let rec aux_simple = (i: int): int => if (i < 100) { aux_simple(i + 1) } else { i }; let counter_simple = (n: int): int => aux_simple(n); type sum_aggregator = {counter: int, sum: int }; let counter = (n: int): int => { let initial: sum_aggregator = { counter: 0, sum: 0 }; let rec aggregate = (prev: sum_aggregator): int => if (prev.counter <= n) { aggregate({ counter: prev.counter + 1, sum: prev.counter + prev.sum }) } else { prev.sum }; aggregate(initial) }; let rec aux_nest = (prev: sum_aggregator): sum_aggregator => if (prev.counter < 100) { let sum: int = prev.sum + aux_simple(prev.counter); aux_nest({counter: prev.counter + 1, sum: sum }) } else { ({counter: prev.counter, sum: prev.sum }) }; let counter_nest = (n: int): int => { let initial: sum_aggregator = { counter: 0, sum: 0 }; let out: sum_aggregator = aux_nest(initial); out.sum };