examples/counter.exs

# Run with:
#   docker compose run --rm dev iex -S mix
#   iex> c "examples/counter.exs"
#   iex> Harlock.run(Counter)
#
# Or, in an interactive PowerShell with this image:
#   docker compose run --rm dev sh -c "elixir -S mix run examples/counter.exs"

defmodule Counter do
  use Harlock.App

  def init(_), do: %{n: 0}

  def update({:key, {:char, ?+}, []}, m), do: %{m | n: m.n + 1}
  def update({:key, {:char, ?=}, []}, m), do: %{m | n: m.n + 1}
  def update({:key, {:char, ?-}, []}, m), do: %{m | n: max(0, m.n - 1)}
  def update({:key, {:char, ?q}, []}, _), do: :quit
  def update({:key, :escape, []}, _), do: :quit
  def update(_event, m), do: m

  def view(m) do
    box(
      title: "Harlock Counter",
      title_align: :center,
      border: :rounded,
      border_style: [fg: :cyan],
      padding: {1, 2},
      child:
        vbox(
          constraints: [fill: 1, length: 1, length: 1],
          children: [
            text("count: #{m.n}", style: [fg: :cyan, bold: true]),
            spacer(),
            text("[+/=] inc  [-] dec  [q/Esc] quit", style: [dim: true])
          ]
        )
    )
  end
end

# If running via `mix run examples/counter.exs` (rather than loading via iex),
# kick off the app immediately.
case System.argv() do
  ["--run"] -> Harlock.run(Counter)
  _ -> :ok
end