import { Sequence } from '../../core';
import { compose } from '../../../../helper/compose';
compose(Sequence, class extends Sequence {
public override mapM(f: (a: a) => Sequence): Sequence>, Sequence.Iterator]> {
return Sequence.from([0])
.bind(() => {
const xs = this.extract();
switch (xs.length) {
case 0:
return Sequence.mempty;
default: {
const x = xs.shift()!;
return f(x)
.bind(y =>
xs.length === 0
? Sequence.from([[y]])
: Sequence.from(xs).mapM(f).fmap(ys => [y, ...ys]));
}
}
});
}
});