Skip to content

Commit 7d13d3b

Browse files
committed
Add list complements helper
1 parent 988b68b commit 7d13d3b

File tree

3 files changed

+38
-7
lines changed

3 files changed

+38
-7
lines changed

lib/beanie/helpers.ex

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
defmodule Beanie.Helpers do
2+
@doc """
3+
Computes the relative complements of two lists - the elements that
4+
are in the first list and not in the second set, and vice versa,
5+
returned as the first and second elements of a tuple, respectively.
6+
"""
7+
@spec relative_complements([term], [term]) :: {[term], [term]}
8+
def relative_complements(list1, list2)
9+
when is_list(list1) and is_list(list2) do
10+
set1 = MapSet.new(list1)
11+
set2 = MapSet.new(list2)
12+
13+
{
14+
set1 |> MapSet.difference(set2) |> MapSet.to_list,
15+
set2 |> MapSet.difference(set1) |> MapSet.to_list
16+
}
17+
end
18+
end

lib/beanie/repository/query.ex

+5-7
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@ defmodule Beanie.Repository.Query do
33
alias Beanie.Repo
44

55
alias Beanie.Repository
6+
alias Beanie.Helpers
67
alias Beanie.Tag
78

89
def update_list(names) do
9-
names = MapSet.new(names)
10-
existing_names = MapSet.new(all_names)
11-
new_names = MapSet.difference(names, existing_names)
12-
deleted_names = MapSet.difference(existing_names, names) |> MapSet.to_list
10+
{new_names, deleted_names} = Helpers.relative_complements(names, all_names)
1311

1412
new_names
1513
|> Enum.each(fn(name) ->
@@ -28,9 +26,9 @@ defmodule Beanie.Repository.Query do
2826

2927
def update_tag_list(repository, tags) do
3028
tag_names = Enum.map(tags, fn(tag) -> tag.name end) |> MapSet.new
31-
existing_names = MapSet.new(all_tag_names(repository))
32-
new_names = MapSet.difference(tag_names, existing_names)
33-
deleted_names = MapSet.difference(existing_names, tag_names) |> MapSet.to_list
29+
30+
{new_names, deleted_names} =
31+
Helpers.relative_complements(tag_names, all_tag_names(repository))
3432

3533
new_names
3634
|> Enum.map(fn(new_name) ->

test/beanie/helpers_test.exs

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
defmodule Beanie.HelpersTest do
2+
use ExUnit.Case
3+
4+
alias Beanie.Helpers
5+
6+
test "relative complements" do
7+
list1 = [1, 2, 3]
8+
list2 = [2, 4, 5]
9+
10+
in1_not2 = [1, 3]
11+
in2_not1 = [4, 5]
12+
13+
assert {in1_not2, in2_not1} == Helpers.relative_complements(list1, list2)
14+
end
15+
end

0 commit comments

Comments
 (0)