Packages
gleam_stdlib
0.35.0
1.0.3
1.0.2
1.0.1
1.0.0
0.71.0
0.70.0
0.69.0
0.68.1
0.68.0
0.67.1
0.67.0
0.65.0
0.64.0
0.63.2
0.63.1
0.63.0
0.62.1
0.62.0
0.61.0
0.60.0
0.59.0
0.58.0
0.57.0
0.56.0
0.55.0
0.54.0
0.53.0
0.52.0
0.51.0
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.43.0
0.42.0
0.41.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.1
0.35.0
0.34.0
0.33.1
0.33.0
0.32.1
0.32.0
0.31.0
0.30.2
0.30.1
0.30.0
0.29.2
0.29.1
0.29.0
0.28.2
0.28.1
0.28.0
0.27.0
0.26.1
0.26.0
0.25.0
0.24.0
0.23.0
0.22.3
0.22.2
0.22.1
0.22.0
0.21.0
0.20.0
0.19.3
0.19.2
0.19.1
0.19.0
0.18.1
0.18.0
0.18.0-rc1
0.17.1
0.17.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.1
0.10.0
0.9.0
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.4.0-rc1
0.3.1
0.3.0
0.2.0
retired
A standard library for the Gleam programming language
Current section
Files
Jump to
Current section
Files
src/gleam@set.erl
-module(gleam@set).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([new/0, size/1, contains/2, delete/2, to_list/1, fold/3, filter/2, drop/2, take/2, intersection/2, difference/2, insert/2, from_list/1, union/2]).
-export_type([set/1]).
-opaque set(EWL) :: {set, gleam@dict:dict(EWL, list(nil))}.
-spec new() -> set(any()).
new() ->
{set, gleam@dict:new()}.
-spec size(set(any())) -> integer().
size(Set) ->
maps:size(erlang:element(2, Set)).
-spec contains(set(EWU), EWU) -> boolean().
contains(Set, Member) ->
_pipe = erlang:element(2, Set),
_pipe@1 = gleam@dict:get(_pipe, Member),
gleam@result:is_ok(_pipe@1).
-spec delete(set(EWW), EWW) -> set(EWW).
delete(Set, Member) ->
{set, gleam@dict:delete(erlang:element(2, Set), Member)}.
-spec to_list(set(EWZ)) -> list(EWZ).
to_list(Set) ->
gleam@dict:keys(erlang:element(2, Set)).
-spec fold(set(EXF), EXH, fun((EXH, EXF) -> EXH)) -> EXH.
fold(Set, Initial, Reducer) ->
gleam@dict:fold(
erlang:element(2, Set),
Initial,
fun(A, K, _) -> Reducer(A, K) end
).
-spec filter(set(EXI), fun((EXI) -> boolean())) -> set(EXI).
filter(Set, Predicate) ->
{set,
gleam@dict:filter(erlang:element(2, Set), fun(M, _) -> Predicate(M) end)}.
-spec drop(set(EXL), list(EXL)) -> set(EXL).
drop(Set, Disallowed) ->
gleam@list:fold(Disallowed, Set, fun delete/2).
-spec take(set(EXP), list(EXP)) -> set(EXP).
take(Set, Desired) ->
{set, gleam@dict:take(erlang:element(2, Set), Desired)}.
-spec order(set(EXT), set(EXT)) -> {set(EXT), set(EXT)}.
order(First, Second) ->
case maps:size(erlang:element(2, First)) > maps:size(
erlang:element(2, Second)
) of
true ->
{First, Second};
false ->
{Second, First}
end.
-spec intersection(set(EYC), set(EYC)) -> set(EYC).
intersection(First, Second) ->
{Larger, Smaller} = order(First, Second),
take(Larger, to_list(Smaller)).
-spec difference(set(EYG), set(EYG)) -> set(EYG).
difference(First, Second) ->
drop(First, to_list(Second)).
-spec insert(set(EWR), EWR) -> set(EWR).
insert(Set, Member) ->
{set, gleam@dict:insert(erlang:element(2, Set), Member, [])}.
-spec from_list(list(EXC)) -> set(EXC).
from_list(Members) ->
Map = gleam@list:fold(
Members,
gleam@dict:new(),
fun(M, K) -> gleam@dict:insert(M, K, []) end
),
{set, Map}.
-spec union(set(EXY), set(EXY)) -> set(EXY).
union(First, Second) ->
{Larger, Smaller} = order(First, Second),
fold(Smaller, Larger, fun insert/2).