Use case for Enum.reduce_while without accumulator

Your code looks good except one point. Calling Enum.reduce* functions does not makes sense if you do not need an accumulator. I would rather write something like:

func = fn
  # return error if needed - equivalent of: {:halt, {:error, error}}
  x when rem(x, 2) != 0 -> {:error, 2}
  # skip item if needed - equivalent of: {:cont, acc}
  x when rem(x, 3) != 0 -> nil
  # return ok tuple for desired item - equivalent of: {:halt, {:ok, item}}
  x -> {:ok, x}
end

iex> Enum.find_value(1..3, func)
{:error, 2} # error returned
iex> Enum.find_value([2, 4], func)
nil # all skipped
iex> Enum.find_value([2, 4, 6], func)
{:ok, 6} # ok returned

For more information please take a look at Enum.find_value/2 documentation.

1 Like