spica
Version:
Supervisor, Coroutine, Channel, select, AtomicPromise, Cancellation, Cache, List, Queue, Stack, and some utils.
19 lines (17 loc) • 813 B
text/typescript
import { Sequence } from '../../core';
import { compose } from '../../../../helper/compose';
compose(Sequence, class <a, z> extends Sequence<a, z> {
public override scanl<b>(f: (b: b, a: a) => b, z: b): Sequence<b, [b, Sequence.Iterator<a>, number]> {
return new Sequence<b, [b, Sequence.Iterator<a>, number]>(([prev, iter, i] = [z, () => this.iterate(), 0]) =>
Sequence.Iterator.when<a, Sequence.Data<b, [b, Sequence.Iterator<a>, number]>>(
iter(),
() =>
i === 0
? Sequence.Data.cons(z)
: Sequence.Data.cons(),
thunk =>
Sequence.Data.cons<b, [b, Sequence.Iterator<a>, number]>(
prev = f(prev, Sequence.Thunk.value(thunk)),
[prev, Sequence.Thunk.iterator(thunk), Sequence.Thunk.index(thunk) + 1])));
}
});