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()}")