import { Sequence } from '../../core';
import { compose } from '../../../../helper/compose';
import { memoize } from '../../../../memoize';
const memory = memoize((_: Sequence): Map> => new Map());
compose(Sequence, class extends Sequence {
public override memoize(): Sequence>]> {
return new Sequence>]>(
([i, memo] = [0, memory(this)], cons) =>
Sequence.Iterator.when(
memo.get(i) || memo.set(i, i > 0 && memo.has(i - 1) ? Sequence.Thunk.iterator(memo.get(i - 1)!)() : this.iterate()).get(i)!,
() => cons(),
thunk => cons(Sequence.Thunk.value(thunk), [i + 1, memo])));
}
});