Last active
December 19, 2017 10:00
-
-
Save leaysgur/08d514a89c6ec13329bcd20408e946d8 to your computer and use it in GitHub Desktop.
Minimal KVS implementation using `GenServer` in Elixir
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
KvSingle
Kv
(withKv.Server
andKv.Impl
)