CapturePipe v0.1.0 CapturePipe View Source
To use this operator in one of your modules, you need to add the following to it:
use CapturePipe
This does the same thing as explicitly writing:
import Capturepipe
import Kernel, except: [|>: 2]
Link to this section Summary
Functions
Extended pipe-operator that allows the usage of bare function captures.
Link to this section Functions
Extended pipe-operator that allows the usage of bare function captures.
This is useful to insert the pipe's results into a datastructure such as a tuple.
What this macro does, is if it encounters a &
capture,
it wraps the whole operand in (...).()
which is the
anonymous-function-call syntax that Elixir's normal pipe accepts,
that (argubably) is less easy on the eyes.
For instance, 10 |> &{:ok, &1}
is turned into 10 |> (&{:ok, &1}).()
Examples
Still works as normal:
iex> [1,2,3] |> Enum.map(fn x -> x + 1 end)
[2,3,4]
Insert the result of an operation into a tuple
iex> 42 |> &{:ok, &1}
{:ok, 42}
It also works multiple times in a row.
iex> 20 |> &{:ok, &1} |> &[&1, 2, 3]
[{:ok, 20}, 2, 3]
Besides the function-capture syntax CapturePipe also enables you to use anonymnous functions directly inside a pipe, performing similar wrapping:
iex> 42 |> fn val -> to_string(val) end
"42"
Even if the pipes are nested deeply and interspersed with 'normal' pipe calls:
iex> (10
iex> |> &Kernel.div(20, &1)
iex> |> Kernel.-()
iex> |> to_string()
iex> |> &"The answer is: #{&1}!"
iex> |> String.upcase()
iex> |> &{:ok, &1}
iex> )
{:ok, "THE ANSWER IS: -2!"}
Currently, the implementation raises errors when captures or anonymous functions with a bad arity are used at runtime. This might be improved in the future to raise compile-time errors whenever possible instead.