tsugar.nim 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import sugar
  2. block dup_with_field:
  3. type
  4. Foo = object
  5. col, pos: int
  6. name: string
  7. proc inc_col(foo: var Foo) = inc(foo.col)
  8. proc inc_pos(foo: var Foo) = inc(foo.pos)
  9. proc name_append(foo: var Foo, s: string) = foo.name &= s
  10. let a = Foo(col: 1, pos: 2, name: "foo")
  11. block:
  12. let b = a.dup(inc_col, inc_pos):
  13. _.pos = 3
  14. name_append("bar")
  15. inc_pos
  16. doAssert(b == Foo(col: 2, pos: 4, name: "foobar"))
  17. block:
  18. let b = a.dup(inc_col, pos = 3, name = "bar"):
  19. name_append("bar")
  20. inc_pos
  21. doAssert(b == Foo(col: 2, pos: 4, name: "barbar"))
  22. import algorithm
  23. var a = @[1, 2, 3, 4, 5, 6, 7, 8, 9]
  24. doAssert dup(a, sort(_)) == sorted(a)
  25. doAssert a.dup(sort) == sorted(a)
  26. #Chaining:
  27. var aCopy = a
  28. aCopy.insert(10)
  29. doAssert a.dup(insert(10)).dup(sort()) == sorted(aCopy)
  30. import random
  31. const b = @[0, 1, 2]
  32. let c = b.dup shuffle()
  33. doAssert b[0] == 0
  34. doAssert b[1] == 1
  35. #test collect
  36. import sets, tables
  37. let data = @["bird", "word"] # if this gets stuck in your head, its not my fault
  38. assert collect(newSeq, for (i, d) in data.pairs: (if i mod 2 == 0: d)) == @["bird"]
  39. assert collect(initTable(2), for (i, d) in data.pairs: {i: d}) == {0: "bird",
  40. 1: "word"}.toTable
  41. assert initHashSet.collect(for d in data.items: {d}) == data.toHashSet
  42. let x = collect(newSeqOfCap(4)):
  43. for (i, d) in data.pairs:
  44. if i mod 2 == 0: d
  45. assert x == @["bird"]
  46. # bug #12874
  47. let bug1 = collect(
  48. newSeq,
  49. for (i, d) in data.pairs:(
  50. block:
  51. if i mod 2 == 0:
  52. d
  53. else:
  54. d & d
  55. )
  56. )
  57. assert bug1 == @["bird", "wordword"]
  58. import strutils
  59. let y = collect(newSeq):
  60. for (i, d) in data.pairs:
  61. try: parseInt(d) except: 0
  62. assert y == @[0, 0]
  63. let z = collect(newSeq):
  64. for (i, d) in data.pairs:
  65. case d
  66. of "bird": "word"
  67. else: d
  68. assert z == @["word", "word"]
  69. proc tforum =
  70. let ans = collect(newSeq):
  71. for y in 0..10:
  72. if y mod 5 == 2:
  73. for x in 0..y:
  74. x
  75. tforum()
  76. block:
  77. let x = collect:
  78. for d in data.items:
  79. when d is int: "word"
  80. else: d
  81. assert x == @["bird", "word"]
  82. assert collect(for (i, d) in pairs(data): (i, d)) == @[(0, "bird"), (1, "word")]
  83. assert collect(for d in data.items: (try: parseInt(d) except: 0)) == @[0, 0]
  84. assert collect(for (i, d) in pairs(data): {i: d}) == {1: "word",
  85. 0: "bird"}.toTable
  86. assert collect(for d in data.items: {d}) == data.toHashSet
  87. # bug #14332
  88. template foo =
  89. discard collect(newSeq, for i in 1..3: i)
  90. foo()