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