File: tgeniteratorinblock.nim

package info (click to toggle)
nim 2.2.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,911,644 kB
  • sloc: sh: 24,603; ansic: 1,761; python: 1,492; makefile: 1,013; sql: 298; asm: 141; xml: 13
file content (54 lines) | stat: -rw-r--r-- 1,061 bytes parent folder | download | duplicates (2)
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
discard """
  output: '''30
60
90
150
180
210
240
60
180
240
[60, 180, 240]
[60, 180]'''
"""
import std/enumerate

template map[T; Y](i: iterable[T], fn: proc(x: T): Y): untyped =
  iterator internal(): Y  {.gensym.} =
    for it in i:
      yield fn(it)
  internal()

template filter[T](i: iterable[T], fn: proc(x: T): bool): untyped =
  iterator internal(): T {.gensym.} =
    for it in i:
      if fn(it):
        yield it
  internal()

template group[T](i: iterable[T], amount: static int): untyped =
  iterator internal(): array[amount, T] {.gensym.} =
    var val: array[amount, T]
    for ind, it in enumerate i:
      val[ind mod amount] = it
      if ind mod amount == amount - 1:
        yield val
  internal()

var a = [10, 20, 30, 50, 60, 70, 80]

proc mapFn(x: int): int = x * 3
proc filterFn(x: int): bool = x mod 20 == 0

for x in a.items.map(mapFn):
  echo x

for y in a.items.map(mapFn).filter(filterFn):
  echo y

for y in a.items.map(mapFn).filter(filterFn).group(3):
  echo y

for y in a.items.map(mapFn).filter(filterFn).group(2):
  echo y