diff options
author | ee7 <45465154+ee7@users.noreply.github.com> | 2020-10-02 21:10:24 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-02 21:10:24 +0200 |
commit | d48b356e493a7a7f6e2cf9855de893f811b2e9ad (patch) | |
tree | 65727ce1e38fa178fe7ab144a049d38a29ccb1c4 | |
parent | 7ef22bf9120e3051fadd14532e4f65fcd1558681 (diff) | |
download | Nim-d48b356e493a7a7f6e2cf9855de893f811b2e9ad.tar.gz |
intsets.nim: Add `toIntSet` proc (#15460)
Similar to: - `critbits.toCritBitTree` - `deques.toDeque` - `sets.toHashSet` - `tables.toTable`
-rw-r--r-- | changelog.md | 5 | ||||
-rw-r--r-- | lib/pure/collections/intsets.nim | 28 |
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 |