Add gm_ctflow_state #1

Merged
uwiger merged 2 commits from uw-add-state-api into master 2026-05-30 20:17:05 +09:00
4 changed files with 95 additions and 4 deletions
Showing only changes of commit 2ea1966973 - Show all commits
+26 -1
View File
@@ -1,5 +1,30 @@
-module(gm_ctflow).
-type flow() :: any().
-export([ put/2
, get/1
, get/2
, erase/1
]).
-type flow() :: any().
-type key() :: any().
-type value() :: any().
-export_type([ flow/0 ]).
-spec put(key(), value()) -> 'ok'.
put(Key, Value) ->
gm_ctflow_state:put(Key, Value).
-spec get(key()) -> value() | no_return().
get(Key) ->
gm_ctflow_state:get(Key).
-spec get(key(), Default) -> value()
when Default :: value().
get(Key, Default) ->
gm_ctflow_state:get(Key, Default).
-spec erase(key()) -> 'ok'.
erase(Key) ->
gm_ctflow_state:erase(Key).
+1
View File
@@ -10,6 +10,7 @@
-export([start/2, stop/1]).
start(_StartType, _StartArgs) ->
gm_ctflow_state:init(),
gm_ctflow_sup:start_link().
stop(_State) ->
+42
View File
@@ -0,0 +1,42 @@
-module(gm_ctflow_state).
-export([ init/0
, put/2
, get/1
, get/2
, erase/1 ]).
-type key() :: any().
-type value() :: any().
init() ->
ets:new(?MODULE, [ordered_set, public, named_table]).
-spec put(key(), value()) -> 'ok'.
put(Key, Value) ->
ets:insert(?MODULE, {Key, Value}),
ok.
-spec get(key()) -> value() | no_return().
get(Key) ->
case ets:lookup(?MODULE, Key) of
[] ->
error({no_such_key, Key});
[{_, Value}] ->
Value
end.
-spec get(key(), Default) -> value()
when Default :: value().
get(Key, Default) ->
case ets:lookup(?MODULE, Key) of
[{_, Value}] ->
Value;
[] ->
Default
end.
erase(Key) ->
ets:delete(?MODULE, Key),
ok.
+26 -3
View File
@@ -11,7 +11,10 @@
]).
%% test cases
-export([ init_counter/1
-export([ put_a/1
, get_a/1
, erase_a/1
, init_counter/1
, incr/1
, check1/1
, check2/1
@@ -27,12 +30,17 @@
all() ->
[
{group, statefuns}
{group, state}
, {group, statefuns}
, {group, workers}
].
groups() ->
[ {statefuns, [sequence], [ init_counter
[ {state, [sequence], [ put_a
, get_a
, erase_a
]}
, {statefuns, [sequence], [ init_counter
, incr
, check1 %% state = 1
, incr
@@ -71,6 +79,21 @@ init_per_testcase(_Case, Config) ->
end_per_testcase(_Case, _Config) ->
ok.
%% ======================================================================
%% State update commands
put_a(_Cfg) ->
ok = gm_ctflow:put(a, 1),
?assertMatch(1, gm_ctflow:get(a)).
get_a(_Cfg) ->
?assertMatch(1, gm_ctflow:get(a)).
erase_a(_Cfg) ->
ok = gm_ctflow:erase(a),
?assertException(error, {no_such_key,a}, gm_ctflow:get(a)),
?assertMatch(undefined, gm_ctflow:get(a, undefined)).
%% ======================================================================
%% This is our 'ctflow_fun' instance, which floats above some simple
%% test cases. In this test suite, we only exercise the flow funs, but