Packages
ra
2.15.4
3.1.9
3.1.8
3.1.7
3.1.6
3.1.5
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.2
3.0.1
3.0.0
3.0.0-beta.1
2.17.3
2.17.2
2.17.1
2.17.0
2.16.13
2.16.12
2.16.11
2.16.10
2.16.9
2.16.8
2.16.7
2.16.6
2.16.5
2.16.4
2.16.3
2.16.2
2.16.1
2.16.0
2.16.0-pre.12
2.16.0-pre.11
2.16.0-pre.10
2.16.0-pre.9
2.16.0-pre.8
2.16.0-pre.7
2.16.0-pre.6
2.16.0-pre.5
2.16.0-pre.4
2.16.0-pre.3
2.16.0-pre.2
2.16.0-pre.1
2.15.4
2.15.3
2.15.2
2.15.1
2.15.0
2.14.0
2.13.6
2.13.5
2.13.4
2.13.3
2.13.2
2.13.1
2.13.0
2.13.0-pre.1
2.12.0
2.11.0
2.11.0-pre.1
2.10.2-pre.2
2.10.2-pre.1
2.10.1
2.10.0
2.10.0-pre.3
2.10.0-pre.2
2.10.0-pre.1
2.9.10-pre.1
2.9.1
2.9.1-pre.2
2.9.1-pre.1
2.9.0
2.8.0
retired
2.7.3
2.7.2
2.7.1
2.7.0
2.7.0-pre.3
2.7.0-pre.2
2.7.0-pre.1
2.6.3
2.6.2
2.6.1
2.6.0-pre.1
2.5.1
2.5.1-pre.1
2.5.0
2.4.9
2.4.8
2.4.7
2.4.6
2.4.5
2.4.4
2.4.3
2.4.2
retired
2.4.1
2.4.0
2.3.0
2.2.0
2.1.0
2.0.13
2.0.12
2.0.11
2.0.10
2.0.9
2.0.8
2.0.7
2.0.6
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.9.6
0.9.5
0.9.4
0.9.2
0.3.3
retired
0.3.2
retired
0.3.1
retired
Raft library
Current section
Files
Jump to
Current section
Files
src/ra_ets_queue.erl
-module(ra_ets_queue).
-export([
new/0,
in/2,
reset/1,
take/2,
len/1
]).
-record(?MODULE, {tbl :: ets:tid(),
next_key = 0 :: non_neg_integer(),
len = 0 :: non_neg_integer(),
queue = queue:new() :: queue:queue()}).
-opaque state() :: #?MODULE{}.
-type item() :: term().
-export_type([
state/0
]).
-spec new() -> state().
new() ->
Tid = ets:new(?MODULE, [set, private]),
#?MODULE{tbl = Tid}.
-spec in(item(), state()) -> state().
in(Item, #?MODULE{tbl = Tbl,
queue = Q,
len = Len,
next_key = NextKey} = State) ->
true = ets:insert(Tbl, {NextKey, Item}),
State#?MODULE{next_key = NextKey + 1,
len = Len + 1,
queue = queue:in(NextKey, Q)}.
-spec len(state()) -> non_neg_integer().
len(#?MODULE{len = Len}) ->
Len.
-spec reset(state()) -> state().
reset(#?MODULE{tbl = Tbl}) ->
true = ets:delete_all_objects(Tbl),
#?MODULE{tbl = Tbl,
len = 0,
queue = queue:new()}.
-spec take(non_neg_integer(), state()) ->
{[item()], state()}.
take(Num, #?MODULE{tbl = Tbl,
len = Len,
queue = Q0} = State) ->
{Q, Taken, Out} = queue_take(Num, Q0, Tbl),
{Out, State#?MODULE{len = Len - Taken,
queue = Q}}.
%% Internal
queue_take(N, Q, Tbl) ->
queue_take(N, Q, Tbl, 0, []).
queue_take(0, Q, _Tbl, Taken, Acc) ->
{Q, Taken, lists:reverse(Acc)};
queue_take(N, Q0, Tbl, Taken, Acc) ->
case queue:out(Q0) of
{{value, Key}, Q} ->
[{Key, I}] = ets:take(Tbl, Key),
queue_take(N - 1, Q, Tbl, Taken + 1,
[I | Acc]);
{empty, _} ->
{Q0, Taken, lists:reverse(Acc)}
end.