diff --git a/src/lib.ts b/src/lib.ts index a8025c9..d1903ff 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -2,7 +2,21 @@ export type { Arr, ClassOf, Constructible, Function, InstanceOf, KeyOfType, Tail } from "./lib/types.ts"; // functions -export { all, chunk, enumerate, fill, filter, filter_map, fold, it, Iter, map, window, zip } from "./lib/iter.ts"; +export { + all, + chunk, + enumerate, + fill, + filter, + filter_map, + fold, + it, + Iter, + map, + reduce, + window, + zip, +} from "./lib/iter.ts"; export { log_from, next, split_promise, wait } from "./lib/utils.ts"; // Structures diff --git a/src/lib/iter.ts b/src/lib/iter.ts index 48b228a..2f62ca0 100644 --- a/src/lib/iter.ts +++ b/src/lib/iter.ts @@ -71,12 +71,21 @@ export function* fill(iter: Iterable, value: O) { for (const _item of iter) yield value; } -export function fold(iter: Iterable, init: O, reduction: (item: I, acc: O) => O) { +export function reduce(iter: Iterable, init: O, reduction: (item: I, acc: O) => O) { let accumulator = init; for (const item of iter) accumulator = reduction(item, accumulator); return accumulator; } +export function fold(iter: Iterable, reduction: (first: T, next: T) => T) { + let accumulator = undefined as T | undefined, passed_first = false; + for (const item of iter) { + if (passed_first) accumulator = reduction(accumulator!, item); + else accumulator = item, passed_first = true; + } + return accumulator; +} + export class Iter { iter; [Symbol.iterator] = () => this.iter[Symbol.iterator](); @@ -136,8 +145,12 @@ export class Iter { return fill(this, value); } - fold(init: O, reduction: (item: T, acc: O) => O) { - return fold(this, init, reduction); + fold(reduction: (first: T, next: T) => T) { + return fold(this, reduction); + } + + reduce(init: O, reduction: (item: T, acc: O) => O) { + return reduce(this, init, reduction); } }