import { Sequence } from '../../core';
import { compose } from '../../../../helper/compose';
compose(Sequence, class extends Sequence {
public override subsequences(): Sequence, Sequence.Iterator]> {
return Sequence.mappend(
Sequence.from([[]]),
Sequence.from([0])
.bind(() =>
nonEmptySubsequences(this)));
}
});
function nonEmptySubsequences(xs: Sequence): Sequence, Sequence.Iterator]> {
return Sequence.Iterator.when, Sequence.Iterator]>>(
xs.iterate(),
() => Sequence.mempty,
xt =>
Sequence.mappend(
Sequence.from([[Sequence.Thunk.value(xt)]]),
new Sequence>, Sequence.Iterator]>, undefined>((_, cons) =>
Sequence.Iterator.when(
xt,
() => cons(),
xt =>
cons(
nonEmptySubsequences(
Sequence.resume(Sequence.Thunk.iterator(xt)))
.foldr((ys, r) =>
Sequence.mappend(
Sequence.mappend(
Sequence.from([ys]),
Sequence.from([[Sequence.Thunk.value(xt), ...ys]])),
r)
, Sequence.mempty))))
.bind(xs => xs)));
}