defmodule Dust.Page do @moduledoc "A page of results from `Dust.enum/3` or `Dust.range/4`." @type item :: term() @type t :: %__MODULE__{items: [item()], next_cursor: String.t() | nil} defstruct items: [], next_cursor: nil @spec new(keyword()) :: t() def new(opts) do %__MODULE__{ items: Keyword.get(opts, :items, []), next_cursor: Keyword.get(opts, :next_cursor) } end defimpl Enumerable do def count(page), do: {:ok, length(page.items)} def member?(page, value), do: {:ok, Enum.member?(page.items, value)} def reduce(page, acc, fun), do: Enumerable.List.reduce(page.items, acc, fun) def slice(page) do size = length(page.items) {:ok, size, fn start, length, step -> page.items |> Enum.drop(start) |> Enum.take_every(step) |> Enum.take(length) end} end end end