on master help sign in
Whitespace, semicolons, lint etc. No functional changes.
2b90d0eColin Curtin
libraries/Dict.elm+22−22
@@ -24,7 +24,7 @@ empty = RBEmpty
24{-- Helpers for checking invariants
24{-- Helpers for checking invariants
25
25
26-- Check that the tree has an equal number of black nodes on each path
26-- Check that the tree has an equal number of black nodes on each path
27−equal_pathLen t =
27+equal_pathLen t =
28 let path_numBlacks t =
28 let path_numBlacks t =
29 case t of
29 case t of
30 RBEmpty -> 1
30 RBEmpty -> 1
@@ -35,14 +35,14 @@ equal_pathLen t =
35 else bl + (if col == Red then 0 else 1)
35 else bl + (if col == Red then 0 else 1)
36 in 0-1 /= path_numBlacks t
36 in 0-1 /= path_numBlacks t
37
37
38−rootBlack t =
38+rootBlack t =
39 case t of
39 case t of
40 RBEmpty -> True
40 RBEmpty -> True
41 RBNode Black _ _ _ _ -> True
41 RBNode Black _ _ _ _ -> True
42 _ -> False
42 _ -> False
43
43
44−redBlack_children t =
44+redBlack_children t =
45− case t of
45+ case t of
46 { RBNode Red _ _ (RBNode Red _ _ _ _) _ -> False
46 { RBNode Red _ _ (RBNode Red _ _ _ _) _ -> False
47 ; RBNode Red _ _ _ (RBNode Red _ _ _ _) -> False
47 ; RBNode Red _ _ _ (RBNode Red _ _ _ _) -> False
48 ; RBEmpty -> True
48 ; RBEmpty -> True
@@ -57,7 +57,7 @@ findExtreme f t =
57 { Nothing -> Just k
57 { Nothing -> Just k
58 ; Just k' -> Just k' }
58 ; Just k' -> Just k' }
59 }
59 }
60−
60+
61findminRbt t = findExtreme fst t
61findminRbt t = findExtreme fst t
62findmaxRbt t = findExtreme snd t
62findmaxRbt t = findExtreme snd t
63
63
@@ -83,7 +83,7 @@ ordered t =
83 }
83 }
84
84
85-- Check that there aren't any right red nodes in the tree *)
85-- Check that there aren't any right red nodes in the tree *)
86−leftLeaning t =
86+leftLeaning t =
87 case t of
87 case t of
88 { RBEmpty -> True
88 { RBEmpty -> True
89 ; RBNode _ _ _ (RBNode Black _ _ _ _) (RBNode Red _ _ _ _) -> False
89 ; RBNode _ _ _ (RBNode Black _ _ _ _) (RBNode Red _ _ _ _) -> False
@@ -92,7 +92,7 @@ leftLeaning t =
92 }
92 }
93
93
94invariants_hold t =
94invariants_hold t =
95− ordered t && rootBlack t && redBlack_children t &&
95+ ordered t && rootBlack t && redBlack_children t &&
96 equal_pathLen t && leftLeaning t
96 equal_pathLen t && leftLeaning t
97
97
98--** End invariant helpers *****
98--** End invariant helpers *****
@@ -101,14 +101,14 @@ invariants_hold t =
101
101
102min : Dict k v -> (k,v)
102min : Dict k v -> (k,v)
103min t =
103min t =
104− case t of
104+ case t of
105 RBNode _ k v RBEmpty _ -> (k,v)
105 RBNode _ k v RBEmpty _ -> (k,v)
106 RBNode _ _ _ l _ -> min l
106 RBNode _ _ _ l _ -> min l
107 RBEmpty -> Error.raise "(min Empty) is not defined"
107 RBEmpty -> Error.raise "(min Empty) is not defined"
108
108
109{--
109{--
110max t =
110max t =
111− case t of
111+ case t of
112 { RBNode _ k v _ RBEmpty -> (k,v)
112 { RBNode _ k v _ RBEmpty -> (k,v)
113 ; RBNode _ _ _ _ r -> max r
113 ; RBNode _ _ _ _ r -> max r
114 ; RBEmpty -> Error.raise "(max Empty) is not defined"
114 ; RBEmpty -> Error.raise "(max Empty) is not defined"
@@ -162,7 +162,7 @@ rotateLeft t =
162 RBNode cy ky vy a (RBNode cz kz vz b c) -> RBNode cy kz vz (RBNode Red ky vy a b) c
162 RBNode cy ky vy a (RBNode cz kz vz b c) -> RBNode cy kz vz (RBNode Red ky vy a b) c
163 _ -> Error.raise "rotateLeft of a node without enough children"
163 _ -> Error.raise "rotateLeft of a node without enough children"
164
164
165−-- rotateRight -- the reverse, and
165+-- rotateRight -- the reverse, and
166-- makes Y have Z's color, and makes Z Red.
166-- makes Y have Z's color, and makes Z Red.
167rotateRight : Dict k v -> Dict k v
167rotateRight : Dict k v -> Dict k v
168rotateRight t =
168rotateRight t =
@@ -172,13 +172,13 @@ rotateRight t =
172
172
173rotateLeftIfNeeded : Dict k v -> Dict k v
173rotateLeftIfNeeded : Dict k v -> Dict k v
174rotateLeftIfNeeded t =
174rotateLeftIfNeeded t =
175− case t of
175+ case t of
176 RBNode _ _ _ _ (RBNode Red _ _ _ _) -> rotateLeft t
176 RBNode _ _ _ _ (RBNode Red _ _ _ _) -> rotateLeft t
177 _ -> t
177 _ -> t
178
178
179rotateRightIfNeeded : Dict k v -> Dict k v
179rotateRightIfNeeded : Dict k v -> Dict k v
180rotateRightIfNeeded t =
180rotateRightIfNeeded t =
181− case t of
181+ case t of
182 RBNode _ _ _ (RBNode Red _ _ (RBNode Red _ _ _ _) _) _ -> rotateRight t
182 RBNode _ _ _ (RBNode Red _ _ (RBNode Red _ _ _ _) _) _ -> rotateRight t
183 _ -> t
183 _ -> t
184
184
@@ -187,14 +187,14 @@ otherColor c = case c of { Red -> Black ; Black -> Red }
187color_flip : Dict k v -> Dict k v
187color_flip : Dict k v -> Dict k v
188color_flip t =
188color_flip t =
189 case t of
189 case t of
190− RBNode c1 bk bv (RBNode c2 ak av la ra) (RBNode c3 ck cv lc rc) ->
190+ RBNode c1 bk bv (RBNode c2 ak av la ra) (RBNode c3 ck cv lc rc) ->
191 RBNode (otherColor c1) bk bv
191 RBNode (otherColor c1) bk bv
192 (RBNode (otherColor c2) ak av la ra)
192 (RBNode (otherColor c2) ak av la ra)
193 (RBNode (otherColor c3) ck cv lc rc)
193 (RBNode (otherColor c3) ck cv lc rc)
194 _ -> Error.raise "color_flip called on a Empty or Node with a Empty child"
194 _ -> Error.raise "color_flip called on a Empty or Node with a Empty child"
195
195
196color_flipIfNeeded : Dict k v -> Dict k v
196color_flipIfNeeded : Dict k v -> Dict k v
197−color_flipIfNeeded t =
197+color_flipIfNeeded t =
198 case t of
198 case t of
199 RBNode _ _ _ (RBNode Red _ _ _ _) (RBNode Red _ _ _ _) -> color_flip t
199 RBNode _ _ _ (RBNode Red _ _ _ _) (RBNode Red _ _ _ _) -> color_flip t
200 _ -> t
200 _ -> t
@@ -202,11 +202,11 @@ color_flipIfNeeded t =
202fixUp t = color_flipIfNeeded (rotateRightIfNeeded (rotateLeftIfNeeded t))
202fixUp t = color_flipIfNeeded (rotateRightIfNeeded (rotateLeftIfNeeded t))
203
203
204ensureBlackRoot : Dict k v -> Dict k v
204ensureBlackRoot : Dict k v -> Dict k v
205−ensureBlackRoot t =
205+ensureBlackRoot t =
206 case t of
206 case t of
207 RBNode Red k v l r -> RBNode Black k v l r
207 RBNode Red k v l r -> RBNode Black k v l r
208 _ -> t
208 _ -> t
209−
209+
210-- Insert a key-value pair into a dictionary. Replaces value when there is
210-- Insert a key-value pair into a dictionary. Replaces value when there is
211-- a collision.
211-- a collision.
212insert : Comparable k -> v -> Dict (Comparable k) v -> Dict (Comparable k) v
212insert : Comparable k -> v -> Dict (Comparable k) v -> Dict (Comparable k) v
@@ -265,7 +265,7 @@ isRedRightLeft t =
265 _ -> False
265 _ -> False
266
266
267moveRedLeft : Dict k v -> Dict k v
267moveRedLeft : Dict k v -> Dict k v
268−moveRedLeft t =
268+moveRedLeft t =
269 let t' = color_flip t in
269 let t' = color_flip t in
270 case t' of
270 case t' of
271 RBNode c k v l r ->
271 RBNode c k v l r ->
@@ -289,9 +289,9 @@ moveRedRightIfNeeded t =
289 if isRedRight t || isRedRightLeft t then t else moveRedRight t
289 if isRedRight t || isRedRightLeft t then t else moveRedRight t
290
290
291deleteMin : Dict k v -> Dict k v
291deleteMin : Dict k v -> Dict k v
292−deleteMin t =
292+deleteMin t =
293 let del t =
293 let del t =
294− case t of
294+ case t of
295 RBNode _ _ _ RBEmpty _ -> RBEmpty
295 RBNode _ _ _ RBEmpty _ -> RBEmpty
296 _ -> case moveRedLeftIfNeeded t of
296 _ -> case moveRedLeftIfNeeded t of
297 RBNode c k v l r -> fixUp (RBNode c k v (del l) r)
297 RBNode c k v l r -> fixUp (RBNode c k v (del l) r)
@@ -314,11 +314,11 @@ deleteMax t =
314-- Remove a key-value pair from a dictionary. If the key is not found,
314-- Remove a key-value pair from a dictionary. If the key is not found,
315-- no changes are made.
315-- no changes are made.
316remove : Comparable k -> Dict (Comparable k) v -> Dict (Comparable k) v
316remove : Comparable k -> Dict (Comparable k) v -> Dict (Comparable k) v
317−remove k t =
317+remove k t =
318 let eq_and_noRightNode t =
318 let eq_and_noRightNode t =
319 case t of { RBNode _ k' _ _ RBEmpty -> k == k' ; _ -> False }
319 case t of { RBNode _ k' _ _ RBEmpty -> k == k' ; _ -> False }
320 eq t = case t of { RBNode _ k' _ _ _ -> k == k' ; _ -> False }
320 eq t = case t of { RBNode _ k' _ _ _ -> k == k' ; _ -> False }
321− delLT t = case moveRedLeftIfNeeded t of
321+ delLT t = case moveRedLeftIfNeeded t of
322 RBNode c k' v l r -> fixUp (RBNode c k' v (del l) r)
322 RBNode c k' v l r -> fixUp (RBNode c k' v (del l) r)
323 RBEmpty -> Error.raise "delLT on Empty"
323 RBEmpty -> Error.raise "delLT on Empty"
324 delEQ t = case t of -- Replace with successor
324 delEQ t = case t of -- Replace with successor
@@ -328,7 +328,7 @@ remove k t =
328 delGT t = case t of
328 delGT t = case t of
329 RBNode c k' v l r -> fixUp (RBNode c k' v l (del r))
329 RBNode c k' v l r -> fixUp (RBNode c k' v l (del r))
330 RBEmpty -> Error.raise "delGT called on a Empty"
330 RBEmpty -> Error.raise "delGT called on a Empty"
331− del t = case t of
331+ del t = case t of
332 RBEmpty -> RBEmpty
332 RBEmpty -> RBEmpty
333 RBNode _ k' _ _ _ ->
333 RBNode _ k' _ _ _ ->
334 if k < k' then delLT t else
334 if k < k' then delLT t else
libraries/Native/Graphics/Input.js+2−2
@@ -57,7 +57,7 @@ Elm.Native.Graphics.Input = function(elm) {
57 btn.elmUp = Render.render(model.up);
57 btn.elmUp = Render.render(model.up);
58 btn.elmHover = Render.render(model.hover);
58 btn.elmHover = Render.render(model.hover);
59 btn.elmDown = Render.render(model.down);
59 btn.elmDown = Render.render(model.down);
60−
60+
61 function replace(node) {
61 function replace(node) {
62 if (node !== btn.firstChild) btn.replaceChild(node, btn.firstChild);
62 if (node !== btn.firstChild) btn.replaceChild(node, btn.firstChild);
63 }
63 }
@@ -218,4 +218,4 @@ Elm.Native.Graphics.Input = function(elm) {
218 passwords:mkTextPool('password')
218 passwords:mkTextPool('password')
219 };
219 };
220
220
221−};
221+};
libraries/Native/Matrix2D.js+8−8
@@ -26,12 +26,12 @@ Elm.Native.Matrix2D = function(elm) {
26 var s = Math.sin(t);
26 var s = Math.sin(t);
27 var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4];
27 var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4];
28 return new A([m11*c + m12*s, -m11*s + m12*c, m[2],
28 return new A([m11*c + m12*s, -m11*s + m12*c, m[2],
29− m21*c + m22*s, -m21*s + m22*c, m[5]]);
29+ m21*c + m22*s, -m21*s + m22*c, m[5]]);
30 }
30 }
31 function move(x,y,m) {
31 function move(x,y,m) {
32 var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4];
32 var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4];
33 return new A([m11, m12, m11*x + m12*y + m[2],
33 return new A([m11, m12, m11*x + m12*y + m[2],
34− m21, m22, m21*x + m22*y + m[5]]);
34+ m21, m22, m21*x + m22*y + m[5]]);
35 }
35 }
36 function scale(s,m) { return new A([m[0]*s, m[1]*s, m[2], m[3]*s, m[4]*s, m[5]]); }
36 function scale(s,m) { return new A([m[0]*s, m[1]*s, m[2], m[3]*s, m[4]*s, m[5]]); }
37 function scaleX(x,m) { return new A([m[0]*x, m[1], m[2], m[3]*x, m[4], m[5]]); }
37 function scaleX(x,m) { return new A([m[0]*x, m[1], m[2], m[3]*x, m[4], m[5]]); }
@@ -42,11 +42,11 @@ Elm.Native.Matrix2D = function(elm) {
42 function transform(m11, m21, m12, m22, mdx, mdy, n) {
42 function transform(m11, m21, m12, m22, mdx, mdy, n) {
43 var n11 = n[0], n12 = n[1], n21 = n[3], n22 = n[4], ndx = n[2], ndy = n[5];
43 var n11 = n[0], n12 = n[1], n21 = n[3], n22 = n[4], ndx = n[2], ndy = n[5];
44 return new A([m11*n11 + m12*n21,
44 return new A([m11*n11 + m12*n21,
45− m11*n12 + m12*n22,
45+ m11*n12 + m12*n22,
46− m11*ndx + m12*ndy + mdx,
46+ m11*ndx + m12*ndy + mdx,
47− m21*n11 + m22*n21,
47+ m21*n11 + m22*n21,
48− m21*n12 + m22*n22,
48+ m21*n12 + m22*n22,
49− m21*ndx + m22*ndy + mdy]);
49+ m21*ndx + m22*ndy + mdy]);
50 }
50 }
51
51
52 function multiply(m, n) {
52 function multiply(m, n) {
@@ -68,4 +68,4 @@ Elm.Native.Matrix2D = function(elm) {
68 reflectY:reflectY
68 reflectY:reflectY
69 };
69 };
70
70
71−};
71+};
libraries/Native/Prelude.js+36−35
@@ -8,62 +8,63 @@ Elm.Native.Prelude = function(elm) {
8 var Utils = Elm.Native.Utils(elm);
8 var Utils = Elm.Native.Utils(elm);
9 var Char = Elm.Char(elm);
9 var Char = Elm.Char(elm);
10
10
11− function div(a,b) { return (a/b)|0 }
11+ function div(a,b) { return (a/b)|0; }
12− function rem(a,b) { return a % b }
12+ function rem(a,b) { return a % b; }
13 function mod(a,b) {
13 function mod(a,b) {
14 var r = a % b;
14 var r = a % b;
15 var m = a === 0 ? 0 : (b > 0 ? (a >= 0 ? r : r+b) : -mod(-a,-b));
15 var m = a === 0 ? 0 : (b > 0 ? (a >= 0 ? r : r+b) : -mod(-a,-b));
16+
16 return m === b ? 0 : m;
17 return m === b ? 0 : m;
17 }
18 }
18− function abs(x) { return x < 0 ? -x : x }
19+ function abs(x) { return x < 0 ? -x : x; }
19− function logBase(base,n) { return Math.log(n) / Math.log(base) }
20+ function logBase(base,n) { return Math.log(n) / Math.log(base); }
20− function min(a,b) { return a < b ? a : b }
21+ function min(a,b) { return a < b ? a : b; }
21− function max(a,b) { return a > b ? a : b }
22+ function max(a,b) { return a > b ? a : b; }
22− function clamp(lo,hi,n) { return n < lo ? lo : n > hi ? hi : n }
23+ function clamp(lo,hi,n) { return n < lo ? lo : n > hi ? hi : n; }
23− function xor(a,b) { return a !== b }
24+ function xor(a,b) { return a !== b; }
24− function not(b) { return !b }
25+ function not(b) { return !b; }
25−
26+
26− function truncate(n) { return n|0 }
27+ function truncate(n) { return n|0; }
27−
28+
28− function id(n) { return n }
29+ function id(n) { return n; }
29− function flip(f,a,b) { return A2(f,b,a) }
30+ function flip(f,a,b) { return A2(f,b,a); }
30− function curry(f,a,b) { return f(Utils.Tuple2(a,b)) }
31+ function curry(f,a,b) { return f(Utils.Tuple2(a,b)); }
31− function uncurry(f,v) { return A2(f,v._0,v._1) }
32+ function uncurry(f,v) { return A2(f,v._0,v._1); }
32− function fst(t) { return t._0 }
33+ function fst(t) { return t._0; }
33− function snd(t) { return t._1 }
34+ function snd(t) { return t._1; }
34
35
35 function readInt(str) {
36 function readInt(str) {
36 var s = JS.fromString(str);
37 var s = JS.fromString(str);
37 var len = s.length;
38 var len = s.length;
38− if (len === 0) { return Maybe.Nothing }
39+ if (len === 0) { return Maybe.Nothing; }
39 var start = 0;
40 var start = 0;
40 if (s[0] == '-') {
41 if (s[0] == '-') {
41− if (len === 1) { return Maybe.Nothing }
42+ if (len === 1) { return Maybe.Nothing; }
42− start = 1;
43+ start = 1;
43 }
44 }
44 for (var i = start; i < len; ++i) {
45 for (var i = start; i < len; ++i) {
45− if (!Char.isDigit(s[i])) { return Maybe.Nothing }
46+ if (!Char.isDigit(s[i])) { return Maybe.Nothing; }
46 }
47 }
47− return Maybe.Just(parseInt(s));
48+ return Maybe.Just(parseInt(s, 10));
48 }
49 }
49−
50+
50 function readFloat(str) {
51 function readFloat(str) {
51 var s = JS.fromString(str);
52 var s = JS.fromString(str);
52 var len = s.length;
53 var len = s.length;
53 if (len === 0) { return Maybe.Nothing; }
54 if (len === 0) { return Maybe.Nothing; }
54 var start = 0;
55 var start = 0;
55 if (s[0] == '-') {
56 if (s[0] == '-') {
56− if (len === 1) { return Maybe.Nothing; }
57+ if (len === 1) { return Maybe.Nothing; }
57− start = 1;
58+ start = 1;
58 }
59 }
59 var dotCount = 0;
60 var dotCount = 0;
60 for (var i = start; i < len; ++i) {
61 for (var i = start; i < len; ++i) {
61− if (Char.isDigit(s[i])) { continue; }
62+ if (Char.isDigit(s[i])) { continue; }
62− if (s[i] === '.') {
63+ if (s[i] === '.') {
63− dotCount += 1;
64+ dotCount += 1;
64− if (dotCount <= 1) { continue; }
65+ if (dotCount <= 1) { continue; }
65− }
66+ }
66− return Maybe.Nothing;
67+ return Maybe.Nothing;
67 }
68 }
68 return Maybe.Just(parseFloat(s));
69 return Maybe.Just(parseFloat(s));
69 }
70 }
@@ -113,8 +114,8 @@ Elm.Native.Prelude = function(elm) {
113 };
114 };
114
115
115 function add(Module) {
116 function add(Module) {
116− var M = Module(elm);
117+ var M = Module(elm);
117− for (var k in M) { prelude[k] = M[k] }
118+ for (var k in M) { prelude[k] = M[k]; }
118 }
119 }
119 add(Elm.Native.Show);
120 add(Elm.Native.Show);
120 add(Elm.Signal);
121 add(Elm.Signal);
@@ -124,4 +125,4 @@ Elm.Native.Prelude = function(elm) {
124 add(Elm.Graphics.Element);
125 add(Elm.Graphics.Element);
125
126
126 return elm.Native.Prelude = prelude;
127 return elm.Native.Prelude = prelude;
127−};
128+};
libraries/Native/Show.js+1−1
@@ -115,4 +115,4 @@ Elm.Native.Show = function(elm) {
115 }
115 }
116
116
117 return elm.Native.Show = { show:show };
117 return elm.Native.Show = { show:show };
118−};
118+};
libraries/Native/Signal/Http.js+4−4
@@ -39,16 +39,16 @@ Elm.Native.Http = function(elm) {
39 request.onreadystatechange = function(e) {
39 request.onreadystatechange = function(e) {
40 if (request.readyState === 4) {
40 if (request.readyState === 4) {
41 response.value = (request.status === 200 ?
41 response.value = (request.status === 200 ?
42− { ctor:'Success', _0:JS.toString(request.responseText) } :
42+ { ctor:'Success', _0:JS.toString(request.responseText) } :
43− { ctor:'Failure', _0:request.status, _1:JS.toString(request.statusText) });
43+ { ctor:'Failure', _0:request.status, _1:JS.toString(request.statusText) });
44− setTimeout(function() { updateQueue(queue,responses); }, 0);
44+ setTimeout(function() { updateQueue(queue,responses); }, 0);
45 }
45 }
46 };
46 };
47 request.open(JS.fromString(req.verb), JS.fromString(req.url), true);
47 request.open(JS.fromString(req.verb), JS.fromString(req.url), true);
48 List.map(setHeader)(req.headers);
48 List.map(setHeader)(req.headers);
49 request.send(JS.fromString(req.body));
49 request.send(JS.fromString(req.body));
50 }
50 }
51−
51+
52 function send(requests) {
52 function send(requests) {
53 var responses = Signal.constant(elm.Http.Waiting);
53 var responses = Signal.constant(elm.Http.Waiting);
54 var sender = A2( Signal.lift, registerReq([],responses), requests );
54 var sender = A2( Signal.lift, registerReq([],responses), requests );
libraries/Native/Signal/Keyboard.js+7−7
@@ -47,13 +47,13 @@ Elm.Native.Keyboard = function(elm) {
47 function f(ks) {
47 function f(ks) {
48 var x = 0, y = 0;
48 var x = 0, y = 0;
49 while (ks.ctor == "Cons") {
49 while (ks.ctor == "Cons") {
50− switch (ks._0) {
50+ switch (ks._0) {
51− case left : --x; break;
51+ case left : --x; break;
52− case right: ++x; break;
52+ case right: ++x; break;
53− case up : ++y; break;
53+ case up : ++y; break;
54− case down : --y; break;
54+ case down : --y; break;
55− }
55+ }
56− ks = ks._1;
56+ ks = ks._1;
57 }
57 }
58 return { _:{}, x:x, y:y };
58 return { _:{}, x:x, y:y };
59 }
59 }
libraries/Native/Signal/Signal.js+73−72
@@ -4,7 +4,7 @@ Elm.Native.Signal = function(elm) {
4
4
5 elm.Native = elm.Native || {};
5 elm.Native = elm.Native || {};
6 if (elm.Native.Signal) return elm.Native.Signal;
6 if (elm.Native.Signal) return elm.Native.Signal;
7−
7+
8 var Utils = Elm.Native.Utils(elm);
8 var Utils = Elm.Native.Utils(elm);
9 var Either = Elm.Either(elm);
9 var Either = Elm.Either(elm);
10 var foldl1 = Elm.List(elm).foldl1;
10 var foldl1 = Elm.List(elm).foldl1;
@@ -44,45 +44,45 @@ Elm.Native.Signal = function(elm) {
44 ++count;
44 ++count;
45 if (changed) { isChanged = true; }
45 if (changed) { isChanged = true; }
46 if (count == n) {
46 if (count == n) {
47− if (isChanged) { this.value = update() }
47+ if (isChanged) { this.value = update(); }
48− send(this, timestep, isChanged);
48+ send(this, timestep, isChanged);
49− isChanged = false;
49+ isChanged = false;
50− count = 0;
50+ count = 0;
51 }
51 }
52 };
52 };
53 for (var i = n; i--; ) { args[i].kids.push(this); }
53 for (var i = n; i--; ) { args[i].kids.push(this); }
54 }
54 }
55
55
56 function lift(func, a) {
56 function lift(func, a) {
57− function update() { return func(a.value) }
57+ function update() { return func(a.value); }
58 return new LiftN(update, [a]);
58 return new LiftN(update, [a]);
59 }
59 }
60 function lift2(func, a, b) {
60 function lift2(func, a, b) {
61− function update() { return A2( func, a.value, b.value ) }
61+ function update() { return A2( func, a.value, b.value ); }
62 return new LiftN(update, [a,b]);
62 return new LiftN(update, [a,b]);
63 }
63 }
64 function lift3(func, a, b, c) {
64 function lift3(func, a, b, c) {
65− function update() { return A3( func, a.value, b.value, c.value ) }
65+ function update() { return A3( func, a.value, b.value, c.value ); }
66 return new LiftN(update, [a,b,c]);
66 return new LiftN(update, [a,b,c]);
67 }
67 }
68 function lift4(func, a, b, c, d) {
68 function lift4(func, a, b, c, d) {
69− function update() { return A4( func, a.value, b.value, c.value, d.value ) }
69+ function update() { return A4( func, a.value, b.value, c.value, d.value ); }
70 return new LiftN(update, [a,b,c,d]);
70 return new LiftN(update, [a,b,c,d]);
71 }
71 }
72 function lift5(func, a, b, c, d, e) {
72 function lift5(func, a, b, c, d, e) {
73− function update() { return A5( func, a.value, b.value, c.value, d.value, e.value ) }
73+ function update() { return A5( func, a.value, b.value, c.value, d.value, e.value ); }
74 return new LiftN(update, [a,b,c,d,e]);
74 return new LiftN(update, [a,b,c,d,e]);
75 }
75 }
76 function lift6(func, a, b, c, d, e, f) {
76 function lift6(func, a, b, c, d, e, f) {
77− function update() { return A6( func, a.value, b.value, c.value, d.value, e.value, f.value ) }
77+ function update() { return A6( func, a.value, b.value, c.value, d.value, e.value, f.value ); }
78 return new LiftN(update, [a,b,c,d,e,f]);
78 return new LiftN(update, [a,b,c,d,e,f]);
79 }
79 }
80 function lift7(func, a, b, c, d, e, f, g) {
80 function lift7(func, a, b, c, d, e, f, g) {
81− function update() { return A7( func, a.value, b.value, c.value, d.value, e.value, f.value, g.value ) }
81+ function update() { return A7( func, a.value, b.value, c.value, d.value, e.value, f.value, g.value ); }
82 return new LiftN(update, [a,b,c,d,e,f,g]);
82 return new LiftN(update, [a,b,c,d,e,f,g]);
83 }
83 }
84 function lift8(func, a, b, c, d, e, f, g, h) {
84 function lift8(func, a, b, c, d, e, f, g, h) {
85− function update() { return A8( func, a.value, b.value, c.value, d.value, e.value, f.value, g.value, h.value ) }
85+ function update() { return A8( func, a.value, b.value, c.value, d.value, e.value, f.value, g.value, h.value ); }
86 return new LiftN(update, [a,b,c,d,e,f,g,h]);
86 return new LiftN(update, [a,b,c,d,e,f,g,h]);
87 }
87 }
88
88
@@ -95,38 +95,38 @@ Elm.Native.Signal = function(elm) {
95 return new LiftN(update, [input]);
95 return new LiftN(update, [input]);
96 }
96 }
97
97
98− function dropIf(pred,base,input) {
98+ function DropIf(pred,base,input) {
99 this.id = Utils.guid();
99 this.id = Utils.guid();
100 this.value = pred(input.value) ? base : input.value;
100 this.value = pred(input.value) ? base : input.value;
101 this.kids = [];
101 this.kids = [];
102 this.recv = function(timestep, changed, parentID) {
102 this.recv = function(timestep, changed, parentID) {
103− var chng = changed && !pred(input.value);
103+ var chng = changed && !pred(input.value);
104− if (chng) { this.value = input.value; }
104+ if (chng) { this.value = input.value; }
105− send(this, timestep, chng);
105+ send(this, timestep, chng);
106 };
106 };
107 input.kids.push(this);
107 input.kids.push(this);
108 }
108 }
109
109
110− function dropRepeats(input) {
110+ function DropRepeats(input) {
111 this.id = Utils.guid();
111 this.id = Utils.guid();
112 this.value = input.value;
112 this.value = input.value;
113 this.kids = [];
113 this.kids = [];
114 this.recv = function(timestep, changed, parentID) {
114 this.recv = function(timestep, changed, parentID) {
115− var chng = changed && !Utils.eq(this.value,input.value);
115+ var chng = changed && !Utils.eq(this.value,input.value);
116− if (chng) { this.value = input.value; }
116+ if (chng) { this.value = input.value; }
117− send(this, timestep, chng);
117+ send(this, timestep, chng);
118 };
118 };
119 input.kids.push(this);
119 input.kids.push(this);
120 }
120 }
121−
121+
122 function dropWhen(s1,b,s2) {
122 function dropWhen(s1,b,s2) {
123− var pairs = lift2( F2(function(x,y){return {x:x,y:y}}), s1, s2 );
123+ var pairs = lift2( F2(function(x,y){return {x:x,y:y};}), s1, s2 );
124− var dropped = new dropIf(function(p){return p.x},{x:true,y:b},pairs);
124+ var dropped = new DropIf(function(p){return p.x;},{x:true,y:b},pairs);
125− return lift(function(p){return p.y}, dropped)
125+ return lift(function(p){return p.y;}, dropped);
126 }
126 }
127
127
128 function timestamp(a) {
128 function timestamp(a) {
129− function update() { return Utils.Tuple2(Date.now(), a.value) }
129+ function update() { return Utils.Tuple2(Date.now(), a.value); }
130 return new LiftN(update, [a]);
130 return new LiftN(update, [a]);
131 }
131 }
132
132
@@ -134,69 +134,69 @@ Elm.Native.Signal = function(elm) {
134 this.id = Utils.guid();
134 this.id = Utils.guid();
135 this.value = s2.value;
135 this.value = s2.value;
136 this.kids = [];
136 this.kids = [];
137−
137+
138 var count = 0;
138 var count = 0;
139 var isChanged = false;
139 var isChanged = false;
140−
140+
141 this.recv = function(timestep, changed, parentID) {
141 this.recv = function(timestep, changed, parentID) {
142− if (parentID === s1.id) isChanged = changed;
142+ if (parentID === s1.id) isChanged = changed;
143− ++count;
143+ ++count;
144− if (count == 2) {
144+ if (count == 2) {
145− if (isChanged) { this.value = s2.value; }
145+ if (isChanged) { this.value = s2.value; }
146− send(this, timestep, isChanged);
146+ send(this, timestep, isChanged);
147− count = 0;
147+ count = 0;
148− isChanged = false;
148+ isChanged = false;
149− }
149+ }
150 };
150 };
151 s1.kids.push(this);
151 s1.kids.push(this);
152 s2.kids.push(this);
152 s2.kids.push(this);
153 }
153 }
154
154
155− function sampleOn(s1,s2) { return new SampleOn(s1,s2) }
155+ function sampleOn(s1,s2) { return new SampleOn(s1,s2); }
156
156
157 function delay(t,s) {
157 function delay(t,s) {
158 var delayed = new Input(s.value);
158 var delayed = new Input(s.value);
159 var firstEvent = true;
159 var firstEvent = true;
160 function update(v) {
160 function update(v) {
161− if (firstEvent) { firstEvent = false; return; }
161+ if (firstEvent) { firstEvent = false; return; }
162− setTimeout(function() { elm.notify(delayed.id, v) }, t);
162+ setTimeout(function() { elm.notify(delayed.id, v); }, t);
163 }
163 }
164− function first(a,b) { return a }
164+ function first(a,b) { return a; }
165 return new SampleOn(delayed, lift2(F2(first), delayed, lift(update,s)));
165 return new SampleOn(delayed, lift2(F2(first), delayed, lift(update,s)));
166 }
166 }
167−
167+
168 function Merge(s1,s2) {
168 function Merge(s1,s2) {
169 this.id = Utils.guid();
169 this.id = Utils.guid();
170 this.value = s1.value;
170 this.value = s1.value;
171 this.kids = [];
171 this.kids = [];
172−
172+
173 var next = null;
173 var next = null;
174 var count = 0;
174 var count = 0;
175 var isChanged = false;
175 var isChanged = false;
176−
176+
177 this.recv = function(timestep, changed, parentID) {
177 this.recv = function(timestep, changed, parentID) {
178− ++count;
178+ ++count;
179− if (changed) {
179+ if (changed) {
180− isChanged = true;
180+ isChanged = true;
181− if (parentID == s2.id && next === null) { next = s2.value; }
181+ if (parentID == s2.id && next === null) { next = s2.value; }
182− if (parentID == s1.id) { next = s1.value; }
182+ if (parentID == s1.id) { next = s1.value; }
183− }
183+ }
184−
184+
185− if (count == 2) {
185+ if (count == 2) {
186− if (isChanged) { this.value = next; next = null; }
186+ if (isChanged) { this.value = next; next = null; }
187− send(this, timestep, isChanged);
187+ send(this, timestep, isChanged);
188− isChanged = false;
188+ isChanged = false;
189− count = 0;
189+ count = 0;
190− }
190+ }
191 };
191 };
192 s1.kids.push(this);
192 s1.kids.push(this);
193 s2.kids.push(this);
193 s2.kids.push(this);
194 }
194 }
195
195
196− function merge(s1,s2) { return new Merge(s1,s2) }
196+ function merge(s1,s2) { return new Merge(s1,s2); }
197− function merges(ss) { return A2(foldl1, F2(merge), ss) }
197+ function merges(ss) { return A2(foldl1, F2(merge), ss); }
198 function mergeEither(s1,s2) { return new Merge(lift(Either.Left, s1),
198 function mergeEither(s1,s2) { return new Merge(lift(Either.Left, s1),
199− lift(Either.Right,s2)) }
199+ lift(Either.Right,s2)); }
200
200
201 function average(sampleSize, s) {
201 function average(sampleSize, s) {
202 var sample = new Array(sampleSize);
202 var sample = new Array(sampleSize);
@@ -206,13 +206,13 @@ Elm.Native.Signal = function(elm) {
206 var full = false;
206 var full = false;
207 var total = 0;
207 var total = 0;
208 function f(n) {
208 function f(n) {
209− total += n - sample[i];
209+ total += n - sample[i];
210− sample[i] = n;
210+ sample[i] = n;
211− var avg = total / Math.max(1, full ? sampleSize : i);
211+ var avg = total / Math.max(1, full ? sampleSize : i);
212− if (++i == sampleSize) { full = true; i = 0; }
212+ if (++i == sampleSize) { full = true; i = 0; }
213− return avg;
213+ return avg;
214 }
214 }
215− return lift(f,s);pp
215+ return lift(f,s);
216 }
216 }
217
217
218 return elm.Native.Signal = {
218 return elm.Native.Signal = {
@@ -231,17 +231,18 @@ Elm.Native.Signal = function(elm) {
231 merges : merges,
231 merges : merges,
232 mergeEither : F2(mergeEither),
232 mergeEither : F2(mergeEither),
233 average : F2(average),
233 average : F2(average),
234− count : function(s) { return foldp(F2(function(_,c) { return c+1 }), 0, s) },
234+ count : function(s) { return foldp(F2(function(_,c) { return c+1; }), 0, s); },
235 countIf : F2(function(pred,s) {
235 countIf : F2(function(pred,s) {
236− return foldp(F2(function(x,c){return pred(x) ? c+1 : c}), 0, s)}),
236+ return foldp(F2(function(x,c){
237+ return pred(x) ? c+1 : c; }), 0, s)}),
237 keepIf : F3(function(pred,base,sig) {
238 keepIf : F3(function(pred,base,sig) {
238− return new dropIf(function(x) {return !pred(x)},base,sig) }),
239+ return new DropIf(function(x) {return !pred(x);},base,sig); }),
239− dropIf : F3(function(pred,base,sig) { return new dropIf(pred,base,sig) }),
240+ dropIf : F3(function(pred,base,sig) { return new DropIf(pred,base,sig); }),
240 keepWhen : F3(function(s1,b,s2) {
241 keepWhen : F3(function(s1,b,s2) {
241− return dropWhen(lift(function(b){return !b;},s1), b, s2) }),
242+ return dropWhen(lift(function(b){return !b;},s1), b, s2); }),
242 dropWhen : F3(dropWhen),
243 dropWhen : F3(dropWhen),
243− dropRepeats : function(s) { return new dropRepeats(s);},
244+ dropRepeats : function(s) { return new DropRepeats(s);},
244 sampleOn : F2(sampleOn),
245 sampleOn : F2(sampleOn),
245 timestamp : timestamp
246 timestamp : timestamp
246 };
247 };
247−};
248+};
libraries/Native/Signal/Time.js+7−7
@@ -12,9 +12,9 @@ Elm.Native.Time = function(elm) {
12 var ticker = Signal.constant(diff);
12 var ticker = Signal.constant(diff);
13 function tick(zero) { return function() {
13 function tick(zero) { return function() {
14 curr = Date.now();
14 curr = Date.now();
15− diff = zero ? 0 : curr - prev;
15+ diff = zero ? 0 : curr - prev;
16− prev = curr;
16+ prev = curr;
17− elm.notify(ticker.id, diff);
17+ elm.notify(ticker.id, diff);
18 };
18 };
19 }
19 }
20 var timeoutID = 0;
20 var timeoutID = 0;
@@ -22,14 +22,14 @@ Elm.Native.Time = function(elm) {
22 if (isOn) {
22 if (isOn) {
23 timeoutID = setTimeout(tick(!wasOn && isOn), msPerFrame);
23 timeoutID = setTimeout(tick(!wasOn && isOn), msPerFrame);
24 } else if (wasOn) {
24 } else if (wasOn) {
25− clearTimeout(timeoutID);
25+ clearTimeout(timeoutID);
26 }
26 }
27 wasOn = isOn;
27 wasOn = isOn;
28 return t;
28 return t;
29 }
29 }
30 return A3( Signal.lift2, F2(f), isOn, ticker );
30 return A3( Signal.lift2, F2(f), isOn, ticker );
31 }
31 }
32−
32+
33 function everyWhen(t, isOn) {
33 function everyWhen(t, isOn) {
34 var clock = Signal.constant(Date.now());
34 var clock = Signal.constant(Date.now());
35 function tellTime() { elm.notify(clock.id, Date.now()); }
35 function tellTime() { elm.notify(clock.id, Date.now()); }
@@ -38,7 +38,7 @@ Elm.Native.Time = function(elm) {
38 }
38 }
39
39
40 function since(t, s) {
40 function since(t, s) {
41− function cmp(a,b) { return !Utils.eq(a,b) }
41+ function cmp(a,b) { return !Utils.eq(a,b); }
42 var dcount = Signal.count(A2(Signal.delay, t, s));
42 var dcount = Signal.count(A2(Signal.delay, t, s));
43 return A3( Signal.lift2, F2(cmp), Signal.count(s), dcount );
43 return A3( Signal.lift2, F2(cmp), Signal.count(s), dcount );
44 }
44 }
@@ -70,4 +70,4 @@ Elm.Native.Time = function(elm) {
70 read : read
70 read : read
71 };
71 };
72
72
73−};
73+};
libraries/Native/Signal/Window.js+2−2
@@ -18,10 +18,10 @@ Elm.Native.Window = function(elm) {
18
18
19 // Do not move width and height into Elm. By setting the default number of kids,
19 // Do not move width and height into Elm. By setting the default number of kids,
20 // the resize listener can be detached.
20 // the resize listener can be detached.
21− var width = A2(Signal.lift, function(p){return p._0}, dimensions);
21+ var width = A2(Signal.lift, function(p){return p._0;}, dimensions);
22 width.defaultNumberOfKids = 0;
22 width.defaultNumberOfKids = 0;
23
23
24− var height = A2(Signal.lift, function(p){return p._1}, dimensions);
24+ var height = A2(Signal.lift, function(p){return p._1;}, dimensions);
25 height.defaultNumberOfKids = 0;
25 height.defaultNumberOfKids = 0;
26
26
27 function resize(e) {
27 function resize(e) {
libraries/Native/Utils.js+22−20
@@ -13,8 +13,8 @@ Elm.Native.Utils = function(elm) {
13 return c === Object.keys(y).length;
13 return c === Object.keys(y).length;
14 }
14 }
15 if (typeof x === 'function') {
15 if (typeof x === 'function') {
16− throw new Error('Equality error: general function equality is ' +
16+ throw new Error('Equality error: general function equality is ' +
17− 'undecidable, and therefore, unsupported');
17+ 'undecidable, and therefore, unsupported');
18 }
18 }
19 return x === y;
19 return x === y;
20 }
20 }
@@ -22,18 +22,20 @@ Elm.Native.Utils = function(elm) {
22 var EQ = 0, LT = 1, GT = 2, ord = ['EQ','LT','GT'];
22 var EQ = 0, LT = 1, GT = 2, ord = ['EQ','LT','GT'];
23 function compare(x,y) { return { ctor: ord[cmp(x,y)] } }
23 function compare(x,y) { return { ctor: ord[cmp(x,y)] } }
24 function cmp(x,y) {
24 function cmp(x,y) {
25+ var ord;
25 if (typeof x !== 'object') return x === y ? EQ : x < y ? LT : GT;
26 if (typeof x !== 'object') return x === y ? EQ : x < y ? LT : GT;
26
27
27 if (x.ctor === "Cons" || x.ctor === "Nil") {
28 if (x.ctor === "Cons" || x.ctor === "Nil") {
28− while (true) {
29+ while (true) {
29− if (x.ctor === "Nil" && y.ctor === "Nil") return EQ;
30+ if (x.ctor === "Nil" && y.ctor === "Nil") return EQ;
30− if (x.ctor !== y.ctor) return {ctor: x.ctor==='Nil'?LT:GT};
31+ if (x.ctor !== y.ctor) return x.ctor === 'Nil' ? LT : GT;
31− var ord = cmp(x._0, y._0);
32+ ord = cmp(x._0, y._0);
32− if (ord !== EQ) return ord;
33+ if (ord !== EQ) return ord;
33− x = x._1;
34+ x = x._1;
34− y = y._1;
35+ y = y._1;
35− }
36+ }
36 }
37 }
38+
37 if (x.ctor.slice(0,5) === 'Tuple') {
39 if (x.ctor.slice(0,5) === 'Tuple') {
38 var n = x.ctor.slice(5) - 0;
40 var n = x.ctor.slice(5) - 0;
39 var err = 'cannot compare tuples with more than 6 elements.';
41 var err = 'cannot compare tuples with more than 6 elements.';
@@ -48,8 +50,8 @@ Elm.Native.Utils = function(elm) {
48 return EQ;
50 return EQ;
49 }
51 }
50 throw new Error('Comparison error: comparison is only defined on ints, ' +
52 throw new Error('Comparison error: comparison is only defined on ints, ' +
51− 'floats, times, chars, strings, lists of comparable values, ' +
53+ 'floats, times, chars, strings, lists of comparable values, ' +
52− 'and tuples of comparable values.')
54+ 'and tuples of comparable values.')
53 }
55 }
54
56
55
57
@@ -68,11 +70,11 @@ Elm.Native.Utils = function(elm) {
68 function remove(x,r) {
70 function remove(x,r) {
69 var o = copy(r);
71 var o = copy(r);
70 if (x in o._) {
72 if (x in o._) {
71− o[x] = o._[x][0];
73+ o[x] = o._[x][0];
72− o._[x] = o._[x].slice(1);
74+ o._[x] = o._[x].slice(1);
73− if (o._[x].length === 0) { delete o._[x]; }
75+ if (o._[x].length === 0) { delete o._[x]; }
74 } else {
76 } else {
75− delete o[x];
77+ delete o[x];
76 }
78 }
77 return o;
79 return o;
78 }
80 }
@@ -80,8 +82,8 @@ Elm.Native.Utils = function(elm) {
80 function replace(kvs,r) {
82 function replace(kvs,r) {
81 var o = copy(r);
83 var o = copy(r);
82 for (var i = kvs.length; i--; ) {
84 for (var i = kvs.length; i--; ) {
83− var kvsi = kvs[i];
85+ var kvsi = kvs[i];
84− o[kvsi[0]] = kvsi[1];
86+ o[kvsi[0]] = kvsi[1];
85 }
87 }
86 return o;
88 return o;
87 }
89 }
@@ -103,7 +105,7 @@ Elm.Native.Utils = function(elm) {
103 t.style.visibility = "hidden";
105 t.style.visibility = "hidden";
104 t.style.styleFloat = "left";
106 t.style.styleFloat = "left";
105 t.style.cssFloat = "left";
107 t.style.cssFloat = "left";
106−
108+
107 elm.node.appendChild(t);
109 elm.node.appendChild(t);
108 var w = t.clientWidth;
110 var w = t.clientWidth;
109 var h = t.clientHeight;
111 var h = t.clientHeight;
@@ -127,4 +129,4 @@ Elm.Native.Utils = function(elm) {
127 htmlHeight: F2(htmlHeight),
129 htmlHeight: F2(htmlHeight),
128 toFloat: function(x){return x}
130 toFloat: function(x){return x}
129 };
131 };
130−};
132+};
runtime/Init.js+15−15
@@ -6,7 +6,7 @@ Elm.init = function(module, baseNode) {
6 var signalGraph = null;
6 var signalGraph = null;
7 var inputs = [];
7 var inputs = [];
8 var visualModel = null;
8 var visualModel = null;
9−
9+
10 function notify(id, v) {
10 function notify(id, v) {
11 var timestep = Date.now();
11 var timestep = Date.now();
12 var hasListener = false;
12 var hasListener = false;
@@ -24,17 +24,17 @@ Elm.init = function(module, baseNode) {
24 var style = document.createElement('style');
24 var style = document.createElement('style');
25 style.type = 'text/css';
25 style.type = 'text/css';
26 style.innerHTML = "html,head,body { padding:0; margin:0; }" +
26 style.innerHTML = "html,head,body { padding:0; margin:0; }" +
27− "body { font-family: calibri, helvetica, arial, sans-serif; }";
27+ "body { font-family: calibri, helvetica, arial, sans-serif; }";
28 document.head.appendChild(style);
28 document.head.appendChild(style);
29 }
29 }
30
30
31− // create the actuall RTS. Any impure modules will attach themselves to this
31+ // create the actual RTS. Any impure modules will attach themselves to this
32 // object. This permits many Elm programs to be embedded per document.
32 // object. This permits many Elm programs to be embedded per document.
33 var elm = {notify: notify, node: baseNode, id: ElmRuntime.guid(), inputs: inputs};
33 var elm = {notify: notify, node: baseNode, id: ElmRuntime.guid(), inputs: inputs};
34
34
35 // Set up methods to communicate with Elm program from JS.
35 // Set up methods to communicate with Elm program from JS.
36 function send(name, value) {
36 function send(name, value) {
37− if (typeof value === 'undefined') return function(v) { return send(name,v) };
37+ if (typeof value === 'undefined') return function(v) { return send(name,v); };
38 var e = document.createEvent('Event');
38 var e = document.createEvent('Event');
39 e.initEvent(name + '_' + elm.id, true, true);
39 e.initEvent(name + '_' + elm.id, true, true);
40 e.value = value;
40 e.value = value;
@@ -44,11 +44,11 @@ Elm.init = function(module, baseNode) {
44 document.addEventListener(name + '_' + elm.id, handler);
44 document.addEventListener(name + '_' + elm.id, handler);
45 }
45 }
46
46
47− recv('elm_log', function(e) {console.log(e.value)});
47+ recv('elm_log', function(e) {console.log(e.value);});
48− recv('elm_title', function(e) {document.title = e.value});
48+ recv('elm_title', function(e) {document.title = e.value;});
49 recv('elm_redirect', function(e) {
49 recv('elm_redirect', function(e) {
50− if (e.value.length > 0) { window.location = e.value; }
50+ if (e.value.length > 0) { window.location = e.value; }
51− });
51+ });
52
52
53 // If graphics are not enabled, escape early, skip over setting up DOM stuff.
53 // If graphics are not enabled, escape early, skip over setting up DOM stuff.
54 if (baseNode === null) return { send : send, recv : recv };
54 if (baseNode === null) return { send : send, recv : recv };
@@ -58,14 +58,14 @@ Elm.init = function(module, baseNode) {
58
58
59 // evaluate the given module and extract its 'main' value.
59 // evaluate the given module and extract its 'main' value.
60 signalGraph = module(elm).main;
60 signalGraph = module(elm).main;
61−
61+
62 // make sure the signal graph is actually a signal, extract the visual model,
62 // make sure the signal graph is actually a signal, extract the visual model,
63 // and filter out any unused inputs.
63 // and filter out any unused inputs.
64 var Signal = Elm.Signal(elm);
64 var Signal = Elm.Signal(elm);
65 if (!('recv' in signalGraph)) signalGraph = Signal.constant(signalGraph);
65 if (!('recv' in signalGraph)) signalGraph = Signal.constant(signalGraph);
66 visualModel = signalGraph.value;
66 visualModel = signalGraph.value;
67 inputs = ElmRuntime.filterDeadInputs(inputs);
67 inputs = ElmRuntime.filterDeadInputs(inputs);
68−
68+
69 var tuple2 = Elm.Native.Utils(elm).Tuple2;
69 var tuple2 = Elm.Native.Utils(elm).Tuple2;
70 function adjustWindow() {
70 function adjustWindow() {
71 if ('Window' in elm) {
71 if ('Window' in elm) {
@@ -77,12 +77,12 @@ Elm.init = function(module, baseNode) {
77 }
77 }
78 }
78 }
79 }
79 }
80−
80+
81 // Add the visualModel to the DOM
81 // Add the visualModel to the DOM
82− var renderNode = Render.render(visualModel)
82+ var renderNode = Render.render(visualModel);
83 baseNode.appendChild(renderNode);
83 baseNode.appendChild(renderNode);
84 adjustWindow();
84 adjustWindow();
85−
85+
86 // set up updates so that the DOM is adjusted as necessary.
86 // set up updates so that the DOM is adjusted as necessary.
87 var update = Render.update;
87 var update = Render.update;
88 function domUpdate(value) {
88 function domUpdate(value) {
@@ -93,8 +93,8 @@ Elm.init = function(module, baseNode) {
93 });
93 });
94 return value;
94 return value;
95 }
95 }
96−
96+
97 signalGraph = A2(Signal.lift, domUpdate, signalGraph);
97 signalGraph = A2(Signal.lift, domUpdate, signalGraph);
98−
98+
99 return { send : send, recv : recv };
99 return { send : send, recv : recv };
100};
100};
runtime/Render/Collage.js+40−40
@@ -37,26 +37,26 @@ function customLineHelp(ctx, style, path) {
37 var draw = true, segmentLength = pattern[0];
37 var draw = true, segmentLength = pattern[0];
38 ctx.moveTo(x0,y0);
38 ctx.moveTo(x0,y0);
39 while (i--) {
39 while (i--) {
40− x1 = points[i]._0; y1 = points[i]._1;
40+ x1 = points[i]._0; y1 = points[i]._1;
41− dx = x1 - x0; dy = y1 - y0;
41+ dx = x1 - x0; dy = y1 - y0;
42− remaining = Math.sqrt(dx * dx + dy * dy);
42+ remaining = Math.sqrt(dx * dx + dy * dy);
43− while (segmentLength <= remaining) {
43+ while (segmentLength <= remaining) {
44− x0 += dx * segmentLength / remaining;
44+ x0 += dx * segmentLength / remaining;
45− y0 += dy * segmentLength / remaining;
45+ y0 += dy * segmentLength / remaining;
46− ctx[draw ? 'lineTo' : 'moveTo'](x0, y0);
46+ ctx[draw ? 'lineTo' : 'moveTo'](x0, y0);
47− // update starting position
47+ // update starting position
48− dx = x1 - x0; dy = y1 - y0;
48+ dx = x1 - x0; dy = y1 - y0;
49− remaining = Math.sqrt(dx * dx + dy * dy);
49+ remaining = Math.sqrt(dx * dx + dy * dy);
50− // update pattern
50+ // update pattern
51− draw = !draw;
51+ draw = !draw;
52− pindex = (pindex + 1) % plen;
52+ pindex = (pindex + 1) % plen;
53− segmentLength = pattern[pindex];
53+ segmentLength = pattern[pindex];
54− }
54+ }
55− if (remaining > 0) {
55+ if (remaining > 0) {
56− ctx[draw ? 'lineTo' : 'moveTo'](x1, y1);
56+ ctx[draw ? 'lineTo' : 'moveTo'](x1, y1);
57− segmentLength -= remaining;
57+ segmentLength -= remaining;
58− }
58+ }
59− x0 = x1; y0 = y1;
59+ x0 = x1; y0 = y1;
60 }
60 }
61}
61}
62
62
@@ -79,18 +79,18 @@ function texture(redo, ctx, src) {
79}
79}
80
80
81function gradient(ctx, grad) {
81function gradient(ctx, grad) {
82− var g;
82+ var g, p1, p2;
83 if (grad.ctor === 'Linear') {
83 if (grad.ctor === 'Linear') {
84− var p1 = grad._1, p2 = grad._2;
84+ p1 = grad._1; p2 = grad._2;
85− g = ctx.createLinearGradient(p1._0, p1._1, p2._0, p2._1);
85+ g = ctx.createLinearGradient(p1._0, p1._1, p2._0, p2._1);
86 } else {
86 } else {
87− var p1 = grad._1, p2 = grad._3;
87+ p1 = grad._1; p2 = grad._3;
88− g = ctx.createRadialGradient(p1._0, p1._1, grad._2, p2._0, p2._1, grad._4);
88+ g = ctx.createRadialGradient(p1._0, p1._1, grad._2, p2._0, p2._1, grad._4);
89 }
89 }
90 var stops = fromList(grad._0);
90 var stops = fromList(grad._0);
91 for (var i = stops.length; i--; ) {
91 for (var i = stops.length; i--; ) {
92− var stop = stops[i];
92+ var stop = stops[i];
93− g.addColorStop(stop._0, extract(stop._1));
93+ g.addColorStop(stop._0, extract(stop._1));
94 }
94 }
95 return g;
95 return g;
96}
96}
@@ -123,23 +123,23 @@ function renderForm(stack, redo, ctx, form) {
123 switch(f.ctor) {
123 switch(f.ctor) {
124 case 'FPath' : drawLine(ctx, f._0, f._1); break;
124 case 'FPath' : drawLine(ctx, f._0, f._1); break;
125 case 'FShape':
125 case 'FShape':
126− if (f._0.ctor === 'Left') {
126+ if (f._0.ctor === 'Left') {
127− f._1.closed = true;
127+ f._1.closed = true;
128− drawLine(ctx, f._0._0, f._1);
128+ drawLine(ctx, f._0._0, f._1);
129− } else {
129+ } else {
130 drawShape(redo, ctx, f._0._0, f._1);
130 drawShape(redo, ctx, f._0._0, f._1);
131 }
131 }
132− break;
132+ break;
133 case 'FImage': drawImage(redo, ctx, f); break;
133 case 'FImage': drawImage(redo, ctx, f); break;
134 case 'FGroup':
134 case 'FGroup':
135− ctx.save();
135+ ctx.save();
136− var m = f._0;
136+ var m = f._0;
137 // stack.push(makeTransform(x, y, theta, scale, m));
137 // stack.push(makeTransform(x, y, theta, scale, m));
138− ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);
138+ ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);
139− renderForms(stack, redo, ctx, f._1);
139+ renderForms(stack, redo, ctx, f._1);
140 // stack.pop();
140 // stack.pop();
141− ctx.restore();
141+ ctx.restore();
142− break;
142+ break;
143 }
143 }
144 ctx.restore();
144 ctx.restore();
145}
145}
@@ -207,10 +207,10 @@ function update(node, oldModel, newModel) {
207 var ctx = node.getContext('2d');
207 var ctx = node.getContext('2d');
208 var w = newModel.w, h = newModel.h;
208 var w = newModel.w, h = newModel.h;
209 ctx.clearRect(-w/2, -h/2, w, h);
209 ctx.clearRect(-w/2, -h/2, w, h);
210− function redo() { renderForms( [], this, ctx, newModel.forms ); }
210+ var redo = function(){ renderForms( [], this, ctx, newModel.forms ); };
211 renderForms( [], redo, ctx, newModel.forms );
211 renderForms( [], redo, ctx, newModel.forms );
212}
212}
213
213
214return { render:render, update:update };
214return { render:render, update:update };
215
215
216−};
216+};
runtime/Utils.js+5−5
@@ -13,11 +13,11 @@ ElmRuntime.use = function(M) {
13function isAlive(input) {
13function isAlive(input) {
14 if (!('defaultNumberOfKids' in input)) return true;
14 if (!('defaultNumberOfKids' in input)) return true;
15 var len = input.kids.length;
15 var len = input.kids.length;
16− if (len == 0) return false;
16+ if (len === 0) return false;
17 if (len > input.defaultNumberOfKids) return true;
17 if (len > input.defaultNumberOfKids) return true;
18 var alive = false;
18 var alive = false;
19 for (var i = len; i--; ) {
19 for (var i = len; i--; ) {
20− alive = alive || isAlive(input.kids[i]);
20+ alive = alive || isAlive(input.kids[i]);
21 }
21 }
22 return alive;
22 return alive;
23}
23}
@@ -25,7 +25,7 @@ function isAlive(input) {
25ElmRuntime.filterDeadInputs = function(inputs) {
25ElmRuntime.filterDeadInputs = function(inputs) {
26 var temp = [];
26 var temp = [];
27 for (var i = inputs.length; i--; ) {
27 for (var i = inputs.length; i--; ) {
28− if (isAlive(inputs[i])) temp.push(inputs[i]);
28+ if (isAlive(inputs[i])) temp.push(inputs[i]);
29 }
29 }
30 return temp;
30 return temp;
31};
31};
@@ -34,8 +34,8 @@ ElmRuntime.filterDeadInputs = function(inputs) {
34var vendors = ['ms', 'moz', 'webkit', 'o'];
34var vendors = ['ms', 'moz', 'webkit', 'o'];
35for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {
35for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {
36 window.requestAnimationFrame = window[vendors[i]+'RequestAnimationFrame'];
36 window.requestAnimationFrame = window[vendors[i]+'RequestAnimationFrame'];
37− window.cancelAnimationFrame = window[vendors[i]+'CancelAnimationFrame']
37+ window.cancelAnimationFrame = window[vendors[i]+'CancelAnimationFrame'] ||
38− || window[vendors[i]+'CancelRequestAnimationFrame'];
38+ window[vendors[i]+'CancelRequestAnimationFrame'];
39}
39}
40
40
41if (window.requestAnimationFrame && window.cancelAnimationFrame) {
41if (window.requestAnimationFrame && window.cancelAnimationFrame) {