Skip to content

Instantly share code, notes, and snippets.

@remiq
Created May 15, 2016 13:28
Show Gist options
  • Save remiq/dbecca7e4d06e708937eacd60f590413 to your computer and use it in GitHub Desktop.
Save remiq/dbecca7e4d06e708937eacd60f590413 to your computer and use it in GitHub Desktop.
Enum.map with error handling
defmodule EnumEx do
@doc """
Executes `fun` for each `list` element (just like `map`), but if one iter fails,
then aborts everything and returns first error.
`fun` must return {:ok, result} | {:error, error}
"""
def map_or_error(list, fun) do
result = Enum.reduce(list, [], fn
i, acc when is_list(acc) ->
IO.inspect {i, acc}
case fun.(i) do
{:ok, res} -> [res | acc]
{:error, _error} = error -> error
end
_i, {:error, _error} = error -> error
end)
case result do
{:error, _error} = error -> error
list when is_list(list) -> {:ok, Enum.reverse(list)}
end
end
@doc """
Example of usage
"""
def map_or_error_test do
f = fn
6 -> {:error, :error6}
i -> {:ok, i}
end
{:ok, [1,2,3,4,5]} = map_or_error 1..5, f
{:error, :error6} = map_or_error 1..6, f
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment