From 11909830cc953dc270b81304f1a41dbd3f137ac3 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 3 Apr 2024 11:02:45 +1300 Subject: [PATCH] use ts NoInfer in Iterable module --- packages/effect/src/Iterable.ts | 48 ++++++++++++++++++--- packages/effect/src/internal/Iterable.ts | 54 ------------------------ 2 files changed, 43 insertions(+), 59 deletions(-) delete mode 100644 packages/effect/src/internal/Iterable.ts diff --git a/packages/effect/src/Iterable.ts b/packages/effect/src/Iterable.ts index 425f238712..61fa9b03f5 100644 --- a/packages/effect/src/Iterable.ts +++ b/packages/effect/src/Iterable.ts @@ -14,7 +14,6 @@ import { isBoolean } from "./Predicate.js" import type { NonEmptyArray } from "./ReadonlyArray.js" import type * as ReadonlyRecord from "./ReadonlyRecord.js" import * as Tuple from "./Tuple.js" -import type { NoInfer } from "./Types.js" /** * Return a `Iterable` with element `i` initialized with `f(i)`. @@ -123,7 +122,7 @@ export const fromRecord = (self: Readonly>): I export const prepend: { (head: B): (self: Iterable) => Iterable (self: Iterable, head: B): Iterable -} = dual(2, (self: Iterable, head: B): Iterable => flatten([[head], self])) +} = dual(2, (self: Iterable, head: B): Iterable => prependAll(self, [head])) /** * Prepends the specified prefix iterable to the beginning of the specified iterable. @@ -144,7 +143,7 @@ export const prependAll: { (self: Iterable, that: Iterable): Iterable } = dual( 2, - (self: Iterable, that: Iterable): Iterable => flatten([that, self]) + (self: Iterable, that: Iterable): Iterable => appendAll(that, self) ) /** @@ -156,7 +155,7 @@ export const prependAll: { export const append: { (last: B): (self: Iterable) => Iterable (self: Iterable, last: B): Iterable -} = dual(2, (self: Iterable, last: B): Iterable => flatten([self, [last]])) +} = dual(2, (self: Iterable, last: B): Iterable => appendAll(self, [last])) /** * Concatenates two iterables, combining their elements. @@ -169,7 +168,27 @@ export const appendAll: { (self: Iterable, that: Iterable): Iterable } = dual( 2, - (self: Iterable, that: Iterable): Iterable => flatten([self, that]) + (self: Iterable, that: Iterable): Iterable => ({ + [Symbol.iterator]() { + const iterA = self[Symbol.iterator]() + let doneA = false + let iterB: Iterator + return { + next() { + if (!doneA) { + const r = iterA.next() + if (r.done) { + doneA = true + iterB = that[Symbol.iterator]() + return iterB.next() + } + return r + } + return iterB.next() + } + } + } + }) ) /** @@ -938,6 +957,25 @@ export const forEach: { } }) +/** + * @category folding + * @since 2.0.0 + */ +export const reduce: { + (b: B, f: (b: B, a: A, i: number) => B): (self: Iterable) => B + (self: Iterable, b: B, f: (b: B, a: A, i: number) => B): B +} = dual(3, (self: Iterable, b: B, f: (b: B, a: A, i: number) => B): B => { + if (Array.isArray(self)) { + return self.reduce(f, b) + } + let i = 0 + let result = b + for (const n of self) { + result = f(result, n, i++) + } + return result +}) + /** * Deduplicates adjacent elements that are identical using the provided `isEquivalent` function. * diff --git a/packages/effect/src/internal/Iterable.ts b/packages/effect/src/internal/Iterable.ts deleted file mode 100644 index c5416aca9b..0000000000 --- a/packages/effect/src/internal/Iterable.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** @internal */ -export function concat(that: Iterable) { - return (self: Iterable): Iterable => { - return { - [Symbol.iterator]() { - const iterA = self[Symbol.iterator]() - let doneA = false - let iterB: Iterator - return { - next() { - if (!doneA) { - const r = iterA.next() - if (r.done) { - doneA = true - iterB = that[Symbol.iterator]() - return iterB.next() - } - return r - } - return iterB.next() - } - } - } - } - } -} - -/** @internal */ -export function reduce(b: B, f: (s: B, a: A) => B) { - return function(iterable: Iterable): B { - if (Array.isArray(iterable)) { - return iterable.reduce(f, b) - } - let result = b - for (const n of iterable) { - result = f(result, n) - } - return result - } -} - -/** @internal */ -export function map(f: (a: A) => B) { - return function(iterable: Iterable): Iterable { - if (Array.isArray(iterable)) { - return iterable.map(f) - } - return (function*() { - for (const n of iterable) { - yield f(n) - } - })() - } -}