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
|
discard """
output: '''--- evens
2
4
6
8
--- squares
1
4
9
16
25
36
49
64
81
'''
"""
iterator `/`[T](sequence: seq[T],
filter: proc(e:T):bool {.closure.}) : T =
for element in sequence:
if (filter(element)):
yield element
iterator `>>`[I,O](sequence: seq[I],
map: proc(e:I):O {.closure.}) : O =
for element in sequence:
yield map(element)
iterator `/>>`[I,O](sequence: seq[I],
filtermap:tuple[
f:proc(e:I):bool {.closure.},
m:proc(e:I):O {.closure.}]) : O =
for element in sequence:
if (filtermap.f(element)):
yield filtermap.m(element)
proc isEven(x:int): bool =
(x and 1) == 0
proc square(x:int): int =
x * x
let list = @[1,2,3,4,5,6,7,8,9]
echo ("--- evens")
for item in list / isEven: echo(item)
echo ("--- squares")
for item in list >> square: echo(item)
#echo ("--- squares of evens, only")
# next line doesn't compile. Generic types are not inferred
#for item in list />> (isEven, square) : echo(item)
|