summary refs log tree commit diff stats
path: root/tests/iter/tmoditer.nim
blob: 34c6321ce38e78e6a022951d80c9a59ad91a3e1d (plain) (blame)
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
discard """
  output: "XXXXX01234"
"""

iterator modPairs(a: var array[0..4,string]): tuple[key: int, val: var string] =
  for i in 0..a.high:
    yield (i, a[i])

iterator modItems*[T](a: var array[0..4,T]): var T =
  for i in 0..a.high:
    yield a[i]

var
  arr = ["a", "b", "c", "d", "e"]

for a in modItems(arr):
  a = "X"

for a in items(arr):
  stdout.write(a)

for i, a in modPairs(arr):
  a = $i

for a in items(arr):
  stdout.write(a)

echo ""

#--------------------------------------------------------------------
# Lent iterators
#--------------------------------------------------------------------
type
  NonCopyable = object
    x: int


proc `=destroy`(o: var NonCopyable) =
  discard

proc `=copy`(dst: var NonCopyable, src: NonCopyable) {.error.}

proc `=sink`(dst: var NonCopyable, src: NonCopyable) =
  dst.x = src.x

iterator lentItems[T](a: openarray[T]): lent T =
  for i in 0..a.high:
    yield a[i]

iterator lentPairs[T](a: array[0..1, T]): tuple[key: int, val: lent T] =
  for i in 0..a.high:
    yield (i, a[i])


let arr1 = [1, 2, 3]
let arr2 = @["a", "b", "c"]
let arr3 = [NonCopyable(x: 1), NonCopyable(x: 2)]
let arr4 = @[(1, "a"), (2, "b"), (3, "c")]

var accum: string
for x in lentItems(arr1):
  accum &= $x
doAssert(accum == "123")

accum = ""
for x in lentItems(arr2):
  accum &= $x
doAssert(accum == "abc")

accum = ""
for val in lentItems(arr3):
  accum &= $val.x
doAssert(accum == "12")

accum = ""
for i, val in lentPairs(arr3):
  accum &= $i & "-" & $val.x & " "
doAssert(accum == "0-1 1-2 ")

accum = ""
for i, val in lentItems(arr4):
  accum &= $i & "-" & $val & " "
doAssert(accum == "1-a 2-b 3-c ")

accum = ""
for (i, val) in lentItems(arr4):
  accum &= $i & "-" & $val & " "
doAssert(accum == "1-a 2-b 3-c ")