on master help sign in
Rename libraries, dropping prefixes. This probably introduces some bugs.
commitbdb898df65ce44563e883cc79acd4056a62b80be authorevancz <info@elm-lang.org> dateMon 15 Oct 2012, 23:03 (14 years ago) parent93564d4
29 files changed+771−812
core-elm/Map.elm → core-elm/Dict.elm core-elm/Set.elm+6−6 core-js/Char.js+25 core-js/Data.js−150 core-js/Everything.js+5−34 core-js/Graphics/Collage.js+4−2 core-js/Graphics/Color.js+3−3 core-js/Graphics/Element.js+20−19 core-js/List.js+2−1 core-js/Maybe.js+38 core-js/Prelude.js+34−30 core-js/Signal/HTTP.js+58 core-js/Signal/Input.js+83 core-js/Signal/Keyboard.js+43 core-js/Signal/Mouse.js+70 core-js/Signal/Random.js+14 core-js/Signal/Time.js+25 core-js/Signal/Window.js+19 core-js/String.js+83 core-js/Text.js+5−2 core-js/Value.js+22−2 core-js/cat.bat+1−1 core-js/foreign/JSON.js+4−5 core-js/foreign/JavaScript.js+64−66 core-js/runtime/Dispatcher.js+3−130 core-js/runtime/Signal.js+130−354 elm/elm-runtime-0.4.5.js+3 elm/src/Gen/CompileToJS.hs+5−5 elm/src/Types/Hints.hs+2−2
core-elm/Map.elm → core-elm/Dict.elmrenamed

The content is the same.

core-elm/Set.elm+6−6
@@ -1,10 +1,10 @@
11
22module Set (empty,singleton,insert,remove,member) where
33
4−import Map as Map
4+import Dict as Dict
55
6−empty = Map.empty
7−singleton k = Map.singleton k ()
8−insert k = Map.insert k ()
9−remove = Map.remove
10−member = Map.member
6+empty = Dict.empty
7+singleton k = Dict.singleton k ()
8+insert k = Dict.insert k ()
9+remove = Dict.remove
10+member = Dict.member
core-js/Char.jsnew file+25
@@ -0,0 +1,25 @@
1+
2+var Elm = Elm || {};
3+Elm.Char = function() {
4+ function isBetween(lo,hi) { return function(chr) {
5+ var c = chr.charCodeAt(0);
6+ return lo <= c && c <= hi;
7+ };
8+ }
9+ var isDigit = isBetween('0'.charCodeAt(0),'9'.charCodeAt(0));
10+ var chk1 = isBetween('a'.charCodeAt(0),'f'.charCodeAt(0));
11+ var chk2 = isBetween('A'.charCodeAt(0),'F'.charCodeAt(0));
12+
13+ return {fromCode : function(c) { return String.fromCharCode(c); },
14+ toCode : function(c) { return c.charCodeAt(0); },
15+ toUpper : function(c) { return c.toUpperCase(); },
16+ toLower : function(c) { return c.toLowerCase(); },
17+ toLocaleUpper : function(c) { return c.toLocaleUpperCase(); },
18+ toLocaleLower : function(c) { return c.toLocaleLowerCase(); },
19+ isLower : isBetween('a'.charCodeAt(0),'z'.charCodeAt(0)),
20+ isUpper : isBetween('A'.charCodeAt(0),'Z'.charCodeAt(0)),
21+ isDigit : isDigit,
22+ isOctDigit : isBetween('0'.charCodeAt(0),'7'.charCodeAt(0)),
23+ isHexDigit : function(c) { return isDigit(c) || chk1(c) || chk2(c); }
24+ };
25+}();
core-js/Data.jsdeleted−150
@@ -1,150 +0,0 @@
1−
2−var Data = function() {
3−
4−var Char = function() {
5− function isBetween(lo,hi) { return function(chr) {
6− var c = chr.charCodeAt(0);
7− return lo <= c && c <= hi;
8− };
9− }
10− var isDigit = isBetween('0'.charCodeAt(0),'9'.charCodeAt(0));
11− var chk1 = isBetween('a'.charCodeAt(0),'f'.charCodeAt(0));
12− var chk2 = isBetween('A'.charCodeAt(0),'F'.charCodeAt(0));
13−
14− return {fromCode : function(c) { return String.fromCharCode(c); },
15− toCode : function(c) { return c.charCodeAt(0); },
16− toUpper : function(c) { return c.toUpperCase(); },
17− toLower : function(c) { return c.toLowerCase(); },
18− toLocaleUpper : function(c) { return c.toLocaleUpperCase(); },
19− toLocaleLower : function(c) { return c.toLocaleLowerCase(); },
20− isLower : isBetween('a'.charCodeAt(0),'z'.charCodeAt(0)),
21− isUpper : isBetween('A'.charCodeAt(0),'Z'.charCodeAt(0)),
22− isDigit : isDigit,
23− isOctDigit : isBetween('0'.charCodeAt(0),'7'.charCodeAt(0)),
24− isHexDigit : function(c) { return isDigit(c) || chk1(c) || chk2(c); }
25− };
26−}();
27−
28−var Maybe = function() {
29− function consMaybe(x) { return function(xs) {
30− if (x[0] === "Just") return ["Cons", x[1], xs];
31− return xs;
32− };
33− }
34− function fromMaybe(b) { return function(m) {
35− if (m[0] === "Just") return m[1];
36− return b;
37− };
38− }
39− function mapCons(f) { return function(y) { return function(xs) {
40− var x = f(y);
41− if (x[0] === "Just") return ["Cons", x[1], xs];
42− return xs;
43− };
44− };
45− }
46− function maybe(b) { return function(f) { return function(m) {
47− if (m[0] === "Just") return f(m[1]);
48− return b;
49− };
50− };
51− }
52−
53− return {Just : function(x) { return ["Just",x]; },
54− Nothing : ["Nothing"],
55− catMaybes : List.foldr(consMaybe)(["Nil"]),
56− isJust : function(m) { return m[0] === "Just"; },
57− isNothing : function(m) { return m[0] === "Nothing"; },
58− fromMaybe : fromMaybe,
59− consMaybe : consMaybe,
60− mapMaybe : function(f) { return List.foldr(mapCons(f))(["Nil"]); },
61− maybe : maybe
62− };
63−}();
64−
65−/*
66−var String = function() {
67−
68− function append(s1) { return function(s2) {
69− return s1.concat(s2);
70− };
71− }
72− function map(f) { return function(s) {
73− for (var i = s.length; i--; ) { s[i] = f(s[i]); }
74− };
75− }
76−
77− function intercalate(sep) { return function(ss) {
78− return Value.listToArray(ss).join(sep);
79− };
80− }
81− function intersperse(sep) { return function(s) {
82− return s.split("").join(sep);
83− };
84− }
85−
86− function foldl(f) { return function(b) { return function(s) {
87− var acc = b;
88− for (var i = 0, len = s.length; i < len; ++i) { acc = f(s[i])(acc); }
89− return acc;
90− };
91− };
92− }
93− function foldr(f) { return function(b) { return function(s) {
94− var acc = b;
95− for (var i = s.length; i--; ) { acc = f(s[i])(acc); }
96− return acc;
97− };
98− };
99− }
100−
101− function concatMap(f) { return function(s) {
102− var a = s.split("");
103− for (var i = a.length; i--; ) { a[i] = f(a[i]); }
104− return a.join("");
105− };
106− }
107−
108− function forall(pred) { return function(s) {
109− for (var i = s.length; i--; ) { if (!pred(s[i])) {return false}; }
110− return true;
111− };
112− }
113− function exists(pred) { return function(s) {
114− for (var i = s.length; i--; ) { if (pred(s[i])) {return true}; }
115− return false;
116− };
117− }
118−
119− return {cons : append,
120− snoc : append,
121− head : function(s) { return s[0]; },
122− last : function(s) { return s[s.length-1]; },
123− tail : function(s) { return s.slice(1); },
124− length : function(s) { return s.length; },
125− map : map,
126− intercalate : intercalate,
127− intersperse : intersperse,
128− reverse : function(s) { return s.split("").reverse().join(""); },
129− toLower : function(s) { return s.toLowerCase(); },
130− toUpper : function(s) { return s.toUpperCase(); },
131− foldl : foldl,
132− foldr : foldr,
133− concat : function(ss) { return Value.listToArray(ss).join(""); },
134− concatMap : concatMap,
135− forall : forall,
136− exists : exists,
137− //filter : filter,
138− //take:,
139− //drop:,
140− toText : Value.toText,
141− properEscape : Value.properEscape
142− };
143−}();
144−*/
145−return {String: {toText:Value.toText, properEscape:Value.properEscape},
146− Char:Char,
147− Maybe:Maybe,
148− List:List
149− };
150−}();
core-js/Everything.js+5−34
@@ -1,9 +1,7 @@
11
2−var eq = Value.eq;
3−
4−Signal.addListener(document, 'elm_log', function(e) { console.log(e.value); });
5−Signal.addListener(document, 'elm_title', function(e) { document.title = e.value; });
6−Signal.addListener(document, 'elm_redirect', function(e) {
2+Value.addListener(document, 'elm_log', function(e) { console.log(e.value); });
3+Value.addListener(document, 'elm_title', function(e) {document.title = e.value;});
4+Value.addListener(document, 'elm_redirect', function(e) {
75 if (e.value.length > 0) { window.location = e.value; }
86 });
97
@@ -23,38 +21,11 @@ var includeGlobal = this;
2321 }
2422 }
2523 };
26− var includeAs = function(name) { return function(library) {
27− includeGlobal[name] = includeGlobal[name] || {};
28− for (var i in library) {
29− if (i === 'Internal') continue;
30− includeGlobal[name][i] = library[i];
31− }
32− };
33− };
34− include (Element);
35− include (Text);
24+ include (Graphics.Element);
25+ include (Graphics.Text);
3626
3727 color = Element.color;
3828 height = Element.height;
3929 show = Value.show;
4030
41− include (ElmCode.Graphics.Color);
42− include (ElmCode.Graphics.Element);
43−
44− includeAs ('Time') (Signal.Time);
45− includeAs ('Mouse') (Signal.Mouse);
46− includeAs ('Keyboard') (Signal.Keyboard);
47− includeAs ('Window') (Signal.Window);
48− includeAs ('HTTP') (Signal.HTTP);
49− includeAs ('Input') (Signal.Input);
50− includeAs ('Random') (Signal.Random);
51−
5231}());
53−
54−var ElmCode = ElmCode || {};
55−ElmCode.Data = Data;
56−ElmCode.Signal = Signal;
57−ElmCode.Data.List = List;
58−ElmCode.Foreign = Foreign;
59−ElmCode.Prelude = Prelude;
60−ElmCode.Graphics.Text = Text;
core-js/Graphics/Collage.js+4−2
@@ -1,6 +1,8 @@
11
22var Collage = function() {
33
4+var JS = Elm.JavaScript;
5+
46function tracePoints(ctx,points) {
57 var i = points.length - 1;
68 if (i <= 0) return;
@@ -22,7 +24,7 @@ function filled(ctx,color,points) {
2224
2325function textured(redo,ctx,src,points) {
2426 var img = new Image();
25− img.src = Foreign.JavaScript.castStringToJSString(src);
27+ img.src = JS.castStringToJSString(src);
2628 img.onload = redo;
2729
2830 tracePoints(ctx,points);
@@ -92,7 +94,7 @@ function drawShape(redo,ctx,shapeStyle,color,points) {
9294function drawImage(redo,ctx,w,h,src) {
9395 var img = new Image();
9496 img.onload = redo;
95− img.src = Foreign.JavaScript.castStringToJSString(src);
97+ img.src = JS.castStringToJSString(src);
9698 ctx.drawImage(img,-w/2,-h/2,w,h);
9799}
98100
core-js/Graphics/Color.js+3−3
@@ -1,6 +1,6 @@
1−var ElmCode = ElmCode || {};
2−ElmCode.Graphics = ElmCode.Graphics || {};
3−ElmCode.Graphics.Color = function() {
1+var Elm = Elm || {};
2+Elm.Graphics = Elm.Graphics || {};
3+Elm.Graphics.Color = function() {
44 function Color_0(a1) {
55 return function(a2) {
66 return function(a3) {
core-js/Graphics/Element.js+20−19
@@ -1,6 +1,7 @@
1−var ElmCode = ElmCode || {};
2−ElmCode.Graphics = ElmCode.Graphics || {};
3−ElmCode.Graphics.Element = function() {
1+var Elm = Elm || {};
2+Elm.Graphics = Elm.Graphics || {};
3+Elm.Graphics.Element = function() {
4+ var JS = Elm.JavaScript;
45 var DLeft_0 = ["DLeft"];
56 var DRight_1 = ["DRight"];
67 var DUp_2 = ["DUp"];
@@ -50,17 +51,17 @@ ElmCode.Graphics.Element = function() {
5051 }
5152 }
5253 function EImage_40(a1) {
53− return["EImage", Foreign.JavaScript.castStringToJSString(a1)]
54+ return["EImage", JS.castStringToJSString(a1)]
5455 }
5556 function EVideo_41(a1) {
56− return["EVideo", Foreign.JavaScript.castStringToJSString(a1)]
57+ return["EVideo", JS.castStringToJSString(a1)]
5758 }
5859 function EFittedImage_42(a1) {
59− return["EFittedImage", Foreign.JavaScript.castStringToJSString(a1)]
60+ return["EFittedImage", JS.castStringToJSString(a1)]
6061 }
6162 function EFlow_43(a1) {
6263 return function(a2) {
63− return["EFlow", a1, Foreign.JavaScript.castListToJSArray(a2)]
64+ return["EFlow", a1, JS.castListToJSArray(a2)]
6465 }
6566 }
6667 function ECollage_44(a1) {
@@ -80,19 +81,19 @@ ElmCode.Graphics.Element = function() {
8081 var Dotted_69 = ["Dotted"];
8182 var Dashed_70 = ["Dashed"];
8283 function Custom_71(a1) {
83− return["Custom", Foreign.JavaScript.castListToJSArray(a1)]
84+ return["Custom", JS.castListToJSArray(a1)]
8485 }
8586 var Filled_72 = ["Filled"];
8687 var Outlined_73 = ["Outlined"];
8788 function CustomOutline_74(a1) {
88− return["CustomOutline", Foreign.JavaScript.castListToJSArray(a1)]
89+ return["CustomOutline", JS.castListToJSArray(a1)]
8990 }
9091 function Line_75(a1) {
91− return["Line", Foreign.JavaScript.castListToJSArray(a1)]
92+ return["Line", JS.castListToJSArray(a1)]
9293 }
9394 function Shape_78(a1) {
9495 return function(a2) {
95− var points = Foreign.JavaScript.castListToJSArray(a1);
96+ var points = JS.castListToJSArray(a1);
9697 if (points.length > 0) { points.push(points[0]); }
9798 return["Shape", points, a2];
9899 }
@@ -123,7 +124,7 @@ ElmCode.Graphics.Element = function() {
123124 function FImage_87(a1) {
124125 return function(a2) {
125126 return function(a3) {
126− return["FImage", a1, a2, Foreign.JavaScript.castStringToJSString(a3)]
127+ return["FImage", a1, a2, JS.castStringToJSString(a3)]
127128 }
128129 }
129130 }
@@ -218,7 +219,7 @@ ElmCode.Graphics.Element = function() {
218219 }
219220 function link(lnk) {
220221 return function(e) {
221− return newElement_38(e[2], e[3], e[4], e[5], e[6], Just(Foreign.JavaScript.castStringToJSString(lnk)));
222+ return newElement_38(e[2], e[3], e[4], e[5], e[6], Just(JS.castStringToJSString(lnk)));
222223 }
223224 }
224225 function widthOf_52(e) { return ~~e[3]; }
@@ -258,18 +259,18 @@ ElmCode.Graphics.Element = function() {
258259 }
259260 }
260261 function images(srcs) {
261− var pics = Elm.Input(spacer_66(0)(0));
262− var update = Elm.Lift(function(src) {
263− src = Foreign.JavaScript.castStringToJSString(src);
262+ var pics = Elm.Signal.constant(spacer_66(0)(0));
263+ var update = Elm.Signal.lift(function(src) {
264+ src = JS.castStringToJSString(src);
264265 var img = new Image();
265266 img.onload = function() {
266267 Dispatcher.notify(pics.id,
267268 image_57(this.width)(this.height)(src));
268269 };
269270 img.src = src;
270− }, [srcs]);
271− var combine = Elm.Lift(function(x) { return function(y) { return x; } },
272− [pics,update]);
271+ })(srcs);
272+ function f(x) { return function(y) { return x; } }
273+ var combine = Elm.Signal.lift2(f)(pics)(update);
273274 return combine;
274275 }
275276 function video_58(w) {
core-js/List.js+2−1
@@ -1,4 +1,5 @@
1−var List = function() {
1+var Elm = Elm || {};
2+Elm.List = function() {
23
34 var throwError = function(f) {
45 throw "Function '" + f + "' expecting a list!";
core-js/Maybe.jsnew file+38
@@ -0,0 +1,38 @@
1+
2+var Elm = Elm || {};
3+Elm.Maybe = function() {
4+ function consMaybe(x) { return function(xs) {
5+ if (x[0] === "Just") return ["Cons", x[1], xs];
6+ return xs;
7+ };
8+ }
9+ function fromMaybe(b) { return function(m) {
10+ if (m[0] === "Just") return m[1];
11+ return b;
12+ };
13+ }
14+ function mapCons(f) { return function(y) { return function(xs) {
15+ var x = f(y);
16+ if (x[0] === "Just") return ["Cons", x[1], xs];
17+ return xs;
18+ };
19+ };
20+ }
21+ function maybe(b) { return function(f) { return function(m) {
22+ if (m[0] === "Just") return f(m[1]);
23+ return b;
24+ };
25+ };
26+ }
27+
28+ return {Just : function(x) { return ["Just",x]; },
29+ Nothing : ["Nothing"],
30+ catMaybes : Elm.List.foldr(consMaybe)(["Nil"]),
31+ isJust : function(m) { return m[0] === "Just"; },
32+ isNothing : function(m) { return m[0] === "Nothing"; },
33+ fromMaybe : fromMaybe,
34+ consMaybe : consMaybe,
35+ mapMaybe : function(f) { return Elm.List.foldr(mapCons(f))(["Nil"]); },
36+ maybe : maybe
37+ };
38+}();
core-js/Prelude.js+34−30
@@ -1,5 +1,6 @@
11
2−var Prelude = function() {
2+var Elm = Elm || {};
3+Elm.Prelude = function() {
34 var mod = function(x) { return function(y) {
45 var r = x % y;
56 var m = x==0 ? 0 : (y>0 ? (x>=0 ? r : r+y) : -mod(-x)(-y));
@@ -26,7 +27,8 @@ var Prelude = function() {
2627
2728 var logBase=function(b){return function(x){return Math.log(x)/Math.log(b);};};
2829
29− return {id : function(x) { return x; },
30+ return {eq : Value.eq,
31+ id : function(x) { return x; },
3032 not : function(b) { return !b; },
3133 fst : function(p) { return p[1]; },
3234 snd : function(p) { return p[2]; },
@@ -62,34 +64,36 @@ var Prelude = function() {
6264 curry : curry,
6365 uncurry : uncurry,
6466 logBase : logBase,
65− Just : Data.Maybe.Just,
66− Nothing : Data.Maybe.Nothing,
67− maybe : Data.Maybe.maybe,
68− map : Data.List.map,
69− filter : Data.List.filter,
70− head : Data.List.head,
71− tail : Data.List.tail,
72− last : Data.List.last,
73− length : Data.List.length,
74− reverse : Data.List.reverse,
75− foldr : Data.List.foldr,
76− foldr1 : Data.List.foldr1,
77− foldl : Data.List.foldl,
78− foldl1 : Data.List.foldl1,
79− and : Data.List.and,
80− or : Data.List.or,
81− all : Data.List.all,
82− any : Data.List.any,
83− sum : Data.List.sum,
84− product : Data.List.product,
85− concat : Data.List.concat,
86− concatMap : Data.List.concatMap,
87− maximum : Data.List.maximum,
88− minimum : Data.List.minimum,
89− scanl : Data.List.scanl,
90− scanl1 : Data.List.scanl1,
91− take : Data.List.take,
92− drop : Data.List.drop,
67+ Just : Maybe.Just,
68+ Nothing : Maybe.Nothing,
69+ maybe : Maybe.maybe,
70+ map : List.map,
71+ filter : List.filter,
72+ head : List.head,
73+ tail : List.tail,
74+ last : List.last,
75+ length : List.length,
76+ reverse : List.reverse,
77+ foldr : List.foldr,
78+ foldr1 : List.foldr1,
79+ foldl : List.foldl,
80+ foldl1 : List.foldl1,
81+ and : List.and,
82+ or : List.or,
83+ all : List.all,
84+ any : List.any,
85+ sum : List.sum,
86+ product : List.product,
87+ concat : List.concat,
88+ concatMap : List.concatMap,
89+ maximum : List.maximum,
90+ minimum : List.minimum,
91+ scanl : List.scanl,
92+ scanl1 : List.scanl1,
93+ take : List.take,
94+ drop : List.drop,
95+ zip : List.zip,
96+ unzip : List.unzip,
9397 lift : Signal.lift,
9498 lift2 : Signal.lift2,
9599 lift3 : Signal.lift3,
core-js/Signal/HTTP.jsnew file+58
@@ -0,0 +1,58 @@
1+Elm.HTTP = function() {
2+ var toElmString = Elm.JavaScript.castJSStringToString;
3+ function request(verb) { return function(url) { return function(data) {
4+ return function(headers) {
5+ return {0 : "Request",
6+ length : 1,
7+ verb : JS.castStringToJSString(verb),
8+ url : JS.castStringToJSString(url),
9+ data : data === null ? null : JS.castStringToJSString(data),
10+ headers : headers }; }; }; };
11+ }
12+ function get(url) { return request("GET")(url)(null)(["Nil"]); }
13+ function post(url) { return function(data) {
14+ return request("POST")(url)(data)(["Nil"]); }; }
15+
16+ function sendReq(responses) { return function(req) {
17+ Dispatcher.notify(responses.id,["Waiting"]);
18+ var request = null;
19+ if (window.XMLHttpRequest) {
20+ request = new XMLHttpRequest();
21+ } else if (window.ActiveXObject) {
22+ request = new ActiveXObject("Microsoft.XMLHTTP");
23+ }
24+ request.onreadystatechange = function(e) {
25+ if (request.readyState === 4) {
26+ Dispatcher.notify(
27+ responses.id,
28+ request.status === 200
29+ ? ["Success", toElmString(request.responseText)]
30+ : ["Failure", request.status, toElmString(request.statusText)]);
31+ }
32+ };
33+ request.open(req.verb, req.url, true);
34+ List.map(function(pair) {
35+ request.setRequestHeader(
36+ JS.castStringToJSString(pair[1]),
37+ JS.castStringToJSString(pair[2]));
38+ })(req.headers);
39+ request.send(req.data);
40+ return null;
41+ };
42+ }
43+
44+ function send(requests) {
45+ var responses = Elm.Signal.constant(["Waiting"]);
46+ var sender = Elm.Signal.lift(sendReq(responses))(requests);
47+ function f(x) { return function(y) { return x; } }
48+ var combine = Elm.Signal.lift2(f)(responses)(sender);
49+ return combine;
50+ }
51+
52+ return {get : get,
53+ post : post,
54+ request : request,
55+ send : send,
56+ sendGet : function(urls){return send(Elm.Signal.lift(get)(urls));}
57+ };
58+}();
core-js/Signal/Input.jsnew file+83
@@ -0,0 +1,83 @@
1+
2+Elm.Input = function() {
3+ var toElmString = Elm.JavaScript.castJSStringToString;
4+ var newTextInput = function(elem, ghostText) {
5+ elem.placeholder = JS.castStringToJSString(ghostText);
6+ var str = Elm.Signal.constant(["Nil"]);
7+ addListener(elem, 'keyup', function(e) {
8+ Dispatcher.notify(str.id, toElmString(elem.value));
9+ elem.focus();
10+ });
11+ elem.style.padding = "1px";
12+ return Value.Tuple(wrap(elem), str);
13+ };
14+ var newElement = function(name) {
15+ var e = document.createElement(name);
16+ e.style.padding = "0";
17+ e.style.margin = "0";
18+ return e;
19+ };
20+ var textArea = function(cols) { return function(rows) {
21+ var textarea = newElement('textarea');
22+ textarea.rows = rows;
23+ textarea.cols = cols;
24+ return newTextInput(textarea, "");
25+ };
26+ };
27+ var textField = function(ghostText) {
28+ var field = newElement('input');
29+ field.type = 'text';
30+ return newTextInput(field, ghostText);
31+ };
32+ var password = function(ghostText) {
33+ var field = newElement('input');
34+ field.type = 'password';
35+ return newTextInput(field, ghostText);
36+ };
37+ var checkbox = function(checked) {
38+ var box = newElement('input');
39+ box.type = 'checkbox';
40+ box.checked = checked;
41+ var status = Elm.Signal.constant(checked);
42+ addListener(box, 'change', function(e) {
43+ Dispatcher.notify(status.id, box.checked);
44+ });
45+ return Value.Tuple(wrap(box), status);
46+ };
47+ var dropDown = function(options) {
48+ var slct = newElement('select');
49+ var opts = [];
50+ while (options[0] === "Cons") {
51+ var opt = newElement('option');
52+ var str = Text.toText(options[1][1]);
53+ opt.value = str;
54+ opt.innerHTML = str;
55+ slct.appendChild(opt);
56+ opts.push(options[1][2]);
57+ options = options[2];
58+ }
59+ var status = Elm.Signal.constant(opts[0]);
60+ addListener(slct, 'change', function(e) {
61+ Dispatcher.notify(status.id, opts[slct.selectedIndex]);
62+ });
63+ return Value.Tuple(wrap(slct), status);
64+ };
65+ var stringDropDown = function(opts) {
66+ return dropDown(List.map (function(x) {return Value.Tuple(x,x);}) (opts));
67+ };
68+ var button = function(name) {
69+ var b = newElement('input');
70+ b.type = "button";
71+ b.value = JS.castStringToJSString(name);
72+ var press = Elm.Signal.constant(false);
73+ addListener(b, 'click', function(e) {
74+ Dispatcher.notify(press.id, true);
75+ Dispatcher.notify(press.id, false);
76+ });
77+ return Value.Tuple(wrap(b),press);
78+ };
79+ return {textArea:textArea, textField:textField,
80+ password:password, checkbox:checkbox,
81+ dropDown:dropDown, stringDropDown:stringDropDown,
82+ button:button};
83+}();
core-js/Signal/Keyboard.jsnew file+43
@@ -0,0 +1,43 @@
1+
2+Elm.Keyboard = { Raw : function() {
3+ var keysDown = Elm.Signal.constant(["Nil"]);
4+ var charPressed = Elm.Signal.constant(["Nothing"]);
5+ function remove(x,xs) {
6+ if (xs[0] === "Nil") return xs;
7+ if (xs[1] === x) return xs[2];
8+ return ["Cons", xs[1], remove(x,xs[2])];
9+ }
10+ function has(x,xs) {
11+ while (xs[0] !== "Nil") {
12+ if (xs[1] === x) return true;
13+ xs = xs[2];
14+ }
15+ return false;
16+ }
17+ addListener(document, 'keydown', function(e) {
18+ if (has(e.keyCode, keysDown.value)) return;
19+ var hasListener = Dispatcher.notify(keysDown.id, ["Cons", e.keyCode, keysDown.value]);
20+ if (!hasListener)
21+ this.removeEventListener('keydown',arguments.callee,false);
22+ });
23+ addListener(document, 'keyup', function(e) {
24+ var codes = remove(e.keyCode, keysDown.value);
25+ var hasListener = Dispatcher.notify(keysDown.id, codes);
26+ if (!hasListener)
27+ this.removeEventListener('keyup',arguments.callee,false);
28+ });
29+ addListener(window, 'blur', function(e) {
30+ var hasListener = Dispatcher.notify(keysDown.id, ["Nil"]);
31+ if (!hasListener)
32+ this.removeEventListener('blur',arguments.callee,false);
33+ });
34+ addListener(document, 'keypress', function(e) {
35+ var hasListener = Dispatcher.notify(charPressed.id, ["Just",e.charCode || e.keyCode]);
36+ Dispatcher.notify(charPressed.id, ["Nothing"]);
37+ if (!hasListener)
38+ this.removeEventListener('keypress',arguments.callee,false);
39+ });
40+ return {keysDown:keysDown,
41+ charPressed:charPressed};
42+ }()
43+};
core-js/Signal/Mouse.jsnew file+70
@@ -0,0 +1,70 @@
1+
2+Elm.Mouse = function() {
3+ var position = Elm.Signal.constant(Value.Tuple(0,0));
4+ position.defaultNumberOfKids = 2;
5+
6+ var x = Elm.Signal.lift(function(p){return p[1];})(position);
7+ x.defaultNumberOfKids = 0;
8+ var y = Elm.Signal.lift(function(p){return p[2];})(position);
9+ y.defaultNumberOfKids = 0;
10+
11+ var isDown = Elm.Signal.constant(false);
12+ var isClicked = Elm.Signal.constant(false);
13+ var clicks = Elm.Signal.constant(Value.Tuple());
14+
15+ function getXY(e) {
16+ var posx = 0;
17+ var posy = 0;
18+ if (!e) var e = window.event;
19+ if (e.pageX || e.pageY) {
20+ posx = e.pageX;
21+ posy = e.pageY;
22+ } else if (e.clientX || e.clientY) {
23+ posx = e.clientX + document.body.scrollLeft +
24+ document.documentElement.scrollLeft;
25+ posy = e.clientY + document.body.scrollTop +
26+ document.documentElement.scrollTop;
27+ }
28+ return Value.Tuple(posx, posy);
29+ }
30+
31+ addListener(document, 'click', function(e) {
32+ var hasListener1 = Dispatcher.notify(isClicked.id, true);
33+ var hasListener2 = Dispatcher.notify(clicks.id, Value.Tuple());
34+ Dispatcher.notify(isClicked.id, false);
35+ if (!hasListener1 && !hasListener2)
36+ this.removeEventListener('click',arguments.callee,false);
37+ });
38+ addListener(document, 'mousedown', function(e) {
39+ var hasListener = Dispatcher.notify(isDown.id, true);
40+ if (!hasListener)
41+ this.removeEventListener('mousedown',arguments.callee,false);
42+ });
43+ addListener(document, 'mouseup', function(e) {
44+ var hasListener = Dispatcher.notify(isDown.id, false);
45+ if (!hasListener)
46+ this.removeEventListener('mouseup',arguments.callee,false);
47+ });
48+ addListener(document, 'mousemove', function(e) {
49+ var hasListener = Dispatcher.notify(position.id, getXY(e));
50+ if (!hasListener)
51+ this.removeEventListener('mousemove',arguments.callee,false);
52+ });
53+ var clickedOn = function(elem) {
54+ var node = Render.render(elem);
55+ var click = Elm.Signal.constant(false);
56+ addListener(node, 'click', function(e) {
57+ Dispatcher.notify(click.id, true);
58+ Dispatcher.notify(click.id, false);
59+ });
60+ return Value.Tuple(wrap(node), click);
61+ };
62+ return {position: position,
63+ x:x,
64+ y:y,
65+ isClicked: isClicked,
66+ isDown: isDown,
67+ clicks: clicks,
68+ isClickedOn: clickedOn
69+ };
70+ }();
core-js/Signal/Random.jsnew file+14
@@ -0,0 +1,14 @@
1+
2+Elm.Random = function() {
3+ var inRange = function(min) { return function(max) {
4+ return Elm.Signal.constant(Math.floor(Math.random() * (max-min+1)) + min);
5+ };
6+ };
7+ var randomize = function(min) { return function(max) { return function(signal) {
8+ function f(x) { return Math.floor(Math.random() * (max-min+1)) + min; }
9+ return Elm.Signal.lift(f)(signal);
10+ };
11+ };
12+ };
13+ return { inRange:inRange, randomize:randomize };
14+}();
core-js/Signal/Time.jsnew file+25
@@ -0,0 +1,25 @@
1+Elm.Time = function() {
2+ var every = function(t) {
3+ t *= 1000;
4+ var clock = Elm.Signal.constant(0);
5+ var time = 0;
6+ setInterval(function() {
7+ time += t;
8+ Dispatcher.notify(clock.id, time/1000);
9+ }, t);
10+ return clock;
11+ };
12+ var after = function(t) {
13+ t *= 1000;
14+ var thread = Elm.Signal.constant(false);
15+ setTimeout(function() { Dispatcher.notify(thread.id, true); }, t);
16+ return thread;
17+ };
18+ var before = function(t) {
19+ t *= 1000;
20+ var thread = Elm.Signal.constant(true);
21+ setTimeout(function() { Dispatcher.notify(thread.id, false); }, t);
22+ return thread;
23+ };
24+ return {every:every,after:after,before:before};
25+}();
core-js/Signal/Window.jsnew file+19
@@ -0,0 +1,19 @@
1+Elm.Window = function() {
2+ var dimensions = Elm.Signal.constant(Value.Tuple(window.innerWidth,
3+ window.innerHeight));
4+ dimensions.defaultNumberOfKids = 2;
5+
6+ var width = Elm.Signal.lift(function(p){return p[1];})(dimensions);
7+ width.defaultNumberOfKids = 0;
8+ var height = Elm.Signal.lift(function(p){return p[2];})(dimensions);
9+ height.defaultNumberOfKids = 0;
10+
11+ addListener(window, 'resize', function(e) {
12+ var w = document.getElementById('widthChecker').offsetWidth;
13+ var hasListener = Dispatcher.notify(dimensions.id,
14+ Value.Tuple(w, window.innerHeight));
15+ if (!hasListener)
16+ this.removeEventListener('resize',arguments.callee,false);
17+ });
18+ return {dimensions:dimensions,width:width,height:height};
19+}();
core-js/String.jsnew file+83
@@ -0,0 +1,83 @@
1+
2+/*
3+var String = function() {
4+
5+ function append(s1) { return function(s2) {
6+ return s1.concat(s2);
7+ };
8+ }
9+ function map(f) { return function(s) {
10+ for (var i = s.length; i--; ) { s[i] = f(s[i]); }
11+ };
12+ }
13+
14+ function intercalate(sep) { return function(ss) {
15+ return Value.listToArray(ss).join(sep);
16+ };
17+ }
18+ function intersperse(sep) { return function(s) {
19+ return s.split("").join(sep);
20+ };
21+ }
22+
23+ function foldl(f) { return function(b) { return function(s) {
24+ var acc = b;
25+ for (var i = 0, len = s.length; i < len; ++i) { acc = f(s[i])(acc); }
26+ return acc;
27+ };
28+ };
29+ }
30+ function foldr(f) { return function(b) { return function(s) {
31+ var acc = b;
32+ for (var i = s.length; i--; ) { acc = f(s[i])(acc); }
33+ return acc;
34+ };
35+ };
36+ }
37+
38+ function concatMap(f) { return function(s) {
39+ var a = s.split("");
40+ for (var i = a.length; i--; ) { a[i] = f(a[i]); }
41+ return a.join("");
42+ };
43+ }
44+
45+ function forall(pred) { return function(s) {
46+ for (var i = s.length; i--; ) { if (!pred(s[i])) {return false}; }
47+ return true;
48+ };
49+ }
50+ function exists(pred) { return function(s) {
51+ for (var i = s.length; i--; ) { if (pred(s[i])) {return true}; }
52+ return false;
53+ };
54+ }
55+
56+ return {cons : append,
57+ snoc : append,
58+ head : function(s) { return s[0]; },
59+ last : function(s) { return s[s.length-1]; },
60+ tail : function(s) { return s.slice(1); },
61+ length : function(s) { return s.length; },
62+ map : map,
63+ intercalate : intercalate,
64+ intersperse : intersperse,
65+ reverse : function(s) { return s.split("").reverse().join(""); },
66+ toLower : function(s) { return s.toLowerCase(); },
67+ toUpper : function(s) { return s.toUpperCase(); },
68+ foldl : foldl,
69+ foldr : foldr,
70+ concat : function(ss) { return Value.listToArray(ss).join(""); },
71+ concatMap : concatMap,
72+ forall : forall,
73+ exists : exists,
74+ //filter : filter,
75+ //take:,
76+ //drop:,
77+ toText : Value.toText,
78+ properEscape : Value.properEscape
79+ };
80+}();
81+*/
82+
83+var String = {toText:Value.toText, properEscape:Value.properEscape};
core-js/Text.js+5−2
@@ -12,7 +12,7 @@ var Text = function() {
1212 };
1313
1414 var typeface = function(name) {
15− name = Foreign.JavaScript.castStringToJSString(name);
15+ name = Elm.JavaScript.castStringToJSString(name);
1616 return addStyle('font-family', name);
1717 };
1818 var size = function(px) {
@@ -46,4 +46,7 @@ var Text = function() {
4646 typeface : typeface,
4747 color : color,
4848 link : link };
49−}();
49+}();
50+
51+var Elm = Elm || {};
52+Elm.Graphics.Text = Text;
core-js/Value.js+22−2
@@ -133,7 +133,7 @@ var Value = function(){
133133
134134
135135 function groupForms(forms) {
136− forms = Foreign.JavaScript.castListToJSArray(forms);
136+ forms = Elm.JavaScript.castListToJSArray(forms);
137137 var groups = [];
138138 var arr = [];
139139 for (var i = forms.length; i--; ) {
@@ -230,6 +230,23 @@ var Value = function(){
230230 return out;
231231 };
232232
233+ function wrap(elem) {
234+ var p = Value.getSize(elem);
235+ return ["Element", Guid.guid(), ["EHtml",elem],
236+ p[0], p[1], 1, Nothing, Nothing];
237+ }
238+ var addListener = function() {
239+ if(document.addEventListener) {
240+ return function(element, event, handler) {
241+ element.addEventListener(event, handler, false);
242+ };
243+ } else {
244+ return function(element, event, handler) {
245+ element.attachEvent('on' + event, handler);
246+ };
247+ }
248+ }();
249+
233250 return {eq:eq,
234251 str:str,
235252 show:show,
@@ -241,5 +258,8 @@ var Value = function(){
241258 getTextSize : getTextSize,
242259 getSize : getSize,
243260 getExcess : getExcess,
244− groupForms : groupForms };
261+ groupForms : groupForms,
262+ wrap : wrap,
263+ addListener : addListener
264+ };
245265}();
core-js/cat.bat+1−1
@@ -1,4 +1,4 @@
1−copy /B Guid.js+foreign\JavaScript.js+foreign\JSON.js+Value.js+List.js+Data.js+Graphics\Color.js+Graphics\Collage.js+Graphics\Element.js+Text.js+Graphics\Render.js+runtime\Dispatcher.js+runtime\Signal.js+Prelude.js+Everything.js+Automaton.js ..\elm-mini.js
1+copy /B Guid.js+foreign\JavaScript.js+foreign\JSON.js+Value.js+List.js+Char.js+Maybe.js+String.js+Graphics\Color.js+Graphics\Collage.js+Graphics\Element.js+Text.js+Graphics\Render.js+runtime\Signal.js+runtime\Dispatcher.js+Signal\HTTP.js+Signal\Input.js+Signal\Keyboard.js+Signal\Mouse.js+Signal\Random.js+Signal\Time.js+Signal\Window.js+Prelude.js+Everything.js+Automaton.js ..\elm-mini.js
22
33cd ..\elm
44
core-js/foreign/JSON.js+4−5
@@ -1,6 +1,7 @@
11
2−var ElmJSON = function() {
3− var JS = Foreign.JavaScript;
2+var Elm = Elm || {};
3+Elm.JSON = function() {
4+ var JS = Elm.JavaScript;
45 var empty = ['JSON',{}];
56 function singleton(k) { return function(v) {
67 var obj = {};
@@ -133,6 +134,4 @@ var ElmJSON = function() {
133134 JsonArray : JsonArray,
134135 JsonObject : JsonObject
135136 };
136−}();
137−
138−Foreign.JavaScript.JSON = ElmJSON;
137+}();
core-js/foreign/JavaScript.js+64−66
@@ -1,72 +1,70 @@
11
2−var Foreign = function() {
3− var JavaScript = function() {
4− function castJSBoolToBool(b) { return b; }
5− function castBoolToJSBool(b) { return b; }
2+var Elm = Elm || {};
3+Elm.JavaScript = function() {
4+ function castJSBoolToBool(b) { return b; }
5+ function castBoolToJSBool(b) { return b; }
66
7− function castJSNumberToFloat(n) { return n; }
8− function castFloatToJSNumber(n) { return n; }
7+ function castJSNumberToFloat(n) { return n; }
8+ function castFloatToJSNumber(n) { return n; }
9+
10+ function castJSNumberToInt(n) { return ~~n; }
11+ function castIntToJSNumber(n) { return n; }
912
10− function castJSNumberToInt(n) { return ~~n; }
11− function castIntToJSNumber(n) { return n; }
12−
13− function castJSElementToElement(w) {
14− return function(h) {
15− return function(node) {
16− return ["Element",Guid.guid(),
17− ["EExternalHtml",node],
18− w,h,1,Nothing,Nothing];
19− }
13+ function castJSElementToElement(w) {
14+ return function(h) {
15+ return function(node) {
16+ return ["Element",Guid.guid(),
17+ ["EExternalHtml",node],
18+ w,h,1,Nothing,Nothing];
2019 }
2120 }
22− function castElementToJSElement(elem) { return Render.render(elem); }
23−
24− function castJSArrayToList(arr) {
25− var list = ["Nil"];
26− for (var i = arr.length; i--; ) {
27− list = [ "Cons", arr[i], list ];
28− }
29− return list;
30− }
31− function castListToJSArray(list) {
32− var a = [];
33− while (list[0] === "Cons") {
34− a.push(list[1]);
35− list = list[2];
36− }
37− return a;
38− }
21+ }
22+ function castElementToJSElement(elem) { return Render.render(elem); }
3923
40− var castJSStringToString = castJSArrayToList;
41− function castStringToJSString(str) {
42− if (typeof str === "string") return str;
43− return castListToJSArray(str).join('');
44− }
45−
46− function fromTuple(t) { return t.slice(1); }
47− function toTuple(a) { return ["Tuple" + a.length].concat(a); }
48−
49− return {castJSBoolToBool:castJSBoolToBool,
50− castBoolToJSBool:castBoolToJSBool,
51− castJSNumberToFloat:castJSNumberToFloat,
52− castFloatToJSNumber:castFloatToJSNumber,
53− castJSNumberToInt:castJSNumberToInt,
54− castIntToJSNumber:castIntToJSNumber,
55− Experimental : {castJSElementToElement:castJSElementToElement,
56− castElementToJSElement:castElementToJSElement},
57− castJSArrayToList:castJSArrayToList,
58− castListToJSArray:castListToJSArray,
59− castJSStringToString:castJSStringToString,
60− castStringToJSString:castStringToJSString,
61− castTupleToJSTuple2:fromTuple,
62− castTupleToJSTuple3:fromTuple,
63− castTupleToJSTuple4:fromTuple,
64− castTupleToJSTuple5:fromTuple,
65− castJSTupleToTuple2:toTuple,
66− castJSTupleToTuple3:toTuple,
67− castJSTupleToTuple4:toTuple,
68− castJSTupleToTuple5:toTuple
69− };
70− }();
71− return {JavaScript:JavaScript};
72−}();
24+ function castJSArrayToList(arr) {
25+ var list = ["Nil"];
26+ for (var i = arr.length; i--; ) {
27+ list = [ "Cons", arr[i], list ];
28+ }
29+ return list;
30+ }
31+ function castListToJSArray(list) {
32+ var a = [];
33+ while (list[0] === "Cons") {
34+ a.push(list[1]);
35+ list = list[2];
36+ }
37+ return a;
38+ }
39+
40+ var castJSStringToString = castJSArrayToList;
41+ function castStringToJSString(str) {
42+ if (typeof str === "string") return str;
43+ return castListToJSArray(str).join('');
44+ }
45+
46+ function fromTuple(t) { return t.slice(1); }
47+ function toTuple(a) { return ["Tuple" + a.length].concat(a); }
48+
49+ return {castJSBoolToBool:castJSBoolToBool,
50+ castBoolToJSBool:castBoolToJSBool,
51+ castJSNumberToFloat:castJSNumberToFloat,
52+ castFloatToJSNumber:castFloatToJSNumber,
53+ castJSNumberToInt:castJSNumberToInt,
54+ castIntToJSNumber:castIntToJSNumber,
55+ Experimental : {castJSElementToElement:castJSElementToElement,
56+ castElementToJSElement:castElementToJSElement},
57+ castJSArrayToList:castJSArrayToList,
58+ castListToJSArray:castListToJSArray,
59+ castJSStringToString:castJSStringToString,
60+ castStringToJSString:castStringToJSString,
61+ castTupleToJSTuple2:fromTuple,
62+ castTupleToJSTuple3:fromTuple,
63+ castTupleToJSTuple4:fromTuple,
64+ castTupleToJSTuple5:fromTuple,
65+ castJSTupleToTuple2:toTuple,
66+ castJSTupleToTuple3:toTuple,
67+ castJSTupleToTuple4:toTuple,
68+ castJSTupleToTuple5:toTuple
69+ };
70+}();
core-js/runtime/Dispatcher.js+3−130
@@ -1,131 +1,4 @@
11
2−var Elm = function() {
3− var send = function(node, timestep, changed) {
4− var kids = node.kids;
5− for (var i = kids.length; i--; ) {
6− kids[i].recv(timestep, changed, node.id);
7− }
8− };
9− var input = function(base) {
10− this.id = Guid.guid();
11− this.value = base;
12− this.kids = [];
13− this.defaultNumberOfKids = 0;
14− this.recv = function(timestep, eid, v) {
15− var changed = eid === this.id;
16− if (changed) { this.value = v; }
17− send(this, timestep, changed);
18− return changed;
19− };
20− Dispatcher.inputs.push(this);
21− };
22− var lift = function(func,args) {
23− this.id = Guid.guid();
24− this.value = null;
25− this.kids = [];
26− this.count = 0;
27− this.changed = false;
28−
29− args.reverse();
30− this.recalc = function() {
31− var f = func;
32− for (var i = args.length; i--; ) {
33− f = f(args[i].value);
34− }
35− this.value = f;
36− };
37− this.recalc();
38−
39− this.recv = function(timestep, changed, parentID) {
40− this.count += 1;
41− if (changed) { this.changed = true; }
42− if (this.count == args.length) {
43− if (this.changed) { this.recalc() }
44− send(this, timestep, this.changed);
45− this.changed = false;
46− this.count = 0;
47− }
48− };
49− for (var i = args.length; i--; ) {
50− args[i].kids.push(this);
51− }
52− };
53− var fold = function(func,base,baseIsFunc,input) {
54− this.id = Guid.guid();
55− this.value = baseIsFunc ? base(input.value) : base;
56− this.kids = [];
57− this.recv = function(timestep, changed, parentID) {
58− if (changed) { this.value = func(input.value)(this.value); }
59− send(this, timestep, changed);
60− };
61− input.kids.push(this);
62− };
63−
64− var dropIf = function(pred,base,input) {
65− this.id = Guid.guid();
66− this.value = pred(input.value) ? base : input.value;
67− this.kids = [];
68− this.recv = function(timestep, changed, parentID) {
69− var chng = changed && !pred(input.value);
70− if (chng) { this.value = input.value; }
71− send(this, timestep, chng);
72− };
73− input.kids.push(this);
74− };
75− var dropRepeats = function(input) {
76− this.id = Guid.guid();
77− this.value = input.value;
78− this.kids = [];
79− this.recv = function(timestep, changed, parentID) {
80− var chng = changed && !eq(this.value,input.value);
81− if (chng) { this.value = input.value; }
82− send(this, timestep, chng);
83− };
84− input.kids.push(this);
85− };
86−
87− var dropWhen = function(s1) { return function(b) { return function(s2) {
88− var pairs = new lift(function(x){return function(y){return [x,y];};},[s1,s2]);
89− var dropped = new dropIf(function(p){return p[0];},[true,b],pairs);
90− return new lift(function(p){return p[1];},[dropped]); }; };
91− };
92−
93− var sampleOn = function(s1,s2) {
94− this.id = Guid.guid();
95− this.value = s2.value;
96− this.kids = [];
97− this.count = 0;
98− this.changed = false;
99−
100− this.recv = function(timestep, changed, parentID) {
101− if (parentID === s1.id) this.changed = changed;
102− this.count += 1;
103− if (this.count == 2) {
104− if (this.changed) { this.value = s2.value; }
105− send(this, timestep, this.changed);
106− this.count = 0;
107− this.changed = false;
108− }
109− };
110− s1.kids.push(this);
111− s2.kids.push(this);
112− };
113−
114− return {Input: function(x) {return new input(x);},
115− Lift: function(f,xs){return new lift(f,xs);},
116− Fold: function(f,b,x){return new fold(f,b,false,x);},
117− Fold1: function(f,b,x){return new fold(f,b,true,x);},
118− keepIf : function(pred) { return function(base) { return function(sig) {
119− return new dropIf(function(x) { return !pred(x)},base,sig); }; }; },
120− dropIf : function(pred) { return function(base) { return function(sig) {
121− return new dropIf(pred,base,sig); }; }; },
122− keepWhen : function(s) { return dropWhen(new lift(function(b){return !b;},[s])); },
123− dropWhen : dropWhen,
124− dropRepeats : function(s) { return new dropRepeats(s);},
125− sampleOn : function(s1) { return function(s2) { return new sampleOn(s1,s2); }; }
126− };
127−}();
128−
1292var Dispatcher = function() {
1303 var program = null;
1314 var timestep = 0;
@@ -135,7 +8,7 @@ var Dispatcher = function() {
1358 var initialize = function() {
1369 program = ElmCode.main();
13710 if (!program.hasOwnProperty('recv')) {
138− program = Elm.Input(program);
11+ program = Elm.Signal.constant(program);
13912 }
14013
14114 currentElement = program.value;
@@ -147,12 +20,12 @@ var Dispatcher = function() {
14720 if (w !== window.innerWidth) {
14821 Dispatcher.notify(Window.dimensions.id, Value.Tuple(w, window.innerHeight));
14922 }
150− program = Elm.Lift(function(value) {
23+ program = Elm.Signal.lift(function(value) {
15124 var content = document.getElementById('content');
15225 Render.update(content.firstChild,currentElement,value);
15326 currentElement = value;
15427 return value;
155− }, [program]);
28+ })(program);
15629 };
15730 var notify = function(id, v) {
15831 timestep += 1;
core-js/runtime/Signal.js+130−354
@@ -1,367 +1,143 @@
11
2−var Signal = function() {
3− function wrap(elem) {
4− var p = Value.getSize(elem);
5− return ["Element", Guid.guid(), ["EHtml",elem], p[0], p[1], 1, Nothing, Nothing];
6− }
7− function toElmString(str) {
8− var out = ["Nil"];
9− for (var i = str.length; i--; ) {
10− out = ["Cons", str[i], out];
11− }
12− return out;
13− }
14− var addListener = function() {
15− if(document.addEventListener) {
16− return function(element, event, handler) {
17− element.addEventListener(event, handler, false);
18− };
19− }
20− else {
21− return function(element, event, handler) {
22− element.attachEvent('on' + event, handler);
23− };
24− }
25− }();
26−
27− var Mouse = function() {
28− var position = Elm.Input(Value.Tuple(0,0));
29− position.defaultNumberOfKids = 2;
30−
31− var x = Elm.Lift(function(p){return p[1];},[position]);
32− x.defaultNumberOfKids = 0;
33− var y = Elm.Lift(function(p){return p[2];},[position]);
34− y.defaultNumberOfKids = 0;
35−
36− var isDown = Elm.Input(false);
37− var isClicked = Elm.Input(false);
38− var clicks = Elm.Input(Value.Tuple());
2+var Elm = Elm || {};
3+Elm.Signal = function() {
4+ var send = function(node, timestep, changed) {
5+ var kids = node.kids;
6+ for (var i = kids.length; i--; ) {
7+ kids[i].recv(timestep, changed, node.id);
8+ }
9+ };
10+ var input = function(base) {
11+ this.id = Guid.guid();
12+ this.value = base;
13+ this.kids = [];
14+ this.defaultNumberOfKids = 0;
15+ this.recv = function(timestep, eid, v) {
16+ var changed = eid === this.id;
17+ if (changed) { this.value = v; }
18+ send(this, timestep, changed);
19+ return changed;
20+ };
21+ Dispatcher.inputs.push(this);
22+ };
23+ var lift = function(func,args) {
24+ this.id = Guid.guid();
25+ this.value = null;
26+ this.kids = [];
27+ this.count = 0;
28+ this.changed = false;
29+
30+ args.reverse();
31+ this.recalc = function() {
32+ var f = func;
33+ for (var i = args.length; i--; ) {
34+ f = f(args[i].value);
35+ }
36+ this.value = f;
37+ };
38+ this.recalc();
3939
40− function getXY(e) {
41− var posx = 0;
42− var posy = 0;
43− if (!e) var e = window.event;
44− if (e.pageX || e.pageY) {
45− posx = e.pageX;
46− posy = e.pageY;
47− } else if (e.clientX || e.clientY) {
48− posx = e.clientX + document.body.scrollLeft +
49− document.documentElement.scrollLeft;
50− posy = e.clientY + document.body.scrollTop +
51− document.documentElement.scrollTop;
40+ this.recv = function(timestep, changed, parentID) {
41+ this.count += 1;
42+ if (changed) { this.changed = true; }
43+ if (this.count == args.length) {
44+ if (this.changed) { this.recalc() }
45+ send(this, timestep, this.changed);
46+ this.changed = false;
47+ this.count = 0;
5248 }
53− return Value.Tuple(posx, posy);
49+ };
50+ for (var i = args.length; i--; ) {
51+ args[i].kids.push(this);
5452 }
55−
56− addListener(document, 'click', function(e) {
57− var hasListener1 = Dispatcher.notify(isClicked.id, true);
58− var hasListener2 = Dispatcher.notify(clicks.id, Value.Tuple());
59− Dispatcher.notify(isClicked.id, false);
60− if (!hasListener1 && !hasListener2)
61− this.removeEventListener('click',arguments.callee,false);
62− });
63− addListener(document, 'mousedown', function(e) {
64− var hasListener = Dispatcher.notify(isDown.id, true);
65− if (!hasListener)
66− this.removeEventListener('mousedown',arguments.callee,false);
67− });
68− addListener(document, 'mouseup', function(e) {
69− var hasListener = Dispatcher.notify(isDown.id, false);
70− if (!hasListener)
71− this.removeEventListener('mouseup',arguments.callee,false);
72− });
73− addListener(document, 'mousemove', function(e) {
74− var hasListener = Dispatcher.notify(position.id, getXY(e));
75− if (!hasListener)
76− this.removeEventListener('mousemove',arguments.callee,false);
77− });
78− var clickedOn = function(elem) {
79− var node = Render.render(elem);
80− var click = Elm.Input(false);
81− addListener(node, 'click', function(e) {
82− Dispatcher.notify(click.id, true);
83− Dispatcher.notify(click.id, false);
84− });
85− return Value.Tuple(wrap(node), click);
53+ };
54+ var fold = function(func,base,baseIsFunc,input) {
55+ this.id = Guid.guid();
56+ this.value = baseIsFunc ? base(input.value) : base;
57+ this.kids = [];
58+ this.recv = function(timestep, changed, parentID) {
59+ if (changed) { this.value = func(input.value)(this.value); }
60+ send(this, timestep, changed);
8661 };
87− return {position: position,
88− x:x,
89− y:y,
90− isClicked: isClicked,
91− isDown: isDown,
92− clicks: clicks,
93− isClickedOn: clickedOn
94− };
95− }();
62+ input.kids.push(this);
63+ };
9664
97− var Time = function() {
98− var every = function(t) {
99− t *= 1000;
100− var clock = Elm.Input(0);
101− var time = 0;
102− setInterval(function() {
103− time += t;
104− Dispatcher.notify(clock.id, time/1000);
105− }, t);
106− return clock;
107− };
108− var after = function(t) {
109− t *= 1000;
110− var thread = Elm.Input(false);
111− setTimeout(function() { Dispatcher.notify(thread.id, true); }, t);
112− return thread;
113− };
114− var before = function(t) {
115− t *= 1000;
116− var thread = Elm.Input(true);
117− setTimeout(function() { Dispatcher.notify(thread.id, false); }, t);
118− return thread;
65+ var dropIf = function(pred,base,input) {
66+ this.id = Guid.guid();
67+ this.value = pred(input.value) ? base : input.value;
68+ this.kids = [];
69+ this.recv = function(timestep, changed, parentID) {
70+ var chng = changed && !pred(input.value);
71+ if (chng) { this.value = input.value; }
72+ send(this, timestep, chng);
73+ };
74+ input.kids.push(this);
75+ };
76+ var dropRepeats = function(input) {
77+ this.id = Guid.guid();
78+ this.value = input.value;
79+ this.kids = [];
80+ this.recv = function(timestep, changed, parentID) {
81+ var chng = changed && !eq(this.value,input.value);
82+ if (chng) { this.value = input.value; }
83+ send(this, timestep, chng);
11984 };
120− return {every:every,after:after,before:before};
121− }();
122−
123− var Window = function() {
124− var dimensions = Elm.Input(Value.Tuple(window.innerWidth,window.innerHeight));
125− dimensions.defaultNumberOfKids = 2;
126−
127− var width = Elm.Lift(function(p){return p[1];},[dimensions]);
128− width.defaultNumberOfKids = 0;
129− var height = Elm.Lift(function(p){return p[2];},[dimensions]);
130− height.defaultNumberOfKids = 0;
131−
132− addListener(window, 'resize', function(e) {
133− var w = document.getElementById('widthChecker').offsetWidth;
134− var hasListener = Dispatcher.notify(dimensions.id, Value.Tuple(w, window.innerHeight));
135− if (!hasListener)
136− this.removeEventListener('resize',arguments.callee,false);
137− });
138− return {dimensions:dimensions,width:width,height:height};
139− }();
140−
141− var Keyboard = { Raw : function() {
142− var keysDown = Elm.Input(["Nil"]);
143− var charPressed = Elm.Input(["Nothing"]);
144− function remove(x,xs) {
145− if (xs[0] === "Nil") return xs;
146− if (xs[1] === x) return xs[2];
147− return ["Cons", xs[1], remove(x,xs[2])];
148− }
149− function has(x,xs) {
150− while (xs[0] !== "Nil") {
151− if (xs[1] === x) return true;
152− xs = xs[2];
153− }
154− return false;
155− }
156− addListener(document, 'keydown', function(e) {
157− if (has(e.keyCode, keysDown.value)) return;
158− var hasListener = Dispatcher.notify(keysDown.id, ["Cons", e.keyCode, keysDown.value]);
159− if (!hasListener)
160− this.removeEventListener('keydown',arguments.callee,false);
161− });
162− addListener(document, 'keyup', function(e) {
163− var codes = remove(e.keyCode, keysDown.value);
164− var hasListener = Dispatcher.notify(keysDown.id, codes);
165− if (!hasListener)
166− this.removeEventListener('keyup',arguments.callee,false);
167− });
168− addListener(window, 'blur', function(e) {
169− var hasListener = Dispatcher.notify(keysDown.id, ["Nil"]);
170− if (!hasListener)
171− this.removeEventListener('blur',arguments.callee,false);
172− });
173− addListener(document, 'keypress', function(e) {
174− var hasListener = Dispatcher.notify(charPressed.id, ["Just",e.charCode || e.keyCode]);
175− Dispatcher.notify(charPressed.id, ["Nothing"]);
176− if (!hasListener)
177− this.removeEventListener('keypress',arguments.callee,false);
178− });
179− return {keysDown:keysDown,
180− charPressed:charPressed};
181− }()
85+ input.kids.push(this);
86+ };
87+
88+ var dropWhen = function(s1) { return function(b) { return function(s2) {
89+ var pairs = new lift(function(x){return function(y){return [x,y];};},[s1,s2]);
90+ var dropped = new dropIf(function(p){return p[0];},[true,b],pairs);
91+ return new lift(function(p){return p[1];},[dropped]); }; };
18292 };
18393
184− var HTTP = function() {
185−
186− function request(verb) { return function(url) { return function(data) {
187− return function(headers) {
188− return {0 : "Request",
189− length : 1,
190− verb : Foreign.JavaScript.castStringToJSString(verb),
191− url : Foreign.JavaScript.castStringToJSString(url),
192− data : data === null ? null : Foreign.JavaScript.castStringToJSString(data),
193− headers : headers }; }; }; };
194− }
195− function get(url) { return request("GET")(url)(null)(["Nil"]); }
196− function post(url) { return function(data) {
197− return request("POST")(url)(data)(["Nil"]); }; }
198−
199− function sendReq(responses) { return function(req) {
200− Dispatcher.notify(responses.id,["Waiting"]);
201− var request = null;
202− if (window.XMLHttpRequest) {
203− request = new XMLHttpRequest();
204− } else if (window.ActiveXObject) {
205− request = new ActiveXObject("Microsoft.XMLHTTP");
206− }
207− request.onreadystatechange = function(e) {
208− if (request.readyState === 4) {
209− Dispatcher.notify(
210− responses.id,
211− request.status === 200
212− ? ["Success", toElmString(request.responseText)]
213− : ["Failure", request.status, toElmString(request.statusText)]);
94+ var sampleOn = function(s1,s2) {
95+ this.id = Guid.guid();
96+ this.value = s2.value;
97+ this.kids = [];
98+ this.count = 0;
99+ this.changed = false;
100+
101+ this.recv = function(timestep, changed, parentID) {
102+ if (parentID === s1.id) this.changed = changed;
103+ this.count += 1;
104+ if (this.count == 2) {
105+ if (this.changed) { this.value = s2.value; }
106+ send(this, timestep, this.changed);
107+ this.count = 0;
108+ this.changed = false;
214109 }
215− };
216− request.open(req.verb, req.url, true);
217− List.map(function(pair) {
218− request.setRequestHeader(
219− Foreign.JavaScript.castStringToJSString(pair[1]),
220− Foreign.JavaScript.castStringToJSString(pair[2]));
221− })(req.headers);
222− request.send(req.data);
223− return null;
224− };
225− }
226−
227− function send(requests) {
228− var responses = Elm.Input(["Waiting"]);
229− var sender = Elm.Lift(sendReq(responses), [requests]);
230− var combine = Elm.Lift(function(x){return function(y){return x;}},
231− [responses,sender]);
232− return combine;
233− }
234−
235− return {get : get,
236− post : post,
237− request : request,
238− send : send,
239− sendGet : function(urls){return send(Elm.Lift(get,[urls]));}
240− };
241− }();
242− var Random = function() {
243− var inRange = function(min) { return function(max) {
244− return Elm.Input(Math.floor(Math.random() * (max-min+1)) + min);
245− };
246− };
247− var randomize = function(min) { return function(max) { return function(signal) {
248− return Elm.Lift(function(x) { return Math.floor(Math.random() * (max-min+1)) + min;},[signal]);
249− };
250− };
251− };
252− return { inRange:inRange, randomize:randomize };
253− }();
254− var Input = function() {
255− var newTextInput = function(elem, ghostText) {
256− elem.placeholder = Foreign.JavaScript.castStringToJSString(ghostText);
257− var str = Elm.Input(["Nil"]);
258− addListener(elem, 'keyup', function(e) {
259− Dispatcher.notify(str.id, toElmString(elem.value));
260− elem.focus();
261− });
262− elem.style.padding = "1px";
263− return Value.Tuple(wrap(elem), str);
264− };
265− var newElement = function(name) {
266− var e = document.createElement(name);
267− e.style.padding = "0";
268− e.style.margin = "0";
269− return e;
270− };
271− var textArea = function(cols) { return function(rows) {
272− var textarea = newElement('textarea');
273− textarea.rows = rows;
274− textarea.cols = cols;
275− return newTextInput(textarea, "");
276− };
277− };
278− var textField = function(ghostText) {
279− var field = newElement('input');
280− field.type = 'text';
281− return newTextInput(field, ghostText);
282− };
283− var password = function(ghostText) {
284− var field = newElement('input');
285− field.type = 'password';
286− return newTextInput(field, ghostText);
287− };
288− var checkbox = function(checked) {
289− var box = newElement('input');
290− box.type = 'checkbox';
291− box.checked = checked;
292− var status = Elm.Input(checked);
293− addListener(box, 'change', function(e) {
294− Dispatcher.notify(status.id, box.checked);
295− });
296− return Value.Tuple(wrap(box), status);
297− };
298− var dropDown = function(options) {
299− var slct = newElement('select');
300− var opts = [];
301− while (options[0] === "Cons") {
302− var opt = newElement('option');
303− var str = Text.toText(options[1][1]);
304− opt.value = str;
305− opt.innerHTML = str;
306− slct.appendChild(opt);
307− opts.push(options[1][2]);
308− options = options[2];
309− }
310− var status = Elm.Input(opts[0]);
311− addListener(slct, 'change', function(e) {
312− Dispatcher.notify(status.id, opts[slct.selectedIndex]);
313− });
314− return Value.Tuple(wrap(slct), status);
315− };
316− var stringDropDown = function(opts) {
317− return dropDown(List.map (function(x) {return Value.Tuple(x,x);}) (opts));
318− };
319− var button = function(name) {
320− var b = newElement('input');
321− b.type = "button";
322− b.value = Foreign.JavaScript.castStringToJSString(name);
323− var press = Elm.Input(false);
324− addListener(b, 'click', function(e) {
325− Dispatcher.notify(press.id, true);
326− Dispatcher.notify(press.id, false);
327− });
328− return Value.Tuple(wrap(b),press);
329− };
330− return {textArea:textArea, textField:textField,
331− password:password, checkbox:checkbox,
332− dropDown:dropDown, stringDropDown:stringDropDown,
333− button:button};
334− }();
335−
336− return {addListener:addListener,
337− Mouse:Mouse,
338− Keyboard:Keyboard,
339− Time:Time,
340− Window:Window,
341− HTTP:HTTP,
342− Random:Random,
343− Input:Input,
344− constant : function(v) { return Elm.Input(v); },
345− lift : function(f){return function(e){return Elm.Lift(f,[e]);};},
346− lift2 : function(f) { return function(e1) { return function(e2) {
347− return Elm.Lift(f, [e1,e2]); }; }; },
348− lift3 : function(f) { return function(e1) { return function(e2) {
349− return function(e3){return Elm.Lift(f,[e1,e2,e3]);};};};},
350− lift4 : function(f) { return function(e1) { return function(e2) {
110+ };
111+ s1.kids.push(this);
112+ s2.kids.push(this);
113+ };
114+
115+ return {
116+ constant : function(v) { return new input(v); },
117+ lift : function(f){return function(e){return new lift(f,[e]);};},
118+ lift2 : function(f) { return function(e1) { return function(e2) {
119+ return new lift(f, [e1,e2]); }; }; },
120+ lift3 : function(f) { return function(e1) { return function(e2) {
121+ return function(e3){return new lift(f,[e1,e2,e3]);};};};},
122+ lift4 : function(f) { return function(e1) { return function(e2) {
351123 return function(e3) { return function(e4) {
352− return Elm.Lift(f, [e1,e2,e3,e4]); }; }; }; }; },
353− foldp : function(f) { return function(b) { return function(e) {
354− return Elm.Fold(f,b,e); }; }; },
355− foldp_ : function(f) { return function(b) { return function(e) {
356− return Elm.Fold1(f,b,e); }; }; },
357− foldp1 : function(f) { return function(e) {
358− return Elm.Fold1(f,function(x){return x;},e); }; },
359− count : function(sig){return Elm.Fold(function(_){return function(c){return c+1;};},0,sig)},
360− keepIf : Elm.keepIf,
361− dropIf : Elm.dropIf,
362− keepWhen : Elm.keepWhen,
363− dropWhen : Elm.dropWhen,
364− dropRepeats : Elm.dropRepeats,
365− sampleOn : Elm.sampleOn
124+ return new lift(f, [e1,e2,e3,e4]); }; }; }; }; },
125+ foldp : function(f) { return function(b) { return function(e) {
126+ return new fold(f,b,false,e); }; }; },
127+ foldp_ : function(f) { return function(b) { return function(e) {
128+ return new fold(f,b,true,e); }; }; },
129+ foldp1 : function(f) { return function(e) {
130+ return new fold(f,function(x){return x;},true,e); }; },
131+ count : function(sig) {
132+ var incr = function(_){return function(c){return c+1;};};
133+ return new fold(incr,0,false,sig) },
134+ keepIf : function(pred) { return function(base) { return function(sig) {
135+ return new dropIf(function(x) { return !pred(x)},base,sig); }; }; },
136+ dropIf : function(pred) { return function(base) { return function(sig) {
137+ return new dropIf(pred,base,sig); }; }; },
138+ keepWhen : function(s) { return dropWhen(new lift(function(b){return !b;},[s])); },
139+ dropWhen : dropWhen,
140+ dropRepeats : function(s) { return new dropRepeats(s);},
141+ sampleOn : function(s1){return function(s2){return new sampleOn(s1,s2);};}
366142 };
367143}();
elm/elm-runtime-0.4.5.js+3
@@ -401,6 +401,9 @@ var Value = function(){
401401 return "[]";
402402 } else if (v[0] === "JSON") {
403403 return "(JSON.fromList " + toString(ElmJSON.toList(v)) + ")";
404+ } else if (v[0] === "RBNode" || v[0] === "RBEmpty") {
405+ function cons(k){ return function(v) { return function(acc) { return ["Cons",["Tuple2",k,v],acc]; }; }; }
406+ return "(Map.fromList " + toString(ElmCode.Map.fold(cons)(["Nil"])(v)) + ")";
404407 } else {
405408 var output = "";
406409 for (var i = v.length; --i; ) {
elm/src/Gen/CompileToJS.hs+5−5
@@ -31,12 +31,12 @@ assign x e = "\nvar " ++ x ++ "=" ++ e ++ ";"
3131ret e = "\nreturn "++ e ++";"
3232iff a b c = a ++ "?" ++ b ++ ":" ++ c
3333
34−mainEquals s = globalAssign "ElmCode.main" (jsFunc "" (ret s))
34+mainEquals s = globalAssign "Elm.main" (jsFunc "" (ret s))
3535globalAssign m s = "\n" ++ m ++ "=" ++ s ++ ";"
3636
3737tryBlock escapees names e =
3838 concat [ "\ntry{\n" ++ e ++ "\n} catch (e) {"
39− , "ElmCode.main=function() {"
39+ , "Elm.main=function() {"
4040 , "var msg = ('<br/><h2>Your browser may not be supported. " ++
4141 "Are you using a modern browser?</h2>' +" ++
4242 " '<br/><span style=\"color:grey\">Runtime Error in " ++
@@ -62,10 +62,10 @@ jsModule (escapees, Module names exports imports stmts) =
6262 intercalate "." (tail modNames) ++ "' is already defined.\"; "
6363 , globalAssign modName $ jsFunc "" (includes ++body++ export) ++ "()"
6464 , mainEquals $ modName ++ ".main" ]
65− where modNames = if null names then ["ElmCode", "Main"]
66− else "ElmCode" : names
65+ where modNames = if null names then ["Elm", "Main"]
66+ else "Elm" : names
6767 modName = intercalate "." modNames
68− includes = concatMap jsImport $ map (first ("ElmCode."++)) imports
68+ includes = concatMap jsImport $ map (first ("Elm."++)) imports
6969 body = stmtsToJS stmts
7070 export = getExports exports stmts
7171 exps = if null exports then ["main"] else exports
elm/src/Types/Hints.hs+2−2
@@ -139,8 +139,8 @@ signals =
139139 , "count" -:: signalOf a ==> signalOf int
140140 , "keepIf" -:: (a==>bool) ==> a ==> signalOf a ==> signalOf a
141141 , "dropIf" -:: (a==>bool) ==> a ==> signalOf a ==> signalOf a
142− , "keepWhen" -:: signalOf bool ==>a==> signalOf a ==> signalOf a
143− , "dropWhen" -:: signalOf bool ==>a==> signalOf a ==> signalOf a
142+ , "keepWhen" -:: signalOf bool ==> a ==> signalOf a ==> signalOf a
143+ , "dropWhen" -:: signalOf bool ==> a ==> signalOf a ==> signalOf a
144144 , "dropRepeats" -:: signalOf a ==> signalOf a
145145 , "sampleOn" -:: signalOf a ==> signalOf b ==> signalOf b
146146 ]