FunctionChains.jl

FunctionChains.jl implements chained functions with functionality beyond Base.ComposedFunction.

The package defines the function fchain that turns a sequence of functions into a callable function chain. Functions are applied in the order they are given, so fchain(f, g, h) and fchain((f, g, h)) are semantically equivalent to h ∘ g ∘ f.

Function chains can be based on tuples of functions but also on arrays (e.g. fchain([x -> i * x for i in 1:4]) or generators/iterators (e.g. fchain((x -> i * x for i in 1:4)) of functions. fchain will always try to generate type-stable function chains if possible.

The function chain generated by fchain supports InverseFunctions.inverse and/or ChangesOfVariables.with_logabsdet_jacobian, as well as the Adapt, Functors and FlexiMaps APIs, if all functions in the chain do support the respective API.

FunctionChains also exports the convenience functions asfunction(f) and typed_callable(f) that wrap a callable f in a properly typed callable function (object) if necessary, e.g. if f is a type (constructor).

Example:

using FunctionChains

f = fchain(Complex, sqrt)
f(-1)

# output

0.0 + 1.0im
g = fchain((x -> i * x for i in 1:4))
g(1.75)

# output

42.0

The functions chains f and g in this example are both type stable

using Test
@inferred f(-1)
@inferred g(1.75)

In general, type stability will depend on the functions in the sequence and the type of the sequence itself.