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);
}
}
});