UNPKG

1.23 kBJavaScriptView Raw
1/**
2 * Utility module to create and manipulate Iterators.
3 *
4 * @module iterator
5 */
6
7/**
8 * @template T,R
9 * @param {Iterator<T>} iterator
10 * @param {function(T):R} f
11 * @return {IterableIterator<R>}
12 */
13export const mapIterator = (iterator, f) => ({
14 [Symbol.iterator] () {
15 return this
16 },
17 // @ts-ignore
18 next () {
19 const r = iterator.next()
20 return { value: r.done ? undefined : f(r.value), done: r.done }
21 }
22})
23
24/**
25 * @template T
26 * @param {function():IteratorResult<T>} next
27 * @return {IterableIterator<T>}
28 */
29export const createIterator = next => ({
30 /**
31 * @return {IterableIterator<T>}
32 */
33 [Symbol.iterator] () {
34 return this
35 },
36 // @ts-ignore
37 next
38})
39
40/**
41 * @template T
42 * @param {Iterator<T>} iterator
43 * @param {function(T):boolean} filter
44 */
45export const iteratorFilter = (iterator, filter) => createIterator(() => {
46 let res
47 do {
48 res = iterator.next()
49 } while (!res.done && !filter(res.value))
50 return res
51})
52
53/**
54 * @template T,M
55 * @param {Iterator<T>} iterator
56 * @param {function(T):M} fmap
57 */
58export const iteratorMap = (iterator, fmap) => createIterator(() => {
59 const { done, value } = iterator.next()
60 return { done, value: done ? undefined : fmap(value) }
61})