Skip to content

Instantly share code, notes, and snippets.

@leaysgur
Last active December 19, 2017 10:00
Show Gist options
  • Save leaysgur/08d514a89c6ec13329bcd20408e946d8 to your computer and use it in GitHub Desktop.
Save leaysgur/08d514a89c6ec13329bcd20408e946d8 to your computer and use it in GitHub Desktop.
Minimal KVS implementation using `GenServer` in Elixir
defmodule Kv do
@name :kvs
def new() do
GenServer.start_link(Kv.Server, %{}, name: @name)
end
def lookup(name) do
GenServer.call(@name, {:lookup, name})
end
def store(name, value) do
GenServer.cast(@name, {:store, name, value})
end
end
defmodule Kv.Impl do
def new() do
%{}
end
def lookup(store, name) do
{:ok, result} = Map.fetch(store, name)
result
end
def store(store, name, value) do
Map.put(store, name, value)
end
end
defmodule Kv.Server do
use GenServer
alias Kv.Impl
def handle_call({:lookup, name}, _, store) do
{:reply, Impl.lookup(store, name), store}
end
def handle_cast({:store, name, value}, store) do
{:noreply, Impl.store(store, name, value)}
end
end
defmodule KvSingle do
use GenServer
@name :kvs
def new() do
GenServer.start_link(__MODULE__, %{}, name: @name)
end
def lookup(name) do
GenServer.call(@name, {:lookup, name})
end
def store(name, value) do
GenServer.cast(@name, {:store, name, value})
end
def handle_call({:lookup, name}, _, store) do
{:ok, result} = Map.fetch(store, name)
{:reply, result, store}
end
def handle_cast({:store, name, value}, store) do
{:noreply, Map.put(store, name, value)}
end
end
@leaysgur
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment