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 = func(list) => reduce(func(acc, item) => acc + 1, 0, list); let reverse = func(list) => reduce(func (acc, item) => [item] + acc, [], 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 len = import "std/lists.ucg".len; let len1 = len(mod.list1); let len2 = len(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; };