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])));
}