Rail

testCoverage StatusHex.pmGitHub

Rail is a helper macros for "Railway oriented programming".

It helps you handle error cases at almost no cost with rail, >>>, and def macro.

If you are not comfortable with "Railway oriented programming", see Railway oriented programming

This library is mostly copied from SeokminHong/reather-lite and removed reader monad related stuffs to lower learning curve.

Installation

def deps do
[
{:rail, "~> 0.6.0"}
]
end

Usage

Basic usage

use Rail introduces new syntax left <- right,

defmodule Target do
use Rail
def div(num, denom) do
denom <- check_denom(denom)
num / denom
end
def check_denom(0) do
{:error, :div_by_zero}
end
def check_denom(n) do
# same with {:ok, n}
n
end
end
iex> Calc.div(10, 2)
5.0
iex> Calc.div(10, 0)
{:error, :div_by_zero}

rail/1 is available inside other code blocks.

iex> rail do
... x <- {:ok, 1}
... y <- {:ok, 2}
...
... x + y
... end
3

left >>> right is similar to |>, but

iex> 1 >>> fn v -> Integer.to_string(v) end
"1"
iex> {:ok, 1} >>> fn v -> Integer.to_string(v) end
"1"
iex> {:ok, 1} >>> Integer.to_string()
"1"
iex> {:error, :div_by_zero} >>> Integer.to_string()
{:error, :div_by_zero}

LICENSE

MIT