summary refs log tree commit diff stats
path: root/tests/closure
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2016-04-03 18:12:10 +0200
committerAndreas Rumpf <rumpf_a@web.de>2016-04-03 18:12:25 +0200
commit5757ad858cfa86b47a02a0389d3257c3284e1dbb (patch)
treecf6ef5d76f96cf673910a069056ef7f778f1f54e /tests/closure
parente2671aa401076cc2bb722ce3c777d7a74b8d71c9 (diff)
downloadNim-5757ad858cfa86b47a02a0389d3257c3284e1dbb.tar.gz
fixes #3995
Diffstat (limited to 'tests/closure')
-rw-r--r--tests/closure/tflatmap.nim24
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)