Skip to content

Instantly share code, notes, and snippets.

@bkono
Forked from zabirauf/ROP.ex
Created June 3, 2016 00:05
Show Gist options
  • Save bkono/2ff8fe7031db8d8effff87cc8c43085a to your computer and use it in GitHub Desktop.
Save bkono/2ff8fe7031db8d8effff87cc8c43085a to your computer and use it in GitHub Desktop.
Railway Oriented Programming macros in Elixir
defmodule ROP do
defmacro try_catch(args, func) do
quote do
(fn ->
try do
unquote(args) |> unquote(func)
rescue
e -> {:error, e}
end
end).()
end
end
defmacro tee(args, func) do
quote do
(fn ->
unquote(args) |> unquote(func)
{:ok, unquote(args)}
end).()
end
end
defmacro bind(args, func) do
quote do
(fn ->
result = unquote(args) |> unquote(func)
{:ok, result}
end).()
end
end
defmacro left >>> right do
quote do
(fn ->
case unquote(left) do
{:ok, x} -> x |> unquote(right)
{:error, _} = expr -> expr
end
end).()
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment