added folding to iterators

This commit is contained in:
Matthieu Jolimaitre 2024-10-08 12:28:30 +02:00
parent d90cae3651
commit 57e3126702
2 changed files with 31 additions and 4 deletions

View file

@ -2,7 +2,21 @@
export type { Arr, ClassOf, Constructible, Function, InstanceOf, KeyOfType, Tail } from "./lib/types.ts"; export type { Arr, ClassOf, Constructible, Function, InstanceOf, KeyOfType, Tail } from "./lib/types.ts";
// functions // 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"; export { log_from, next, split_promise, wait } from "./lib/utils.ts";
// Structures // Structures

View file

@ -71,12 +71,21 @@ export function* fill<I, O>(iter: Iterable<I>, value: O) {
for (const _item of iter) yield value; for (const _item of iter) yield value;
} }
export function fold<I, O>(iter: Iterable<I>, init: O, reduction: (item: I, acc: O) => O) { export function reduce<I, O>(iter: Iterable<I>, init: O, reduction: (item: I, acc: O) => O) {
let accumulator = init; let accumulator = init;
for (const item of iter) accumulator = reduction(item, accumulator); for (const item of iter) accumulator = reduction(item, accumulator);
return accumulator; return accumulator;
} }
export function fold<T>(iter: Iterable<T>, 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<T> { export class Iter<T> {
iter; iter;
[Symbol.iterator] = () => this.iter[Symbol.iterator](); [Symbol.iterator] = () => this.iter[Symbol.iterator]();
@ -136,8 +145,12 @@ export class Iter<T> {
return fill(this, value); return fill(this, value);
} }
fold<O>(init: O, reduction: (item: T, acc: O) => O) { fold(reduction: (first: T, next: T) => T) {
return fold(this, init, reduction); return fold(this, reduction);
}
reduce<O>(init: O, reduction: (item: T, acc: O) => O) {
return reduce(this, init, reduction);
} }
} }