Quark v1.0.1 Quark.Compose

Function composition is taking two functions, and joining them together to create a new function. For example:


iex> sum_plus_one = compose([&(&1 + 1), &Enum.sum/1])
iex> sum_plus_one.([1,2,3])
7

In this case, we have joined Enum.sum with a function that adds one, to create a new function that takes a list, sums it, and adds one.

Note that composition normally applies from right to left, though Quark provides the opposite in the form of *_forward functions.

Summary

Functions

Infix compositon operator

Function composition, from the tail of the list to the head

Function composition

Function composition, from the back of the lift to the front

Compose functions, from the head of the list of functions. The is the reverse order versus what one would normally expect (left to right rather than right to left)

Functions

g <|> f

Specs

(... -> any) <|> (... -> any) :: (... -> any)

Infix compositon operator


iex> sum_plus_one = fn x -> x + 1 end <|> &Enum.sum/1
iex> sum_plus_one.([1,2,3])
7

iex> add_one = &(&1 + 1)
iex> piped = [1,2,3] |> Enum.sum |> add_one.()
iex> composed = [1,2,3] |> ((add_one <|> &Enum.sum/1)).()
iex> piped == composed
true
compose()
compose(func_list)

Specs

compose([(... -> any)]) :: (... -> any)

Function composition, from the tail of the list to the head


iex> sum_plus_one = compose([&(&1 + 1), &Enum.sum/1])
iex> [1,2,3] |> sum_plus_one.()
7
compose(g, f)

Specs

compose((... -> any), (... -> any)) :: any

Function composition


iex> sum_plus_one = compose(&(&1 + 1), &Enum.sum/1)
iex> [1,2,3] |> sum_plus_one.()
7
compose_forward()

Function composition, from the back of the lift to the front


iex> sum_plus_one = compose_forward(&(Enum.sum(&1)), &(&1 + 1))
iex> [1,2,3] |> sum_plus_one.()
7
compose_forward(f)
compose_forward(f, g)

Specs

compose_forward((... -> any), (... -> any)) :: (... -> any)
compose_list_forward()

Compose functions, from the head of the list of functions. The is the reverse order versus what one would normally expect (left to right rather than right to left).


iex> sum_plus_one = compose_list_forward([&Enum.sum/1, &(&1 + 1)])
iex> [1,2,3] |> sum_plus_one.()
7
compose_list_forward(func_list)

Specs

compose_list_forward([(... -> any)]) :: (... -> any)