import { Sequence } from '../../core'; import { compose } from '../../../../helper/compose'; compose(Sequence, class extends Sequence { public override iterate(): Sequence.Thunk { return this.iterate_(); } private iterate_(z?: z, i = 0): Sequence.Thunk { const data = this.cons(z!, Sequence.Data.cons); switch (data.length) { case 0: return >[ undefined, Sequence.Iterator.done, -1 ]; case 1: return >[ data[0], () => Sequence.Iterator.done(), i ]; case 2: return >[ data[0], () => this.iterate_(data[1] as z, i + 1), i ]; default: throw Sequence.Exception.invalidDataError(data); } } });