34 lines
651 B
Erlang
34 lines
651 B
Erlang
-module(singleton).
|
|
|
|
-export([get/0, set/1, start/0]).
|
|
|
|
-export([loop/1]).
|
|
|
|
% spec singleton:get() -> {ok, Value::any()} | not_set
|
|
get() ->
|
|
?MODULE ! {get, self()},
|
|
receive
|
|
{ok, not_set} -> not_set;
|
|
Answer -> Answer
|
|
end.
|
|
|
|
% spec singleton:set(Value::any()) -> ok
|
|
set(Value) ->
|
|
?MODULE ! {set, self(), Value},
|
|
receive
|
|
ok -> ok
|
|
end.
|
|
|
|
start() ->
|
|
register(?MODULE, spawn(?MODULE, loop, [not_set])).
|
|
|
|
loop(Value) ->
|
|
receive
|
|
{get, From} ->
|
|
From ! {ok, Value},
|
|
loop(Value);
|
|
{set, From, NewValue} ->
|
|
From ! ok,
|
|
loop(NewValue)
|
|
end.
|