Pipes
AÂ pipe
function takes a T
 value and invokes a (T) -> R
function with it:
import arrow.syntax.function.pipe fun main(args: Array<String>) { val strong: (String) -> String = { body -> "<strong>$body</strong>" } "From a pipe".pipe(strong).pipe(::println) }
A pipe is similar to function composition, but instead of generating new functions, we can chain function invocations to produce new values, reducing nesting calls. Pipes are known in other languages, such as Elm and Ocaml, as the operator |>
:
fun main(args: Array<String>) { splitter(filterBills(calculatePrice(Quote(20.0, "Foo", "Shoes", 1)))) //Nested Quote(20.0, "Foo", "Shoes", 1) pipe ::calculatePrice pipe ::filterBills pipe ::splitter //Pipe }
Both lines are equivalent, but the first one must be understood backwards and the second one should read from left to right:
import arrow.syntax.function.pipe import arrow.syntax.function.pipe3 import arrow.syntax.function.reverse fun main(args...