summary refs log tree commit diff stats
diff options
context:
space:
mode:
authoree7 <45465154+ee7@users.noreply.github.com>2020-10-02 21:10:24 +0200
committerGitHub <noreply@github.com>2020-10-02 21:10:24 +0200
commitd48b356e493a7a7f6e2cf9855de893f811b2e9ad (patch)
tree65727ce1e38fa178fe7ab144a049d38a29ccb1c4
parent7ef22bf9120e3051fadd14532e4f65fcd1558681 (diff)
downloadNim-d48b356e493a7a7f6e2cf9855de893f811b2e9ad.tar.gz
intsets.nim: Add `toIntSet` proc (#15460)
Similar to:
- `critbits.toCritBitTree`
- `deques.toDeque`
- `sets.toHashSet`
- `tables.toTable`
-rw-r--r--changelog.md5
-rw-r--r--lib/pure/collections/intsets.nim28
2 files changed, 30 insertions, 3 deletions
diff --git a/changelog.md b/changelog.md
index 219d085b1..7d1217f97 100644
--- a/changelog.md
+++ b/changelog.md
@@ -201,6 +201,11 @@
 
 - Add `readLines(p: Process)` to `osproc` module for `startProcess` convenience.
 
+- Added `intsets.toIntSet`, which creates an IntSet from an openArray. The usage
+  is similar to procs such as `sets.toHashSet` and `tables.toTable`. Previously,
+  it was necessary to create an empty IntSet and add items manually.
+
+
 ## Language changes
 
 - The `=destroy` hook no longer has to reset its target, as the compiler now automatically inserts
diff --git a/lib/pure/collections/intsets.nim b/lib/pure/collections/intsets.nim
index eae3fa447..3be453e29 100644
--- a/lib/pure/collections/intsets.nim
+++ b/lib/pure/collections/intsets.nim
@@ -18,9 +18,8 @@
 ## **See also:**
 ## * `sets module <sets.html>`_ for more general hash sets
 
-
-import
-  hashes
+import std/private/since
+import hashes
 
 type
   BitScalar = uint
@@ -161,6 +160,9 @@ iterator items*(s: IntSet): int {.inline.} =
 
 proc initIntSet*: IntSet =
   ## Returns an empty IntSet.
+  ##
+  ## See also:
+  ## * `toIntSet proc <#toIntSet,openArray[int]>`_
   runnableExamples:
     var a = initIntSet()
     assert len(a) == 0
@@ -251,6 +253,24 @@ proc incl*(s: var IntSet, other: IntSet) =
 
   for item in other: incl(s, item)
 
+proc toIntSet*(x: openArray[int]): IntSet {.since: (1, 3).} =
+  ## Creates a new IntSet that contains the elements of `x`.
+  ##
+  ## Duplicates are removed.
+  ##
+  ## See also:
+  ## * `initIntSet proc <#initIntSet>`_
+  runnableExamples:
+    var
+      a = toIntSet([5, 6, 7])
+      b = toIntSet(@[1, 8, 8, 8])
+    assert len(a) == 3
+    assert len(b) == 2
+
+  result = initIntSet()
+  for item in items(x):
+    result.incl(item)
+
 proc containsOrIncl*(s: var IntSet, key: int): bool =
   ## Includes `key` in the set `s` and tells if `key` was already in `s`.
   ##
@@ -585,6 +605,8 @@ when isMainModule:
   x.incl(1044)
   x.excl(1044)
 
+  assert x == [1, 2, 7, 1056].toIntSet
+
   assert x.containsOrIncl(888) == false
   assert 888 in x
   assert x.containsOrIncl(888) == true