Current section
Files
Jump to
Current section
Files
src/sprocket@internal@utils@ordered_map.erl
-module(sprocket@internal@utils@ordered_map).
-compile([no_auto_import, nowarn_unused_vars]).
-export([new/0, from/3, insert/3, update/3, has_key/2, get/2, remove/2, size/1, iter/1, next/1, fold/3]).
-export_type([keyed_item/2, ordered_map/2, ordered_map_iter/2]).
-type keyed_item(JKC, JKD) :: {keyed_item, JKC, JKD}.
-opaque ordered_map(JKE, JKF) :: {ordered_map,
list(keyed_item(JKE, JKF)),
gleam@map:map_(JKE, JKF),
integer()}.
-opaque ordered_map_iter(JKG, JKH) :: {ordered_map_iter,
list(keyed_item(JKG, JKH))}.
-spec new() -> ordered_map(any(), any()).
new() ->
{ordered_map, [], gleam@map:new(), 0}.
-spec from(list(keyed_item(JKM, JKN)), gleam@map:map_(JKM, JKN), integer()) -> ordered_map(JKM, JKN).
from(Ordered, Map, Size) ->
{ordered_map, Ordered, Map, Size}.
-spec insert(ordered_map(JKV, JKW), JKV, JKW) -> ordered_map(JKV, JKW).
insert(M, Key, Value) ->
{ordered_map,
gleam@list:reverse(
[{keyed_item, Key, Value} |
gleam@list:reverse(erlang:element(2, M))]
),
gleam@map:insert(erlang:element(3, M), Key, Value),
erlang:element(4, M) + 1}.
-spec update(ordered_map(JLB, JLC), JLB, JLC) -> ordered_map(JLB, JLC).
update(M, Key, Value) ->
case gleam@map:has_key(erlang:element(3, M), Key) of
true ->
{ordered_map,
gleam@list:map(
erlang:element(2, M),
fun(Keyed_item) ->
{keyed_item, K, _} = Keyed_item,
case K =:= Key of
true ->
{keyed_item, Key, Value};
false ->
Keyed_item
end
end
),
gleam@map:insert(erlang:element(3, M), Key, Value),
erlang:element(4, M)};
false ->
M
end.
-spec has_key(ordered_map(JLH, any()), JLH) -> boolean().
has_key(M, Key) ->
gleam@map:has_key(erlang:element(3, M), Key).
-spec get(ordered_map(JLL, JLM), JLL) -> {ok, JLM} | {error, nil}.
get(M, Key) ->
gleam@map:get(erlang:element(3, M), Key).
-spec remove(ordered_map(JLR, JLS), JLR) -> ordered_map(JLR, JLS).
remove(M, Key) ->
case gleam@map:has_key(erlang:element(3, M), Key) of
true ->
{ordered_map,
erlang:element(2, M),
gleam@map:delete(erlang:element(3, M), Key),
erlang:element(4, M) - 1};
false ->
M
end.
-spec size(ordered_map(any(), any())) -> integer().
size(M) ->
erlang:element(4, M).
-spec iter(ordered_map(JMB, JMC)) -> ordered_map_iter(JMB, JMC).
iter(M) ->
_pipe = erlang:element(2, M),
{ordered_map_iter, _pipe}.
-spec next(ordered_map_iter(JMH, JMI)) -> {ok,
{ordered_map_iter(JMH, JMI), keyed_item(JMH, JMI)}} |
{error, nil}.
next(Iter) ->
case Iter of
{ordered_map_iter, []} ->
{error, nil};
{ordered_map_iter, [Item | Rest]} ->
{ok, {{ordered_map_iter, Rest}, Item}}
end.
-spec fold(ordered_map(JMR, JMS), JMV, fun((JMV, keyed_item(JMR, JMS)) -> JMV)) -> JMV.
fold(M, Acc, Func) ->
_pipe = erlang:element(2, M),
gleam@list:fold(_pipe, Acc, Func).