Skip to content

Instantly share code, notes, and snippets.

@suhanlee
Last active March 24, 2018 16:18
Show Gist options
  • Save suhanlee/178316547f6b024349a4c8eb095ab3d1 to your computer and use it in GitHub Desktop.
Save suhanlee/178316547f6b024349a4c8eb095ab3d1 to your computer and use it in GitHub Desktop.
genserver behaviour
defmodule KeyValueStore do
use GenServer
def init(_) do
{:ok, HashDict.new}
end
def handle_cast({:put, key, value}, state) do
{:noreply, HashDict.put(state, key, value)}
end
def handle_call({:get, key}, _, state) do
{:reply, HadhDict.get(state, key), state}
end
def start do
GenServer.start(KeyValueStore, nil)
end
def put(pid, key, value) do
GenServer.cast(pid, {:put, key, value})
end
def get(pid, key) do
GenServer.call(pid, {:get, key})
end
end
defmodule KeyValueStore do
use GenServer
def init(_) do
:timer.send_interval(5000, :cleanup)
{:ok, HashDict.new}
end
def handle_info(:cleanup, state) do
IO.puts "performing cleanup..."
{:noreply, state}
end
def handle_info(_, state), do: {:noreply, state}
end
defmodule Todo.Database do
use GenServer
def start(db_folder) do
GenServer.start(__MODULE__, db_folder,
name: :database_server)
end
def store(key, data) do
GenServer.cast(:database_server, {:store, key, data})
end
def get(key) do
GenServer.call(:database_server, {:get, key})
end
def init(db_folder) do
File.mkdir_p(db_folder)
{:ok, db_folder)
end
def handle_cast({:store, key, data}, db_folder) do
file_name(db_folder, key)
|> File.write!(:erlang.term_to_binary(data))
{:noreply, db_folder}
end
def handle_call({:get, key}, _, db_folder) do
data = case File.read(file_name(db_folder, key)) do
{:ok, contents} -> :erlang.binary_to_term(contents)
_ -> nil
end
{:reply, data, db_folder}
end
defp file_name(db_folder, key), do: "#{db_folder}/#{key}"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment