#include <memory>

struct ListNode;
using List = std::unique_ptr<const ListNode>;

struct ListNode {
    const int data;
    const List next;
};

List Cons(int head, List tail)
{
    return List(new ListNode{head, std::move(tail)});
}

List Nil()
{
    return List();
}

size_t len(const List & self)
{
    if (!self) {
        return 0;
    }
    return 1 + len(self->next);
}

#include <iostream>

void test(size_t n)
{
    auto p = Nil();
    for (size_t i = 0; i < n; ++i) {
        auto x = std::move(p);
        p = Cons(1, std::move(x));
    }
    std::cout << "done: " << len(p) << std::endl;
}

int main()
{
    test(131028);
}