Skip to content

Instantly share code, notes, and snippets.

@film42
Last active August 29, 2015 14:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save film42/d63f791820efd0256f73 to your computer and use it in GitHub Desktop.
Save film42/d63f791820efd0256f73 to your computer and use it in GitHub Desktop.
-module(erlish).
-export([init/0, manager/1, get/1, set/2, keys/0, del/1, expire/2]).
manager(State) ->
receive
{get, Key, Sender} ->
Value = case maps:is_key(Key, State) of
true ->
maps:get(Key, State);
_ ->
{error, [no_such_key, Key]}
end,
Sender ! Value,
manager(State);
{set, Key, Value, Sender} ->
New_State = maps:put(Key, Value, State),
Sender ! ok,
manager(New_State);
{del, Key, Sender} ->
New_State = maps:remove(Key, State),
Sender ! ok,
manager(New_State);
{keys, Sender} ->
Sender ! maps:keys(State),
manager(State);
{expire, Key, Seconds, Sender} ->
timer:send_after(Seconds * 1000, {del, Key, self()}),
Sender ! ok,
manager(State);
_ ->
manager(State)
end.
get(Key) ->
manager ! {get, Key, self()},
receive T -> T end.
set(Key, Value) ->
manager ! {set, Key, Value, self()},
receive T -> T end.
keys() ->
manager ! {keys, self()},
receive T -> T end.
del(Key) ->
manager ! {del, Key, self()},
receive T -> T end.
expire(Key, Seconds) ->
manager ! {expire, Key, Seconds, self()},
receive T -> T end.
init() ->
register(manager, spawn(erlish, manager, [#{}])).
73> erlish:init().
true
74> erlish:set(test, 123).
ok
75> erlish:expire(test, 10).
ok
76> erlish:get(test).
123
76> erlish:set(test, xyz).
ok
76> erlish:get(test).
xyz
77> erlish:get(test).
{error,[no_such_key,test]}
@mmmries
Copy link

mmmries commented May 4, 2015

Did you try using the receive...after... syntax instead of sending yourself a del message?d

receive
  {expire, Key, Seconds, Sender} -> ...
after
  1000 ->
    manager(remove_expired_keys(state))
end

@film42
Copy link
Author

film42 commented May 27, 2015

👍 Very cool!

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