diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2016-04-03 18:12:10 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2016-04-03 18:12:25 +0200 |
commit | 5757ad858cfa86b47a02a0389d3257c3284e1dbb (patch) | |
tree | cf6ef5d76f96cf673910a069056ef7f778f1f54e /tests/closure | |
parent | e2671aa401076cc2bb722ce3c777d7a74b8d71c9 (diff) | |
download | Nim-5757ad858cfa86b47a02a0389d3257c3284e1dbb.tar.gz |
fixes #3995
Diffstat (limited to 'tests/closure')
-rw-r--r-- | tests/closure/tflatmap.nim | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/tests/closure/tflatmap.nim b/tests/closure/tflatmap.nim new file mode 100644 index 000000000..240756424 --- /dev/null +++ b/tests/closure/tflatmap.nim @@ -0,0 +1,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) |