defmodule Response do defstruct response: [], records: [] def wrap(response) do %__MODULE__{response: response} end def records(st) do %{st | records: st.response} end defimpl Enumerable, for: Response do def count(_page), do: {:error, __MODULE__} def member?(_page, _value), do: {:error, __MODULE__} def reduce(%Response{records: records}, acc, fun) do Enumerable.reduce(records, acc, fun) end end defimpl Collectable, for: Response do def into(original) do {original, fn source, {:cont, nil} -> source source, {:cont, value} -> %Response{source | response: [value|source.response]} source, :done -> %Response{source | response: :lists.reverse(source.response)} _, :halt -> :ok end} end end end