Reducer.ts
Reducer.ts overview
Section titled “Reducer.ts overview”Reusable strategies for reducing many values into one value. A Reducer<A>
extends Combiner.Combiner with an initialValue for empty collections and
a combineAll method for folding an entire iterable. This module provides a
constructor for reducers and a helper for reversing the order in which values
are combined.
Since v4.0.0
Exports Grouped by Category
Section titled “Exports Grouped by Category”combinators
Section titled “combinators”Reverses the argument order of a reducer’s combine method.
When to use
Use when you want the right-hand value to act as the accumulator, or need to reverse a non-commutative reducer such as string concatenation.
Details
- Returns a new
Reducerwherecombine(self, that)calls the original reducer ascombine(that, self). - The
initialValueis preserved from the original reducer. - The
combineAllis re-derived from the flippedcombine(using the default left-to-right fold), not carried over from the original.
Example (Reversing string concatenation)
import { Reducer, String } from "effect"
const Prepend = Reducer.flip(String.ReducerConcat)
console.log(Prepend.combine("a", "b"))// Output: "ba"
console.log(Prepend.combineAll(["a", "b", "c"]))// Output: "cba"See
makeCombiner.flip– the same operation on a plainCombiner
Signature
declare const flip: <A>(reducer: Reducer<A>) => Reducer<A>Since v4.0.0
constructors
Section titled “constructors”Creates a Reducer from a combine function and an initialValue.
When to use
Use when you have a custom reducing operation not covered by a pre-built reducer.
- You want to provide an optimized
combineAll(e.g. short-circuiting on a known absorbing element like0for multiplication).
Details
- If
combineAllis omitted, a default left-to-right fold starting frominitialValueis used. - If
combineAllis provided, it completely replaces the default fold.
Example (Multiplying with short-circuit)
import { Reducer } from "effect"
const Product = Reducer.make<number>( (a, b) => a * b, 1, (collection) => { let acc = 1 for (const n of collection) { if (n === 0) return 0 acc *= n } return acc })
console.log(Product.combineAll([2, 3, 4]))// Output: 24
console.log(Product.combineAll([2, 0, 4]))// Output: 0See
Reducer– the interface this createsflip– reverse the argument order
Signature
declare const make: <A>( combine: (self: A, that: A) => A, initialValue: A, combineAll?: (collection: Iterable<A>) => A) => Reducer<A>Since v4.0.0
models
Section titled “models”Reducer (interface)
Section titled “Reducer (interface)”Represents a strategy for reducing a collection of values of type A into
a single result.
When to use
Use when you need to fold/reduce a collection into a single value.
- You want a reusable reducing strategy that can be passed to library
functions like
Struct.makeReducer,Option.makeReducer, orRecord.makeReducerUnion. - You need both the combining logic and a known starting value.
Details
Extends Combiner.Combiner with:
initialValue– the identity/neutral element forcombine.combineAll– folds an entireIterable<A>frominitialValue.
Many modules ship pre-built reducers:
Number.ReducerSum,Number.ReducerMultiplyString.ReducerConcatBoolean.ReducerAnd,Boolean.ReducerOr
Example (String concatenation reducer)
import { Reducer } from "effect"
const Concat = Reducer.make<string>((a, b) => a + b, "")
console.log(Concat.combineAll(["hello", " ", "world"]))// Output: "hello world"See
make– create aReducerfrom a function and initial valueCombiner.Combiner– parent interface withoutinitialValue
Signature
export interface Reducer<A> extends Combiner.Combiner<A> { /** * Neutral starting value (combining with this changes nothing). * * **When to use** * * Use to seed a reduction and represent the result of reducing an empty collection. */ readonly initialValue: A
/** * Combines all values in the collection, starting from `initialValue`. * * **When to use** * * Use to reduce an iterable with this reducer's initial value and combining operation. */ readonly combineAll: (collection: Iterable<A>) => A}Since v4.0.0