Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds toSet to create sets from iterables #16276

Merged
merged 15 commits into from
Dec 14, 2020
Merged
2 changes: 2 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@

- `strscans.scanf` now supports parsing single characters.

- Added `setutils.toSet` that can take any iteratable and convert it to a built-in set,
if the iteratable yields a built-in settable type.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

iteratable doesn't seem enligh; should be iterable


## Language changes

Expand Down
32 changes: 32 additions & 0 deletions lib/std/setutils.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#
#
# The Nim Compiler
# (c) Copyright 2020 Nim Contributors
#
# See the file "copying.txt", included in this
# distribution, for details about the copyright.
#

## This module adds functionality to the built-in `set` type.
## See also std/packedsets, std/sets

import typetraits

#[
type SetElement* = char|byte|bool|int16|uint16|enum|uint8|int8
## The allowed types of a built-in set.
]#

template toSet*(iter: untyped): untyped =
## Return a built-in set from the elements of iterable `iter`
runnableExamples:
timotheecour marked this conversation as resolved.
Show resolved Hide resolved
assert "helloWorld".toSet == {'W', 'd', 'e', 'h', 'l', 'o', 'r'}
assert toSet([10u16, 20, 30]) == {10u16, 20, 30}
assert [30u8, 100, 10].toSet == {10u8, 30, 100}
assert toSet(@[1321i16, 321, 90]) == {90i16, 321, 1321}
assert toSet([false]) == {false}
assert toSet(0u8..10) == {0u8..10}
var result: set[elementType(iter)]
for x in iter:
incl(result, x)
result
14 changes: 14 additions & 0 deletions tests/stdlib/tsetutils.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
discard """
targets: "c js"
"""
import std/setutils
timotheecour marked this conversation as resolved.
Show resolved Hide resolved

template main =
doAssert "abcbb".toSet == {'a', 'b', 'c'}
doAssert toSet([10u8, 12, 13]) == {10u8, 12, 13}
doAssert toSet(0u16..30) == {0u16..30}
type A = distinct char
doAssert [A('x')].toSet == {A('x')}

main()
static: main()