lib/source/events.ex

defmodule Strom.Source.Events do
  @behaviour Strom.Source

  defstruct infinite: false, events: []

  def new(events) when is_list(events), do: %__MODULE__{events: events}

  @impl true
  def start(%__MODULE__{} = state), do: state

  @impl true
  def call(%__MODULE__{events: events} = state) do
    case events do
      [hd | tl] ->
        {:ok, {[hd], %{state | events: tl}}}

      [] ->
        {:error, {:halt, state}}
    end
  end

  @impl true
  def stop(%__MODULE__{} = stream), do: stream

  @impl true
  def infinite?(%__MODULE__{infinite: infinite}), do: infinite
end