Merge pull request #1361 from def-/setdiff

Add missing difference and  to sets module
This commit is contained in:
Andreas Rumpf
2014-07-15 19:07:08 +02:00
2 changed files with 31 additions and 1 deletions

View File

@@ -167,6 +167,13 @@ proc intersection*[A](s1, s2: TSet[A]): TSet[A] =
for item in s1:
if item in s2: incl(result, item)
proc difference*[A](s1, s2: TSet[A]): TSet[A] =
## returns a new set of all items that are contained in `s1`, but not in `s2`
result = initSet[A]()
for item in s1:
if not contains(s2, item):
incl(result, item)
proc symmetricDifference*[A](s1, s2: TSet[A]): TSet[A] =
## returns a new set of all items that are contained in either
## `s1` or `s2`, but not both
@@ -182,6 +189,10 @@ proc `*`*[A](s1, s2: TSet[A]): TSet[A] {.inline.} =
## alias for `intersection`
result = intersection(s1, s2)
proc `-`*[A](s1, s2: TSet[A]): TSet[A] {.inline.} =
## alias for `difference`
result = difference(s1, s2)
proc `-+-`*[A](s1, s2: TSet[A]): TSet[A] {.inline.} =
## alias for `symmetricDifference`
result = symmetricDifference(s1, s2)

View File

@@ -74,8 +74,27 @@ block symmetricDifference:
assert((s3 -+- s3) == initSet[int]())
assert((s3 -+- s1) == s1_s3)
block difference:
let
s1_s2 = difference(s1, s2)
s1_s3 = difference(s1, s3)
s2_s3 = s2 - s3
assert s1_s2.len == 2
assert s1_s3.len == 5
assert s2_s3.len == 3
for i in s1:
assert i in s1_s2 xor i in s2
assert i in s1_s3 xor i in s3
for i in s2:
assert i in s2_s3 xor i in s3
assert((s2 - s2) == initSet[int]())
assert((s1 - s3 - s1) == s1 -+- s3)
block disjoint:
assert(not disjoint(s1, s2))
assert disjoint(s1, s3)
assert(not disjoint(s2, s3))
assert(not disjoint(s2, s2))
assert(not disjoint(s2, s2))