Documentation
¶
Overview ¶
Package hof provides pure function combinators: composition, partial application, and independent application. Based on Stone's "Algorithms: A Functional Programming Approach" (pipe, sect, cross).
For resilience decorators (retry, circuit breaker, throttle, debounce), see the [cb] package.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Bind ¶
func Bind[A, B, C any](f func(A, B) C, a A) func(B) C
Bind fixes the first argument of a binary function: Bind(f, x)(y) = f(x, y). Panics if f is nil.
Example ¶
package main
import (
"fmt"
"github.com/binaryphile/fluentfp/hof"
)
func main() {
// Fix the first argument of a binary function.
add := func(a, b int) int { return a + b }
addFive := hof.Bind(add, 5)
fmt.Println(addFive(3))
}
Output: 8
func BindR ¶
func BindR[A, B, C any](f func(A, B) C, b B) func(A) C
BindR fixes the second argument of a binary function: BindR(f, y)(x) = f(x, y). Panics if f is nil.
Example ¶
package main
import (
"fmt"
"github.com/binaryphile/fluentfp/hof"
)
func main() {
// Fix the second argument of a binary function.
subtract := func(a, b int) int { return a - b }
subtractThree := hof.BindR(subtract, 3)
fmt.Println(subtractThree(10))
}
Output: 7
func Cross ¶
func Cross[A, B, C, D any](f func(A) C, g func(B) D) func(A, B) (C, D)
Cross applies two functions independently to two separate arguments. Cross(f, g)(a, b) = (f(a), g(b)). Panics if f or g is nil.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/binaryphile/fluentfp/hof"
)
func main() {
// Apply separate functions to separate arguments.
double := func(n int) int { return n * 2 }
toUpper := func(s string) string { return strings.ToUpper(s) }
both := hof.Cross(double, toUpper)
d, u := both(5, "hello")
fmt.Println(d, u)
}
Output: 10 HELLO
func Eq ¶
func Eq[T comparable](target T) func(T) bool
Eq returns a predicate that checks equality to target. T is inferred from target: hof.Eq(Skipped) returns func(Status) bool.
func Pipe ¶
func Pipe[A, B, C any](f func(A) B, g func(B) C) func(A) C
Pipe composes two functions left-to-right: Pipe(f, g)(x) = g(f(x)). Panics if f or g is nil.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/binaryphile/fluentfp/hof"
)
func main() {
// Compose TrimSpace then ToLower into a single transform.
normalize := hof.Pipe(strings.TrimSpace, strings.ToLower)
fmt.Println(normalize(" Hello World "))
}
Output: hello world
Example (Chaining) ¶
package main
import (
"fmt"
"strconv"
"github.com/binaryphile/fluentfp/hof"
)
func main() {
// Multi-step composition uses intermediate variables.
double := func(n int) int { return n * 2 }
addOne := func(n int) int { return n + 1 }
toString := func(n int) string { return strconv.Itoa(n) }
doubleAddOne := hof.Pipe(double, addOne)
full := hof.Pipe(doubleAddOne, toString)
fmt.Println(full(5))
}
Output: 11
Types ¶
This section is empty.