blob: 345a4867ad1cf735f1903b62eaa9d11f88cab111 (
plain) (
tree)
|
|
discard """
output: '''0
1
2
3
4
5
6
7
8
9
10
5 5
7 7
9 9
0
0
0
0
1
2
70'''
"""
when true:
proc main() =
let
lo=0
hi=10
iterator itA(): int =
for x in lo..hi:
yield x
for x in itA():
echo x
var y: int
iterator itB(): int =
while y <= hi:
yield y
inc y
y = 5
for x in itB():
echo x, " ", y
inc y
main()
iterator infinite(): int {.closure.} =
var i = 0
while true:
yield i
inc i
iterator take[T](it: iterator (): T, numToTake: int): T {.closure.} =
var i = 0
for x in it():
if i >= numToTake:
break
yield x
inc i
# gives wrong reasult (3 times 0)
for x in infinite.take(3):
echo x
# does what we want
let inf = infinite
for x in inf.take(3):
echo x
# bug #3583
proc foo(f: (iterator(): int)) =
for i in f(): echo i
let fIt = iterator(): int = yield 70
foo fIt
# bug #5321
proc lineIter*(filename: string): iterator(): string =
result = iterator(): string {.closure.} =
for line in lines(filename):
yield line
proc unused =
var count = 0
let iter = lineIter("temp10.nim")
for line in iter():
count += 1
iterator lineIter2*(filename: string): string {.closure.} =
var f = open(filename, bufSize=8000)
defer: close(f) # <-- commenting defer "solves" the problem
var res = TaintedString(newStringOfCap(80))
while f.readLine(res): yield res
proc unusedB =
var count = 0
for line in lineIter2("temp10.nim"):
count += 1
# bug #5519
import os, algorithm
iterator filesIt(path: string): auto {.closure.} =
var files = newSeq[string]()
var dirs = newSeq[string]()
for k, p in os.walkDir(path):
let (_, n, e) = p.splitFile
if e != "":
continue
case k
of pcFile, pcLinkToFile:
files.add(n)
else:
dirs.add(n)
files.sort(system.cmp)
dirs.sort(system.cmp)
for f in files:
yield f
for d in dirs:
files = newSeq[string]()
for k, p in os.walkDir(path / d):
let (_, n, e) = p.splitFile
if e != "":
continue
case k
of pcFile, pcLinkToFile:
files.add(n)
else:
discard
files.sort(system.cmp)
let prefix = path.splitPath[1]
for f in files:
yield prefix / f
|