on master help sign in
Add native Trampoline support for unbounded recursion
commit8ae1c1c24639142e130e3840013da0cca05d8ca7 authorMax New <maxsnew@gmail.com> dateSat 4 Jan 2014, 04:35 (13 years ago) parent3640376
2 files changed+36
libraries/Native/Trampoline.js+25 libraries/Trampoline.elm+11
libraries/Native/Trampoline.jsnew file+25
@@ -0,0 +1,25 @@
1+Elm.Native.Trampoline = {};
2+Elm.Native.Trampoline.make = function(elm) {
3+ elm.Native = elm.Native || {};
4+ elm.Native.Trampoline = elm.Native.Trampoline || {};
5+ if (elm.Native.Trampoline.values) return elm.Native.Trampoline.values;
6+
7+ var _E = Elm.Native.Error.make(elm),
8+
9+ // trampoline : Trampoline a -> a
10+ trampoline = function(t) {
11+ var tramp = t;
12+ while(true) {
13+ switch(tramp._0.ctor) {
14+ case "Left":
15+ return tramp._0._0;
16+ case "Right":
17+ tramp = tramp._0._0({ctor: "_Tuple0"});
18+ continue;
19+ }
20+ _E.Case("Trampoline", "in Native.Trampoline.trampoline");
21+ }
22+ }
23+
24+ return elm.Native.Trampoline.values = { trampoline: trampoline };
25+};
libraries/Trampoline.elmnew file+11
@@ -0,0 +1,11 @@
1+module Trampoline (Trampoline, trampoline)
2+ where
3+
4+{-| -}
5+import Native.Trampoline
6+import open Either
7+
8+data Trampoline a = Trampoline (Either a (() -> Trampoline a))
9+
10+trampoline : Trampoline a -> a
11+trampoline = Native.Trampoline.trampoline