-module(sprocket@internal@utils@ordered_map). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([new/0, from/3, from_list/1, insert/3, update/3, has_key/2, get/2, remove/2, size/1, iter/1, next/1, fold/3, map/2, index_map/2, find_next/2, find_previous/2, find/2]). -export_type([keyed_item/2, ordered_map/2, ordered_map_iter/2]). -type keyed_item(IVM, IVN) :: {keyed_item, IVM, IVN}. -opaque ordered_map(IVO, IVP) :: {ordered_map, list(keyed_item(IVO, IVP)), gleam@dict:dict(IVO, IVP), integer()}. -opaque ordered_map_iter(IVQ, IVR) :: {ordered_map_iter, list(keyed_item(IVQ, IVR))}. -file("/home/runner/work/sprocket/sprocket/src/sprocket/internal/utils/ordered_map.gleam", 16). -spec new() -> ordered_map(any(), any()). new() -> {ordered_map, [], maps:new(), 0}. -file("/home/runner/work/sprocket/sprocket/src/sprocket/internal/utils/ordered_map.gleam", 20). -spec from(list(keyed_item(IVW, IVX)), gleam@dict:dict(IVW, IVX), integer()) -> ordered_map(IVW, IVX). from(Ordered, Map, Size) -> {ordered_map, Ordered, Map, Size}. -file("/home/runner/work/sprocket/sprocket/src/sprocket/internal/utils/ordered_map.gleam", 28). -spec from_list(list(keyed_item(IWF, IWG))) -> ordered_map(IWF, IWG). from_list(Ordered) -> {R_ordered, Map@1, Size@1} = begin _pipe = Ordered, gleam@list:fold( _pipe, {[], maps:new(), 0}, fun(Acc, Keyed_item) -> {Ordered@1, Map, Size} = Acc, {keyed_item, Key, Value} = Keyed_item, Keyed_item@1 = {keyed_item, Key, Value}, case gleam@dict:has_key(Map, Key) of true -> {Ordered@1, Map, Size}; false -> {[Keyed_item@1 | Ordered@1], gleam@dict:insert(Map, Key, Value), Size + 1} end end ) end, {ordered_map, lists:reverse(R_ordered), Map@1, Size@1}. -file("/home/runner/work/sprocket/sprocket/src/sprocket/internal/utils/ordered_map.gleam", 49). -spec insert(ordered_map(IWM, IWN), IWM, IWN) -> ordered_map(IWM, IWN). insert(M, Key, Value) -> {ordered_map, lists:reverse( [{keyed_item, Key, Value} | lists:reverse(erlang:element(2, M))] ), gleam@dict:insert(erlang:element(3, M), Key, Value), erlang:element(4, M) + 1}. -file("/home/runner/work/sprocket/sprocket/src/sprocket/internal/utils/ordered_map.gleam", 58). -spec update(ordered_map(IWS, IWT), IWS, IWT) -> ordered_map(IWS, IWT). update(M, Key, Value) -> case gleam@dict: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@dict:insert(erlang:element(3, M), Key, Value), erlang:element(4, M)}; false -> M end. -file("/home/runner/work/sprocket/sprocket/src/sprocket/internal/utils/ordered_map.gleam", 76). -spec has_key(ordered_map(IWY, any()), IWY) -> boolean(). has_key(M, Key) -> gleam@dict:has_key(erlang:element(3, M), Key). -file("/home/runner/work/sprocket/sprocket/src/sprocket/internal/utils/ordered_map.gleam", 80). -spec get(ordered_map(IXC, IXD), IXC) -> {ok, IXD} | {error, nil}. get(M, Key) -> gleam_stdlib:map_get(erlang:element(3, M), Key). -file("/home/runner/work/sprocket/sprocket/src/sprocket/internal/utils/ordered_map.gleam", 84). -spec remove(ordered_map(IXI, IXJ), IXI) -> ordered_map(IXI, IXJ). remove(M, Key) -> case gleam@dict:has_key(erlang:element(3, M), Key) of true -> {ordered_map, erlang:element(2, M), gleam@dict:delete(erlang:element(3, M), Key), erlang:element(4, M) - 1}; false -> M end. -file("/home/runner/work/sprocket/sprocket/src/sprocket/internal/utils/ordered_map.gleam", 96). -spec size(ordered_map(any(), any())) -> integer(). size(M) -> erlang:element(4, M). -file("/home/runner/work/sprocket/sprocket/src/sprocket/internal/utils/ordered_map.gleam", 100). -spec iter(ordered_map(IXS, IXT)) -> ordered_map_iter(IXS, IXT). iter(M) -> _pipe = erlang:element(2, M), {ordered_map_iter, _pipe}. -file("/home/runner/work/sprocket/sprocket/src/sprocket/internal/utils/ordered_map.gleam", 105). -spec next(ordered_map_iter(IXY, IXZ)) -> {ok, {ordered_map_iter(IXY, IXZ), keyed_item(IXY, IXZ)}} | {error, nil}. next(Iter) -> case Iter of {ordered_map_iter, []} -> {error, nil}; {ordered_map_iter, [Item | Rest]} -> {ok, {{ordered_map_iter, Rest}, Item}} end. -file("/home/runner/work/sprocket/sprocket/src/sprocket/internal/utils/ordered_map.gleam", 115). -spec fold(ordered_map(IYI, IYJ), IYM, fun((IYM, keyed_item(IYI, IYJ)) -> IYM)) -> IYM. fold(M, Acc, Func) -> _pipe = erlang:element(2, M), gleam@list:fold(_pipe, Acc, Func). -file("/home/runner/work/sprocket/sprocket/src/sprocket/internal/utils/ordered_map.gleam", 121). -spec map(ordered_map(IYP, IYQ), fun((keyed_item(IYP, IYQ)) -> IYV)) -> list(IYV). map(M, Func) -> _pipe = erlang:element(2, M), gleam@list:map(_pipe, Func). -file("/home/runner/work/sprocket/sprocket/src/sprocket/internal/utils/ordered_map.gleam", 127). -spec index_map( ordered_map(IYX, IYY), fun((keyed_item(IYX, IYY), integer()) -> IZD) ) -> list(IZD). index_map(M, Func) -> _pipe = erlang:element(2, M), gleam@list:index_map(_pipe, Func). -file("/home/runner/work/sprocket/sprocket/src/sprocket/internal/utils/ordered_map.gleam", 150). -spec find_next_helper(list(keyed_item(any(), IZM))) -> {ok, IZM} | {error, nil}. find_next_helper(Ordered) -> case Ordered of [Item | _] -> {ok, erlang:element(3, Item)}; _ -> {error, nil} end. -file("/home/runner/work/sprocket/sprocket/src/sprocket/internal/utils/ordered_map.gleam", 136). -spec find_next(ordered_map(IZF, IZG), IZF) -> {ok, IZG} | {error, nil}. find_next(M, Key) -> case erlang:element(2, M) of [] -> {error, nil}; [Item | Rest] -> case Item of {keyed_item, K, _} -> case K =:= Key of true -> find_next_helper(Rest); false -> find_next( {ordered_map, Rest, erlang:element(3, M), erlang:element(4, M)}, Key ) end end end. -file("/home/runner/work/sprocket/sprocket/src/sprocket/internal/utils/ordered_map.gleam", 162). -spec find_previous_helper(ordered_map(IZY, IZZ), IZY, {ok, IZZ} | {error, nil}) -> {ok, IZZ} | {error, nil}. find_previous_helper(M, Key, Prev) -> case erlang:element(2, M) of [] -> {error, nil}; [Item | Rest] -> case Item of {keyed_item, K, V} -> case K =:= Key of true -> Prev; false -> find_previous_helper( {ordered_map, Rest, erlang:element(3, M), erlang:element(4, M)}, Key, {ok, V} ) end end end. -file("/home/runner/work/sprocket/sprocket/src/sprocket/internal/utils/ordered_map.gleam", 158). -spec find_previous(ordered_map(IZS, IZT), IZS) -> {ok, IZT} | {error, nil}. find_previous(M, Key) -> find_previous_helper(M, Key, {error, nil}). -file("/home/runner/work/sprocket/sprocket/src/sprocket/internal/utils/ordered_map.gleam", 181). -spec find(ordered_map(JAG, JAH), fun((keyed_item(JAG, JAH)) -> boolean())) -> {ok, keyed_item(JAG, JAH)} | {error, nil}. find(M, Find_by) -> case erlang:element(2, M) of [] -> {error, nil}; [Item | Rest] -> case Item of {keyed_item, K, V} -> case Find_by(Item) of true -> {ok, {keyed_item, K, V}}; false -> find( {ordered_map, Rest, erlang:element(3, M), erlang:element(4, M)}, Find_by ) end end end.