<A>(reducer: Reducer<A>): Reducer<A>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"export function function flip<A>(
reducer: Reducer<A>
): Reducer<A>
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
Reducer where combine(self, that) calls the original
reducer as combine(that, self).
- The
initialValue is preserved from the original reducer.
- The
combineAll is re-derived from the flipped combine (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"
flip<function (type parameter) A in flip<A>(reducer: Reducer<A>): Reducer<A>A>(reducer: Reducer<A>(parameter) reducer: {
initialValue: A;
combineAll: (collection: Iterable<A>) => A;
combine: (self: A, that: A) => A;
}
reducer: interface Reducer<A>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, or
Record.makeReducerUnion.
- You need both the combining logic and a known starting value.
Details
Extends
Combiner.Combiner
with:
initialValue – the identity/neutral element for combine.
combineAll – folds an entire Iterable<A> from initialValue.
Many modules ship pre-built reducers:
Number.ReducerSum, Number.ReducerMultiply
String.ReducerConcat
Boolean.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"
Reducer<function (type parameter) A in flip<A>(reducer: Reducer<A>): Reducer<A>A>): interface Reducer<A>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, or
Record.makeReducerUnion.
- You need both the combining logic and a known starting value.
Details
Extends
Combiner.Combiner
with:
initialValue – the identity/neutral element for combine.
combineAll – folds an entire Iterable<A> from initialValue.
Many modules ship pre-built reducers:
Number.ReducerSum, Number.ReducerMultiply
String.ReducerConcat
Boolean.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"
Reducer<function (type parameter) A in flip<A>(reducer: Reducer<A>): Reducer<A>A> {
return function make<A>(
combine: (self: A, that: A) => A,
initialValue: A,
combineAll?: (collection: Iterable<A>) => A
): Reducer<A>
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 like 0 for multiplication).
Details
- If
combineAll is omitted, a default left-to-right fold starting from
initialValue is used.
- If
combineAll is 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: 0
make((self: Aself, that: Athat) => reducer: Reducer<A>(parameter) reducer: {
initialValue: A;
combineAll: (collection: Iterable<A>) => A;
combine: (self: A, that: A) => A;
}
reducer.combine(that: Athat, self: Aself), reducer: Reducer<A>(parameter) reducer: {
initialValue: A;
combineAll: (collection: Iterable<A>) => A;
combine: (self: A, that: A) => A;
}
reducer.Reducer<A>.initialValue: ANeutral starting value (combining with this changes nothing).
When to use
Use to seed a reduction and represent the result of reducing an empty collection.
initialValue)
}