From ddbd11bc34e0836193e4cbd76192bcce97d618bb Mon Sep 17 00:00:00 2001 From: Angus MacDonald Date: Fri, 27 Nov 2020 14:18:16 -0600 Subject: [PATCH] Add iterableIteratorf and functions --- src/iterable-iterator/iterable-iteratorf.ts | 97 +++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/iterable-iterator/iterable-iteratorf.ts diff --git a/src/iterable-iterator/iterable-iteratorf.ts b/src/iterable-iterator/iterable-iteratorf.ts new file mode 100644 index 0000000000..a0784e300e --- /dev/null +++ b/src/iterable-iterator/iterable-iteratorf.ts @@ -0,0 +1,97 @@ +export class iterableIteratorf { + /** + * Return values from the given iterator matching the provided filter fn. + * Equivalent to calling filter on an array. + */ + static filter( + iterableIterator: IterableIterator, + filterFn: (v: T) => boolean + ): T[] { + const result = []; + let nextEntry = iterableIterator.next(); + while (!nextEntry.done) { + if (filterFn(nextEntry.value)) { + result.push(nextEntry.value); + } + nextEntry = iterableIterator.next(); + } + return result; + } + + /** + * Run the given function on values in the iterator. + * Equivalent to calling forEach on an array. + */ + static forEach( + iterableIterator: IterableIterator, + callback: (value: T) => void + ): void { + let nextEntry = iterableIterator.next(); + while (!nextEntry.done) { + callback(nextEntry.value); + nextEntry = iterableIterator.next(); + } + } + + /** + * Return an array with the results from calling the given function on + * values in the iterator. + * Equivalent to calling map on an array. + */ + static map( + iterableIterator: IterableIterator, + callback: (value: T) => V + ): V[] { + const result: V[] = []; + let nextEntry = iterableIterator.next(); + while (!nextEntry.done) { + result.push(callback(nextEntry.value)); + nextEntry = iterableIterator.next(); + } + + return result; + } + + /** + * Return the value in the iterator that generated the highest score when + * passed to the given scoreFn. + * Similar to arrayf.max + */ + static max( + iterableIterator: IterableIterator, + scoreFn: (value: T) => number + ): T { + let maxValue; + let maxScore = Number.NEGATIVE_INFINITY; + + let nextEntry = iterableIterator.next(); + while (!nextEntry.done) { + const score = scoreFn(nextEntry.value); + if (maxScore < score) { + maxValue = nextEntry.value; + maxScore = score; + } + nextEntry = iterableIterator.next(); + } + + return maxValue; + } + + /** + * Return true if some value in the iterator returns true for the given + * function. + */ + static some( + iterableIterator: IterableIterator, + filterFn: (v: T) => boolean + ): boolean { + let nextEntry = iterableIterator.next(); + while (!nextEntry.done) { + if (filterFn(nextEntry.value)) { + return true; + } + nextEntry = iterableIterator.next(); + } + return false; + } +}