import { Sequence } from '../../core';
import { compose } from '../../../../helper/compose';
compose(Sequence, class extends Sequence {
public static override intersect(a: Sequence, b: Sequence, cmp: (l: a, r: a) => number): Sequence, Sequence.Iterator]> {
return new Sequence, Sequence.Iterator]>(([ai, bi] = [() => a.iterate(), () => b.iterate()], cons) =>
Sequence.Iterator.when(
ai(),
() => cons(),
(at, ar) =>
Sequence.Iterator.when(
bi(),
() => cons(),
(bt, br) => {
const ord = cmp(Sequence.Thunk.value(at), Sequence.Thunk.value(bt));
if (ord < 0) return bi = () => bt, ar();
if (ord > 0) return br();
return cons(Sequence.Thunk.value(at), [Sequence.Thunk.iterator(at), Sequence.Thunk.iterator(bt)]);
})));
}
});