lib/example/stack.ex

defmodule Example.Stack do
  alias Pistis.Machine.Response
  @behaviour Pistis.Machine

  @spec initial_state :: []
  @spec process_command({:peek} | {:pop} | {:push, any}, any) :: Response.t()

  @impl Pistis.Machine
  def initial_state(), do: []

  @impl Pistis.Machine
  def process_command({:push, item}, state) do
    %Response{response: :ok, state: [item | state]}
  end

  @impl Pistis.Machine
  def process_command({:pop}, []), do: %Response{response: :empty_list, state: []}

  @impl Pistis.Machine
  def process_command({:pop}, state) do
    [head | tail] = state
    %Response{response: head, state: tail}
  end

  @impl Pistis.Machine
  def process_command({:peek}, []), do: %Response{response: :empty_list, state: []}

  @impl Pistis.Machine
  def process_command({:peek}, state) do
    [head | _] = state
    %Response{response: head, state: state}
  end

end