summary refs log tree commit diff stats
path: root/tests/closure/tflatmap.nim
blob: 240756424bee296da59eaa705e120b4279758cc8 (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
# bug #3995

import future

type
  RNG* = tuple[]
  Rand*[A] = (RNG) -> (A, RNG)

proc nextInt*(r: RNG): (int, RNG) =
  (1, ())

proc flatMap[A,B](f: Rand[A], g: A -> Rand[B]): Rand[B] =
  (rng: RNG) => (
    let (a, rng2) = f(rng);
    let g1 = g(a);
    g1(rng2)
  )

proc map[A,B](s: Rand[A], f: A -> B): Rand[B] =
  let g: A -> Rand[B] = (a: A) => ((rng: RNG) => (f(a), rng))
  flatMap(s, g)

let f = nextInt.map(i => i - i mod 2)