-
Notifications
You must be signed in to change notification settings - Fork 13
/
dropWhile.ts
37 lines (31 loc) · 1.13 KB
/
dropWhile.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
37
import Sequence, {createSequence} from "./Sequence";
class DropWhileIterator<T> implements Iterator<T> {
private dropping = true;
constructor(private readonly iterator: Iterator<T>,
private readonly predicate: (item: T) => boolean) {
}
next(value?: any): IteratorResult<T> {
for (let item = this.iterator.next(); !item.done; item = this.iterator.next()) {
if (!this.dropping) {
return {done: false, value: item.value};
}
const result = this.predicate(item.value);
if (!result) {
this.dropping = false;
return {done: false, value: item.value};
}
}
return {done: true, value: undefined as any};
}
}
export class DropWhile {
/**
* Drops all elements of the sequence as long as the given `predicate` evaluates to true.
*
* @param {(item: T) => boolean} predicate
* @returns {Sequence<T>}
*/
dropWhile<T>(this: Sequence<T>, predicate: (item: T) => boolean): Sequence<T> {
return createSequence(new DropWhileIterator(this.iterator, predicate));
}
}