Slide 76
Slide 76 text
From Front-End to Full Stack with Elixir & Phoenix
ElixirConf 2016
defmodule Team do
# ...
defimpl Enumerable do
def count(%Team{employees: employees}), do: {:ok, length(employees)}
def member?(_, _), do: {:error, __MODULE__}
def reduce(%Team{employees: employees}, acc, fun), do: do_reduce(employees, acc, fun)
# default list reducer
defp do_reduce(_, {:halt, acc}, _fun), do: {:halted, acc}
defp do_reduce(list, {:suspend, acc}, fun), do: {:suspended, acc, &do_reduce(list, &1, fun)}
defp do_reduce([], {:cont, acc}, _fun), do: {:done, acc}
defp do_reduce([h | t], {:cont, acc}, fun), do: do_reduce(t, fun.(h, acc), fun)
end
end