import mem fun greater(a: T, b: T): T { if (a > b) return a; return b; } fun lesser(a: T, b: T): T { if (a > b) return b; return a; } fun make_pair(first: T, second: U): pair { var it.construct(first, second): pair return it } obj pair (Object) { var first: T var second: U fun construct(firstIn: T, secondIn: U): pair* { mem::maybe_copy_construct(&first, &firstIn) mem::maybe_copy_construct(&second, &secondIn) return this } fun construct(): pair* { mem::maybe_construct(&first) mem::maybe_construct(&second) return this } fun copy_construct(old: pair*):void { mem::maybe_copy_construct(&first, &old->first) mem::maybe_copy_construct(&second, &old->second) } fun destruct():void { mem::maybe_destruct(&first) mem::maybe_destruct(&second) } } fun range(end:int): range { var toRet.construct(0, end, 1): range return toRet } fun range(begin: int, end:int): range { var toRet.construct(begin, end, 1): range return toRet } fun range(begin: int, end:int, step: int): range { var toRet.construct(begin, end, step): range return toRet } obj range { var begin: int var end: int var step: int fun construct(beginIn: int, endIn: int, stepIn: int) : range* { begin = beginIn end = endIn step = stepIn } fun for_each(func: fun(int):void):void { for (var i = begin; i < end; i+= step;) func(i) } fun any_true(func: fun(int):bool):bool { for (var i = begin; i < end; i+= step;) if (func(i)) return true return false } }