Skip to content

Instantly share code, notes, and snippets.

@einarwh
Last active May 9, 2021 14:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save einarwh/08f3ecd97faab863b1089c328f681610 to your computer and use it in GitHub Desktop.
Save einarwh/08f3ecd97faab863b1089c328f681610 to your computer and use it in GitHub Desktop.
defmodule Result do
def ok(value) do
{:ok, value }
end
def error(err) do
{:error, err}
end
def pure(value) do
ok(value)
end
def map(result, function) do
case result do
{:ok, value} -> {:ok, function.(value)}
{:error, e} -> {:error, e}
_ -> throw("Illegal value: #{result} is not a result.")
end
end
def map_error(result, function) do
case result do
{:ok, value} -> {:ok, value}
{:error, err} -> {:error, function.(err)}
_ -> throw("Illegal value: #{result} is not a result.")
end
end
def bind(result, function) do
case result do
{:ok, value} -> function.(value)
{:error, e} -> {:error, e}
_ -> throw("Illegal value: #{result} is not a result.")
end
end
def apply(value_result, function_result) do
case {value_result, function_result} do
{{:ok, value}, {:ok, function}} -> pure(function.(value))
{{:error, e}, _} -> {:error, e}
{_, {:error, e}} -> {:error, e}
_ -> throw("Illegal values: one or more of #{value_result} and #{function_result} is not a result.")
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment