lib/event_store/page.ex

defmodule EventStore.Page do
  @moduledoc """
  A page of results from a paginated query.
  """
  alias EventStore.Page

  defstruct [:page_number, :page_size, :total_entries, :total_pages, entries: []]

  @type t :: %Page{
          entries: list(),
          page_number: pos_integer(),
          page_size: integer(),
          total_entries: integer(),
          total_pages: pos_integer()
        }

  @type t(entry) :: %Page{
          entries: list(entry),
          page_number: pos_integer(),
          page_size: integer(),
          total_entries: integer(),
          total_pages: pos_integer()
        }

  def total_pages(0, _page_size), do: 1

  def total_pages(total_entries, page_size) do
    (total_entries / page_size) |> Float.ceil() |> round()
  end
end