mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 17:34:43 +00:00
110 lines
2.5 KiB
Nim
110 lines
2.5 KiB
Nim
import sugar
|
|
|
|
block dup_with_field:
|
|
type
|
|
Foo = object
|
|
col, pos: int
|
|
name: string
|
|
|
|
proc inc_col(foo: var Foo) = inc(foo.col)
|
|
proc inc_pos(foo: var Foo) = inc(foo.pos)
|
|
proc name_append(foo: var Foo, s: string) = foo.name &= s
|
|
|
|
let a = Foo(col: 1, pos: 2, name: "foo")
|
|
block:
|
|
let b = a.dup(inc_col, inc_pos):
|
|
_.pos = 3
|
|
name_append("bar")
|
|
inc_pos
|
|
|
|
doAssert(b == Foo(col: 2, pos: 4, name: "foobar"))
|
|
|
|
block:
|
|
let b = a.dup(inc_col, pos = 3, name = "bar"):
|
|
name_append("bar")
|
|
inc_pos
|
|
|
|
doAssert(b == Foo(col: 2, pos: 4, name: "barbar"))
|
|
|
|
import algorithm
|
|
|
|
var a = @[1, 2, 3, 4, 5, 6, 7, 8, 9]
|
|
doAssert dup(a, sort(_)) == sorted(a)
|
|
doAssert a.dup(sort) == sorted(a)
|
|
#Chaining:
|
|
var aCopy = a
|
|
aCopy.insert(10)
|
|
doAssert a.dup(insert(10)).dup(sort()) == sorted(aCopy)
|
|
|
|
import random
|
|
|
|
const b = @[0, 1, 2]
|
|
let c = b.dup shuffle()
|
|
doAssert b[0] == 0
|
|
doAssert b[1] == 1
|
|
|
|
#test collect
|
|
import sets, tables
|
|
|
|
let data = @["bird", "word"] # if this gets stuck in your head, its not my fault
|
|
doAssert collect(newSeq, for (i, d) in data.pairs: (if i mod 2 == 0: d)) == @["bird"]
|
|
doAssert collect(initTable(2), for (i, d) in data.pairs: {i: d}) == {0: "bird",
|
|
1: "word"}.toTable
|
|
doAssert initHashSet.collect(for d in data.items: {d}) == data.toHashSet
|
|
|
|
let x = collect(newSeqOfCap(4)):
|
|
for (i, d) in data.pairs:
|
|
if i mod 2 == 0: d
|
|
doAssert x == @["bird"]
|
|
|
|
# bug #12874
|
|
|
|
let bug1 = collect(
|
|
newSeq,
|
|
for (i, d) in data.pairs:(
|
|
block:
|
|
if i mod 2 == 0:
|
|
d
|
|
else:
|
|
d & d
|
|
)
|
|
)
|
|
doAssert bug1 == @["bird", "wordword"]
|
|
|
|
import strutils
|
|
let y = collect(newSeq):
|
|
for (i, d) in data.pairs:
|
|
try: parseInt(d) except: 0
|
|
doAssert y == @[0, 0]
|
|
|
|
let z = collect(newSeq):
|
|
for (i, d) in data.pairs:
|
|
case d
|
|
of "bird": "word"
|
|
else: d
|
|
doAssert z == @["word", "word"]
|
|
|
|
proc tforum =
|
|
let ans = collect(newSeq):
|
|
for y in 0..10:
|
|
if y mod 5 == 2:
|
|
for x in 0..y:
|
|
x
|
|
tforum()
|
|
|
|
block:
|
|
let x = collect:
|
|
for d in data.items:
|
|
when d is int: "word"
|
|
else: d
|
|
doAssert x == @["bird", "word"]
|
|
doAssert collect(for (i, d) in pairs(data): (i, d)) == @[(0, "bird"), (1, "word")]
|
|
doAssert collect(for d in data.items: (try: parseInt(d) except: 0)) == @[0, 0]
|
|
doAssert collect(for (i, d) in pairs(data): {i: d}) == {1: "word",
|
|
0: "bird"}.toTable
|
|
doAssert collect(for d in data.items: {d}) == data.toHashSet
|
|
|
|
# bug #14332
|
|
template foo =
|
|
discard collect(newSeq, for i in 1..3: i)
|
|
foo() |