let str_join = module{ sep=" ", list=NULL, } => { let joiner = func (acc, item) => select (acc.out == ""), NULL, { true = acc{ out="@@" % (acc.out,item), }, false = acc{ out="@@@" % (acc.out, acc.sep, item), }, }; let result = reduce(joiner, {sep=mod.sep, out=""}, (mod.list)).out; }; let len = module{ list = NULL, } => { let counter = func (acc, item) => acc + 1; let result = reduce(counter, 0, (mod.list)); }; let reverse = module{ list = NULL, } => { let reducer = func (acc, item) => [item] + acc; let result = reduce(reducer, [], (mod.list)); }; let enumerate = module{ start = 0, step = 1, list = NULL, } => { let reducer = func (acc, item) => acc{ count = acc.count + acc.step, list=acc.list + [[acc.count, item]], }; let acc = {count=mod.start, list=[], step=mod.step}; let enumerated = reduce(reducer, acc, (mod.list)); let result = enumerated.list; }; let zip = module{ list1 = NULL, list2 = NULL, } => { let counter = func (acc, item) => acc + 1; let len1 = reduce(counter, 0, (mod.list1)); let len2 = reduce(counter, 0, (mod.list2)); let rng = select (len1 >= len2), NULL, { true = 0:(len1 - 1), false = 0:(len2 - 1), }; let reducer = func (acc, item) => acc{ result = acc.result + [[acc.list1.(item), acc.list2.(item)]], idxs = acc.idxs + [item] }; let acc = { list1 = mod.list1, list2 = mod.list2, result = [], idxs = [], }; let result = reduce(reducer, acc, rng).result; };