import { Sequence } from '../../core'; import { compose } from '../../../../helper/compose'; compose(Sequence, class extends Sequence { public static override mconcat(as: Iterable>): Sequence, Sequence.Iterator]> { return [...as] .reduce, Sequence.Iterator]>>((a, b) => mconcat(a, b), Sequence.mempty); } }); function mconcat(a: Sequence, b: Sequence): Sequence, Sequence.Iterator]> { return new Sequence, Sequence.Iterator]>(([ai, bi] = [() => a.iterate(), () => b.iterate()], cons) => Sequence.Iterator.when( ai(), () => Sequence.Iterator.when( bi(), () => cons(), bt => cons(Sequence.Thunk.value(bt), [Sequence.Iterator.done, Sequence.Thunk.iterator(bt)])), at => cons(Sequence.Thunk.value(at), [Sequence.Thunk.iterator(at), bi]))); }