1discard """
2  output: '''0
31
42
53
64
75
86
97
108
119
1210
135 5
147 7
159 9
160
170
180
190
201
212
2270
230
24'''
25"""
26
27when true:
28  proc main() =
29    let
30      lo=0
31      hi=10
32
33    iterator itA(): int =
34      for x in lo..hi:
35        yield x
36
37    for x in itA():
38      echo x
39
40    var y: int
41
42    iterator itB(): int =
43      while y <= hi:
44        yield y
45        inc y
46
47    y = 5
48    for x in itB():
49      echo x, " ", y
50      inc y
51
52  main()
53
54
55iterator infinite(): int {.closure.} =
56  var i = 0
57  while true:
58    yield i
59    inc i
60
61iterator take[T](it: iterator (): T, numToTake: int): T {.closure.} =
62  var i = 0
63  for x in it():
64    if i >= numToTake:
65      break
66    yield x
67    inc i
68
69# gives wrong reasult (3 times 0)
70for x in infinite.take(3):
71  echo x
72
73# does what we want
74let inf = infinite
75for x in inf.take(3):
76  echo x
77
78# bug #3583
79proc foo(f: (iterator(): int)) =
80  for i in f(): echo i
81
82let fIt = iterator(): int = yield 70
83foo fIt
84
85# bug #5321
86
87proc lineIter*(filename: string): iterator(): string =
88  result = iterator(): string {.closure.} =
89    for line in lines(filename):
90      yield line
91
92proc unused =
93  var count = 0
94  let iter = lineIter("temp10.nim")
95  for line in iter():
96    count += 1
97
98iterator lineIter2*(filename: string): string {.closure.} =
99  var f = open(filename, bufSize=8000)
100  defer: close(f)   # <-- commenting defer "solves" the problem
101  var res = newStringOfCap(80)
102  while f.readLine(res): yield res
103
104proc unusedB =
105  var count = 0
106  for line in lineIter2("temp10.nim"):
107    count += 1
108
109# bug #5519
110import os, algorithm
111
112iterator filesIt(path: string): auto {.closure.} =
113  var files = newSeq[string]()
114  var dirs = newSeq[string]()
115  for k, p in os.walkDir(path):
116    let (_, n, e) = p.splitFile
117    if e != "":
118      continue
119    case k
120    of pcFile, pcLinkToFile:
121      files.add(n)
122    else:
123      dirs.add(n)
124  files.sort(system.cmp)
125  dirs.sort(system.cmp)
126  for f in files:
127    yield f
128
129  for d in dirs:
130    files = newSeq[string]()
131    for k, p in os.walkDir(path / d):
132      let (_, n, e) = p.splitFile
133      if e != "":
134        continue
135      case k
136      of pcFile, pcLinkToFile:
137        files.add(n)
138      else:
139        discard
140    files.sort(system.cmp)
141    let prefix = path.splitPath[1]
142    for f in files:
143      yield prefix / f
144
145# bug #13815
146var love = iterator: int {.closure.} =
147  yield cast[type(
148    block:
149      var a = 0
150      yield a
151      a)](0)
152
153for i in love():
154  echo i
155