File: tsetutils.nim

package info (click to toggle)
nim 2.2.4-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,951,164 kB
  • sloc: sh: 24,599; ansic: 1,771; python: 1,493; makefile: 1,013; sql: 298; asm: 141; xml: 13
file content (69 lines) | stat: -rw-r--r-- 1,827 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
discard """
  matrix: "--mm:refc; --mm:orc"
  targets: "c js"
"""

import std/setutils
import std/assertions

type 
  Colors = enum
    red, green = 5, blue = 10
  Bar = enum
    bar0 = -1, bar1, bar2

template main =
  block: # toSet
    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')}

  block: # fullSet
    doAssert fullSet(Colors) == {red, green, blue}
    doAssert fullSet(char) == {0.chr..255.chr}
    doAssert fullSet(Bar) == {bar0, bar1, bar2}
    doAssert fullSet(bool) == {true, false}

  block: # complement
    doAssert {red, blue}.complement == {green}
    doAssert (complement {red, green, blue}).card == 0
    doAssert (complement {false}) == {true}
    doAssert {bar0}.complement == {bar1, bar2}
    doAssert {range[0..10](0), 1, 2, 3}.complement == {range[0..10](4), 5, 6, 7, 8, 9, 10}
    doAssert {'0'..'9'}.complement == {0.char..255.char} - {'0'..'9'}

  block: # `[]=`
    type A = enum
      a0, a1, a2, a3
    var s = {a0, a3}
    s[a0] = false
    s[a1] = false
    doAssert s == {a3}
    s[a2] = true
    s[a3] = true
    doAssert s == {a2, a3}
  
  block: # set symmetric difference (xor), https://github.com/nim-lang/RFCs/issues/554
    type T = set[range[0..15]]
    let x: T = {1, 4, 5, 8, 9}
    let y: T = {0, 2..6, 9}
    let res = symmetricDifference(x, y)
    doAssert res == {0, 1, 2, 3, 6, 8}
    doAssert res == (x + y - x * y)
    doAssert res == ((x - y) + (y - x))
    var z = x
    doAssert z == {1, 4, 5, 8, 9}
    doAssert z == x
    z.toggle(y)
    doAssert z == res
    z.toggle(y)
    doAssert z == x
    z.toggle({1, 5})
    doAssert z == {4, 8, 9}
    z.toggle({3, 8})
    doAssert z == {3, 4, 9}

main()
static: main()