veffect
Version:
powerful TypeScript validation library built on the robust foundation of Effect combining exceptional type safety, high performance, and developer experience. Taking inspiration from Effect's functional principles, VEffect delivers a balanced approach tha
55 lines (52 loc) • 1.23 kB
text/typescript
/** @internal */
export function concat<B>(that: Iterable<B>) {
return <A>(self: Iterable<A>): Iterable<A | B> => {
return {
[Symbol.iterator]() {
const iterA = self[Symbol.iterator]()
let doneA = false
let iterB: Iterator<B>
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<A, B>(b: B, f: (s: B, a: A) => B) {
return function(iterable: Iterable<A>): 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<A, B>(f: (a: A) => B) {
return function(iterable: Iterable<A>): Iterable<B> {
if (Array.isArray(iterable)) {
return iterable.map(f)
}
return (function*() {
for (const n of iterable) {
yield f(n)
}
})()
}
}