Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Elixir Processes and GenServers - Part 3

genservers_3.livemd

Elixir Processes and GenServers - Part 3

6. Genserver Example

Here’s a GenServer that implements a counter.

defmodule Counter do
  use GenServer

  # Client API

  def start_link(initial_value \\ 0) do
    GenServer.start_link(__MODULE__, initial_value, name: __MODULE__)
  end

  def increment do
    GenServer.cast(__MODULE__, :increment)
  end

  def decrement do
    GenServer.cast(__MODULE__, :decrement)
  end

  def value do
    GenServer.call(__MODULE__, :get)
  end

  # Server Callbacks

  @impl true
  def init(initial_value) do
    {:ok, initial_value}
  end

  @impl true
  def handle_cast(:increment, state) do
    {:noreply, state + 1}
  end

  @impl true
  def handle_cast(:decrement, state) do
    {:noreply, state - 1}
  end

  @impl true
  def handle_call(:get, _from, state) do
    {:reply, state, state}
  end
end

We can start the GenServer and increment the value.

# Start the counter with an initial value (e.g., 10)
{:ok, _pid} = Counter.start_link(10)

# Increment and decrement
Counter.increment()
Counter.increment()
Counter.decrement()

# Get the current value
IO.puts("Counter value: #{Counter.value()}")
Counter.increment()
IO.puts("Counter value: #{Counter.value()}")

Next