@@ -1,4149 +0,0 @@
4−var Guid = function() {
6− var guid = function() { counter += 1; return counter; };
9−Elm.JavaScript = function() {
10− function castJSBoolToBool(b) { return b; }
11− function castBoolToJSBool(b) { return b; }
13− function castJSNumberToFloat(n) { return n; }
14− function castFloatToJSNumber(n) { return n; }
16− function castJSNumberToInt(n) { return ~~n; }
17− function castIntToJSNumber(n) { return n; }
19− function castJSElementToElement(w) {
21− return function(node) {
22− return ["Element",Guid.guid(),
23− ["EExternalHtml",node],
24− w,h,1,["Nothing"],["Nothing"]];
28− function castElementToJSElement(elem) { return Render.render(elem); }
30− function castJSArrayToList(arr) {
32− for (var i = arr.length; i--; ) {
33− list = [ "Cons", arr[i], list ];
37− function castListToJSArray(list) {
39− while (list[0] === "Cons") {
46− var castJSStringToString = castJSArrayToList;
47− function castStringToJSString(str) {
48− if (typeof str === "string") return str;
49− return castListToJSArray(str).join('');
52− function fromTuple(t) { return t.slice(1); }
53− function toTuple(a) { return ["Tuple" + a.length].concat(a); }
55− return {castJSBoolToBool:castJSBoolToBool,
56− castBoolToJSBool:castBoolToJSBool,
57− castJSNumberToFloat:castJSNumberToFloat,
58− castFloatToJSNumber:castFloatToJSNumber,
59− castJSNumberToInt:castJSNumberToInt,
60− castIntToJSNumber:castIntToJSNumber,
61− Experimental : {castJSElementToElement:castJSElementToElement,
62− castElementToJSElement:castElementToJSElement},
63− castJSArrayToList:castJSArrayToList,
64− castListToJSArray:castListToJSArray,
65− castJSStringToString:castJSStringToString,
66− castStringToJSString:castStringToJSString,
67− castTupleToJSTuple2:fromTuple,
68− castTupleToJSTuple3:fromTuple,
69− castTupleToJSTuple4:fromTuple,
70− castTupleToJSTuple5:fromTuple,
71− castJSTupleToTuple2:toTuple,
72− castJSTupleToTuple3:toTuple,
73− castJSTupleToTuple4:toTuple,
74− castJSTupleToTuple5:toTuple
78−var JSjson = window.JSON;
79−Elm.JSON = function() {
80− var JS = Elm.JavaScript;
81− var empty = ['JSON',{}];
82− function singleton(k) { return function(v) {
84− obj[JS.castStringToJSString(k)] = v;
85− return ['JSON', obj ];
88− function insert(k) { return function(v) { return function(inObj) {
94− outObj[JS.castStringToJSString(k)] = v;
95− return ['JSON', outObj ];
100− function lookup(key) { return function(obj) {
101− var k = JS.castStringToJSString(key);
102− return obj[1].hasOwnProperty(k) ? ["Just", obj[1][k]] : ["Nothing"] ;
105− function find(tipe,base) { return function (key) { return function(obj) {
106− var k = JS.castStringToJSString(key);
107− if (obj[1].hasOwnProperty(k)) {
109− if (v[0] === tipe) { return v[1]; }
115− function lookupWithDefault(base) { return function(key) { return function(obj) {
116− var k = JS.castStringToJSString(key);
117− return obj[1].hasOwnProperty(k) ? obj[1][k] : base ;
122− function remove(k) { return function(inObj) {
125− for (var i in obj) {
128− delete outObj[JS.castStringToJSString(k)];
129− return ['JSON', outObj];
133− function JsonString(v) { return [ "JsonString", v ]; }
134− function JsonNumber(v) { return [ "JsonNumber", v ]; }
135− function JsonBool(v) { return [ "JsonBool", v ]; }
136− var JsonNull = [ "JsonNull" ];
137− function JsonArray(v) { return [ "JsonArray", v ]; }
138− function JsonObject(v) { return [ "JsonObject", v ]; }
140− function toList(json) {
143− for (var i in obj) {
144− arr.push(Value.Tuple(JS.castJSStringToString(i), obj[i]));
146− return JS.castJSArrayToList(arr);
148− function fromList(list) {
149− var arr = JS.castListToJSArray(list);
151− for (var i = arr.length; i--; ) {
152− obj[JS.castStringToJSString(arr[i][1])] = arr[i][2];
154− return [ "JSON", obj ];
157− function toPrettyJSString(sep) { return function (obj) {
158− function fromValue(v) {
160− case 'JsonNull' : return null;
161− case 'JsonString' : return JS.castStringToJSString(v[1]);
165− for (var i in from) {
166− o[i] = fromValue(from[i]);
170− var a = JS.castListToJSArray(v[1]);
171− for (var i = a.length; i--; ) {
172− a[i] = fromValue(a[i]);
179− return JSjson.stringify(fromValue([ 'JsonObject', obj ]), null, JS.castStringToJSString(sep));
182− function fromJSString(str) {
183− var obj = JSjson.parse(str);
184− function toValue(v) {
186− case 'string' : return [ "JsonString", JS.castJSStringToString(v) ];
187− case 'number' : return [ "JsonNumber", JS.castJSNumberToFloat(v) ];
188− case 'boolean' : return [ "JsonBool", JS.castJSBoolToBool(v) ];
190− if (v === null) return [ "JsonNull" ];
192− v[i] = toValue(v[i]);
194− if (v instanceof Array) return [ "JsonArray", JS.castJSArrayToList(v) ];
195− return [ "JsonObject", [ "JSON", v ] ];
198− for (var i in obj) {
199− obj[i] = toValue(obj[i]);
201− return ['JSON',obj];
203− return {empty : empty,
204− singleton : singleton,
207− findString : find("JsonString",["Nil"]),
208− findObject : find("JsonObject", empty ),
209− findArray : find("JsonArray" ,["Nil"]),
210− findWithDefault : lookupWithDefault,
212− toPrettyJSString : toPrettyJSString,
213− toJSString : toPrettyJSString(''),
214− fromJSString : fromJSString,
215− toPrettyString : function(sep) { return function(v) {
216− return JS.castJSStringToString(toPrettyJSString(sep)(v)); }; },
217− toString : function(v) { return JS.castJSStringToString(toPrettyJSString('')(v)); },
218− fromString : function(v) { return fromJSString(JS.castStringToJSString(v)); },
220− fromList : fromList,
221− JsonString : JsonString,
222− JsonNumber : JsonNumber,
223− JsonBool : JsonBool,
224− JsonNull : JsonNull,
225− JsonArray : JsonArray,
226− JsonObject : JsonObject
230−var Value = function(){
232− var eq = function(x,y) {
233− if (typeof x === "object") {
234− if (x.hasOwnProperty('_')) {
235− for (var i in x) { if (x[i] != y[i]) return false; }
236− for (var i in y) { if (x[i] != y[i]) return false; }
239− if (x === y) return true;
240− if (x.length !== y.length) return false;
241− for (var i = x.length; i--; ) {
242− if (!eq(x[i],y[i])) return false;
249− var Tuple = function() {
250− var len = arguments.length;
251− var arr = new Array(len+1);
252− arr[0] = "Tuple" + arguments.length;
253− for (var i = len; i--; ) {
254− arr[i+1] = arguments[i];
259− var listToArray = function(list) {
261− while (list[0] === "Cons") {
268− function makeSpaces(s) {
269− if (s.length == 0) { return s; }
270− var arr = s.split('');
271− if (arr[0] == ' ') { arr[0] = " " }
272− for (var i = arr.length; --i; ) {
273− if (arr[i][0] == ' ' && arr[i-1] == ' ') {
274− arr[i-1] = arr[i-1] + arr[i];
278− for (var i = arr.length; i--; ) {
279− if (arr[i].length > 1 && arr[i][0] == ' ') {
280− var spaces = arr[i].split('');
281− for (var j = spaces.length - 2; j >= 0; j -= 2) {
282− spaces[j] = ' ';
284− arr[i] = spaces.join('');
288− if (arr[arr.length-1] === " ") {
289− return arr.slice(0,-1) + ' ';
294− function properEscape(str) {
295− if (str.length == 0) return str;
296− str = str //.replace(/&/g, "&")
297− .replace(/"/g, /*"*/ """)
298− .replace(/'/g, /*'*/ "'")
299− .replace(/</g, "<")
300− .replace(/>/g, ">")
301− .replace(/\n/g, "<br/>");
302− var arr = str.split('<br/>');
303− for (var i = arr.length; i--; ) {
304− arr[i] = makeSpaces(arr[i]);
306− return arr.join('<br/>');
309− var toText = function(elmList) {
310− if (typeof elmList === "string") return properEscape(elmList);
312− while (elmList[0] === "Cons") {
314− elmList = elmList[2];
316− return properEscape(a.join(''));
319− function getTextSize(w,h,txt) {
320− var t = document.createElement('div');
322− t.style.textAlign = 'left';
323− if (w > 0) { t.style.width = w + "px"; }
325− t.style.visibility = "hidden";
326− t.style.styleFloat = "left";
327− t.style.cssFloat = "left";
329− document.body.appendChild(t);
330− var cStyle = window.getComputedStyle(t,null);
331− var realW = cStyle.getPropertyValue("width").slice(0,-2) - 0;
332− var realH = cStyle.getPropertyValue("height").slice(0,-2) - 0;
333− document.body.removeChild(t);
335− return [Math.ceil(realW),Math.ceil(Math.max(h,realH))];
338− function getSize(e) {
339− var t = e.cloneNode(true);
341− t.style.visibility = "hidden";
342− t.style.styleFloat = "left";
343− t.style.cssFloat = "left";
345− document.body.appendChild(t);
346− var w = t.offsetWidth;
347− var h = t.offsetHeight;
348− document.body.removeChild(t);
353− function getExcess(e) {
354− var t = e.cloneNode(true);
356− t.style.visibility = "hidden";
357− t.style.styleFloat = "left";
358− t.style.cssFloat = "left";
360− document.body.appendChild(t);
361− var ow = t.offsetWidth;
362− var oh = t.offsetHeight;
363− var cStyle = window.getComputedStyle(t,null);
364− var w = cStyle.getPropertyValue("width").slice(0,-2) - 0;
365− var h = cStyle.getPropertyValue("height").slice(0,-2) - 0;
366− document.body.removeChild(t);
372− function groupForms(forms) {
373− forms = Elm.JavaScript.castListToJSArray(forms);
376− for (var i = forms.length; i--; ) {
380− if (arr.length > 0) {
390− if (arr.length > 0) groups.push(arr);
394− var toString = function(v) {
395− if (typeof v === "function") {
396− return "<function>";
397− } else if (typeof v === "boolean") {
398− return v ? "True" : "False";
399− } else if (typeof v === "number") {
401− } else if (typeof v === "string" && v.length < 2) {
403− } else if (typeof v === "object" && v.hasOwnProperty('_')) {
406− if (k == '_') continue;
407− for (var i = v[k].length; i--; ) {
408− output.push(k + " = " + toString(v[k][i]));
411− if (output.length === 0) return "{}";
412− return "{ " + output.join(", ") + " }";
414− if (v[0].substring(0,5) === "Tuple") {
415− var output = new Array(v.length-1);
416− for (var i = v.length; --i; ) { output[i-1] = toString(v[i]); }
417− return "(" + output.join(",") + ")";
418− } else if (v[0] === "Cons") {
419− var start = (typeof v[1] === "string") ? '"' : "[";
420− var end = (typeof v[1] === "string") ? '"' : "]";
421− var div = (typeof v[1] === "string") ? "" : ",";
422− var f = (typeof v[1] === "string") ? function(x){return x} : toString;
423− var output = start + f(v[1]);
426− if (v[0] === "Cons") {
427− output += div + f(v[1]);
430− return output + end;
433− } else if (v[0] === "Nil") {
435− } else if (v[0] === "JSON") {
436− return "(JSON.fromList " + toString(Elm.JSON.toList(v)) + ")";
437− } else if (v[0] === "RBNode" || v[0] === "RBEmpty") {
438− function cons(k){ return function(v) { return function(acc) { return ["Cons",["Tuple2",k,v],acc]; }; }; }
439− var list = Elm.Dict.foldr(cons)(["Nil"])(v);
441− if (list[0] === "Cons" && list[1][2][0] === "Tuple0") {
443− list = Elm.List.map(function(x) { return x[1]; })(list);
445− return "(" + name + ".fromList " + toString(list) + ")";
448− for (var i = v.length; --i; ) { output = ' ' + toString(v[i]) + output; }
449− output = v[0] + output;
450− return (v.length > 1) ? "(" + output + ")" : output;
455− var show = function(v) { return str(toString(v)); };
456− var append = function(xs,ys) {
457− if (typeof xs === "string" && typeof ys === "string") {
458− return xs.concat(ys);
460− if (xs[0] === "Nil") {
463− var root = ["Cons", xs[1], ["Nil"]];
466− while (xs[0]==="Cons") {
467− curr[2] = ["Cons", xs[1], ["Nil"]];
475− var str = function(s) {
477− for (var i = s.length; i--; ) {
478− out = ["Cons", s[i], out];
483− function wrap(elem) {
484− var p = Value.getSize(elem);
485− return ["Element", Guid.guid(), ["EHtml",elem],
486− p[0], p[1], 1, ["Nothing"], ["Nothing"]];
488− var addListener = function() {
489− if(document.addEventListener) {
490− return function(element, event, handler) {
491− element.addEventListener(event, handler, false);
494− return function(element, event, handler) {
495− element.attachEvent('on' + event, handler);
505− listToArray:listToArray,
507− properEscape : properEscape,
508− getTextSize : getTextSize,
510− getExcess : getExcess,
511− groupForms : groupForms,
513− addListener : addListener
515−}();Elm.List = function() {
517− var throwError = function(f) {
518− throw "Function '" + f + "' expecting a list!";
521− function length(xs) {
523− while (xs[0] === "Cons") {
529− var reverse = foldl(function(x_72) {
530− return function(y_73) {
531− return["Cons", x_72, y_73]
534− var concat = foldr(function(x_74) {
535− return function(y_75) {
536− return Value.append(x_74, y_75)
539− var and = foldl(function(x_77) {
540− return function(y_78) {
544− var or = foldl(function(x_79) {
545− return function(y_80) {
549− var sum = foldl(function(x_89) {
550− return function(y_90) {
554− var product = foldl(function(x_91) {
555− return function(y_92) {
559− var maximum = foldl1(function(x) { return function(y) { return Math.max(x,y) } });
560− var minimum = foldl1(function(x) { return function(y) { return Math.min(x,y) } });
562− if (v[0] !== "Cons") {
563− throw "Error: 'head' only accepts lists of length greater than one.";
568− if (v[0] !== "Cons") {
569− throw "Error: 'tail' only accepts lists of length greater than one.";
574− if (v[0] !== "Cons") {
575− throw "Error: 'last' only accepts lists of length greater than one.";
578− while (v[0] === "Cons") {
585− return function(xs) {
586− if (xs[0] === "Nil") { return xs; }
587− if (xs[0] !== "Cons") { throwError('map'); }
588− var root = ["Cons", f(xs[1]), ["Nil"]];
591− while (xs[0]==="Cons") {
592− curr[2] = ["Cons", f(xs[1]), ["Nil"]];
600− return function(b) {
601− return function(xs) {
603− if (xs[0] === "Nil") { return acc; }
604− if (xs[0] !== "Cons") { throwError('foldl'); }
605− while (xs[0] === "Cons") {
606− acc = f(xs[1])(acc);
614− return function(b) {
615− return function(xs) {
617− if (xs[0] === "Nil") { return acc; }
618− if (xs[0] !== "Cons") { throwError('foldr'); }
620− while (xs[0] === "Cons") {
624− for (var i = arr.length; i--; ) {
625− acc = f(arr[i])(acc);
631− function foldl1(f_49) {
632− return function(_temp_50) {
633− return function(v) {
634− if("Cons" !== v[0]) {
639− return foldl(f_49)(x_51)(xs_52)
644− function foldr1(f) {
645− return function(xs) {
646− if (xs[0] === "Nil") { throw "'foldr1' requires an non-empty list." }
647− if (xs[0] !== "Cons") { throwError('foldr1'); }
649− while (xs[0] === "Cons") {
653− var acc = arr.pop();
654− for (var i = arr.length; i--; ) {
655− acc = f(arr[i])(acc);
661− return function(b) {
662− return function(xs) {
663− if (xs[0] === "Nil") { return ["Cons",b,["Nil"]]; }
664− if (xs[0] !== "Cons") { throwError('scanl'); }
666− while (xs[0] === "Cons") {
672− for (var i = arr.length; i--; ) {
673− out = ["Cons", arr[i], out];
679− function scanl1(f) {
680− return function(xs) {
681− if (xs[0] !== "Cons") {
682− throw "Error: 'scanl1' requires a list of at least length 1.";
684− return scanl(f)(xs[1])(xs[2]);
687− function filter(pred) {
688− return function(xs) {
689− if (xs[0] === "Nil") { return xs; }
690− if (xs[0] !== "Cons") { throwError('filter'); }
692− while (xs[0] === "Cons") {
693− if (pred(xs[1])) { arr.push(xs[1]); }
697− for (var i = arr.length; i--; ) {
698− out = ["Cons", arr[i], out];
703− function concatMap(f_76) {
704− return function(x) {
705− return concat(map(f_76)(x))
708− function all(pred) {
709− return foldl(function(x) { return function(acc) {
710− return acc && pred(x);
713− function any(pred) {
714− return foldl(function(x) { return function(acc) {
715− return acc || pred(x);
718− function partition(pred_93) {
719− return function(lst_94) {
722− var c = [function(v) {
723− if("Nil" !== v[0]) {
726− return["Tuple2", ["Nil"], ["Nil"]]
729− if("Cons" !== v[0]) {
734− return function(v) {
735− if("Tuple2" !== v[0]) {
740− return pred_93(x_95) ? ["Tuple2", ["Cons", x_95, as_97], bs_98] : ["Tuple2", as_97, ["Cons", x_95, bs_98]]
742− }(partition(pred_93)(xs_96))
745− for(var i = c.length;i--;) {
747− if(r !== undefined) {
754− function zipWith(f) {
755− return function(listA) {
756− return function(listB) {
757− if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
758− if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zipWith'); }
760− while (listA[0] === "Cons" && listB[0] === "Cons") {
761− arr.push(f(listA[1])(listB[1]));
766− for (var i = arr.length; i--; ) {
767− out = ["Cons", arr[i], out];
773− function zip(listA) {
774− return function(listB) {
775− if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
776− if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zip'); }
778− while (listA[0] === "Cons" && listB[0] === "Cons") {
779− arr.push(["Tuple2", listA[1], listB[1]]);
784− for (var i = arr.length; i--; ) {
785− out = ["Cons", arr[i], out];
790− function unzip(pairs_112) {
793− var c = [function(v) {
794− if("Nil" !== v[0]) {
797− return["Tuple2", ["Nil"], ["Nil"]]
800− if("Cons" !== v[0]) {
805− return function(v) {
806− if("Tuple2" !== v[0]) {
809− if("Tuple2" !== v[1][0]) {
812− var x_115 = v[1][1];
813− var y_116 = v[1][2];
814− if("Tuple2" !== v[2][0]) {
817− var xs_117 = v[2][1];
818− var ys_118 = v[2][2];
819− return["Tuple2", ["Cons", x_115, xs_117], ["Cons", y_116, ys_118]]
823− }(["Tuple2", p_113, unzip(ps_114)])
826− for(var i = c.length;i--;) {
828− if(r !== undefined) {
834− function intersperse(sep_119) {
835− return function(xs_120) {
838− var c = [function(v) {
839− if("Nil" !== v[0]) {
845− if("Cons" !== v[0]) {
849− if("Nil" !== v[2][0]) {
852− return["Cons", a_124, ["Nil"]]
856− if("Cons" !== v[0]) {
860− if("Cons" !== v[2][0]) {
863− var b_122 = v[2][1];
864− var cs_123 = v[2][2];
865− return["Cons", a_121, ["Cons", sep_119, intersperse(sep_119)(["Cons", b_122, cs_123])]]
869− for(var i = c.length;i--;) {
871− if(r !== undefined) {
878− function intercalate(sep_125) {
879− return function(xs_126) {
882− var c = [function(v) {
883− if("Nil" !== v[0]) {
889− if("Cons" !== v[0]) {
893− if("Nil" !== v[2][0]) {
900− if("Cons" !== v[0]) {
904− if("Cons" !== v[2][0]) {
907− var b_128 = v[2][1];
908− var cs_129 = v[2][2];
909− return Value.append(a_127, Value.append(sep_125, intercalate(sep_125)(["Cons", b_128, cs_129])))
913− for(var i = c.length;i--;) {
915− if(r !== undefined) {
923− if (xs[0] === "Nil") { return xs; }
924− if (xs[0] !== "Cons") { throwError('sort'); }
926− while (xs[0] === "Cons") {
930− arr.sort(function(a,b) { return a - b});
932− for (var i = arr.length; i--; ) {
933− out = [ "Cons", arr[i], out ];
937− function take(n) { return function(xs) {
938− if (n <= 0) { return ["Nil"]; }
939− if (xs[0] === "Nil") { return xs; }
940− if (xs[0] !== "Cons") { throwError('take'); }
941− var out = [ "Cons", xs[1], ["Nil"] ];
945− while (xs[0] === "Cons" && n > 0) {
946− temp[2] = [ "Cons", xs[1], ["Nil"] ];
954− function drop(n) { return function(xs) {
955− if (xs[0] === "Nil") { return xs; }
956− if (xs[0] !== "Cons") { throwError('drop'); }
957− while (xs[0] === "Cons" && n > 0) {
978− concatMap:concatMap,
987− partition:partition,
991− intersperse:intersperse,
992− intercalate:intercalate,
997−Elm.Maybe = function() {
998− function consMaybe(x) { return function(xs) {
999− if (x[0] === "Just") return ["Cons", x[1], xs];
1003− function mapCons(f) { return function(y) { return function(xs) {
1005− if (x[0] === "Just") return ["Cons", x[1], xs];
1010− function maybe(b) { return function(f) { return function(m) {
1011− if (m[0] === "Just") return f(m[1]);
1017− return {Just : function(x) { return ["Just",x]; },
1018− Nothing : ["Nothing"],
1019− justs : Elm.List.foldr(consMaybe)(["Nil"]),
1020− isJust : function(m) { return m[0] === "Just"; },
1021− isNothing : function(m) { return m[0] === "Nothing"; },
1027−Elm.Either = function() {
1028− function Left(a1) { return ['Left',a1]; }
1029− function Right(a1){ return ['Right',a1]; }
1030− function either(f){ return function(g){ return function(e){
1032− case 'Left': return f(e[1]);
1033− case 'Right': return g(e[1]);
1036− function isLeft(e) { return e[0] == 'Left'; }
1037− function isRight(e) { return e[0] == 'Right'; }
1039− function get(es) { return Elm.List.map(function(x){return x[1];})(es); }
1040− function lefts(es) { return get(Elm.List.filter(isLeft)(es)); }
1041− function rights(es) { return get(Elm.List.filter(isRight)(es)); }
1042− function partition(es) {
1043− var lrs = Elm.List.partition(isLeft)(es);
1044− lrs[1] = get(lrs[1]);
1045− lrs[2] = get(lrs[2]);
1055− partition:partition};
1058−Elm.Char = function() {
1059− function isBetween(lo,hi) { return function(chr) {
1060− var c = chr.charCodeAt(0);
1061− return lo <= c && c <= hi;
1064− var isDigit = isBetween('0'.charCodeAt(0),'9'.charCodeAt(0));
1065− var chk1 = isBetween('a'.charCodeAt(0),'f'.charCodeAt(0));
1066− var chk2 = isBetween('A'.charCodeAt(0),'F'.charCodeAt(0));
1068− return {fromCode : function(c) { return String.fromCharCode(c); },
1069− toCode : function(c) { return c.charCodeAt(0); },
1070− toUpper : function(c) { return c.toUpperCase(); },
1071− toLower : function(c) { return c.toLowerCase(); },
1072− toLocaleUpper : function(c) { return c.toLocaleUpperCase(); },
1073− toLocaleLower : function(c) { return c.toLocaleLowerCase(); },
1074− isLower : isBetween('a'.charCodeAt(0),'z'.charCodeAt(0)),
1075− isUpper : isBetween('A'.charCodeAt(0),'Z'.charCodeAt(0)),
1077− isOctDigit : isBetween('0'.charCodeAt(0),'7'.charCodeAt(0)),
1078− isHexDigit : function(c) { return isDigit(c) || chk1(c) || chk2(c); }
1081−Elm.Color = function() {
1083−function Color_0(a1) {
1084− return function(a2) {
1085− return function(a3) {
1086− return function(a4) {
1087− return["Color", a1, a2, a3, a4]
1092−var rgba_1 = Color_0;
1093−var red_3 = ["Color",255,0,0,1];
1094−var green_4 = ["Color",0,255,0,1];
1095−var blue_5 = ["Color",0,0,255,1];
1096−var yellow_6 = ["Color",255,255,0,1];
1097−var cyan_7 = ["Color",0,255,255,1];
1098−var magenta_8 = ["Color",255,0,255,1];
1099−var black_9 = ["Color",0,0,0,1];
1100−var white_10 = ["Color",255,255,255,1];
1101−var gray_11 = ["Color",128,128,128,1];
1102−var grey_12 = ["Color",128,128,128,1];
1103−function rgb_2(r_13) {
1104− return function(g_14) {
1105− return function(b_15) {
1106− return ["Color",r_13,g_14,b_15,1]
1110−function extract(c) {
1111− if (c[4] === 1) { return 'rgb(' + c[1] + ',' + c[2] + ',' + c[3] + ')'; }
1112− return 'rgba(' + c[1] + ',' + c[2] + ',' + c[3] + ',' + c[4] + ')';
1114−function complement(rgb) {
1115− var hsv = toHSV(rgb);
1116− hsv.hue = (hsv.hue + 180) % 360;
1120−function hsva(h) { return function(s) { return function(v) { return function(a) {
1121− var clr = toRGB({hue:h, saturation:s, value:v});
1127−function hsv(h) { return function(s) { return function(v) {
1128− return toRGB({hue:h, saturation:s, value:v}); }; }; }
1130−function toHSV(rgb) {
1132− var r = rgb[1] / 255.0, g = rgb[2] / 255.0, b = rgb[3] / 255.0;
1133− var M = Math.max(r,g,b);
1134− var m = Math.min(r,g,b);
1138− if (c === 0) { h = 0; }
1139− else if (M === r) { h = ((g - b) / c) % 6; }
1140− else if (M === g) { h = ((b - r) / c) + 2; }
1141− else if (M === b) { h = ((r - g) / c) + 4; }
1144− return { value : M, hue : h, saturation : (M === 0 ? 0 : c / M) };
1147−function between(lo,hi,x) { return lo <= x && x < hi; }
1148−function norm(n) { return Math.round(n*255); }
1150−function toRGB(hsv) {
1151− var c = hsv.value * hsv.saturation;
1152− var hue = hsv.hue / 60;
1153− var x = c * (1 - Math.abs((hue % 2) - 1));
1154− var r = 0, g = 0, b = 0;
1155− if (between(0,1,hue)) { r = c; g = x; b = 0; }
1156− else if (between(1,2,hue)) { r = x; g = c; b = 0; }
1157− else if (between(2,3,hue)) { r = 0; g = c; b = x; }
1158− else if (between(3,4,hue)) { r = 0; g = x; b = c; }
1159− else if (between(4,5,hue)) { r = x; g = 0; b = c; }
1160− else if (between(5,6,hue)) { r = c; g = 0; b = x; }
1162− var m = hsv.value - c;
1163− return ["Color", norm(r+m), norm(g+m), norm(b+m), 1 ];
1165− return{rgba:rgba_1, rgb:rgb_2, hsva:hsva, hsv:hsv, red:red_3, green:green_4, blue:blue_5, yellow:yellow_6, cyan:cyan_7, magenta:magenta_8, black:black_9, white:white_10, gray:gray_11, grey:grey_12,complement:complement,extract:extract}
1167−var Collage = function() {
1169−var JS = Elm.JavaScript;
1171−function tracePoints(ctx,points) {
1172− var i = points.length - 1;
1173− if (i <= 0) return;
1174− ctx.moveTo(points[i][1], points[i][2]);
1175− while (i--) { ctx.lineTo(points[i][1], points[i][2]); }
1178−function solid(ctx,color,points) {
1179− tracePoints(ctx,points);
1180− ctx.strokeStyle = Elm.Color.extract(color);
1184−function filled(ctx,color,points) {
1185− tracePoints(ctx,points);
1186− ctx.fillStyle = Elm.Color.extract(color);
1190−function textured(redo,ctx,src,points) {
1191− var img = new Image();
1192− img.src = JS.castStringToJSString(src);
1195− tracePoints(ctx,points);
1196− ctx.fillStyle = ctx.createPattern(img,'repeat');
1200−function customLine(pattern,ctx,color,points) {
1201− if (pattern.length === 0) { pattern = [8,4]; }
1202− customLineHelp(ctx, pattern, points);
1203− ctx.strokeStyle = Elm.Color.extract(color);
1207−var customLineHelp = function(ctx, pattern, points) {
1208− var i = points.length - 1;
1209− if (i <= 0) return;
1210− var x0 = points[i][1], y0 = points[i][2];
1211− var x1=0, y1=0, dx=0, dy=0, remaining=0, nx=0, ny=0;
1212− var pindex = 0, plen = pattern.length;
1213− var draw = true, segmentLength = pattern[0];
1216− x1 = points[i][1]; y1 = points[i][2];
1217− dx = x1 - x0; dy = y1 - y0;
1218− remaining = Math.sqrt(dx * dx + dy * dy);
1219− while (segmentLength <= remaining) {
1220− x0 += dx * segmentLength / remaining;
1221− y0 += dy * segmentLength / remaining;
1222− ctx[draw ? 'lineTo' : 'moveTo'](x0, y0);
1223− // update starting position
1224− dx = x1 - x0; dy = y1 - y0;
1225− remaining = Math.sqrt(dx * dx + dy * dy);
1228− pindex = (pindex + 1) % plen;
1229− segmentLength = pattern[pindex];
1231− if (remaining > 0) {
1232− ctx[draw ? 'lineTo' : 'moveTo'](x1, y1);
1233− segmentLength -= remaining;
1239−function drawLine(ctx,form) {
1240− var points = form[3][1];
1241− switch(form[1][0]) {
1242− case "Solid" : return solid(ctx,form[2],points);
1243− case "Dotted": return customLine([3,3],ctx,form[2],points);
1244− case "Dashed": return customLine([8,4],ctx,form[2],points);
1245− case "Custom": return customLine(form[1][1],ctx,form[2],points);
1249−function drawShape(redo,ctx,shapeStyle,color,points) {
1250− switch(shapeStyle[0]) {
1251− case "Filled": return filled(ctx,color,points);
1252− case "Outlined": return solid(ctx,color,points);
1253− case "Textured": return textured(redo,ctx,shapeStyle[1],points);
1254− case "CustomOutline":
1255− return customLine(shapeStyle[1],ctx,color,points);
1259−function drawImage(redo,ctx,w,h,src) {
1260− var img = new Image();
1262− img.src = JS.castStringToJSString(src);
1263− ctx.drawImage(img,-w/2,-h/2,w,h);
1266−function renderForm(redo,ctx,theta,scale,x,y,form) {
1268− if (x !== 0 || y !== 0) ctx.translate(x,y);
1269− if (theta !== ~~theta) ctx.rotate(2*Math.PI*theta);
1270− if (scale !== 1) ctx.scale(scale,scale);
1273− case "FLine": drawLine(ctx,form); break;
1274− case "FShape": drawShape(redo,ctx,form[1],form[2],form[3][1]); break;
1275− case "FImage": drawImage(redo,ctx,form[1],form[2],form[3]); break;
1280−function renderForms(redo,ctx,w,h,forms) {
1281− ctx.clearRect(0,0,w,h);
1282− for (var i = forms.length; i--; ) {
1284− renderForm(redo,ctx,f[1],f[2],f[3][1],f[3][2],f[4]);
1288−function collageForms(w,h,forms) {
1289− var canvas = Render.newElement('canvas');
1292− canvas.style.width = w + 'px';
1293− canvas.style.height = h + 'px';
1294− canvas.style.display = "block";
1297− if (canvas.getContext) {
1298− var ctx = canvas.getContext('2d');
1299− function redo() { renderForms(this,ctx,w,h,forms); }
1300− renderForms(redo,ctx,w,h,forms);
1303− canvas.innerHTML = "Your browser does not support the canvas element.";
1307−function applyTransforms(theta,scale,x,y,w,h,e) {
1308− var t = "translate(" + (x - w / 2) + "px,"+ (y - h / 2) + "px)";
1309− var r = theta === (~~theta) ? "" : "rotate(" + theta*360 + "deg)";
1310− var s = scale === 1 ? "" : "scale(" + scale + "," + scale + ")";
1311− var transforms = t + " " + s + " " + r;
1312− e.style.transform = transforms;
1313− e.style.msTransform = transforms;
1314− e.style.MozTransform = transforms;
1315− e.style.webkitTransform = transforms;
1316− e.style.OTransform = transforms;
1319−function collageElement(w,h,theta,scale,x,y,elem) {
1320− var e = Render.render(elem);
1321− applyTransforms(theta,scale,x,y,elem[3],elem[4],e);
1322− var div = Render.newElement('div');
1323− Render.addTo(div,e);
1324− div.style.width = (~~w) + "px";
1325− div.style.height = (~~h) + "px";
1326− div.style.overflow = "hidden";
1330−function collage(w,h,formss) {
1331− if (formss.length === 0) { return collageForms(w,h,[]); }
1332− var elems = new Array(formss.length);
1333− for (var i = formss.length; i--; ) {
1335− if (typeof f[0] === "string") {
1336− elems[i] = collageElement(w,h,f[1],f[2],f[3][1],f[3][2],f[4][1]);
1338− elems[i] = collageForms(w,h,f);
1341− if (formss.length === 1) { return elems[0]; }
1342− return Render.flowWith(Render.goIn,function(x){return x},elems);
1345−function updateFormSet(node,currSet,nextSet) {
1346− if (Value.eq(nextSet,currSet)) return;
1347− var w = node.style.width.slice(0,-2) - 0;
1348− var h = node.style.height.slice(0,-2) - 0;
1349− if (typeof nextSet[0] === "object") {
1350− if (typeof currSet[0] === "object") {
1351− if (node.getContext) {
1352− var ctx = node.getContext('2d');
1353− function redo() { renderForms(this,ctx,w,h,nextSet); }
1354− return renderForms(redo,ctx,w,h,nextSet);
1357− var newNode = collageForms(w,h,nextSet);
1358− newNode.style.position = 'absolute';
1359− return node.parentNode.replaceChild(newNode,node);
1361− node.style.width = (~~w) + "px";
1362− node.style.height = (~~h) + "px";
1364− var next = nextSet[4][1];
1365− Render.update(node.firstChild, currSet[4][1], next);
1366− applyTransforms(f[1],f[2],f[3][1],f[3][2],next[3],next[4],node.firstChild);
1369−// assumes that the form sets are the same length.
1370−function updateCollage(node,currs,nexts) {
1371− if (nexts.length === 1) {
1372− return updateFormSet(node,currs[0],nexts[0]);
1374− var kids = node.childNodes;
1375− var len = kids.length;
1376− for (var i = len; i--; ) {
1377− updateFormSet(kids[len-i-1], currs[i], nexts[i]);
1381−function style(clr,n,list) {
1383− '<span style="font-size:100%;color:' + clr + ';">' + n + '</span>',
1387−function insideForm(point) { return function(form) {
1388− if (!inBoundsOf(point[1],point[2],form)) return false;
1390− switch (form[4][0]) {
1391− case "FShape": return insideShape(point,form[1],form[2],form[3],form[4][3][1]);
1392− case "FLine": return false;
1394− hw = form[4][1] / 2;
1395− hh = form[4][2] / 2;
1398− hw = form[4][1][3] / 2;
1399− hh = form[4][1][4] / 2;
1402− return insideShape(point,form[1],form[2],form[3],
1411−function inBoundsOf(px,py,form) {
1412− if (form.length < 6) {
1413− var fx = form[3][1], fy = form[3][2];
1414− var radiusSquared = 0;
1415− var scale = form[2];
1416− switch (form[4][0]) {
1418− var points = form[4][3][1];
1419− for (var i = points.length; --i; ) {
1421− radiusSquared = Math.max(radiusSquared, p[1]*p[1] + p[2]*p[2]);
1423− radiusSquared *= scale * scale;
1428− var x = scale * form[4][1] / 2;
1429− var y = scale * form[4][2] / 2;
1430− radiusSquared = x*x + y*y;
1433− var x = scale * form[4][1][3] / 2;
1434− var y = scale * form[4][1][4] / 2;
1435− radiusSquared = x*x + y*y;
1438− form.push(function(px,py) {
1441− return dx*dx + dy*dy < radiusSquared + 1;
1444− return form[5](px,py);
1447−function insideShape(point,theta,scale,pos,points) {
1449− var list = ["Nil"];
1452− var x = (point[1] - pos[1]) / scale;
1453− var y = (point[2] - pos[2]) / scale;
1455− var t = -2 * Math.PI * theta;
1456− var nx = x * Math.cos(t) - y * Math.sin(t);
1457− y = x * Math.sin(t) + y * Math.cos(t);
1461− if (points.length === 0) { return false; }
1463− for (var i = points.length - 1; i--; ) {
1465− var p1x = p1[1], p1y = p1[2], p2x = p2[1], p2y = p2[2];
1467− if (p1y < p2y) {var ymin=p1y, ymax=p2y;} else {var ymin=p2y, ymax=p1y;}
1468− if (p1x < p2x) {var xmin=p1x, xmax=p2x;} else {var xmin=p2x, xmax=p1x;}
1470− if (ymin < y && y <= ymax && x <= xmax) {
1471− if (x <= xmin || x <= ((y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x)) {
1477− return (counter % 2) === 1;
1480−return {collage:collage, updateCollage:updateCollage, insideForm:insideForm};
1482−}();Elm.Graphics = function() {
1483− for (this['i'] in Elm.List) {
1484− eval('var ' + this['i'] + ' = Elm.List[this.i];');
1486− var JS = Elm.JavaScript;
1487− var DLeft_0 = ["DLeft"];
1488− var DRight_1 = ["DRight"];
1489− var DUp_2 = ["DUp"];
1490− var DDown_3 = ["DDown"];
1491− var DIn_4 = ["DIn"];
1492− var DOut_5 = ["DOut"];
1493− function Absolute_12(a1) {
1494− return["Absolute", a1]
1496− function Relative_13(a1) {
1497− return["Relative", a1]
1499− var Near_14 = ["Near"];
1500− var Mid_15 = ["Mid"];
1501− var Far_16 = ["Far"];
1502− function Position_17(a1) {
1503− return function(a2) {
1504− return["Position", a1, a2]
1507− function PositionTL_18(a1) {
1508− return function(a2) {
1509− return["PositionTL", a1, a2]
1512− function PositionTR_19(a1) {
1513− return function(a2) {
1514− return["PositionTR", a1, a2]
1517− function PositionBL_20(a1) {
1518− return function(a2) {
1519− return["PositionBL", a1, a2]
1522− function PositionBR_21(a1) {
1523− return function(a2) {
1524− return["PositionBR", a1, a2]
1527− function Element_37(id,e,w,h,o,c,l) {
1528− return["Element", id, e, w, h, o, c, l ]
1530− function EText_39(a1) {
1531− return function(a2) {
1532− return["EText", a1, a2]
1535− function EImage_40(a1) {
1536− return["EImage", JS.castStringToJSString(a1)]
1538− function EVideo_41(a1) {
1539− return["EVideo", JS.castStringToJSString(a1)]
1541− function EFittedImage_42(a1) {
1542− return["EFittedImage", JS.castStringToJSString(a1)]
1544− function EFlow_43(a1) {
1545− return function(a2) {
1546− return["EFlow", a1, JS.castListToJSArray(a2)]
1549− function ECollage_44(a1) {
1550− return function(a2) {
1551− return function(a3) {
1552− return["ECollage", a1, a2, Value.groupForms(a3)]
1556− var EEmpty_45 = ["EEmpty"];
1557− function EContainer_46(a1) {
1558− return function(a2) {
1559− return["EContainer", a1, a2]
1562− var Solid_68 = ["Solid"];
1563− var Dotted_69 = ["Dotted"];
1564− var Dashed_70 = ["Dashed"];
1565− function Custom_71(a1) {
1566− return["Custom", JS.castListToJSArray(a1)]
1568− var Filled_72 = ["Filled"];
1569− var Outlined_73 = ["Outlined"];
1570− function CustomOutline_74(a1) {
1571− return["CustomOutline", JS.castListToJSArray(a1)]
1573− function Line_75(a1) {
1574− return["Line", JS.castListToJSArray(a1)]
1576− function Shape_78(a1) {
1577− return function(a2) {
1578− var points = JS.castListToJSArray(a1);
1579− if (points.length > 0) { points.push(points[0]); }
1580− return["Shape", points, a2];
1583− function Form_84(a1) {
1584− return function(a2) {
1585− return function(a3) {
1586− return function(a4) {
1587− return["Form", a1, a2, a3, a4]
1592− function FLine_85(a1) {
1593− return function(a2) {
1594− return function(a3) {
1595− return["FLine", a1, a2, a3]
1599− function FShape_86(a1) {
1600− return function(a2) {
1601− return function(a3) {
1602− return["FShape", a1, a2, a3]
1606− function FImage_87(a1) {
1607− return function(a2) {
1608− return function(a3) {
1609− return["FImage", a1, a2, JS.castStringToJSString(a3)]
1613− function FElement_88(a1) {
1614− return["FElement", a1]
1616− var left_6 = DLeft_0;
1617− var right_7 = DRight_1;
1618− var down_8 = DDown_3;
1620− var inward_10 = DIn_4;
1621− var outward_11 = DOut_5;
1622− var topLeft_22 = Position_17(Near_14)(Near_14);
1623− var topRight_23 = Position_17(Far_16)(Near_14);
1624− var bottomLeft_24 = Position_17(Near_14)(Far_16);
1625− var bottomRight_25 = Position_17(Far_16)(Far_16);
1626− var midLeft_26 = Position_17(Near_14)(Mid_15);
1627− var midRight_27 = Position_17(Far_16)(Mid_15);
1628− var midTop_28 = Position_17(Mid_15)(Near_14);
1629− var midBottom_29 = Position_17(Mid_15)(Far_16);
1630− var middle_30 = Position_17(Mid_15)(Mid_15);
1631− function middleAt(a1) {
1632− return function(a2) {
1633− return["PositionAt", a1, a2]
1636− var topLeftAt_31 = PositionTL_18;
1637− var topRightAt_32 = PositionTR_19;
1638− var bottomLeftAt_33 = PositionBL_20;
1639− var bottomRightAt_34 = PositionBR_21;
1640− var absolute_35 = Absolute_12;
1641− var relative_36 = Relative_13;
1642− function newElement_38(e,w,h,o,c,l) { return Element_37(Guid.guid(),e,w,h,o,c,l); }
1643− function basicNewElement(e,w,h) { return Element_37(Guid.guid(),e,w,h,1,["Nothing"],["Nothing"]); }
1644− var line_76 = Line_75;
1645− var polygon_79 = Shape_78;
1646− function sprite_96(src) {
1647− return function(w) {
1648− return function(h) {
1649− return function(pos) {
1650− return Form_84(0)(1)(pos)(FImage_87(w)(h)(src))
1655− function toForm_97(pos) {
1656− return function(e) {
1657− return Form_84(0)(1)(pos)(FElement_88(e))
1660− function width_47(w__101) {
1661− return function(e) {
1666− return newElement_38(e[2],w__101,e[4] * w__101 / e[3], e[5], e[6], e[7]);
1668− var p = Value.getTextSize(w__101,e[4],be[2]);
1669− return newElement_38(e[2], w__101, p[1], e[5], e[6], e[7]);
1671− return newElement_38(e[2], w__101, e[4], e[5], e[6], e[7]);
1674− function height_48(h__108) {
1675− return function(e) {
1680− return newElement_38(e[2], e[3] * h__108 / e[4], h__108, e[5], e[6], e[7]);
1682− return newElement_38(e[2], e[3], h__108, e[5], e[6], e[7]);
1685− function size_49(w) {
1686− return function(h) {
1687− return function(e) {
1688− return newElement_38(e[2], w, h, e[5], e[6], e[7]);
1692− function opacity_50(o) {
1693− return function(e) {
1694− return newElement_38(e[2], e[3], e[4], o, e[6], e[7]);
1697− function color_51(c) {
1698− return function(e) {
1699− return newElement_38(e[2], e[3], e[4], e[5], ["Just",c], e[7]);
1702− function link(lnk) {
1703− return function(e) {
1704− return newElement_38(e[2], e[3], e[4], e[5], e[6], ["Just", JS.castStringToJSString(lnk)]);
1707− function widthOf_52(e) { return ~~e[3]; }
1708− function heightOf_53(e) { return ~~e[4]; }
1709− function sizeOf_54(e) { return["Tuple2", ~~e[3], ~~e[4]] }
1710− function text_56(txt) {
1711− var p = Value.getTextSize(0,0,txt);
1712− return basicNewElement(EText_39("left")(txt), p[0], p[1])
1714− function plainText(str) {
1715− var txt = Value.toText(str);
1716− var p = Value.getTextSize(0,0,txt);
1717− return basicNewElement(EText_39("left")(txt),p[0],p[1])
1719− function asText(v) {
1720− var txt = Elm.Text.monospace(Value.toText(Value.show(v)));
1721− var p = Value.getTextSize(0,0,txt);
1722− return basicNewElement(EText_39("left")(txt),p[0],p[1])
1724− function centeredText(txt) {
1725− var p = Value.getTextSize(0,0,txt);
1726− return basicNewElement(EText_39("center")(txt),p[0],p[1])
1728− function justifiedText(txt) {
1729− var p = Value.getTextSize(0,0,txt);
1730− return basicNewElement(EText_39("justify")(txt),p[0],p[1])
1732− function rightedText(txt) {
1733− var p = Value.getTextSize(0,0,txt);
1734− return basicNewElement(EText_39("right")(txt),p[0],p[1])
1736− function image_57(w) {
1737− return function(h) {
1738− return function(src) {
1739− return basicNewElement(EImage_40(src),w,h)
1743− function images(srcs) {
1744− var pics = Elm.Signal.constant(spacer_66(0)(0));
1745− var update = Elm.Signal.lift(function(src) {
1746− src = JS.castStringToJSString(src);
1747− var img = new Image();
1748− img.onload = function() {
1749− Dispatcher.notify(pics.id,
1750− image_57(this.width)(this.height)(src));
1754− function f(x) { return function(y) { return x; } }
1755− var combine = Elm.Signal.lift2(f)(pics)(update);
1758− function video_58(w) {
1759− return function(h) {
1760− return function(src) {
1761− return basicNewElement(EVideo_41(src),w,h)
1765− function fittedImage_59(w_147) {
1766− return function(h_148) {
1767− return function(s_149) {
1768− return basicNewElement(EFittedImage_42(s_149),w_147,h_148)
1772− function flow_60(dir_150) {
1773− return function(es_151) {
1774− return function() {
1775− var w_152 = function() {
1776− var ws_154 = map(widthOf_52)(es_151);
1777− return function(case1) {
1781− return sum(ws_154);
1785− return maximum(ws_154)
1788− var h_153 = function() {
1789− var hs_155 = map(heightOf_53)(es_151);
1790− return function(case3) {
1794− return sum(hs_155);
1798− return maximum(hs_155)
1801− return basicNewElement(EFlow_43(dir_150)(es_151), w_152, h_153)
1805− function above_61(e1_156) {
1806− return function(e2_157) {
1807− return basicNewElement(EFlow_43(DDown_3)(["Cons", e1_156, ["Cons", e2_157, ["Nil"]]]), Math.max(widthOf_52(e1_156),widthOf_52(e2_157)), heightOf_53(e1_156) + heightOf_53(e2_157));
1810− function below_62(e1_158) {
1811− return function(e2_159) {
1812− return basicNewElement(EFlow_43(DDown_3)(["Cons", e2_159, ["Cons", e1_158, ["Nil"]]]), Math.max(widthOf_52(e1_158),widthOf_52(e2_159)), heightOf_53(e1_158) + heightOf_53(e2_159));
1815− function beside_63(e1_160) {
1816− return function(e2_161) {
1817− return basicNewElement(EFlow_43(DRight_1)(["Cons", e1_160, ["Cons", e2_161, ["Nil"]]]), widthOf_52(e1_160) + widthOf_52(e2_161), Math.max(heightOf_53(e1_160),heightOf_53(e2_161)));
1820− function layers_64(es_162) {
1821− return basicNewElement(EFlow_43(DOut_5)(es_162), maximum(map(widthOf_52)(es_162)), maximum(map(heightOf_53)(es_162)))
1823− function collage_65(w_163) {
1824− return function(h_164) {
1825− return function(forms_165) {
1826− return basicNewElement(ECollage_44(w_163)(h_164)(forms_165),w_163,h_164)
1830− function spacer_66(w_166) {
1831− return function(h_167) {
1832− return basicNewElement(EEmpty_45,w_166,h_167)
1835− function container_67(w_169) {
1836− return function(h_170) {
1837− return function(pos_168) {
1838− return function(e_171) {
1839− return basicNewElement(EContainer_46(pos_168)(e_171),w_169,h_170)
1844− function segment_77(p1_172) {
1845− return function(p2_173) {
1846− return Line_75(["Cons", p1_172, ["Cons", p2_173, ["Nil"]]])
1849− function rect_80(w_174) {
1850− return function(h_175) {
1851− return function(pos_176) {
1852− return Shape_78(["Cons", ["Tuple2", 0 - w_174 / 2, 0 - h_175 / 2],
1853− ["Cons", ["Tuple2", 0 - w_174 / 2, h_175 / 2],
1854− ["Cons", ["Tuple2", w_174 / 2, h_175 / 2],
1855− ["Cons", ["Tuple2", w_174 / 2, 0 - h_175 / 2], ["Nil"]]]]])(pos_176)
1859− function oval_81(w_177) {
1860− return function(h_178) {
1861− return function(pos_179) {
1862− return function() {
1864− return function() {
1865− function f_181(i_182) {
1866− return["Tuple2", w_177 / 2 * Math.cos(2 * (Math.PI / n_180) * i_182), h_178 / 2 * Math.sin(2 * (Math.PI / n_180) * i_182)];
1868− return Shape_78(map(f_181)(function() {
1870− var hi = n_180 - 1;
1874− lst = ["Cons", hi, lst]
1884− function circle_82(r_183) {
1885− return oval_81(2 * r_183)(2 * r_183)
1887− function ngon_83(n_184) {
1888− return function(r_185) {
1889− return function(pos_186) {
1890− return function() {
1892− return function() {
1893− function f_188(i_189) {
1894− return["Tuple2", r_185 * Math.cos(2 * (Math.PI / m_187) * i_189), r_185 * Math.sin(2 * (Math.PI / m_187) * i_189)];
1896− return Shape_78(map(f_188)(function() {
1898− var hi = n_184 - 1;
1902− lst = ["Cons", hi, lst]
1912− function solid_89(clr_190) {
1913− return function(ln_191) {
1914− return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Solid_68)(clr_190)(ln_191))
1917− function dotted_90(clr_192) {
1918− return function(ln_193) {
1919− return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Dotted_69)(clr_192)(ln_193))
1922− function dashed_91(clr_194) {
1923− return function(ln_195) {
1924− return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Dashed_70)(clr_194)(ln_195))
1927− function customLine_92(pattern_196) {
1928− return function(clr_197) {
1929− return function(ln_198) {
1930− return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Custom_71(pattern_196))(clr_197)(ln_198))
1934− function filled_93(clr) {
1935− return function(shape) {
1936− return Form_84(0)(1)(shape[2])(FShape_86(Filled_72)(clr)(shape));
1939− function outlined_94(clr) {
1940− return function(shape) {
1941− return Form_84(0)(1)(shape[2])(FShape_86(Outlined_73)(clr)(shape));
1944− function customOutline_95(pattern) {
1945− return function(clr) {
1946− return function(shape) {
1947− return Form_84(0)(1)(shape[2])(FShape_86(CustomOutline_74(pattern))(clr)(shape));
1951− function textured(src) {
1952− return function(shape) {
1953− return Form_84(0)(1)(shape[2])(FShape_86(["Textured",src])(null)(shape));
1956− function rotate_98(t_212) {
1957− return function(Form$thetascaleposform_213) {
1958− return function(case5) {
1962− var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1963− return Form_84(t_212 + case1)(case2)(case3)(case4)
1965− throw"Non-exhaustive pattern match in case";
1966− }(Form$thetascaleposform_213)
1969− function scale_99(s) {
1970− return function(form) {
1971− return Form_84(form[1])(s * form[2])(form[3])(form[4])
1974− function move_100(x_224) {
1975− return function(y_225) {
1976− return function(Form$thetascaleTuple2$pxpyform_226) {
1977− return function(case7) {
1981− var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1984− var case5 = case3[1], case6 = case3[2];
1985− return Form_84(case1)(case2)(["Tuple2", x_224 + case5, y_225 + case6])(case4)
1989− throw"Non-exhaustive pattern match in case";
1990− }(Form$thetascaleTuple2$pxpyform_226)
1994− return{left:left_6, right:right_7, down:down_8, up:up_9, inward:inward_10, outward:outward_11, topLeft:topLeft_22, topRight:topRight_23, bottomLeft:bottomLeft_24, bottomRight:bottomRight_25, midLeft:midLeft_26, midRight:midRight_27, midTop:midTop_28, midBottom:midBottom_29, middle:middle_30, middleAt:middleAt, topLeftAt:topLeftAt_31, topRightAt:topRightAt_32, bottomLeftAt:bottomLeftAt_33, bottomRightAt:bottomRightAt_34, absolute:absolute_35, relative:relative_36, width:width_47, height:height_48, size:size_49, opacity:opacity_50,
1995− color:color_51, link:link, widthOf:widthOf_52, heightOf:heightOf_53, sizeOf:sizeOf_54, text:text_56, asText:asText, plainText:plainText, centeredText:centeredText, justifiedText:justifiedText, rightedText:rightedText, image:image_57, images:images, video:video_58, fittedImage:fittedImage_59, flow:flow_60, above:above_61, below:below_62, beside:beside_63, layers:layers_64, collage:collage_65, spacer:spacer_66, container:container_67, line:line_76, segment:segment_77, polygon:polygon_79, rect:rect_80, oval:oval_81, circle:circle_82, ngon:ngon_83, solid:solid_89, dotted:dotted_90, dashed:dashed_91, customLine:customLine_92, filled:filled_93,
1996− outlined:outlined_94, customOutline:customOutline_95, textured:textured, sprite:sprite_96, toForm:toForm_97, rotate:rotate_98, scale:scale_99, move:move_100,
1997− isWithin: Collage.insideForm}
1999−Elm.Text = function() {
2000− function fromString(s) { return Value.toText(s); }
2002− var addTag = function(tag) { return function(text) {
2003− return '<' + tag + ' style="padding:0;margin:0">' + text + '</' + tag + '>';
2006− var addStyle = function(style, value) { return function(text) {
2007− return "<span style='" + style + ":" + value + "'>" + text + "</span>";
2011− var typeface = function(name) {
2012− name = Elm.JavaScript.castStringToJSString(name);
2013− return addStyle('font-family', name);
2015− var size = function(px) {
2016− return addStyle('font-size', px + 'px');
2018− var header = addTag('h1');
2019− var height = function(h) { return addStyle('font-size', h+'em'); }
2020− var italic = addStyle('font-style', 'italic');
2021− var bold = addTag('b');
2022− var color = function(c) {
2023− return addStyle('color', Elm.Color.extract(c));
2025− var underline = addStyle('text-decoration', 'underline');
2026− var overline = addStyle('text-decoration', 'overline');
2027− var strikeThrough = addStyle('text-decoration', 'line-through');
2028− var link = function(href) { return function(text) {
2029− return "<a href='" + fromString(href) + "'>" + text + "</a>";
2033− return {fromString : fromString,
2034− toText: fromString,
2039− underline : underline,
2040− overline : overline,
2041− strikeThrough : strikeThrough,
2042− monospace : typeface('monospace'),
2043− typeface : typeface,
2048−var Render = function(){
2050−function newElement(elementType) {
2051− var e = document.createElement(elementType);
2052− e.style.padding = "0";
2053− e.style.margin = "0";
2057−function addTo(container, elem) {
2058− container.appendChild(elem);
2061−function makeText(pos,txt) {
2062− var e = newElement('div');
2064− e.style.textAlign = pos;
2068−function image(src) {
2069− var img = newElement('img');
2072− img.style.display = "block";
2076−function fittedImage(w,h,src) {
2077− var e = newElement('div');
2078− e.style.width = w + 'px';
2079− e.style.height = h + 'px';
2080− e.style.position = "relative";
2081− e.style.overflow = "hidden";
2083− var img = newElement('img');
2084− img.onload = function() {
2085− img.style.position = 'absolute';
2086− img.style.margin = 'auto';
2088− var sw = w, sh = h;
2089− if (w / h > this.width / this.height) {
2090− sh = Math.round(this.height * w / this.width);
2092− sw = Math.round(this.width * h / this.height);
2094− img.style.width = sw + 'px';
2095− img.style.height = sh + 'px';
2096− img.style.left = ((w - sw) / 2) + 'px';
2097− img.style.top = ((h - sh) / 2) + 'px';
2105−var video = function(src) {
2106− var e = newElement('video');
2107− e.controls = "controls";
2108− var source = newElement('source');
2110− var segs = src.split('.');
2111− source.type = "video/" + segs[segs.length-1];
2113− e.style.display = "block";
2117−function divify(e) {
2118− var div = newElement('div');
2122−function goDown(e) {
2123− return e //.tagName === "DIV" ? e : divify(e);
2125−function goRight(e) {
2126− e.style.styleFloat = "left";
2127− e.style.cssFloat = "left";
2131− e.style.position = 'absolute';
2134−function flowWith(f, prep, elist) {
2135− var container = newElement('div');
2136− for (var i = elist.length; i--; ) {
2137− addTo(container, f(prep(elist[i])));
2142−function flow(dir,elist) {
2144− case "DDown": elist = elist.slice(0).reverse();
2145− case "DUp": return flowWith(goDown,render,elist);
2146− case "DRight": elist = elist.slice(0).reverse();
2147− case "DLeft": return flowWith(goRight,render,elist);
2148− case "DOut": elist = elist.slice(0).reverse();
2149− case "DIn": return flowWith(goIn,render,elist);
2153−function toPos(pos) {
2155− case "Absolute": return pos[1] + "px";
2156− case "Relative": return (pos[1] * 100) + "%";
2160−function setPos(pos,e) {
2161− e.style.position = 'absolute';
2162− e.style.margin = 'auto';
2165− if (pos[1][0] !== "Far") e.style.left = 0;
2166− if (pos[1][0] !== "Near") e.style.right = 0;
2167− if (pos[2][0] !== "Far") e.style.top = 0;
2168− if (pos[2][0] !== "Near") e.style.bottom = 0;
2171− e.style.top = toPos(pos[2]);
2172− e.style.left = toPos(pos[1]);
2173− var shift = "translate(" + ~~(-e.style.width.slice(0,-2) / 2) + "px," + ~~(-e.style.height.slice(0,-2) / 2) + "px)";
2174− e.style.transform = shift;
2175− e.style.msTransform = shift;
2176− e.style.MozTransform = shift;
2177− e.style.webkitTransform = shift;
2178− e.style.OTransform = shift;
2181− var p = pos[0].slice(-2);
2182− e.style[p[0] === "T" ? 'top' : 'bottom'] = toPos(pos[2]);
2183− e.style[p[1] === "L" ? 'left' : 'right'] = toPos(pos[1]);
2187−function container(pos,elem) {
2188− var e = render(elem);
2190− var div = newElement('div');
2191− div.style.position = "relative";
2192− div.style.overflow = "hidden";
2197−function render(elem) {
2199− switch(elem[2][0]) {
2200− case "EText": e = makeText(elem[2][1],elem[2][2]); break;
2201− case "EImage": e = image(elem[2][1]); break;
2202− case "EVideo": e = video(elem[2][1]); break;
2203− case "EFittedImage": e = fittedImage(elem[3],elem[4],elem[2][1]); break;
2204− case "EFlow": e = flow(elem[2][1][0],elem[2][2]); break;
2205− case "ECollage": e = Collage.collage(elem[2][1],elem[2][2],elem[2][3]); break;
2206− case "EEmpty": e = newElement('div'); break;
2207− case "EContainer": e = container(elem[2][1],elem[2][2]); break;
2210− if (e.type !== 'button') {
2211− var p = Value.getExcess(e);
2216− case "EExternalHtml":
2217− e = newElement('div');
2218− addTo(e, elem[2][1]);
2222− e.style.width = (~~elem[3]) + 'px';
2223− e.style.height = (~~elem[4]) + 'px';
2224− if (elem[5] !== 1) { e.style.opacity = elem[5]; }
2225− if (elem[6][0] === "Just") {
2226− e.style.backgroundColor = Elm.Color.extract(elem[6][1]);
2228− if (elem[7][0] === "Just") {
2229− var a = newElement('a');
2230− a.href = elem[7][1];
2237−function update(node,curr,next) {
2238− if (node.tagName === 'A') { node = node.firstChild; }
2239− if (curr[1] === next[1]) return;
2240− if (curr[2][0] !== next[2][0]) {
2241− return node.parentNode.replaceChild(render(next),node);
2243− var nextE = next[2], currE = curr[2];
2246− if (nextE[1] !== currE[1]) node.style.textAlign = nextE[1];
2247− if (nextE[2] !== currE[2]) node.innerHTML = nextE[2];
2250− if (nextE[1] !== currE[1]) node.src = nextE[1];
2253− case "EFittedImage":
2254− if (!Value.eq(nextE,currE) || next[3]!==curr[3] || next[4]!==curr[4]) {
2255− return node.parentNode.replaceChild(render(next),node);
2259− if (nextE[1] !== currE[1] || nextE[2] !== currE[2] || nextE[3].length !== currE[3].length) {
2260− return node.parentNode.replaceChild(render(next),node);
2262− Collage.updateCollage(node,currE[3],nextE[3]);
2265− if (nextE[1] !== currE[1]) {
2266− return node.parentNode.replaceChild(render(next),node);
2268− var nexts = nextE[2];
2269− var kids = node.childNodes;
2270− if (nexts.length !== kids.length) {
2271− return node.parentNode.replaceChild(render(next),node);
2273− var currs = currE[2];
2274− var goDir = function(x) { return x; };
2275− switch(nextE[1][0]) {
2276− case "DDown": case "DUp": goDir = goDown; break;
2277− case "DRight": case "DLeft": goDir = goRight; break;
2278− case "DOut": case "DIn": goDir = goIn; break;
2280− for (var i = kids.length; i-- ;) {
2281− update(kids[i],currs[i],nexts[i]);
2286− update(node.childNodes[0],currE[2],nextE[2]);
2287− setPos(nextE[1],node.childNodes[0]);
2292− if (next[1] !== curr[1]) {
2293− var e = render(next);
2294− node.parentNode.replaceChild(e,node);
2297− if (e.type !== 'button') {
2298− var p = Value.getExcess(node);
2303− case "EExternalHtml":
2304− if (next[1] !== curr[1])
2305− node.parentNode.replaceChild(render(next),node);
2308− if (next[3] !== curr[3]) node.style.width = (~~next[3]) + 'px';
2309− if (next[4] !== curr[4]) node.style.height = (~~next[4]) + 'px';
2310− if (next[5] !== curr[5]) node.style.opacity = next[5];
2311− if (next[6].length === 2) {
2312− var clr = Elm.Color.extract(next[6][1]);
2313− if (clr !== node.style.backgroundColor) node.style.backgroundColor = clr;
2315− if (next[7].length === 2) {
2316− if (curr[7].length === 1 || next[7][1] !== curr[7][1]) node.parentNode.href = next[7][1];
2321−return {render:render,update:update,addTo:addTo,newElement:newElement,flowWith:flowWith,goIn:goIn};
2324−Elm.Signal = function() {
2325− var send = function(node, timestep, changed) {
2326− var kids = node.kids;
2327− for (var i = kids.length; i--; ) {
2328− kids[i].recv(timestep, changed, node.id);
2334− function input(base) {
2335− this.id = Guid.guid();
2338− this.defaultNumberOfKids = 0;
2339− this.recv = function(timestep, eid, v) {
2340− var changed = eid === this.id;
2341− if (changed) { this.value = v; }
2342− send(this, timestep, changed);
2345− Dispatcher.inputs.push(this);
2350− function lift(func,args) {
2351− this.id = Guid.guid();
2355− this.changed = false;
2358− this.recalc = function() {
2360− for (var i = args.length; i--; ) {
2361− f = f(args[i].value);
2367− this.recv = function(timestep, changed, parentID) {
2369− if (changed) { this.changed = true; }
2370− if (this.count == args.length) {
2371− if (this.changed) { this.recalc() }
2372− send(this, timestep, this.changed);
2373− this.changed = false;
2377− for (var i = args.length; i--; ) {
2378− args[i].kids.push(this);
2384− function fold(func,base,baseIsFunc,input) {
2385− this.id = Guid.guid();
2386− this.value = baseIsFunc ? base(input.value) : base;
2388− this.recv = function(timestep, changed, parentID) {
2389− if (changed) { this.value = func(input.value)(this.value); }
2390− send(this, timestep, changed);
2392− input.kids.push(this);
2398− function dropIf(pred,base,input) {
2399− this.id = Guid.guid();
2400− this.value = pred(input.value) ? base : input.value;
2402− this.recv = function(timestep, changed, parentID) {
2403− var chng = changed && !pred(input.value);
2404− if (chng) { this.value = input.value; }
2405− send(this, timestep, chng);
2407− input.kids.push(this);
2413− function dropRepeats(input) {
2414− this.id = Guid.guid();
2415− this.value = input.value;
2417− this.recv = function(timestep, changed, parentID) {
2418− var chng = changed && !Value.eq(this.value,input.value);
2419− if (chng) { this.value = input.value; }
2420− send(this, timestep, chng);
2422− input.kids.push(this);
2425− var dropWhen = function(s1) { return function(b) { return function(s2) {
2426− var pairs = new lift(function(x){return function(y){return [x,y];};},[s1,s2]);
2427− var dropped = new dropIf(function(p){return p[0];},[true,b],pairs);
2428− return new lift(function(p){return p[1];},[dropped]); }; };
2434− function timeIndex(pair,s) {
2435− this.id = Guid.guid();
2436− var t = (new window.Date).getTime();
2437− this.value = pair ? Value.Tuple(t,s.value) : t;
2439− this.recv = function(timestep, changed, parentID) {
2440− if (changed) this.value = pair ? Value.Tuple(timestep, s.value) : timestep;
2441− send(this, timestep, changed);
2449− function sampleOn(s1,s2) {
2450− this.id = Guid.guid();
2451− this.value = s2.value;
2454− this.changed = false;
2456− this.recv = function(timestep, changed, parentID) {
2457− if (parentID === s1.id) this.changed = changed;
2459− if (this.count == 2) {
2460− if (this.changed) { this.value = s2.value; }
2461− send(this, timestep, this.changed);
2463− this.changed = false;
2466− s1.kids.push(this);
2467− s2.kids.push(this);
2470− function delay(t) { return function(s) {
2471− var delayed = new input(s.value);
2472− var firstEvent = true;
2473− function update(v) {
2474− if (firstEvent) return;
2475− setTimeout(function() { Dispatcher.notify(delayed.id,v); },t);
2477− function first(a) { return function(b) { return a; }; }
2478− var out = new sampleOn(delayed,new lift(first, [delayed, new lift(update,[s])]));
2479− firstEvent = false;
2487− function merge(s1,s2) {
2488− this.id = Guid.guid();
2489− this.value = s1.value;
2493− this.changed = false;
2495− this.recv = function(timestep, changed, parentID) {
2498− this.changed = true;
2499− if (parentID == s2.id && this.next === null) { this.next = s2.value; }
2500− if (parentID == s1.id) { this.next = s1.value; }
2503− if (this.count == 2) {
2504− if (this.changed) {
2505− this.value = this.next;
2508− send(this, timestep, this.changed);
2509− this.changed = false;
2513− s1.kids.push(this);
2514− s2.kids.push(this);
2517− function merges(ss) {
2518− function mrg(x) { return function(y) { return new merge(x,y); }; }
2519− return Elm.List.foldl1(mrg)(ss);
2522− function mergeEither(s1) { return function(s2) {
2523− function f(s) { return function(x) { return [s,x]; }; }
2524− return new merge(new lift(f('Left'),[s1]), new lift(f('Right'),[s2]));
2528− function average(sampleSize) { return function(s) {
2529− var sample = new Array(sampleSize);
2530− var i = sampleSize;
2531− while (i--) sample[i] = 0;
2536− total += n - sample[i];
2538− var avg = total / Math.max(1, full ? sampleSize : i);
2539− if (++i == sampleSize) { full = true; i = 0; }
2542− return new lift(f, [s]);
2547− constant : function(v) { return new input(v); },
2548− lift : function(f){return function(e){return new lift(f,[e]);};},
2549− lift2 : function(f) {
2550− return function(e1) { return function(e2) {
2551− return new lift(f, [e1,e2]); };};},
2552− lift3 : function(f) {
2553− return function(e1) { return function(e2) {
2554− return function(e3){return new lift(f,[e1,e2,e3]);};};};},
2555− lift4 : function(f) {
2556− return function(e1) { return function(e2) {
2557− return function(e3) { return function(e4) {
2558− return new lift(f, [e1,e2,e3,e4]);};};};};},
2559− lift5 : function(f) {
2560− return function(e1) { return function(e2) {
2561− return function(e3) { return function(e4) {
2562− return function(e5) {
2563− return new lift(f, [e1,e2,e3,e4,e5]);};};};};};},
2564− lift6 : function(f) { return function(e1) { return function(e2) {
2565− return function(e3) { return function(e4) {
2566− return function(e5) { return function(e6) {
2567− return new lift(f, [e1,e2,e3,e4,e5,e6]); };};};};};};},
2568− lift7 : function(f) { return function(e1) { return function(e2) {
2569− return function(e3) { return function(e4) {
2570− return function(e5) { return function(e6) {
2571− return function(e7) {
2572− return new lift(f, [e1,e2,e3,e4,e5,e6,e7]);};};};};};};};},
2573− lift8 : function(f) { return function(e1) { return function(e2) {
2574− return function(e3) { return function(e4) {
2575− return function(e5) { return function(e6) {
2576− return function(e7) { return function(e8) {
2577− return new lift(f, [e1,e2,e3,e4,e5,e6,e7,e8]);};};};};};};};};},
2578− foldp : function(f) { return function(b) { return function(e) {
2579− return new fold(f,b,false,e); }; }; },
2580− foldp$ : function(f) { return function(b) { return function(e) {
2581− return new fold(f,b,true,e); }; }; },
2582− foldp1 : function(f) { return function(e) {
2583− return new fold(f,function(x){return x;},true,e); }; },
2585− merge : function(s1) { return function(s2) { return new merge(s1,s2)}; },
2587− mergeEither : mergeEither,
2589− count : function(sig) {
2590− var incr = function(_){return function(c){return c+1;};};
2591− return new fold(incr,0,false,sig) },
2592− countIf : function(pred) { return function(sig) {
2593− var incr = function(x){return function(c){return pred(x) ? c+1 : c;};};
2594− return new fold(incr,0,false,sig) }; },
2595− keepIf : function(pred) { return function(base) { return function(sig) {
2596− return new dropIf(function(x) { return !pred(x)},base,sig); }; }; },
2597− dropIf : function(pred) { return function(base) { return function(sig) {
2598− return new dropIf(pred,base,sig); }; }; },
2599− keepWhen : function(s) { return dropWhen(new lift(function(b){return !b;},[s])); },
2600− dropWhen : dropWhen,
2601− dropRepeats : function(s) { return new dropRepeats(s);},
2602− sampleOn : function(s1){return function(s2){return new sampleOn(s1,s2);};},
2603− timestamp : function(s) { return new timeIndex(true, s); },
2604− timeOf : function(s) { return new timeIndex(false, s); }
2607−var Dispatcher = function() {
2608− var program = null;
2610− var currentElement = null;
2612− var initialize = function() {
2613− program = Elm.main();
2614− if (!program.hasOwnProperty('recv')) {
2615− program = Elm.Signal.constant(program);
2618− currentElement = program.value;
2619− filterDeadInputs();
2621− var content = document.getElementById('content');
2622− content.appendChild(Render.render(currentElement));
2623− var w = document.getElementById('widthChecker').offsetWidth;
2624− if (w !== window.innerWidth) {
2625− Dispatcher.notify(Elm.Window.dimensions.id, Value.Tuple(w, window.innerHeight));
2627− program = Elm.Signal.lift(function(value) {
2628− var content = document.getElementById('content');
2629− Render.update(content.firstChild,currentElement,value);
2630− currentElement = value;
2634− var notify = function(id, v) {
2635− var timestep = (new window.Date).getTime();
2636− var hasListener = false;
2637− for (var i = inputs.length; i--; ) {
2638− hasListener = inputs[i].recv(timestep, id, v) || hasListener;
2640− return hasListener;
2643− function isAlive(input) {
2644− if (!input.hasOwnProperty('defaultNumberOfKids')) return true;
2645− var len = input.kids.length;
2646− if (len == 0) return false;
2647− if (len > input.defaultNumberOfKids) return true;
2649− for (var i = len; i--; ) {
2650− alive = alive || isAlive(input.kids[i]);
2654− function filterDeadInputs() {
2656− for (var i = inputs.length; i--; ) {
2657− if (isAlive(inputs[i])) temp.push(inputs[i]);
2662− return {initialize:initialize, notify:notify, inputs:inputs};
2663−}();Elm.HTTP = function() {
2664− var JS = Elm.JavaScript;
2665− var toElmString = Elm.JavaScript.castJSStringToString;
2666− function request(verb) { return function(url) { return function(data) {
2667− return function(headers) {
2668− return {0 : "Request",
2670− verb : JS.castStringToJSString(verb),
2671− url : JS.castStringToJSString(url),
2672− data : data === null ? null : JS.castStringToJSString(data),
2673− headers : headers }; }; }; };
2675− function get(url) { return request("GET")(url)(null)(["Nil"]); }
2676− function post(url) { return function(data) {
2677− return request("POST")(url)(data)(["Nil"]); }; }
2679− function registerReq(queue,responses) { return function(req) {
2680− if (req.url !== "") { sendReq(queue,responses,req); }
2684− function updateQueue(queue,responses) {
2685− if (queue.length > 0) {
2686− Dispatcher.notify(responses.id, queue[0].value);
2687− if (queue[0].value[0] !== "Waiting") {
2689− setTimeout(function() { updateQueue(queue,responses); }, 0);
2694− function sendReq(queue,responses,req) {
2695− var response = { value: ["Waiting"] };
2696− queue.push(response);
2698− var request = null;
2699− if (window.ActiveXObject) { request = new ActiveXObject("Microsoft.XMLHTTP"); }
2700− if (window.XMLHttpRequest) { request = new XMLHttpRequest(); }
2701− request.onreadystatechange = function(e) {
2702− if (request.readyState === 4) {
2703− response.value = (request.status === 200
2704− ? ["Success", toElmString(request.responseText)]
2705− : ["Failure", request.status,
2706− toElmString(request.statusText)]);
2707− setTimeout(function() { updateQueue(queue,responses); }, 0);
2710− request.open(req.verb, req.url, true);
2711− Elm.List.map(function(pair) {
2712− request.setRequestHeader(
2713− JS.castStringToJSString(pair[1]),
2714− JS.castStringToJSString(pair[2]));
2716− request.send(req.data);
2720− function send(requests) {
2721− var responses = Elm.Signal.constant(["Waiting"]);
2722− var sender = Elm.Signal.lift(registerReq([],responses))(requests);
2723− function f(x) { return function(y) { return x; } }
2724− var combine = Elm.Signal.lift2(f)(responses)(sender);
2732− sendGet : function(urls){return send(Elm.Signal.lift(get)(urls));}
2736−Elm.Input = function() {
2737− var JS = Elm.JavaScript;
2738− var toElmString = Elm.JavaScript.castJSStringToString;
2739− var newTextInput = function(elem, ghostText) {
2740− elem.placeholder = JS.castStringToJSString(ghostText);
2741− var str = Elm.Signal.constant(["Nil"]);
2742− Value.addListener(elem, 'keyup', function(e) {
2743− Dispatcher.notify(str.id, toElmString(elem.value));
2746− elem.style.padding = "1px";
2747− return Value.Tuple(Value.wrap(elem), str);
2749− var newElement = function(name) {
2750− var e = document.createElement(name);
2751− e.style.padding = "0";
2752− e.style.margin = "0";
2755− var textArea = function(cols) { return function(rows) {
2756− var textarea = newElement('textarea');
2757− textarea.rows = rows;
2758− textarea.cols = cols;
2759− return newTextInput(textarea, "");
2762− var textField = function(ghostText) {
2763− var field = newElement('input');
2764− field.type = 'text';
2765− return newTextInput(field, ghostText);
2767− var password = function(ghostText) {
2768− var field = newElement('input');
2769− field.type = 'password';
2770− return newTextInput(field, ghostText);
2772− var checkbox = function(checked) {
2773− var box = newElement('input');
2774− box.type = 'checkbox';
2775− box.checked = checked;
2776− var status = Elm.Signal.constant(checked);
2777− Value.addListener(box, 'change', function(e) {
2778− Dispatcher.notify(status.id, box.checked);
2780− return Value.Tuple(Value.wrap(box), status);
2782− var dropDown = function(options) {
2783− var slct = newElement('select');
2785− while (options[0] === "Cons") {
2786− var opt = newElement('option');
2787− var str = Value.toText(options[1][1]);
2789− opt.innerHTML = str;
2790− slct.appendChild(opt);
2791− opts.push(options[1][2]);
2792− options = options[2];
2794− var status = Elm.Signal.constant(opts[0]);
2795− Value.addListener(slct, 'change', function(e) {
2796− Dispatcher.notify(status.id, opts[slct.selectedIndex]);
2798− return Value.Tuple(Value.wrap(slct), status);
2800− var stringDropDown = function(opts) {
2801− return dropDown(Elm.List.map (function(x) {return Value.Tuple(x,x);}) (opts));
2803− var button = function(name) {
2804− var b = newElement('input');
2806− b.value = JS.castStringToJSString(name);
2807− var press = Elm.Signal.constant(false);
2808− Value.addListener(b, 'click', function(e) {
2809− Dispatcher.notify(press.id, true);
2810− Dispatcher.notify(press.id, false);
2812− return Value.Tuple(Value.wrap(b),press);
2814− return {textArea:textArea, textField:textField,
2815− password:password, checkbox:checkbox,
2816− dropDown:dropDown, stringDropDown:stringDropDown,
2820−Elm.Keyboard = { Raw : function() {
2821− var keysDown = Elm.Signal.constant(["Nil"]);
2822− var charPressed = Elm.Signal.constant(["Nothing"]);
2824− function remove(x,xs) {
2825− if (xs[0] === "Nil") return xs;
2826− if (xs[1] === x) return xs[2];
2827− return ["Cons", xs[1], remove(x,xs[2])];
2829− function has(x,xs) {
2830− while (xs[0] !== "Nil") {
2831− if (xs[1] === x) return true;
2836− Value.addListener(document, 'keydown', function(e) {
2837− if (has(e.keyCode, keysDown.value)) return;
2838− var hasListener = Dispatcher.notify(keysDown.id, ["Cons", e.keyCode, keysDown.value]);
2840− this.removeEventListener('keydown',arguments.callee,false);
2842− Value.addListener(document, 'keyup', function(e) {
2843− var codes = remove(e.keyCode, keysDown.value);
2844− var hasListener = Dispatcher.notify(keysDown.id, codes);
2846− this.removeEventListener('keyup',arguments.callee,false);
2848− Value.addListener(window, 'blur', function(e) {
2849− var hasListener = Dispatcher.notify(keysDown.id, ["Nil"]);
2851− this.removeEventListener('blur',arguments.callee,false);
2853− Value.addListener(document, 'keypress', function(e) {
2854− var hasListener = Dispatcher.notify(charPressed.id, ["Just",e.charCode || e.keyCode]);
2855− Dispatcher.notify(charPressed.id, ["Nothing"]);
2857− this.removeEventListener('keypress',arguments.callee,false);
2859− return {keysDown:keysDown,
2860− charPressed:charPressed};
2865− function keySignal(f) {
2866− var signal = Elm.Signal.lift(f)(Elm.Keyboard.Raw.keysDown);
2867− Elm.Keyboard.Raw.keysDown.defaultNumberOfKids += 1;
2868− signal.defaultNumberOfKids = 0;
2872− function dir(left,right,up,down) {
2875− while (ks[0] == "Cons") {
2877− case left : --x; break;
2878− case right: ++x; break;
2879− case up : ++y; break;
2880− case down : --y; break;
2884− return { _:[true], x:[x], y:[y] };
2886− return keySignal(f);
2891− while (ks[0] == "Cons") {
2892− if (key == ks[1]) return true;
2897− return keySignal(f);
2900− Elm.Keyboard.arrows = dir(37,39,38,40);
2901− Elm.Keyboard.wasd = dir(65,68,87,83);
2902− Elm.Keyboard.shift = is(16);
2903− Elm.Keyboard.ctrl = is(17);
2904− Elm.Keyboard.space = is(32);
2908−Elm.Mouse = function() {
2909− var position = Elm.Signal.constant(Value.Tuple(0,0));
2910− position.defaultNumberOfKids = 2;
2912− var x = Elm.Signal.lift(function(p){return p[1];})(position);
2913− x.defaultNumberOfKids = 0;
2914− var y = Elm.Signal.lift(function(p){return p[2];})(position);
2915− y.defaultNumberOfKids = 0;
2917− var isDown = Elm.Signal.constant(false);
2918− var isClicked = Elm.Signal.constant(false);
2919− var clicks = Elm.Signal.constant(Value.Tuple());
2921− function getXY(e) {
2924− if (!e) e = window.event;
2925− if (e.pageX || e.pageY) {
2928− } else if (e.clientX || e.clientY) {
2929− posx = e.clientX + document.body.scrollLeft +
2930− document.documentElement.scrollLeft;
2931− posy = e.clientY + document.body.scrollTop +
2932− document.documentElement.scrollTop;
2934− return Value.Tuple(posx, posy);
2937− Value.addListener(document, 'click', function(e) {
2938− var hasListener1 = Dispatcher.notify(isClicked.id, true);
2939− var hasListener2 = Dispatcher.notify(clicks.id, Value.Tuple());
2940− Dispatcher.notify(isClicked.id, false);
2941− if (!hasListener1 && !hasListener2)
2942− this.removeEventListener('click',arguments.callee,false);
2944− Value.addListener(document, 'mousedown', function(e) {
2945− var hasListener = Dispatcher.notify(isDown.id, true);
2947− this.removeEventListener('mousedown',arguments.callee,false);
2949− Value.addListener(document, 'mouseup', function(e) {
2950− var hasListener = Dispatcher.notify(isDown.id, false);
2952− this.removeEventListener('mouseup',arguments.callee,false);
2954− Value.addListener(document, 'mousemove', function(e) {
2955− var hasListener = Dispatcher.notify(position.id, getXY(e));
2957− this.removeEventListener('mousemove',arguments.callee,false);
2959− var clickedOn = function(elem) {
2960− var node = Render.render(elem);
2961− var click = Elm.Signal.constant(false);
2962− Value.addListener(node, 'click', function(e) {
2963− Dispatcher.notify(click.id, true);
2964− Dispatcher.notify(click.id, false);
2966− return Value.Tuple(Value.wrap(node), click);
2968− return {position: position,
2971− isClicked: isClicked,
2974− isClickedOn: clickedOn
2977−Elm.Random = function() {
2978− var inRange = function(min) { return function(max) {
2979− return Elm.Signal.constant(Math.floor(Math.random() * (max-min+1)) + min);
2982− var randomize = function(min) { return function(max) { return function(signal) {
2983− function f(x) { return Math.floor(Math.random() * (max-min+1)) + min; }
2984− return Elm.Signal.lift(f)(signal);
2988− return { inRange:inRange, randomize:randomize };
2989−}();Elm.Time = function() {
2990− function timeNow() { return (new window.Date).getTime(); }
2991− function everyWhen(isOn) { return function(t) {
2992− var clock = Elm.Signal.constant(timeNow());
2993− function tellTime() { Dispatcher.notify(clock.id, timeNow()); }
2994− setInterval(tellTime, t);
2998− function fpsWhen(desiredFPS) { return function (isOn) {
2999− var msPerFrame = 1000 / desiredFPS;
3000− var prev = timeNow(), curr = prev, diff = 0, wasOn = true;
3001− var ticker = Elm.Signal.constant(diff);
3002− function tick(zero) { return function() {
3004− diff = zero ? 0 : curr - prev;
3006− Dispatcher.notify(ticker.id, diff);
3010− function f(isOn) { return function(t) {
3012− timeoutID = setTimeout(tick(!wasOn && isOn), msPerFrame);
3013− } else if (wasOn) {
3014− clearTimeout(timeoutID);
3020− return Elm.Signal.lift2(f)(isOn)(ticker);
3023− function since(t) { return function(s) {
3024− function cmp(a) { return function(b) { return !Value.eq(a,b); }; }
3025− var dcount = Elm.Signal.count(Elm.Signal.delay(t)(s));
3026− return Elm.Signal.lift2(cmp)(Elm.Signal.count(s))(dcount);
3029− function after(t) {
3031− var thread = Elm.Signal.constant(false);
3032− setTimeout(function() { Dispatcher.notify(thread.id, true); }, t);
3035− function before(t) {
3037− var thread = Elm.Signal.constant(true);
3038− setTimeout(function() { Dispatcher.notify(thread.id, false); }, t);
3042− var t = window.Date.parse(s);
3043− return isNaN(t) ? ["Nothing"] : ["Just",t];
3045− return {fpsWhen : fpsWhen,
3046− fps : function(t) { return fpsWhen(t)(Elm.Signal.constant(true)); },
3047− every : everyWhen(Elm.Signal.constant(true)),
3048− delay : Elm.Signal.delay,
3056− inHours : function(t) { return t / 3600000; },
3057− inMinutes : function(t) { return t / 60000; },
3058− inSeconds : function(t) { return t / 1000; },
3059− inMss : function(t) { return t; },
3060− toDate : function(t) { return new window.Date(t); },
3064−}();Elm.Window = function() {
3065− var dimensions = Elm.Signal.constant(Value.Tuple(window.innerWidth,
3066− window.innerHeight));
3067− dimensions.defaultNumberOfKids = 2;
3069− var width = Elm.Signal.lift(function(p){return p[1];})(dimensions);
3070− width.defaultNumberOfKids = 0;
3071− var height = Elm.Signal.lift(function(p){return p[2];})(dimensions);
3072− height.defaultNumberOfKids = 0;
3074− Value.addListener(window, 'resize', function(e) {
3075− var w = document.getElementById('widthChecker').offsetWidth;
3076− var hasListener = Dispatcher.notify(dimensions.id,
3077− Value.Tuple(w, window.innerHeight));
3079− this.removeEventListener('resize',arguments.callee,false);
3081− return {dimensions:dimensions,width:width,height:height};
3084−Elm.Date = function() {
3086− function dateNow() { return new window.Date; }
3087− function readDate(str) {
3088− var d = new window.Date(Elm.JavaScript.castStringToJSString(str));
3089− if (isNaN(d.getTime())) return ["Nothing"];
3093− var dayTable = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
3094− var monthTable = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
3095− "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
3099− year : function(d) { return d.getFullYear(); },
3100− month : function(d) { return [monthTable[d.getMonth()]]; },
3101− day : function(d) { return d.getDate(); },
3102− hour : function(d) { return d.getHours(); },
3103− minute : function(d) { return d.getMinutes(); },
3104− second : function(d) { return d.getSeconds(); },
3105− dayOfWeek : function(d) { return [dayTable[d.getDay()]]; },
3106− toTime : function(d) { return d.getTime(); },
3107− Mon : ["Mon"], Tue : ["Tue"], Wed : ["Wed"],
3108− Thu : ["Thu"], Fri : ["Fri"], Sat : ["Sat"], Sun : ["Sun"],
3109− Jan : ["Jan"], Feb : ["Feb"], Mar : ["Mar"], Apr : ["Apr"],
3110− May : ["May"], Jun : ["Jun"], Jul : ["Jul"], Aug : ["Aug"],
3111− Sep : ["Sep"], Oct : ["Oct"], Nov : ["Nov"], Dec : ["Dec"]
3116−Value.addListener(document, 'elm_log', function(e) { console.log(e.value); });
3117−Value.addListener(document, 'elm_title', function(e) {document.title = e.value;});
3118−Value.addListener(document, 'elm_redirect', function(e) {
3119− if (e.value.length > 0) { window.location = e.value; }
3121−Value.addListener(document, 'elm_viewport', function(e) {
3122− var node = document.getElementById('elm_viewport');
3124− node = document.createElement('meta');
3125− node.id = 'elm_viewport';
3126− node.name = 'viewport';
3127− document.head.appendChild(node);
3129− node.content = e.value;
3130− Dispatcher.notify(Elm.Window.dimensions.id,
3131− Value.Tuple(window.innerWidth, window.innerHeight));
3134−Elm.Prelude = function() {
3135− var mod = function(x) { return function(y) {
3137− var m = x==0 ? 0 : (y>0 ? (x>=0 ? r : r+y) : -mod(-x)(-y));
3138− return m == y ? 0 : m;
3141− var min = function(x) { return function(y) { return Math.min(x,y); }; };
3142− var max = function(x) { return function(y) { return Math.max(x,y); }; };
3144− var flip=function(f){return function(x){return function(y){return f(y)(x);};};};
3145− var clamp = function(lo) { return function(hi) {
3146− return function(x) { return Math.min(hi, Math.max(lo, x)); };
3149− var curry = function(f) { return function(x) { return function(y) {
3150− return f(["Tuple2",x,y]); }; };
3152− var uncurry = function(f) { return function(p) {
3153− if (p[0] !== "Tuple2") {
3154− throw "Function was uncurry'd but was not given a pair.";
3156− return f(p[1])(p[2]); };
3159− var logBase=function(b){return function(x){return Math.log(x)/Math.log(b);};};
3161− function readInt(str) {
3162− var s = Elm.JavaScript.castStringToJSString(str);
3163− var len = s.length;
3164− if (len === 0) { return ["Nothing"]; }
3167− if (len === 1) { return ["Nothing"]; }
3170− for (var i = start; i < len; ++i) {
3171− if (!Elm.Char.isDigit(s[i])) { return ["Nothing"]; }
3173− return ["Just", parseInt(s)];
3176− function readFloat(str) {
3177− var s = Elm.JavaScript.castStringToJSString(str);
3178− var len = s.length;
3179− if (len === 0) { return ["Nothing"]; }
3182− if (len === 1) { return ["Nothing"]; }
3186− for (var i = start; i < len; ++i) {
3187− if (Elm.Char.isDigit(s[i])) { continue; }
3188− if (s[i] === '.') {
3190− if (dotCount <= 1) { continue; }
3192− return ["Nothing"];
3194− return ["Just", parseFloat(s)];
3197− function compare(x) { return function (y) {
3198− if (x instanceof Array && y instanceof Array) {
3199− var len = x.length;
3200− if (len == y.length) {
3201− for (var i = 1; i < len; ++i) {
3202− var cmp = compare(x[i])(y[i]);
3203− if (cmp[0] === 'EQ') continue;
3208− return [ y.length == 1 ? 'GT' : 'LT' ];
3210− return [ x === y ? 'EQ' : (x < y ? 'LT' : 'GT') ];
3213− return {eq : Value.eq,
3214− id : function(x) { return x; },
3215− not : function(b) { return !b; },
3216− xor : function(x) { return function(y) { return x != y; }; },
3217− fst : function(p) { return p[1]; },
3218− snd : function(p) { return p[2]; },
3219− rem : function(x) { return function(y) { return x % y; }; },
3220− div : function(x) { return function(y) { return ~~(x / y); }; },
3223− toFloat : function(x) { return x; },
3224− round : function(n) { return Math.round(n); },
3225− floor : function(n) { return Math.floor(n); },
3226− ceiling : function(n) { return Math.ceil(n); },
3227− truncate : function(n) { return ~~n; },
3229− readFloat : readFloat,
3240− atan2 : function(y) { return function(x) { return Math.atan2(y,x); }; },
3249− Just : Elm.Maybe.Just,
3250− Nothing : Elm.Maybe.Nothing,
3251− maybe : Elm.Maybe.maybe,
3252− map : Elm.List.map,
3253− zip : Elm.List.zip,
3254− zipWith : Elm.List.zipWith,
3255− filter : Elm.List.filter,
3256− head : Elm.List.head,
3257− tail : Elm.List.tail,
3258− last : Elm.List.last,
3259− length : Elm.List.length,
3260− reverse : Elm.List.reverse,
3261− foldr : Elm.List.foldr,
3262− foldr1 : Elm.List.foldr1,
3263− foldl : Elm.List.foldl,
3264− foldl1 : Elm.List.foldl1,
3265− and : Elm.List.and,
3267− all : Elm.List.all,
3268− any : Elm.List.any,
3269− sum : Elm.List.sum,
3270− product : Elm.List.product,
3271− concat : Elm.List.concat,
3272− concatMap : Elm.List.concatMap,
3273− maximum : Elm.List.maximum,
3274− minimum : Elm.List.minimum,
3275− scanl : Elm.List.scanl,
3276− scanl1 : Elm.List.scanl1,
3277− take : Elm.List.take,
3278− drop : Elm.List.drop,
3279− zip : Elm.List.zip,
3280− unzip : Elm.List.unzip,
3281− lift : Elm.Signal.lift,
3282− lift2 : Elm.Signal.lift2,
3283− lift3 : Elm.Signal.lift3,
3284− lift4 : Elm.Signal.lift4,
3285− lift5 : Elm.Signal.lift5,
3286− lift6 : Elm.Signal.lift6,
3287− lift7 : Elm.Signal.lift7,
3288− lift8 : Elm.Signal.lift8,
3289− foldp : Elm.Signal.foldp,
3290− foldp1 : Elm.Signal.foldp1,
3291− foldp$ : Elm.Signal.foldp$,
3292− constant : Elm.Signal.constant,
3293− merge : Elm.Signal.merge,
3294− merges : Elm.Signal.merges,
3295− mergeEither : Elm.Signal.mergeEither,
3296− count : Elm.Signal.count,
3297− countIf : Elm.Signal.countIf,
3298− average : Elm.Signal.average,
3299− keepIf : Elm.Signal.keepIf,
3300− dropIf : Elm.Signal.dropIf,
3301− keepWhen : Elm.Signal.keepWhen,
3302− dropWhen : Elm.Signal.dropWhen,
3303− dropRepeats : Elm.Signal.dropRepeats,
3304− sampleOn : Elm.Signal.sampleOn,
3305− timestamp : Elm.Signal.timestamp,
3306− timeOf : Elm.Signal.timeOf
3312− var include = function(library) {
3313− for (var i in library) {
3314− Elm.Prelude[i] = library[i];
3317− include (Elm.Color);
3318− include (Elm.Text);
3319− include (Elm.Graphics);
3320− include (Elm.Time);
3326−Elm.Touch = function() {
3332− this.insert = function(key,value) {
3333− this.keys.push(key);
3334− this.values.push(value);
3336− this.lookup = function(key) {
3337− var i = this.keys.indexOf(key)
3338− return i >= 0 ? this.values[i] : {x:0,y:0,t:0};
3340− this.remove = function(key) {
3341− var i = this.keys.indexOf(key);
3343− var t = this.values[i];
3344− this.keys.splice(i,1);
3345− this.values.splice(i,1);
3350− var root = Elm.Signal.constant([]),
3353− tap = {_:[true],x:[0],y:[0]},
3356− function touch(t) {
3357− var r = dict.lookup(t.identifier);
3358− return {_ : [true], id: [t.identifier],
3359− x: [t.pageX], y: [t.pageY],
3360− x0: [r.x], y0: [r.y],
3364− function start(e) {
3365− dict.insert(e.identifier,{x:e.pageX,y:e.pageY,t:Date.now()});
3368− var t = dict.remove(e.identifier);
3369− if (Date.now() - t.t < tapTime) {
3371− tap = {_:[true], x:[t.x], y:[t.y]};
3375− function listen(name, f) {
3376− function update(e) {
3377− for (var i = e.changedTouches.length; i--; ) { f(e.changedTouches[i]); }
3378− var ts = new Array(e.touches.length);
3379− for (var i = e.touches.length; i--; ) { ts[i] = touch(e.touches[i]); }
3380− var hasListener = Dispatcher.notify(root.id, ts);
3381− if (!hasListener) return document.removeEventListener(name, update);
3382− e.preventDefault();
3384− Value.addListener(document, name, update);
3387− listen("touchstart", start);
3388− listen("touchmove", function(_){});
3389− listen("touchend", end);
3390− listen("touchcancel", end);
3391− listen("touchleave", end);
3393− function dependency(f) {
3394− var sig = Elm.Signal.lift(f)(root);
3395− root.defaultNumberOfKids += 1;
3396− sig.defaultNumberOfKids = 0;
3400− var touches = dependency(function(ts) {
3401− return Elm.JavaScript.castJSArrayToList(ts);
3403− var taps = function() {
3404− var sig = dependency(function(_) { return tap; });
3405− sig.defaultNumberOfKids = 1;
3406− function pred(_) { var b = hasTap; hasTap = false; return b; }
3407− var sig2 = Elm.Signal.keepIf(pred)({_:[true],x:[0],y:[0]})(sig);
3408− sig2.defaultNumberOfKids = 0;
3412− return { touches: touches, taps: taps };
3414−Elm.Dict=function(){
3415− var compare = Elm.Prelude.compare;
3416− var uncurry = Elm.Prelude.uncurry;
3417− var Nothing = Elm.Prelude.Nothing;
3418− var Just = Elm.Prelude.Just;
3419− var not = Elm.Prelude.not;
3420− var eq = Elm.Prelude.eq;
3421− var isJust=Elm.Maybe.isJust;
3423− var Black_1=['Black'];
3424− function RBNode_2(a1){
3425− return function(a2){
3426− return function(a3){
3427− return function(a4){
3428− return function(a5){
3429− return ['RBNode',a1,a2,a3,a4,a5];};};};};}
3430− var RBEmpty_3=['RBEmpty'];
3431− function min_6(t_42){
3435− throw '(min RBEmpty) is not defined';
3437− switch(t_42[4][0]){
3439− return ['Tuple2',t_42[2],t_42[3]];
3441− return min_6(t_42[4]);
3443− throw "Non-exhaustive pattern match in case";}();}
3444− function lookup_7(k_46){
3445− return function(t_47){
3452− var case12=compare(k_46)(t_47[2]);
3455− return Just(t_47[3]);
3457− return lookup_7(k_46)(t_47[5]);
3459− return lookup_7(k_46)(t_47[4]);
3461− throw "Non-exhaustive pattern match in case";}();
3463− throw "Non-exhaustive pattern match in case";}();};}
3464− function findWithDefault_8(base_52){
3465− return function(k_53){
3466− return function(t_54){
3473− var case19=compare(k_53)(t_54[2]);
3478− return findWithDefault_8(base_52)(k_53)(t_54[5]);
3480− return findWithDefault_8(base_52)(k_53)(t_54[4]);
3482− throw "Non-exhaustive pattern match in case";}();
3484− throw "Non-exhaustive pattern match in case";}();};};}
3485− function member_9(k_59){
3486− return function(t_60){
3487− return isJust(lookup_7(k_59)(t_60));};}
3488− function rotateLeft_10(t_61){
3492− switch(t_61[5][0]){
3494− return RBNode_2(t_61[1])(t_61[5][2])(t_61[5][3])(RBNode_2(Red_0)(t_61[2])(t_61[3])(t_61[4])(t_61[5][4]))(t_61[5][5]);
3497− throw 'rotateLeft of a node without enough children';}();}
3498− function rotateRight_11(t_71){
3502− switch(t_71[4][0]){
3504− return RBNode_2(t_71[1])(t_71[4][2])(t_71[4][3])(t_71[4][4])(RBNode_2(Red_0)(t_71[2])(t_71[3])(t_71[4][5])(t_71[5]));
3507− throw 'rotateRight of a node without enough children';}();}
3508− function rotateLeftIfNeeded_12(t_81){
3512− switch(t_81[5][0]){
3514− switch(t_81[5][1][0]){
3516− return rotateLeft_10(t_81);
3521− function rotateRightIfNeeded_13(t_82){
3525− switch(t_82[4][0]){
3527− switch(t_82[4][1][0]){
3529− switch(t_82[4][4][0]){
3531− switch(t_82[4][4][1][0]){
3533− return rotateRight_11(t_82);
3540− function otherColor_14(c_83){
3548− throw "Non-exhaustive pattern match in case";}();}
3549− function color_flip_15(t_84){
3553− switch(t_84[4][0]){
3555− switch(t_84[5][0]){
3557− return RBNode_2(otherColor_14(t_84[1]))(t_84[2])(t_84[3])(RBNode_2(otherColor_14(t_84[4][1]))(t_84[4][2])(t_84[4][3])(t_84[4][4])(t_84[4][5]))(RBNode_2(otherColor_14(t_84[5][1]))(t_84[5][2])(t_84[5][3])(t_84[5][4])(t_84[5][5]));
3561− throw 'color_flip called on a RBEmpty or RBNode with a RBEmpty child';}();}
3562− function color_flipIfNeeded_16(t_98){
3566− switch(t_98[4][0]){
3568− switch(t_98[4][1][0]){
3570− switch(t_98[5][0]){
3572− switch(t_98[5][1][0]){
3574− return color_flip_15(t_98);
3581− function fixUp_17(t_99){
3582− return color_flipIfNeeded_16(rotateRightIfNeeded_13(rotateLeftIfNeeded_12(t_99)));}
3583− function ensureBlackRoot_18(t_100){
3587− switch(t_100[1][0]){
3589− return RBNode_2(Black_1)(t_100[2])(t_100[3])(t_100[4])(t_100[5]);
3593− function insert_19(k_105){
3594− return function(v_106){
3595− return function(t_107){
3597− function ins_108(t_109){
3601− return RBNode_2(Red_0)(k_105)(v_106)(RBEmpty_3)(RBEmpty_3);
3604− var h_115=function(){
3605− var case114=compare(k_105)(t_109[2]);
3606− switch(case114[0]){
3608− return RBNode_2(t_109[1])(t_109[2])(v_106)(t_109[4])(t_109[5]);
3610− return RBNode_2(t_109[1])(t_109[2])(t_109[3])(t_109[4])(ins_108(t_109[5]));
3612− return RBNode_2(t_109[1])(t_109[2])(t_109[3])(ins_108(t_109[4]))(t_109[5]);
3614− throw "Non-exhaustive pattern match in case";}();
3615− return fixUp_17(h_115);}();
3617− throw "Non-exhaustive pattern match in case";}();}
3618− return ensureBlackRoot_18(ins_108(t_107));}();};};}
3619− function singleton_20(k_116){
3620− return function(v_117){
3621− return insert_19(k_116)(v_117)(RBEmpty_3);};}
3622− function isRed_21(t_118){
3626− switch(t_118[1][0]){
3632− function isRedLeft_22(t_119){
3636− switch(t_119[4][0]){
3638− switch(t_119[4][1][0]){
3645− function isRedLeftLeft_23(t_120){
3649− switch(t_120[4][0]){
3651− switch(t_120[4][4][0]){
3653− switch(t_120[4][4][1][0]){
3661− function isRedRight_24(t_121){
3665− switch(t_121[5][0]){
3667− switch(t_121[5][1][0]){
3674− function isRedRightLeft_25(t_122){
3678− switch(t_122[5][0]){
3680− switch(t_122[5][4][0]){
3682− switch(t_122[5][4][1][0]){
3690− function moveRedLeft_26(t_123){
3692− var t__124=color_flip_15(t_123);
3697− switch(t__124[5][0]){
3699− switch(t__124[5][4][0]){
3701− switch(t__124[5][4][1][0]){
3703− return color_flip_15(rotateLeft_10(RBNode_2(t__124[1])(t__124[2])(t__124[3])(t__124[4])(rotateRight_11(t__124[5]))));
3709− return t__124;}();}();}
3710− function moveRedRight_27(t_130){
3712− var t__131=color_flip_15(t_130);
3713− return (isRedLeftLeft_23(t__131)?color_flip_15(rotateRight_11(t__131)):t__131);}();}
3714− function moveRedLeftIfNeeded_28(t_132){
3715− return ((not(isRedLeft_22(t_132))&¬(isRedLeftLeft_23(t_132)))?moveRedLeft_26(t_132):t_132);}
3716− function moveRedRightIfNeeded_29(t_133){
3717− return ((not(isRedRight_24(t_133))&¬(isRedRightLeft_25(t_133)))?moveRedRight_27(t_133):t_133);}
3718− function deleteMin_30(t_134){
3720− function del_135(t_136){
3724− switch(t_136[4][0]){
3730− var case198=moveRedLeftIfNeeded_28(t_136);
3731− switch(case198[0]){
3735− return fixUp_17(RBNode_2(case198[1])(case198[2])(case198[3])(del_135(case198[4]))(case198[5]));
3737− throw "Non-exhaustive pattern match in case";}();}();}
3738− return ensureBlackRoot_18(del_135(t_134));}();}
3739− function remove_31(k_142){
3740− return function(t_143){
3742− function eq_and_noRightNode_144(t_150){
3746− switch(t_150[5][0]){
3748− return eq(k_142,t_150[2]);
3752− function eq_145(t_152){
3756− return eq(k_142,t_152[2]);
3759− function delLT_146(t_154){
3761− var case216=moveRedLeftIfNeeded_28(t_154);
3762− switch(case216[0]){
3764− throw 'delLT on RBEmpty';
3766− return fixUp_17(RBNode_2(case216[1])(case216[2])(case216[3])(del_149(case216[4]))(case216[5]));
3768− throw "Non-exhaustive pattern match in case";}();}
3769− function delEQ_147(t_160){
3773− throw 'delEQ called on a RBEmpty';
3776− var Tuple2$k_v__164=min_6(t_160[5]);
3777− var k__165=function(){
3778− switch(Tuple2$k_v__164[0]){
3780− return Tuple2$k_v__164[1];
3782− throw "Non-exhaustive pattern match in case";}();
3783− var v__166=function(){
3784− switch(Tuple2$k_v__164[0]){
3786− return Tuple2$k_v__164[2];
3788− throw "Non-exhaustive pattern match in case";}();
3789− return fixUp_17(RBNode_2(t_160[1])(k__165)(v__166)(t_160[4])(deleteMin_30(t_160[5])));}();
3791− throw "Non-exhaustive pattern match in case";}();}
3792− function delGT_148(t_171){
3796− throw 'delGT called on a RBEmpty';
3798− return fixUp_17(RBNode_2(t_171[1])(t_171[2])(t_171[3])(t_171[4])(del_149(t_171[5])));
3800− throw "Non-exhaustive pattern match in case";}();}
3801− function del_149(t_177){
3807− return ((compare(k_142)(t_177[2])[0] === 'LT')?delLT_146(t_177):function(){
3808− var u_179=(isRedLeft_22(t_177)?rotateRight_11(t_177):t_177);
3809− return (eq_and_noRightNode_144(u_179)?u_179[4]:function(){
3810− var t__180=moveRedRightIfNeeded_29(t_177);
3811− return (eq_145(t__180)?delEQ_147(t__180):delGT_148(t__180));}());}());
3813− throw "Non-exhaustive pattern match in case";}();}
3814− return (member_9(k_142)(t_143)?ensureBlackRoot_18(del_149(t_143)):t_143);}();};}
3815− function map_32(f_181){
3816− return function(t_182){
3822− return RBNode_2(t_182[1])(t_182[2])(f_181(t_182[3]))(map_32(f_181)(t_182[4]))(map_32(f_181)(t_182[5]));
3824− throw "Non-exhaustive pattern match in case";}();};}
3825− function foldl_33(f_188){
3826− return function(acc_189){
3827− return function(t_190){
3833− return foldl_33(f_188)(f_188(t_190[2])(t_190[3])(foldl_33(f_188)(acc_189)(t_190[4])))(t_190[5]);
3835− throw "Non-exhaustive pattern match in case";}();};};}
3836− function foldr_34(f_195){
3837− return function(acc_196){
3838− return function(t_197){
3844− return foldr_34(f_195)(f_195(t_197[2])(t_197[3])(foldr_34(f_195)(acc_196)(t_197[5])))(t_197[4]);
3846− throw "Non-exhaustive pattern match in case";}();};};}
3847− function union_35(t1_202){
3848− return function(t2_203){
3849− return foldl_33(insert_19)(t2_203)(t1_202);};}
3850− function intersect_36(t1_204){
3851− return function(t2_205){
3852− return foldl_33(function(k_206){
3853− return function(v_207){
3854− return function(t_208){
3855− return (member_9(k_206)(t2_205)?insert_19(k_206)(v_207)(t_208):t_208);};};})(empty_4)(t1_204);};}
3856− function diff_37(t1_209){
3857− return function(t2_210){
3858− return foldl_33(function(k_211){
3859− return function(v_212){
3860− return function(t_213){
3861− return remove_31(k_211)(t_213);};};})(t1_209)(t2_210);};}
3862− function keys_38(t_214){
3863− return foldr_34(function(k_215){
3864− return function(v_216){
3865− return function(acc_217){
3866− return ['Cons',k_215,acc_217];};};})(['Nil'])(t_214);}
3867− function values_39(t_218){
3868− return foldr_34(function(k_219){
3869− return function(v_220){
3870− return function(acc_221){
3871− return ['Cons',v_220,acc_221];};};})(['Nil'])(t_218);}
3872− function toList_40(t_222){
3873− return foldr_34(function(k_223){
3874− return function(v_224){
3875− return function(acc_225){
3876− return ['Cons',['Tuple2',k_223,v_224],acc_225];};};})(['Nil'])(t_222);}
3877− function fromList_41(assocs_226){
3878− return Elm.List.foldl(uncurry(insert_19))(empty_4)(assocs_226);}
3879− var empty_4=RBEmpty_3;
3883− findWithDefault:findWithDefault_8,
3886− singleton:singleton_20,
3892− intersect:intersect_36,
3897− fromList:fromList_41};}();
3900− var empty_0=Elm.Dict.empty;
3901− var remove_3=Elm.Dict.remove;
3902− var member_4=Elm.Dict.member;
3903− var union_5=Elm.Dict.union;
3904− var intersect_6=Elm.Dict.intersect;
3905− var diff_7=Elm.Dict.diff;
3906− var toList_8=Elm.Dict.keys;
3907− var fromList_9=Elm.List.foldl(function(k_15){
3908− return function(t_16){
3909− return Elm.Dict.insert(k_15)(["Tuple0"])(t_16);};})(empty_0);
3910− function singleton_1(k_13){
3911− return Elm.Dict.singleton(k_13)(["Tuple0"]);};
3912− function insert_2(k_14){
3913− return Elm.Dict.insert(k_14)(["Tuple0"]);};
3914− function foldl_10(f_17){
3915− return Elm.Dict.foldl(function(k_18){
3916− return function(v_19){
3917− return function(b_20){
3918− return f_17(k_18)(b_20);};};});};
3919− function foldr_11(f_21){
3920− return Elm.Dict.foldr(function(k_22){
3921− return function(v_23){
3922− return function(b_24){
3923− return f_21(k_22)(b_24);};};});};
3924− function map_12(f_25){
3925− return function(t_26){
3926− return function(x){
3927− return fromList_9(Elm.List.map(f_25)(x));}(toList_8(t_26));};};
3928− return {empty:empty_0,singleton:singleton_1,insert:insert_2,remove:remove_3,member:member_4,union:union_5,intersect:intersect_6,diff:diff_7,toList:toList_8,fromList:fromList_9,foldl:foldl_10,foldr:foldr_11,map:map_12};}();
3934−for(this['i'] in Elm){eval('var '+this['i']+'=Elm[this.i];');}
3935−if (Elm.Automaton) throw "Module name collision, 'Automaton' is already defined.";
3936−Elm.Automaton=function(){
3938− if (!(Elm.Prelude instanceof Object)) throw 'module not found';
3940− throw ("Module 'Prelude' is missing. Compile with --make flag or load missing module in a separate JavaScript file.");
3943− for (this['i'] in Elm.Prelude) {
3944− if (hiddenVars[this['i']]) continue;
3945− eval('var ' + this['i'] + ' = Elm.Prelude[this.i];');}
3946− function Automaton_0(a1){
3947− return ["Automaton",a1];}
3948− var Listen_8=["Listen"];
3949− var Ignore_9=["Ignore"];
3950− function DragFrom_10(a1){
3951− return ["DragFrom",a1];}
3952− $op['>>>'] = function(a1_24){
3953− return function(a2_25){
3955− var Automaton$m1_26=a1_24;
3956− var m1_27=function(){
3957− switch(Automaton$m1_26[0]){
3959− return Automaton$m1_26[1];
3961− throw "Non-exhaustive pattern match in case";}();
3962− var Automaton$m2_28=a2_25;
3963− var m2_29=function(){
3964− switch(Automaton$m2_28[0]){
3966− return Automaton$m2_28[1];
3968− throw "Non-exhaustive pattern match in case";}();
3969− return Automaton_0(function(a_32){
3971− var Tuple2$bm1__33=m1_27(a_32);
3972− var b_34=function(){
3973− switch(Tuple2$bm1__33[0]){
3975− return Tuple2$bm1__33[1];
3977− throw "Non-exhaustive pattern match in case";}();
3978− var m1__35=function(){
3979− switch(Tuple2$bm1__33[0]){
3981− return Tuple2$bm1__33[2];
3983− throw "Non-exhaustive pattern match in case";}();
3985− var Tuple2$cm2__40=m2_29(b_34);
3986− var c_41=function(){
3987− switch(Tuple2$cm2__40[0]){
3989− return Tuple2$cm2__40[1];
3991− throw "Non-exhaustive pattern match in case";}();
3992− var m2__42=function(){
3993− switch(Tuple2$cm2__40[0]){
3995− return Tuple2$cm2__40[2];
3997− throw "Non-exhaustive pattern match in case";}();
3998− return ["Tuple2",c_41,$op['>>>'](m1__35)(m2__42)];}();}();});}();};};
3999− $op['<<<'] = function(a2_47){
4000− return function(a1_48){
4001− return $op['>>>'](a1_48)(a2_47);};};
4002− $op['^>>'] = function(f_49){
4003− return function(a_50){
4004− return $op['>>>'](pure_4(f_49))(a_50);};};
4005− $op['>>^'] = function(a_51){
4006− return function(f_52){
4007− return $op['>>>'](a_51)(pure_4(f_52));};};
4008− $op['^<<'] = function(f_53){
4009− return function(a_54){
4010− return $op['>>>'](a_54)(pure_4(f_53));};};
4011− $op['<<^'] = function(a_55){
4012− return function(f_56){
4013− return $op['>>>'](pure_4(f_56))(a_55);};};
4014− var count_7=init_5(0)(function(__84){
4015− return function(c_85){
4016− return (1+c_85);};});
4017− function run_1(Automaton$m0_14){
4018− return function(input_15){
4020− switch(Automaton$m0_14[0]){
4022− return lift(fst)(foldp$(function(a_17){
4023− return function(Tuple2$bAutomaton$m_18){
4025− switch(Tuple2$bAutomaton$m_18[0]){
4027− switch(Tuple2$bAutomaton$m_18[2][0]){
4029− return Tuple2$bAutomaton$m_18[2][1](a_17);
4032− throw "Non-exhaustive pattern match in case";}();};})(Automaton$m0_14[1])(input_15));
4034− throw "Non-exhaustive pattern match in case";}();};}
4035− function step_2(Automaton$m_21){
4036− return function(a_22){
4038− switch(Automaton$m_21[0]){
4040− return Automaton$m_21[1](a_22);
4042− throw "Non-exhaustive pattern match in case";}();};}
4043− function combine_3(autos_57){
4044− return Automaton_0(function(a_58){
4046− var Tuple2$bsautos__59=unzip(map(function(Automaton$m_62){
4048− switch(Automaton$m_62[0]){
4050− return Automaton$m_62[1](a_58);
4052− throw "Non-exhaustive pattern match in case";}();})(autos_57));
4053− var bs_60=function(){
4054− switch(Tuple2$bsautos__59[0]){
4056− return Tuple2$bsautos__59[1];
4058− throw "Non-exhaustive pattern match in case";}();
4059− var autos__61=function(){
4060− switch(Tuple2$bsautos__59[0]){
4062− return Tuple2$bsautos__59[2];
4064− throw "Non-exhaustive pattern match in case";}();
4065− return ["Tuple2",bs_60,combine_3(autos__61)];}();});}
4066− function pure_4(f_68){
4067− return Automaton_0(function(x_69){
4068− return ["Tuple2",f_68(x_69),pure_4(f_68)];});}
4069− function init_5(s_70){
4070− return function(step_71){
4071− return Automaton_0(function(a_72){
4073− var s__73=step_71(a_72)(s_70);
4074− return ["Tuple2",s__73,init_5(s__73)(step_71)];}();});};}
4075− function init__6(s_74){
4076− return function(step_75){
4077− return Automaton_0(function(a_76){
4079− var Tuple2$bs__77=step_75(a_76)(s_74);
4080− var b_78=function(){
4081− switch(Tuple2$bs__77[0]){
4083− return Tuple2$bs__77[1];
4085− throw "Non-exhaustive pattern match in case";}();
4086− var s__79=function(){
4087− switch(Tuple2$bs__77[0]){
4089− return Tuple2$bs__77[2];
4091− throw "Non-exhaustive pattern match in case";}();
4092− return ["Tuple2",b_78,init__6(s__79)(step_75)];}();});};}
4093− function vecSub_11(Tuple2$x1y1_86){
4094− return function(Tuple2$x2y2_87){
4096− switch(Tuple2$x1y1_86[0]){
4099− switch(Tuple2$x2y2_87[0]){
4101− return ["Tuple2",(Tuple2$x1y1_86[1]-Tuple2$x2y2_87[1]),(Tuple2$x1y1_86[2]-Tuple2$x2y2_87[2])];
4103− throw "Non-exhaustive pattern match in case";}();
4105− throw "Non-exhaustive pattern match in case";}();};}
4106− function stepDrag_12(Tuple2$presspos_92){
4107− return function(Tuple2$dsform_93){
4109− switch(Tuple2$presspos_92[0]){
4112− switch(Tuple2$dsform_93[0]){
4115− function wrap_98(ds__99){
4116− return ["Tuple2",Tuple2$dsform_93[2],["Tuple2",ds__99,Tuple2$dsform_93[2]]];}
4118− switch(Tuple2$dsform_93[1][0]){
4120− return (Tuple2$presspos_92[1]?["Tuple2",uncurry(move)(vecSub_11(Tuple2$presspos_92[2])(Tuple2$dsform_93[1][1]))(Tuple2$dsform_93[2]),["Tuple2",DragFrom_10(Tuple2$dsform_93[1][1]),Tuple2$dsform_93[2]]]:function(){
4121− var form__101=uncurry(move)(vecSub_11(Tuple2$presspos_92[2])(Tuple2$dsform_93[1][1]))(Tuple2$dsform_93[2]);
4122− return ["Tuple2",form__101,["Tuple2",Listen_8,form__101]];}());
4124− return wrap_98((Tuple2$presspos_92[1]?Ignore_9:Listen_8));
4126− return wrap_98((not(Tuple2$presspos_92[1])?Listen_8:(isWithin(Tuple2$presspos_92[2])(Tuple2$dsform_93[2])?DragFrom_10(Tuple2$presspos_92[2]):Ignore_9)));
4128− throw "Non-exhaustive pattern match in case";}();}();
4130− throw "Non-exhaustive pattern match in case";}();
4132− throw "Non-exhaustive pattern match in case";}();};}
4133− function draggable_13(form_102){
4134− return init__6(["Tuple2",Listen_8,form_102])(stepDrag_12);}
4135− return {$op : {'>>>' : $op['>>>'], '<<<' : $op['<<<'], '^>>' : $op['^>>'], '>>^' : $op['>>^'], '^<<' : $op['^<<'], '<<^' : $op['<<^']},
4143− draggable:draggable_13};}();
4144−Elm.main=function(){
4145− return Elm.Automaton.main;};
4147−Elm.main=function() {
4148−var msg = ('<br/><h2>Your browser may not be supported. Are you using a modern browser?</h2>' + '<br/><span style="color:grey">Runtime Error in Automaton module:<br/>' + e + '</span>');
4149−document.body.innerHTML = Elm.Text.monospace(msg);throw e;};}}());