defmodule Pex.Result do @moduledoc false @spec ok(any, fun :: any) :: any def ok({:error, _} = error, _fun), do: error def ok(value, fun) when is_function(fun, 1) do try do fun.(unwrap(:ok, value)) rescue exception -> {:error, exception} catch error -> {:error, error} end end @spec error(any, fun:: any) :: any def error({:error, error}, fun) do try do case fun.(unwrap(:error, error)) do {:ok, value} -> value {:error, value} -> value value -> {:error, value} end rescue exception -> {:error, exception} catch error -> {:error, error} end end def error(value, _fun), do: value @spec unwrap(:ok | :error, any) :: any def unwrap(tag, value) do case value do {^tag, value} -> value value -> value end end end