Current section
Files
Jump to
Current section
Files
priv/std_lib/map_set.ex
defmodule ElixirScript.MapSet do
@moduledoc false
defstruct set: []
def new() do
%MapSet{}
end
def size(set) do
length(set.set)
end
def to_list(set) do
set.set
end
def delete(set, term) do
%{ set | set: Elixir.List.remove(set.set, term) }
end
def put(set, term) do
case member?(set, term) do
false ->
%{ set | set: set.set ++ term }
true ->
set
end
end
def member?(set, term) do
set.set.indexOf(term) >= 0
end
def equal?(set1, set2) do
set1 === set2
end
def difference(set1, set2) do
do_difference(to_list(set1), set2, new())
end
def do_difference([], _, difference_set) do
difference_set
end
def do_difference(set1_list, set2, difference_set) do
term = hd(set1_list)
case member?(set2, term) do
true ->
do_difference(tl(set1_list), set2, difference_set)
false ->
do_difference(tl(set1_list), set2, %{ difference_set | set: difference_set.set ++ [term]})
end
end
def intersection(set1, set2) do
do_intersection(to_list(set1), set2, new())
end
def do_intersection([], _, intersection_set) do
intersection_set
end
def do_intersection(set1_list, set2, intersection_set) do
term = hd(set1_list)
case member?(set2, term) do
false ->
do_intersection(tl(set1_list), set2, intersection_set)
true ->
do_intersection(tl(set1_list), set2, %{ intersection_set | set: intersection_set.set ++ [term]})
end
end
def union(set1, set2) do
%{ set1 | set: set1.set ++ set2.set}
end
def disjoint?(set1, set2) do
size(intersection(set1, set2)) == 0
end
def subset?(set1, set2) do
do_subset?(to_list(set1), set2)
end
def do_subset?([], _) do
true
end
def do_subset?(set1_list, set2) do
term = hd(set1_list)
case member?(set2, term) do
false ->
false
true ->
do_subset?(tl(set1_list), set2)
end
end
end