defmodule Sorcery.Src.Enumerable do alias Sorcery.Src @moduledoc """ Functions to help implement Enumerable for the Src struct. """ defimpl Enumerable, for: Src do def count(src) do {:ok, MapSet.size(Src.Utils.entities_set(src))} end def member?(src, element) do {:ok, MapSet.member?(Src.Utils.entities_set(src), element)} end # Start by getting a list of current values like {tk, id, %{...}} def reduce(src, acc, fun) when not is_list(src) do Src.Utils.entities_set(src) |> Enum.map(fn {tk, id} -> current = get_in(src, [tk, id]) {tk, id, current} end) |> __MODULE__.reduce(acc, fun) end def reduce(_list, {:halt, acc}, _fun), do: {:halted, acc} def reduce(list, {:suspend, acc}, fun), do: {:suspended, acc, &reduce(list, &1, fun)} def reduce([], {:cont, acc}, _fun), do: {:done, acc} def reduce([head | tail], {:cont, acc}, fun), do: reduce(tail, fun.(head, acc), fun) def slice(src) do set = Src.Utils.entities_set(src) li = MapSet.to_list(set) {:ok, MapSet.size(set), fn start, len -> Enum.slice(li, start, len) end} end end end