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