-
Notifications
You must be signed in to change notification settings - Fork 72
/
generate.ts
36 lines (32 loc) · 1.08 KB
/
generate.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import { IterableX } from './iterablex';
class GenerateIterable<TState, TResult> extends IterableX<TResult> {
private _initialState: TState;
private _condition: (value: TState) => boolean;
private _iterate: (value: TState) => TState;
private _resultSelector: (value: TState) => TResult;
constructor(
initialState: TState,
condition: (value: TState) => boolean,
iterate: (value: TState) => TState,
resultSelector: (value: TState) => TResult
) {
super();
this._initialState = initialState;
this._condition = condition;
this._iterate = iterate;
this._resultSelector = resultSelector;
}
*[Symbol.iterator]() {
for (let i = this._initialState; this._condition(i); i = this._iterate(i)) {
yield this._resultSelector(i);
}
}
}
export function generate<TState, TResult>(
initialState: TState,
condition: (value: TState) => boolean,
iterate: (value: TState) => TState,
resultSelector: (value: TState) => TResult
): IterableX<TResult> {
return new GenerateIterable<TState, TResult>(initialState, condition, iterate, resultSelector);
}