export class Cons { constructor(public value: A, public next: Cons | undefined) {} toArray(): A[] { const array = []; let cur: Cons | undefined = this; while (cur !== undefined) { array.push(cur.value); cur = cur.next; } return array; } nth(index: number): A | undefined { let cur: Cons | undefined = this; for (let i = 0; i < index && cur !== undefined; ++i) { cur = cur.next; } return cur === undefined ? undefined : cur.value; } } export function copyFirst(n: number, list: Cons): Cons { const newHead = new Cons(list.value, undefined); let current = list; let newCurrent = newHead; while (--n > 0) { current = current.next!; const cons = new Cons(current.value, undefined); newCurrent.next = cons; newCurrent = cons; } return newHead; } export function concat(a: Cons, b: Cons): Cons { let list = new Cons(a.value, undefined); let prev = list; let cur = a; while ((cur = cur.next!) !== undefined) { prev.next = new Cons(cur.value, undefined); prev = prev.next; } prev.next = b; return list; }