Skip to content
vic

Qqwy/elixir-capture_pipe

A pipe-macro for Elixir that allows bare function captures

Qqwy/elixir-capture_pipe.json
{
"createdAt": "2020-07-22T18:11:35Z",
"defaultBranch": "master",
"description": "A pipe-macro for Elixir that allows bare function captures",
"fullName": "Qqwy/elixir-capture_pipe",
"homepage": null,
"language": "Elixir",
"name": "elixir-capture_pipe",
"pushedAt": "2020-07-22T18:49:44Z",
"stargazersCount": 45,
"topics": [],
"updatedAt": "2023-11-13T18:06:36Z",
"url": "https://github.com/Qqwy/elixir-capture_pipe"
}

hex.pm version Build Status Documentation

CapturePipe exposes an 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}).()

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!"}

Capturepipe can be installed by adding capture_pipe to your list of dependencies in mix.exs:

def deps do
[
{:capture_pipe, "~> 0.1.0"}
]
end

Documentation can be found at https://hexdocs.pm/capture_pipe.