packages feed

Elm 0.3.6.2 → 0.4.0

raw patch · 17 files changed

+382/−156 lines, 17 filesdep +bytestringdep +hjsmindep +pandoc

Dependencies added: bytestring, hjsmin, pandoc

Files

Elm.cabal view
@@ -1,6 +1,6 @@  Name:                Elm-Version:             0.3.6.2+Version:             0.4.0 Synopsis:            The Elm language module. Description:         Elm aims to make client-side web-development more pleasant.                      It is a statically/strongly typed, functional reactive@@ -22,7 +22,7 @@ Build-type:          Simple  Extra-source-files:  changelog.txt-Data-files:          elm-runtime-0.3.6.2.js+Data-files:          elm-runtime-0.4.0.js Cabal-version:       >=1.8  source-repository head@@ -35,6 +35,8 @@   Hs-Source-Dirs:      src, src/Parse, src/Types, src/Gen   other-modules:       Ast,                        CompileToJS,+                       Cases,+                       Substitute,                        ExtractNoscript,                        GenerateHtml,                        Guid,@@ -65,13 +67,18 @@                        deepseq,                        text,                        template-haskell,-                       shakespeare+                       shakespeare,+                       pandoc,+                       bytestring,+                       hjsmin  Executable elm   Main-is:             Compiler.hs   Hs-Source-Dirs:      src, src/Parse, src/Types, src/Gen   other-modules:       Ast,                        CompileToJS,+                       Cases,+                       Substitute,                        ExtractNoscript,                        GenerateHtml,                        Guid,@@ -100,4 +107,7 @@                        blaze-html == 0.5.0.*,                        blaze-markup == 0.5.1.*,                        deepseq,-                       cmdargs+                       cmdargs,+                       pandoc,+                       bytestring,+                       hjsmin
changelog.txt view
@@ -1,4 +1,35 @@ 
+Release 0.4.0
+=============
+
+This version is all about graphics: nicer API with more features and major
+efficiency improvements. I am really excited about this release!
+
+* Add native Markdown support. You can now embed markdown directly in .elm files
+  and it is used as an `Element`. Syntax is `[markdown| ... |]` where `...` is
+  formatted as described [here](http://daringfireball.net/projects/markdown/).
+  Content can span multiple lines too.
+
+* Drastically improve the `collage` interface. You can now move, rotate, and scale
+  the following forms:
+  - Elements (any Element you want can be turned into a Form with `toForm`)
+  - Images
+  - Shapes (shapes can be textured now too)
+  - Lines
+  This will make it way easier to make games in Elm. Games can now include text,
+  gifs, videos, and any other Element you can think of.
+
+* Add `--minify` flag, to minify JS code.
+
+* Significantly improve performance of pattern matching.
+
+* Compiler performs beta-reduction in some simple cases.
+
+* The rendering section of the Elm runtume-system (RTS) has been totally rewritten,
+  making screen refreshes use fewer cycles, less memory, and cause less garbage-collection.
+
+
+
 Release 0.3.6
 =============
 
− elm-runtime-0.3.6.2.js
@@ -1,67 +0,0 @@-var Guid=function(){var d=0;return{guid:function(){return d+=1}}}(),Foreign=function(){var d=function(a){for(var c=["Nil"],b=a.length;b--;)c=["Cons",a[b],c];return c},b=function(a){for(var c=[];"Cons"===a[0];)c.push(a[1]),a=a[2];return c},c=function(a){return a.slice(1)},a=function(a){return["Tuple"+a.length].concat(a)};return{JavaScript:{castJSBoolToBool:function(a){return a},castBoolToJSBool:function(a){return a},castJSNumberToFloat:function(a){return a},castFloatToJSNumber:function(a){return a},-castJSNumberToInt:function(a){return~~a},castIntToJSNumber:function(a){return a},Experimental:{castJSElementToElement:function(a){return Element.jsElement(a)},castElementToJSElement:function(a){return a}},castJSArrayToList:d,castListToJSArray:b,castJSStringToString:d,castStringToJSString:function(a){return"string"===typeof a?a:b(a).join("")},castTupleToJSTuple2:c,castTupleToJSTuple3:c,castTupleToJSTuple4:c,castTupleToJSTuple5:c,castJSTupleToTuple2:a,castJSTupleToTuple3:a,castJSTupleToTuple4:a,castJSTupleToTuple5:a}}}(),-ElmJSON=function(){function d(a){return function(h){function b(a){switch(a[0]){case "JsonNull":return null;case "JsonString":return c.castStringToJSString(a[1]);case "JsonObject":var h={},a=a[1][1],d;for(d in a)h[d]=b(a[d]);return h;case "JsonArray":h=c.castListToJSArray(a[1]);for(d=h.length;d--;)h[d]=b(h[d]);return h;default:return a[1]}}return JSON.stringify(b(["JsonObject",h]),null,c.castStringToJSString(a))}}function b(a){function h(a){switch(typeof a){case "string":return["JsonString",c.castJSStringToString(a)];-case "number":return["JsonNumber",c.castJSNumberToFloat(a)];case "boolean":return["JsonBool",c.castJSBoolToBool(a)];case "object":if(null===a)return["JsonNull"];for(var b in a)a[b]=h(a[b]);return a instanceof Array?["JsonArray",c.castJSArrayToList(a)]:["JsonObject",["JSON",a]]}}var a=JSON.parse(a),b;for(b in a)a[b]=h(a[b]);return["JSON",a]}var c=Foreign.JavaScript;return{empty:["JSON",{}],singleton:function(a){return function(h){var b={};b[c.castStringToJSString(a)]=h;return["JSON",b]}},insert:function(a){return function(h){return function(b){var b=-b[1],d={},i;for(i in b)d[i]=b[i];d[c.castStringToJSString(a)]=h;return["JSON",d]}}},lookup:function(a){return function(b){var g=c.castStringToJSString(a);return b[1].hasOwnProperty(g)?Just(b[1][g]):Nothing}},findWithDefault:function(a){return function(b){return function(g){var d=c.castStringToJSString(b);return g[1].hasOwnProperty(d)?g[1][d]:a}}},remove:function(a){return function(b){var b=b[1],d={},j;for(j in b)d[j]=b[j];delete d[c.castStringToJSString(a)];return["JSON",d]}},toPrettyJSString:d,toJSString:d(""),-fromJSString:b,toPrettyString:function(a){return function(b){return c.castJSStringToString(d(a)(b))}},toString:function(a){return c.castJSStringToString(d("")(a))},fromString:function(a){return b(c.castStringToJSString(a))},toList:function(a){var a=a[1],b=[],d;for(d in a)b.push(Value.Tuple(c.castJSStringToString(d),a[d]));return c.castJSArrayToList(b)},fromList:function(a){for(var a=c.castListToJSArray(a),b={},d=a.length;d--;)b[c.castStringToJSString(a[d][1])]=a[d][2];return["JSON",b]},JsonString:function(a){return["JsonString",-a]},JsonNumber:function(a){return["JsonNumber",a]},JsonBool:function(a){return["JsonBool",a]},JsonNull:["JsonNull"],JsonArray:function(a){return["JsonArray",a]},JsonObject:function(a){return["JsonObject",a]}}}();Foreign.JavaScript.JSON=ElmJSON;-var Value=function(){function d(a){if(0==a.length)return a;for(var a=a.replace(/"/g,"&#34;").replace(/'/g,"&#39;").replace(/</g,"&#60;").replace(/>/g,"&#62;").replace(/\n/g,"<br/>"),a=a.split("<br/>"),c=a.length;c--;){var b=a,d=c,i;i=a[c].split("");" "==i[0]&&(i[0]="&nbsp;");for(var k=i.length;--k;)" "==i[k][0]&&" "==i[k-1]&&(i[k-1]+=i[k],i[k]="");for(k=i.length;k--;)if(1<i[k].length&&" "==i[k][0]){for(var f=i[k].split(""),m=f.length-2;0<=m;m-=2)f[m]="&nbsp;";i[k]=f.join("")}i=i.join("");b[d]=i}return a.join("<br/>")}-var b=function(a,c){if("object"===typeof a){if(a===c)return!0;if(a.length!==c.length)return!1;for(var d=a.length;d--;)if(!b(a[d],c[d]))return!1;return!0}return a===c},c=function(a){if("boolean"===typeof a)return a?"True":"False";if("number"!==typeof a){if("string"===typeof a&&2>a.length)return"'"+a+"'";if(a[0]){if("Tuple"===a[0].substring(0,5)){for(var b="",d=a.length;--d;)b=","+c(a[d])+b;","===b[0]&&(b=b.substring(1));return"("+b+")"}if("Cons"===a[0])for(var d="string"===typeof a[1]?'"':"]",j="string"===-typeof a[1]?"":",",i="string"===typeof a[1]?function(a){return a}:c,b=("string"===typeof a[1]?'"':"[")+i(a[1]),a=a[2];;)if("Cons"===a[0])b+=j+i(a[1]),a=a[2];else return b+d;else{if("Nil"===a[0])return"[]";if("JSON"===a[0])return"(JSON.fromList "+c(ElmJSON.toList(a))+")";b="";for(d=a.length;--d;)b=" "+c(a[d])+b;b=a[0]+b;return 1<a.length?"("+b+")":b}}}return a+""};return{eq:b,str:function(a){for(var b=["Nil"],c=a.length;c--;)b=["Cons",a[c],b];return b},show:function(a){return Text.monospace(d(c(a)))},-Tuple:function(){var a=arguments.length,b=Array(a+1);for(b[0]="Tuple"+arguments.length;a--;)b[a+1]=arguments[a];return b},append:function(a,b){if("string"===typeof a&&"string"===typeof b)return a.concat(b);if("Nil"===a[0])return b;for(var c=["Cons",a[1],["Nil"]],d=c,a=a[2];"Cons"===a[0];)d[2]=["Cons",a[1],["Nil"]],a=a[2],d=d[2];d[2]=b;return c},listToArray:function(a){for(var b=[];"Cons"===a[0];)b.push(a[1]),a=a[2];return b},toText:function(a){if("string"===typeof a)return d(a);for(var b=[];"Cons"===-a[0];)b.push(a[1]),a=a[2];return d(b.join(""))},properEscape:d}}(),List=function(){function d(a){return function(e){if("Nil"===e[0])return e;"Cons"!==e[0]&&f("map");for(var b=["Cons",a(e[1]),["Nil"]],c=b,e=e[2];"Cons"===e[0];)c[2]=["Cons",a(e[1]),["Nil"]],e=e[2],c=c[2];return b}}function b(a){return function(e){return function(b){var c=e;if("Nil"===b[0])return c;for("Cons"!==b[0]&&f("foldl");"Cons"===b[0];)c=a(b[1])(c),b=b[2];return c}}}function c(a){return function(e){return function(b){var c=e;-if("Nil"===b[0])return c;"Cons"!==b[0]&&f("foldr");for(var d=[];"Cons"===b[0];)d.push(b[1]),b=b[2];for(b=d.length;b--;)c=a(d[b])(c);return c}}}function a(a){return function(e){var c;"Cons"!==e[0]?c=void 0:(c=e[1],e=e[2],c=b(a)(c)(e));return c}}function h(a){return function(e){return function(b){if("Nil"===b[0])return["Cons",e,["Nil"]];"Cons"!==b[0]&&f("scanl");for(var c=[e];"Cons"===b[0];)e=a(b[1])(e),c.push(e),b=b[2];for(var b=["Nil"],d=c.length;d--;)b=["Cons",c[d],b];return b}}}function g(a){return function(e){a:{for(var b=-[function(a){return"Nil"!==a[0]?void 0:["Tuple2",["Nil"],["Nil"]]},function(e){if("Cons"===e[0]){var b=e[1],e=e[2];var c=g(a)(e);"Tuple2"!==c[0]?b=void 0:(e=c[1],c=c[2],b=a(b)?["Tuple2",["Cons",b,e],c]:["Tuple2",e,["Cons",b,c]]);return b}}],c=b.length;c--;){var d=b[c](e);if(void 0!==d){e=d;break a}}e=void 0}return e}}function j(a){a:{for(var e=[function(a){return"Nil"!==a[0]?void 0:["Tuple2",["Nil"],["Nil"]]},function(a){if("Cons"!==a[0])a=void 0;else if(a=["Tuple2",a[1],j(a[2])],"Tuple2"!==a[0]||-"Tuple2"!==a[1][0])a=void 0;else var e=a[1][1],b=a[1][2],a="Tuple2"!==a[2][0]?void 0:["Tuple2",["Cons",e,a[2][1]],["Cons",b,a[2][2]]];return a}],b=e.length;b--;){var c=e[b](a);if(void 0!==c){a=c;break a}}a=void 0}return a}function i(a){return function(e){a:{for(var b=[function(a){return"Nil"!==a[0]?void 0:["Nil"]},function(a){if("Cons"===a[0]){var e=a[1];return"Nil"!==a[2][0]?void 0:["Cons",e,["Nil"]]}},function(e){if("Cons"===e[0]){var b=e[1];if("Cons"===e[2][0]){var c=e[2][1],e=e[2][2];return["Cons",-b,["Cons",a,i(a)(["Cons",c,e])]]}}}],c=b.length;c--;){var d=b[c](e);if(void 0!==d){e=d;break a}}e=void 0}return e}}function k(a){return function(e){a:{for(var b=[function(a){return"Nil"!==a[0]?void 0:["Nil"]},function(a){if("Cons"===a[0]){var e=a[1];return"Nil"!==a[2][0]?void 0:e}},function(e){if("Cons"===e[0]){var b=e[1];if("Cons"===e[2][0]){var c=e[2][1],e=e[2][2];return Value.append(b,Value.append(a,k(a)(["Cons",c,e])))}}}],c=b.length;c--;){var d=b[c](e);if(void 0!==d){e=d;break a}}e=void 0}return e}}-var f=function(a){throw"Function '"+a+"' expecting a list!";},m=b(function(a){return function(e){return["Cons",a,e]}})(["Nil"]),l=c(function(a){return function(e){return Value.append(a,e)}})(["Nil"]),o=b(function(a){return function(e){return a&&e}})(!0),p=b(function(a){return function(e){return a||e}})(!1),n=b(function(a){return function(e){return a+e}})(0),q=b(function(a){return function(e){return a*e}})(1),s=a(function(a){return function(e){return Math.max(a,e)}}),r=a(function(a){return function(e){return Math.min(a,-e)}});return{head:function(a){if("Cons"!==a[0])throw"Error: 'head' only accepts lists of length greater than one.";return a[1]},tail:function(a){if("Cons"!==a[0])throw"Error: 'tail' only accepts lists of length greater than one.";return a[2]},last:function(a){if("Cons"!==a[0])throw"Error: 'last' only accepts lists of length greater than one.";for(var e=a[1];"Cons"===a[0];)e=a[1],a=a[2];return e},map:d,foldl:b,foldr:c,foldl1:a,foldr1:function(a){return function(e){if("Nil"===e[0])throw"'foldr1' requires an non-empty list.";-"Cons"!==e[0]&&f("foldr1");for(var b=[];"Cons"===e[0];)b.push(e[1]),e=e[2];for(var e=b.pop(),c=b.length;c--;)e=a(b[c])(e);return e}},scanl:h,scanl1:function(a){return function(e){if("Cons"!==e[0])throw"Error: 'scanl1' requires a list of at least length 1.";return h(a)(e[1])(e[2])}},filter:function(a){return function(e){if("Nil"===e[0])return e;"Cons"!==e[0]&&f("filter");for(var b=[];"Cons"===e[0];)a(e[1])&&b.push(e[1]),e=e[2];for(var e=["Nil"],c=b.length;c--;)e=["Cons",b[c],e];return e}},length:function(a){for(var e=-0;"Cons"===a[0];)e+=1,a=a[2];return e},reverse:m,concat:l,concatMap:function(a){return function(e){return l(d(a)(e))}},and:o,or:p,forall:function(a){return b(function(e){return function(b){return b&&a(e)}})(!0)},exists:function(a){return b(function(e){return function(b){return b||a(e)}})(!1)},sum:n,product:q,maximum:s,minimum:r,partition:g,zipWith:function(a){return function(e){return function(b){if("Nil"===e[0]||"Nil"===b[0])return["Nil"];("Cons"!==e[0]||"Cons"!==b[0])&&f("zipWith");for(var c=[];"Cons"===-e[0]&&"Cons"===b[0];)c.push(a(e[1])(b[1])),e=e[2],b=b[2];for(var b=["Nil"],d=c.length;d--;)b=["Cons",c[d],b];return b}}},zip:function(a){return function(b){if("Nil"===a[0]||"Nil"===b[0])return["Nil"];("Cons"!==a[0]||"Cons"!==b[0])&&f("zip");for(var c=[];"Cons"===a[0]&&"Cons"===b[0];)c.push(["Tuple2",a[1],b[1]]),a=a[2],b=b[2];for(var b=["Nil"],d=c.length;d--;)b=["Cons",c[d],b];return b}},unzip:j,intersperse:i,intercalate:k,sort:function(a){if("Nil"===a[0])return a;"Cons"!==a[0]&&f("sort");for(var b=-[];"Cons"===a[0];)b.push(a[1]),a=a[2];b.sort(function(a,b){return a-b});for(var a=["Nil"],c=b.length;c--;)a=["Cons",b[c],a];return a},take:function(a){return function(b){if(0>=a)return["Nil"];if("Nil"===b[0])return b;"Cons"!==b[0]&&f("take");var c=["Cons",b[1],["Nil"]],d=c,b=b[2];for(--a;"Cons"===b[0]&&0<a;)d[2]=["Cons",b[1],["Nil"]],d=d[2],b=b[2],--a;return c}},drop:function(a){return function(b){if("Nil"===b[0])return b;for("Cons"!==b[0]&&f("drop");"Cons"===b[0]&&0<a;)b=b[2],--a;return b}}}}(),-Data=function(){var d;d=function(b){return function(a){return"Just"===b[0]?["Cons",b[1],a]:a}};var b=function(b){return function(a){return function(d){var g=b(a);return"Just"===g[0]?["Cons",g[1],d]:d}}};d={Just:function(b){return["Just",b]},Nothing:["Nothing"],catMaybes:List.foldr(d)(["Nil"]),isJust:function(b){return"Just"===b[0]},isNothing:function(b){return"Nothing"===b[0]},fromMaybe:function(b){return function(a){return"Just"===a[0]?a[1]:b}},consMaybe:d,mapMaybe:function(c){return List.foldr(b(c))(["Nil"])},-maybe:function(b){return function(a){return function(d){return"Just"===d[0]?a(d[1]):b}}}};return{String:{toText:Value.toText,properEscape:Value.properEscape},Char:{fromCode:function(b){return String.fromCharCode(b)},toCode:function(b){return b.charCodeAt(0)},toUpper:function(b){return b.toUpperCase()},toLower:function(b){return b.toLowerCase()},toLocaleUpper:function(b){return b.toLocaleUpperCase()},toLocaleLower:function(b){return b.toLocaleLowerCase()}},Maybe:d,List:List}}(),Color=function(){var d=-function(b,c,a,d){return{r:b,g:c,b:a,a:d}};return{black:d(0,0,0,1),white:d(255,255,255,1),red:d(255,0,0,1),green:d(0,255,0,1),blue:d(0,0,255,1),gray:d(128,128,128,1),grey:d(128,128,128,1),yellow:d(255,255,0,1),cyan:d(0,255,255,1),magenta:d(255,0,255,1),rgba:function(b){return function(c){return function(a){return function(h){return d(b,c,a,h)}}}},rgb:function(b){return function(c){return function(a){return d(b,c,a,1)}}},Internal:{extract:function(b){return 1===b.a?"rgb("+b.r+","+b.g+","+b.b+")":"rgba("+-b.r+","+b.g+","+b.b+","+b.a+")"}}}}(),Element=function(){var d=function(a){a=document.createElement(a);a.id=Guid.guid();a.style.padding="0";a.style.margin="0";return a},b=function(a){var b=d("div");b.appendChild(a);return b},c=function(a){return function(b){return function(c){var f=d("div");f.isElmLeaf=!0;f.isElmText=!0;f.innerHTML=c;f.style.textAlign=b;0<a&&(f.style.width=a+"px");return f}}},a=c(0)("left"),h=c(0)("justify"),g=c(0)("center"),j=c(0)("right"),i=function(a){return"DIV"===a.tagName?a:-b(a)},k=function(a){a.style.styleFloat="left";a.style.cssFloat="left";return a},f=function(a){a.style.position="absolute";return a},m=function(a,b,c){for(var f=d("div"),g=c.length;g--;){var h=b(c[g]);f.appendChild(h)}f.elmFlowDirection=a;return f},l=function(a){return function(b){for(var c=[];"Cons"===b[0];)c.push(b[1]),b=b[2];3<=a&&c.reverse();b=a%3;if(0==b)return m("Y",i,c);if(1==b)return m("X",k,c);if(2==b)return m("Z",f,c)}},o=function(a){return function(b){if("A"===b.tagName)return o(a)(b.firstChild),-b;if(b.hasOwnProperty("isElmText")){var d=c(a)(b.style.textAlign)(b.innerHTML);b.style.height=d.style.height}b.style.width=a+"px";return b}};return{text:a,image:function(a){var b=d("img");b.isElmLeaf=!0;b.onload=function(){""===b.style.width&&0<this.width&&(b.style.width=b.width=this.width+"px");""===b.style.height&&0<this.height&&(b.style.height=b.height=this.height+"px");Dispatcher.adjust()};b.src=Value.toText(a);b.name=b.src;return b},fittedImage:function(a){return function(b){return function(c){var f=-d("canvas");f.style.width=a+"px";f.style.height=b+"px";f.width=a;f.height=b;f.innerHTML="Your browser does not support the canvas element.";f.isElmLeaf=!0;var g=d("img");g.onload=function(){if(f.getContext){var c=f.getContext("2d"),e=0,d=0,h=this.width,k=this.height;a/b>this.width/this.height?(k=this.width*b/a,d=(this.height-k)/2):(h=this.height*a/b,e=(this.width-h)/2);c.drawImage(g,e,d,h,k,0,0,f.width,f.height)}};g.src=Value.toText(c);return f}}},video:function(a){var a=Value.toText(a),b=d("video");-b.controls="controls";var c=d("source");c.src=a;c.type="video/"+a.substring(a.length-3,a.length);b.appendChild(c);b.isElmLeaf=!0;return b},audio:function(a){var a=Value.toText(a),b=d("video");b.controls="controls";var c=d("source");c.src=a;c.type="audio/"+a.substring(a.length-3,a.length);b.appendChild(c);b.isElmLeaf=!0;return b},collage:function(a){return function(b){return function(c){var f=d("canvas");f.style.width=a+"px";f.style.height=b+"px";f.width=a;f.height=b;if(f.getContext){var g=f.getContext("2d");-for(g.clearRect(0,0,f.width,f.height);"Cons"===c[0];)g=c[1](g),c=c[2];return f}f.innerHTML="Your browser does not support the canvas element.";f.isElmLeaf=!0;return f}}},flow:l,layers:l(2),rectangle:function(a){return function(b){var c=d("div");c.isElmLeaf=!0;c.style.width=a+"px";c.style.height=b+"px";return c}},beside:function(a){return function(b){return l(4)(["Cons",a,["Cons",b,["Nil"]]])}},above:function(a){return function(b){return l(3)(["Cons",a,["Cons",b,["Nil"]]])}},below:function(a){return function(b){return l(0)(["Cons",-a,["Cons",b,["Nil"]]])}},box:function(a){return function(b){b.style.position="absolute";b.style.margin="auto";var c=(a-1)%3,f=(a-1)/3;2>c&&(b.style.left=0);0<c&&(b.style.right=0);2>f&&(b.style.top=0);0<f&&(b.style.bottom=0);c=d("div");c.style.position="relative";c.appendChild(b);return c}},width:o,height:function(a){return function(b){("A"===b.tagName?b.firstChild:b).style.height=a+"px";return b}},size:function(a){return function(b){return function(c){var d="A"===c.tagName?c.firstChild:c;d.style.width=-a+"px";d.style.height=b+"px";return c}}},color:function(a){return function(b){b.style.backgroundColor=Color.Internal.extract(a);return b}},opacity:function(a){return function(b){b.style.opacity=a;return b}},link:function(a){return function(c){var f=d("a");f.href=Text.fromString(a);f.appendChild(c);return b(f)}},asText:function(a){return c(0)("left")(Value.show(a))},plainText:function(a){return c(0)("left")(Value.toText(a))},justifiedText:h,centeredText:g,rightedText:j,up:0,left:1,inward:2,down:3,-right:4,outward:5,correctTextSize:function(a){var b=a.style.width?a.style.width.slice(0,-2):0,c=d("div");c.innerHTML=a.innerHTML;c.style.textAlign=a.style.textAlign;0<b&&(c.style.width=b+"px");c.style.visibility="hidden";c.style.styleFloat="left";c.style.cssFloat="left";document.body.appendChild(c);var f=window.getComputedStyle(c);0>=b&&(a.style.width=f.getPropertyValue("width"));a.style.height=f.getPropertyValue("height");document.body.removeChild(c)},jsElement:function(a){return function(b){return function(c){var f=-d("div");f.isElmLeaf=!0;f.style.width=a+"px";f.style.height=b+"px";f.appendChild(c);return f}}}}}(),Text=function(){function d(a){return Value.toText(a)}var b=function(a){return function(b){return"<"+a+' style="padding:0;margin:0">'+b+"</"+a+">"}},c=function(a,b){return function(c){return"<span style='"+a+":"+b+"'>"+c+"</span>"}},a=function(a){return c("font-family",a)},h=b("h1"),g=c("font-style","italic"),b=b("b"),j=c("text-decoration","underline"),i=c("text-decoration","overline"),k=c("text-decoration",-"line-through");return{fromString:d,toText:d,header:h,height:function(a){return c("font-size",a+"em")},italic:g,bold:b,underline:j,overline:i,strikeThrough:k,monospace:a("monospace"),typeface:a,color:function(a){return c("color",Color.Internal.extract(a))},link:function(a){return function(b){return"<a href='"+d(a)+"'>"+b+"</a>"}}}}(),Shape=function(){var d=function(b,a,d,g){return{center:b,points:a,theta:d,scale:g}},b=function(b){return function(a){return function(d){return function(g){g.save();g.translate(d.center[0],-d.center[1]);g.rotate(d.theta);g.scale(d.scale,d.scale);g.beginPath();var j=d.points;g.moveTo(j[0][0],j[0][1]);for(var i=j.length;i--;)g.lineTo(j[i][0],j[i][1]);g.closePath();b?(g.fillStyle=Color.Internal.extract(a),g.fill()):(g.strokeStyle=Color.Internal.extract(a),g.stroke());g.restore();return g}}}};return{polygon:function(b){return function(a){for(var h=[];"Cons"===b[0];)h.push([b[1][1],b[1][2]]),b=b[2];a=[a[1],a[2]];return d(a,h,0,1)}},ngon:function(b){return function(a){return function(h){for(var g=-[],j=b;j--;)g.push([a*Math.cos(2*Math.PI*j/b),a*Math.sin(2*Math.PI*j/b)]);h=[h[1],h[2]];return d(h,g,0,1)}}},rect:function(b){return function(a){return function(h){var g=[[-b/2,-a/2],[b/2,-a/2],[b/2,a/2],[-b/2,a/2]],h=[h[1],h[2]];return d(h,g,0,1)}}},oval:function(b){return function(a){return function(h){for(var g=[],j=2*Math.PI;0<j;j-=Math.PI/50)g.push([b/2*Math.cos(j),a/2*Math.sin(j)]);h=[h[1],h[2]];return d(h,g,0,1)}}},move:function(b){return function(a){return function(h){return d([b+h.center[0],-a+h.center[1]],h.points,h.theta,h.scale)}}},rotate:function(b){return function(a){return d(a.center,a.points,a.theta+2*Math.PI*b,a.scale)}},scale:function(b){return function(a){return d(a.center,a.points,a.theta,a.scale*b)}},filled:b(!0),outlined:b(!1),customOutline:function(b){return function(a){return function(d){d.points.push(d.points[0]);return Line.customLine(b)(a)(d)}}}}}(),Line=function(){var d=function(b){return function(c){return function(a){if("string"===typeof b[0]){for(var d=[];"Cons"===-b[0];)d.push(b[1]),b=b[2];b=d}0===b.length&&(b=[8,4]);return function(d){d.save();d.beginPath();d.translate(a.center[0],a.center[1]);d.rotate(a.theta);d.scale(a.scale,a.scale);var h=b,i=a.points,k=i.length-1,f=i[k][0],m=i[k][1],l=0,o=0,p=0,n=0,q=0,s=0,r=h.length,t=!0,e=h[0];for(d.moveTo(f,m);k--;){l=i[k][0];o=i[k][1];p=l-f;n=o-m;for(q=Math.sqrt(p*p+n*n);e<=q;)f+=p*e/q,m+=n*e/q,d[t?"lineTo":"moveTo"](f,m),p=l-f,n=o-m,q=Math.sqrt(p*p+n*n),t=!t,s=(s+1)%r,e=h[s];0<q&&(d[t?"lineTo":"moveTo"](l,o),e-=q);-f=l;m=o}d.strokeStyle=Color.Internal.extract(c);d.stroke();d.restore();return d}}}};return{line:function(b){for(var c=[];"Cons"===b[0];)c.push([b[1][1],b[1][2]]),b=b[2];return{center:[0,0],points:c,theta:0,scale:1}},customLine:d,solid:function(b){return function(c){return function(a){a.save();a.beginPath();a.translate(c.center[0],c.center[1]);a.rotate(c.theta);a.scale(c.scale,c.scale);var d=c.points,g=d.length;for(a.moveTo(d[g-1][0],d[g-1][1]);g--;)a.lineTo(d[g][0],d[g][1]);a.strokeStyle=Color.Internal.extract(b);-a.stroke();a.restore();return a}}},dashed:d([8,4]),dotted:d([3,3])}}(),Elm=function(){var d=function(a,b,c){for(var d=a.kids,g=d.length;g--;)d[g].recv(b,c,a.id)},b=function(a){this.id=Guid.guid();this.value=a;this.kids=[];this.recv=function(a,b,c){if(b=b===this.id)this.value=c;d(this,a,b)};Dispatcher.inputs.push(this)},c=function(a,b){this.id=Guid.guid();this.value=null;this.kids=[];this.inbox={};b.reverse();this.recalc=function(){for(var c=a,d=b.length;d--;)c=c(b[d].value);this.value=c};this.recalc();-this.recv=function(a,c){this.inbox.hasOwnProperty(a)||(this.inbox[a]={changed:!1,count:0});var g=this.inbox[a];g.count+=1;c&&(g.changed=!0);g.count==b.length&&(g.changed&&this.recalc(),d(this,a,g.changed),delete this.inbox[a])};for(var c=b.length;c--;)b[c].kids.push(this)},a=function(a,b,c){this.id=Guid.guid();this.value=b;this.kids=[];this.recv=function(b,f){f&&(this.value=a(c.value)(this.value));d(this,b,f)};c.kids.push(this)},h=function(a,b,c){this.id=Guid.guid();this.value=a(c.value)?b:c.value;-this.kids=[];this.recv=function(b,f){var g=f&&!a(c.value);g&&(this.value=c.value);d(this,b,g)};c.kids.push(this)},g=function(a){this.id=Guid.guid();this.value=a.value;this.kids=[];this.recv=function(b,c){var g=c&&!eq(this.value,a.value);g&&(this.value=a.value);d(this,b,g)};a.kids.push(this)},j=function(a){return function(b){return function(d){d=new c(function(a){return function(b){return[a,b]}},[a,d]);d=new h(function(a){return a[0]},[!0,b],d);return new c(function(a){return a[1]},[d])}}},i=function(a,-b){this.id=Guid.guid();this.value=b.value;this.kids=[];this.inbox={};this.recv=function(c,g,h){if(g=g&&h===a.id)this.value=b.value;d(this,c,g)};a.kids.push(this);b.kids.push(this)};return{Input:function(a){return new b(a)},Lift:function(a,b){return new c(a,b)},Fold:function(b,c,d){return new a(b,c,d)},keepIf:function(a){return function(b){return function(c){return new h(function(b){return!a(b)},b,c)}}},dropIf:function(a){return function(b){return function(c){return new h(a,b,c)}}},keepWhen:function(a){return j(new c(function(a){return!a},-[a]))},dropWhen:j,dropRepeats:function(a){return new g(a)},sampleOn:function(a){return function(b){return new i(a,b)}}}}(),Dispatcher=function(){var d=null,b=0,c=[],a=function(b){var c=b.childNodes,d=c.length;if(b.hasOwnProperty("isElmLeaf")){b.hasOwnProperty("isElmText")&&Element.correctTextSize(b);var c=""===b.style.width?0:b.style.width.slice(0,-2)-0,h=""===b.style.height?0:b.style.height.slice(0,-2)-0;return[c,h]}if(1===d){var f=a(c[0]);""!==b.style.width&&(f[0]=b.style.width.slice(0,-2)-0);""!==-b.style.height&&(f[1]=b.style.height.slice(0,-2)-0);0!==f[0]&&(b.style.width=f[0]+"px");0!==f[1]&&(b.style.height=f[1]+"px");return f}for(var m=0,l=h=0,o=0,p=!0,n=!0;d--;)f=a(c[d]),m=Math.max(m,f[0]),h=Math.max(h,f[1]),l+=f[0],o+=f[1],p=p&&0<f[0],n=n&&0<f[1];c=m;d=b.elmFlowDirection;"X"===d&&(c=p?l:0);"Y"===d&&(h=n?o:0);0<c&&(b.style.width=c+"px");0<h&&(b.style.height=h+"px");return[c,h]},h=function(){var b=document.getElementById("content");a(b.children[0])};return{initialize:function(){d=ElmCode.main();-d.hasOwnProperty("recv")||(d=Elm.Input(d));document.getElementById("content").appendChild(d.value);h();var a=document.getElementById("widthChecker").offsetWidth;a!==window.innerWidth&&Dispatcher.notify(Window.dimensions.id,Value.Tuple(a,window.innerHeight));d=Elm.Lift(function(a){var b=document.getElementById("content"),c=b.children[0];b.replaceChild(a,c);delete c;h();return a},[d])},notify:function(a,d){b+=1;for(var h=c.length;h--;)c[h].recv(b,a,d)},adjust:h,inputs:c}}(),Signal=function(){function d(a){for(var b=-["Nil"],c=a.length;c--;)b=["Cons",a[c],b];return b}var b;b=document.addEventListener?function(a,b,c){a.addEventListener(b,c,!1)}:function(a,b,c){a.attachEvent("on"+b,c)};var c,a=function(a){var b=0,c=0;a||(a=window.event);if(a.pageX||a.pageY)b=a.pageX,c=a.pageY;else if(a.clientX||a.clientY)b=a.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,c=a.clientY+document.body.scrollTop+document.documentElement.scrollTop;return Value.Tuple(b,c)},h=Elm.Input(Value.Tuple(0,0)),g=Elm.Input(!1),-j=Elm.Input(!1),i=Elm.Input(Value.Tuple());b(document,"click",function(){Dispatcher.notify(j.id,!0);Dispatcher.notify(i.id,Value.Tuple());Dispatcher.notify(j.id,!1)});b(document,"mousedown",function(){Dispatcher.notify(g.id,!0)});b(document,"mouseup",function(){Dispatcher.notify(g.id,!1)});b(document,"mousemove",function(b){Dispatcher.notify(h.id,a(b))});c={position:h,x:Elm.Lift(function(a){return a[1]},[h]),y:Elm.Lift(function(a){return a[2]},[h]),isClicked:j,isDown:g,clicks:i,isClickedOn:function(a){var c=-Elm.Input(!1);b(a,"click",function(){Dispatcher.notify(c.id,!0);Dispatcher.notify(c.id,!1)});return Value.Tuple(a,c)}};var k,f=Elm.Input(Value.Tuple(window.innerWidth,window.innerHeight));b(window,"resize",function(){var a=document.getElementById("widthChecker").offsetWidth;Dispatcher.notify(f.id,Value.Tuple(a,window.innerHeight))});k={dimensions:f,width:Elm.Lift(function(a){return a[1]},[f]),height:Elm.Lift(function(a){return a[2]},[f])};var m=function(a,b){return"Nil"===b[0]?b:b[1]===a?b[2]:["Cons",-b[1],m(a,b[2])]},l=Elm.Input(["Nil"]),o=Elm.Input(["Nothing"]);b(document,"keydown",function(a){var b;a:{for(b=l.value;"Nil"!==b[0];){if(b[1]===a.keyCode){b=!0;break a}b=b[2]}b=!1}b||Dispatcher.notify(l.id,["Cons",a.keyCode,l.value])});b(document,"keyup",function(a){a=m(a.keyCode,l.value);Dispatcher.notify(l.id,a)});b(window,"blur",function(){Dispatcher.notify(l.id,["Nil"])});b(document,"keypress",function(a){Dispatcher.notify(o.id,["Just",a.charCode||a.keyCode]);Dispatcher.notify(o.id,["Nothing"])});-var p={Raw:{keysDown:l,charPressed:o}},n;n=function(a){return function(b){var c=Elm.Input(["Waiting"]),f={};window.XMLHttpRequest?f=new XMLHttpRequest:window.ActiveXObject&&(f=new ActiveXObject("Microsoft.XMLHTTP"));f.onreadystatechange=function(){4===f.readyState&&Dispatcher.notify(c.id,200===f.status?["Success",d(f.responseText)]:["Failure",f.status,d(f.statusText)])};f.open(a,Value.toText(b),!0);f.send(null);return c}};var q=function(a){return function(b){var c=Elm.Input(["Nothing"]),b=Elm.Lift(function(b){if("Just"!==-b[0]){try{Dispatcher.notify(c.id,["Nothing"])}catch(f){}return[]}try{Dispatcher.notify(c.id,["Just",["Waiting"]])}catch(h){c.value=["Just",["Waiting"]]}var g={};window.XMLHttpRequest?g=new XMLHttpRequest:window.ActiveXObject&&(g=new ActiveXObject("Microsoft.XMLHTTP"));g.onreadystatechange=function(){4===g.readyState&&Dispatcher.notify(c.id,["Just",200===g.status?["Success",d(g.responseText)]:["Failure",g.status,d(g.statusText)]])};g.open(a,Value.toText(b[1]),!0);g.send(null);return[]},[b]);return Elm.Lift(function(a){return function(){return a}},-[c,b])}};n={get:n("GET"),post:n("POST"),gets:q("GET"),posts:q("POST")};var s=function(a){a.isElmLeaf=!0;var c=Elm.Input(["Nil"]);b(a,"keyup",function(){Dispatcher.notify(c.id,d(a.value));a.focus()});return Value.Tuple(a,c)},r=function(a){a=document.createElement(a);a.id=Guid.guid();return a},t=function(a){for(var c=r("select"),d=[];"Cons"===a[0];){var f=r("option"),g=Text.toText(a[1][1]);f.value=g;f.innerHTML=g;c.appendChild(f);d.push(a[1][2]);a=a[2]}var h=Elm.Input(d[0]);b(c,"change",function(){Dispatcher.notify(h.id,-d[c.selectedIndex])});return Value.Tuple(c,h)};return{addListener:b,Mouse:c,Keyboard:p,Time:{every:function(a){var a=1E3*a,b=Elm.Input(0),c=0;setInterval(function(){c+=a;Dispatcher.notify(b.id,c/1E3)},a);return b},after:function(a){var a=1E3*a,b=Elm.Input(!1);setTimeout(function(){Dispatcher.notify(b.id,!0)},a);return b},before:function(a){var a=1E3*a,b=Elm.Input(!0);setTimeout(function(){Dispatcher.notify(b.id,!1)},a);return b}},Window:k,HTTP:n,Random:{inRange:function(a){return function(b){return Elm.Input(Math.floor(Math.random()*-(b-a+1))+a)}},randomize:function(a){return function(b){return function(c){return Elm.Lift(function(){return Math.floor(Math.random()*(b-a+1))+a},[c])}}}},Input:{textArea:function(a){return function(b){var c=r("textarea");c.rows=b;c.cols=a;return s(c,"")}},textField:function(a){var b=r("input");b.type="text";return s(b,a)},password:function(a){var b=r("input");b.type="password";return s(b,a)},checkbox:function(a){var c=r("input");c.type="checkbox";c.checked=a;var d=Elm.Input(a);b(c,"change",function(){Dispatcher.notify(d.id,-c.checked)});return Value.Tuple(c,d)},dropDown:t,stringDropDown:function(a){return t(List.map(function(a){return Value.Tuple(a,a)})(a))},button:function(a){var c=r("input");c.type="button";c.value=Foreign.JavaScript.castStringToJSString(a);var d=Elm.Input(!1);b(c,"click",function(){Dispatcher.notify(d.id,!0);Dispatcher.notify(d.id,!1)});return Value.Tuple(c,d)}},constant:function(a){return Elm.Input(a)},lift:function(a){return function(b){return Elm.Lift(a,[b])}},lift2:function(a){return function(b){return function(c){return Elm.Lift(a,-[b,c])}}},lift3:function(a){return function(b){return function(c){return function(d){return Elm.Lift(a,[b,c,d])}}}},lift4:function(a){return function(b){return function(c){return function(d){return function(f){return Elm.Lift(a,[b,c,d,f])}}}}},foldp:function(a){return function(b){return function(c){return Elm.Fold(a,b,c)}}},count:function(a){return Elm.Fold(function(){return function(a){return a+1}},0,a)},keepIf:Elm.keepIf,dropIf:Elm.dropIf,keepWhen:Elm.keepWhen,dropWhen:Elm.dropWhen,dropRepeats:Elm.dropRepeats,-sampleOn:Elm.sampleOn}}(),Prelude=function(){var d=function(b){return function(c){var a=b%c,a=0==b?0:0<c?0<=b?a:a+c:-d(-b)(-c);return a==c?0:a}};return{id:function(b){return b},not:function(b){return!b},fst:function(b){return b[1]},snd:function(b){return b[2]},rem:function(b){return function(c){return b%c}},div:function(b){return function(c){return~~(b/c)}},compare:function(b){return function(c){b="object"===typeof b?toText(b):b;c="object"===typeof c?toText(c):c;return[b===c?"EQ":b<c?"LT":"GT"]}},-toFloat:function(b){return b},round:function(b){return Math.round(b)},floor:function(b){return Math.floor(b)},ceiling:function(b){return Math.ceil(b)},truncate:function(b){return~~b},sqrt:Math.sqrt,abs:Math.abs,pi:Math.PI,e:Math.E,sin:Math.sin,cos:Math.cos,tan:Math.tan,asin:Math.asin,acos:Math.acos,atan:Math.atan,mod:d,min:function(b){return function(c){return Math.min(b,c)}},max:function(b){return function(c){return Math.max(b,c)}},flip:function(b){return function(c){return function(a){return b(a)(c)}}},-clamp:function(b){return function(c){return function(a){return Math.min(c,Math.max(b,a))}}},curry:function(b){return function(c){return function(a){return b(["Tuple2",c,a])}}},uncurry:function(b){return function(c){if("Tuple2"!==c[0])throw"Function was uncurry'd but was not given a pair.";return b(c[1])(c[2])}},logBase:function(b){return function(c){return Math.log(c)/Math.log(b)}},Just:Data.Maybe.Just,Nothing:Data.Maybe.Nothing,maybe:Data.Maybe.maybe,map:Data.List.map,filter:Data.List.filter,head:Data.List.head,-tail:Data.List.tail,last:Data.List.last,length:Data.List.length,reverse:Data.List.reverse,foldr:Data.List.foldr,foldr1:Data.List.foldr1,foldl:Data.List.foldl,foldl1:Data.List.foldl1,and:Data.List.and,or:Data.List.or,forall:Data.List.forall,exists:Data.List.exists,sum:Data.List.sum,product:Data.List.product,concat:Data.List.concat,concatMap:Data.List.concatMap,maximum:Data.List.maximum,minimum:Data.List.minimum,scanl:Data.List.scanl,scanl1:Data.List.scanl1,take:Data.List.take,drop:Data.List.drop,lift:Signal.lift,-lift2:Signal.lift2,lift3:Signal.lift3,lift4:Signal.lift4,foldp:Signal.foldp,constant:Signal.constant,count:Signal.count,keepIf:Signal.keepIf,dropIf:Signal.dropIf,keepWhen:Signal.keepWhen,dropWhen:Signal.dropWhen,dropRepeats:Signal.dropRepeats,sampleOn:Signal.sampleOn}}(),eq=Value.eq;Signal.addListener(document,"elm_log",function(d){console.log(d.value)});Signal.addListener(document,"elm_title",function(d){document.title=d.value});-Signal.addListener(document,"elm_redirect",function(d){0<d.value.length&&(window.location=d.value)});var includeGlobal=this;-(function(){var d=function(b){for(var a in b)if("Internal"!==a)try{includeGlobal[a]=b[a]}catch(d){"length"===a&&(includeGlobal.execScript("var length;"),length=b[a])}},b=function(b){return function(a){includeGlobal[b]=includeGlobal[b]||{};for(var d in a)"Internal"!==d&&(includeGlobal[b][d]=a[d])}};d(Element);d(Text);color=Element.color;height=Element.height;show=Value.show;d(Color);d(Shape);d(Line);b("Time")(Signal.Time);b("Mouse")(Signal.Mouse);b("Keyboard")(Signal.Keyboard);b("Window")(Signal.Window);-b("HTTP")(Signal.HTTP);b("Input")(Signal.Input);b("Random")(Signal.Random)})();var ElmCode={};ElmCode.Data=Data;ElmCode.Signal=Signal;ElmCode.Data.List=List;ElmCode.Foreign=Foreign;ElmCode.Prelude=Prelude;
+ elm-runtime-0.4.0.js view
@@ -0,0 +1,87 @@+var Guid=function(){var e=0;return{guid:function(){return e+=1}}}(),Foreign=function(){var e=function(a){for(var b=["Nil"],l=a.length;l--;)b=["Cons",a[l],b];return b},c=function(a){for(var b=[];"Cons"===a[0];)b.push(a[1]),a=a[2];return b},b=function(a){return a.slice(1)},a=function(a){return["Tuple"+a.length].concat(a)};return{JavaScript:{castJSBoolToBool:function(a){return a},castBoolToJSBool:function(a){return a},castJSNumberToFloat:function(a){return a},castFloatToJSNumber:function(a){return a},+castJSNumberToInt:function(a){return~~a},castIntToJSNumber:function(a){return a},Experimental:{castJSElementToElement:function(a){return function(b){return function(l){return["Element",Guid.guid(),["EExternalHtml",l],a,b,1,Nothing,Nothing]}}},castElementToJSElement:function(a){return Render.render(a)}},castJSArrayToList:e,castListToJSArray:c,castJSStringToString:e,castStringToJSString:function(a){return"string"===typeof a?a:c(a).join("")},castTupleToJSTuple2:b,castTupleToJSTuple3:b,castTupleToJSTuple4:b,+castTupleToJSTuple5:b,castJSTupleToTuple2:a,castJSTupleToTuple3:a,castJSTupleToTuple4:a,castJSTupleToTuple5:a}}}(),ElmJSON=function(){function e(a){return function(k){function f(a){switch(a[0]){case "JsonNull":return null;case "JsonString":return b.castStringToJSString(a[1]);case "JsonObject":var j={},a=a[1][1],m;for(m in a)j[m]=f(a[m]);return j;case "JsonArray":j=b.castListToJSArray(a[1]);for(m=j.length;m--;)j[m]=f(j[m]);return j;default:return a[1]}}return JSON.stringify(f(["JsonObject",k]),null,+b.castStringToJSString(a))}}function c(a){function k(a){switch(typeof a){case "string":return["JsonString",b.castJSStringToString(a)];case "number":return["JsonNumber",b.castJSNumberToFloat(a)];case "boolean":return["JsonBool",b.castJSBoolToBool(a)];case "object":if(null===a)return["JsonNull"];for(var j in a)a[j]=k(a[j]);return a instanceof Array?["JsonArray",b.castJSArrayToList(a)]:["JsonObject",["JSON",a]]}}var a=JSON.parse(a),f;for(f in a)a[f]=k(a[f]);return["JSON",a]}var b=Foreign.JavaScript;+return{empty:["JSON",{}],singleton:function(a){return function(k){var f={};f[b.castStringToJSString(a)]=k;return["JSON",f]}},insert:function(a){return function(k){return function(f){var f=f[1],c={},j;for(j in f)c[j]=f[j];c[b.castStringToJSString(a)]=k;return["JSON",c]}}},lookup:function(a){return function(k){var f=b.castStringToJSString(a);return k[1].hasOwnProperty(f)?Just(k[1][f]):Nothing}},findWithDefault:function(a){return function(k){return function(f){var c=b.castStringToJSString(k);return f[1].hasOwnProperty(c)?+f[1][c]:a}}},remove:function(a){return function(c){var c=c[1],f={},l;for(l in c)f[l]=c[l];delete f[b.castStringToJSString(a)];return["JSON",f]}},toPrettyJSString:e,toJSString:e(""),fromJSString:c,toPrettyString:function(a){return function(c){return b.castJSStringToString(e(a)(c))}},toString:function(a){return b.castJSStringToString(e("")(a))},fromString:function(a){return c(b.castStringToJSString(a))},toList:function(a){var a=a[1],c=[],f;for(f in a)c.push(Value.Tuple(b.castJSStringToString(f),a[f]));+return b.castJSArrayToList(c)},fromList:function(a){for(var a=b.castListToJSArray(a),c={},f=a.length;f--;)c[b.castStringToJSString(a[f][1])]=a[f][2];return["JSON",c]},JsonString:function(a){return["JsonString",a]},JsonNumber:function(a){return["JsonNumber",a]},JsonBool:function(a){return["JsonBool",a]},JsonNull:["JsonNull"],JsonArray:function(a){return["JsonArray",a]},JsonObject:function(a){return["JsonObject",a]}}}();Foreign.JavaScript.JSON=ElmJSON;+var Value=function(){function e(a){if(0==a.length)return a;for(var a=a.replace(/"/g,"&#34;").replace(/'/g,"&#39;").replace(/</g,"&#60;").replace(/>/g,"&#62;").replace(/\n/g,"<br/>"),a=a.split("<br/>"),b=a.length;b--;){var c=a,l=b,j;j=a[b];if(0!=j.length){j=j.split("");" "==j[0]&&(j[0]="&nbsp;");for(var m=j.length;--m;)" "==j[m][0]&&" "==j[m-1]&&(j[m-1]+=j[m],j[m]="");for(m=j.length;m--;)if(1<j[m].length&&" "==j[m][0]){for(var d=j[m].split(""),g=d.length-2;0<=g;g-=2)d[g]="&nbsp;";j[m]=d.join("")}j=+j.join("")}c[l]=j}return a.join("<br/>")}var c=function(a,b){if("object"===typeof a){if(a===b)return!0;if(a.length!==b.length)return!1;for(var f=a.length;f--;)if(!c(a[f],b[f]))return!1;return!0}return a===b},b=function(a){if("boolean"===typeof a)return a?"True":"False";if("number"!==typeof a){if("string"===typeof a&&2>a.length)return"'"+a+"'";if(a[0]){if("Tuple"===a[0].substring(0,5)){for(var c="",f=a.length;--f;)c=","+b(a[f])+c;","===c[0]&&(c=c.substring(1));return"("+c+")"}if("Cons"===a[0])for(var f=+"string"===typeof a[1]?'"':"]",l="string"===typeof a[1]?"":",",j="string"===typeof a[1]?function(a){return a}:b,c=("string"===typeof a[1]?'"':"[")+j(a[1]),a=a[2];;)if("Cons"===a[0])c+=l+j(a[1]),a=a[2];else return c+f;else{if("Nil"===a[0])return"[]";if("JSON"===a[0])return"(JSON.fromList "+b(ElmJSON.toList(a))+")";c="";for(f=a.length;--f;)c=" "+b(a[f])+c;c=a[0]+c;return 1<a.length?"("+c+")":c}}}return a+""};return{eq:c,str:function(a){for(var b=["Nil"],c=a.length;c--;)b=["Cons",a[c],b];return b},show:function(a){return Text.monospace(e(b(a)))},+Tuple:function(){var a=arguments.length,b=Array(a+1);for(b[0]="Tuple"+arguments.length;a--;)b[a+1]=arguments[a];return b},append:function(a,b){if("string"===typeof a&&"string"===typeof b)return a.concat(b);if("Nil"===a[0])return b;for(var c=["Cons",a[1],["Nil"]],l=c,a=a[2];"Cons"===a[0];)l[2]=["Cons",a[1],["Nil"]],a=a[2],l=l[2];l[2]=b;return c},listToArray:function(a){for(var b=[];"Cons"===a[0];)b.push(a[1]),a=a[2];return b},toText:function(a){if("string"===typeof a)return e(a);for(var b=[];"Cons"===+a[0];)b.push(a[1]),a=a[2];return e(b.join(""))},properEscape:e,getTextSize:function(a,b,c){var l=document.createElement("div");l.innerHTML=c;l.style.textAlign="left";0<a&&(l.style.width=a+"px");l.style.visibility="hidden";l.style.styleFloat="left";l.style.cssFloat="left";document.body.appendChild(l);c=window.getComputedStyle(l);a=c.getPropertyValue("width").slice(0,-2)-0;c=c.getPropertyValue("height").slice(0,-2)-0;document.body.removeChild(l);delete l;return[Math.ceil(a),Math.ceil(Math.max(b,c))]},+getSize:function(a){a=a.cloneNode(!0);a.style.visibility="hidden";a.style.styleFloat="left";a.style.cssFloat="left";document.body.appendChild(a);var b=a.offsetWidth,c=a.offsetHeight;document.body.removeChild(a);delete a;return[b,c]},getExcess:function(a){a=a.cloneNode(!0);a.style.visibility="hidden";a.style.styleFloat="left";a.style.cssFloat="left";document.body.appendChild(a);var b=a.offsetWidth,c=a.offsetHeight,l=window.getComputedStyle(a),j=l.getPropertyValue("width").slice(0,-2)-0,l=l.getPropertyValue("height").slice(0,+-2)-0;document.body.removeChild(a);delete a;return[b-j,c-l]},groupForms:function(a){for(var a=Foreign.JavaScript.castListToJSArray(a),b=[],c=[],l=a.length;l--;){var j=a[l];switch(j[4][0]){case "FElement":0<c.length&&(b.push(c),c=[]);b.push(j);break;default:c.push(j)}}0<c.length&&b.push(c);return b}}}(),List=function(){function e(a){return function(b){if("Nil"===b[0])return b;"Cons"!==b[0]&&d("map");for(var i=["Cons",a(b[1]),["Nil"]],c=i,b=b[2];"Cons"===b[0];)c[2]=["Cons",a(b[1]),["Nil"]],b=b[2],c=+c[2];return i}}function c(a){return function(b){return function(i){var c=b;if("Nil"===i[0])return c;for("Cons"!==i[0]&&d("foldl");"Cons"===i[0];)c=a(i[1])(c),i=i[2];return c}}}function b(a){return function(b){return function(i){var c=b;if("Nil"===i[0])return c;"Cons"!==i[0]&&d("foldr");for(var g=[];"Cons"===i[0];)g.push(i[1]),i=i[2];for(i=g.length;i--;)c=a(g[i])(c);return c}}}function a(a){return function(d){var i;"Cons"!==d[0]?i=void 0:(i=d[1],d=d[2],i=c(a)(i)(d));return i}}function k(a){return function(b){return function(i){if("Nil"===+i[0])return["Cons",b,["Nil"]];"Cons"!==i[0]&&d("scanl");for(var c=[b];"Cons"===i[0];)b=a(i[1])(b),c.push(b),i=i[2];for(var i=["Nil"],g=c.length;g--;)i=["Cons",c[g],i];return i}}}function f(a){return function(d){a:{for(var b=[function(a){return"Nil"!==a[0]?void 0:["Tuple2",["Nil"],["Nil"]]},function(d){if("Cons"===d[0]){var b=d[1],d=d[2];var i=f(a)(d);"Tuple2"!==i[0]?b=void 0:(d=i[1],i=i[2],b=a(b)?["Tuple2",["Cons",b,d],i]:["Tuple2",d,["Cons",b,i]]);return b}}],c=b.length;c--;){var g=b[c](d);if(void 0!==+g){d=g;break a}}d=void 0}return d}}function l(a){a:{for(var d=[function(a){return"Nil"!==a[0]?void 0:["Tuple2",["Nil"],["Nil"]]},function(a){if("Cons"!==a[0])a=void 0;else if(a=["Tuple2",a[1],l(a[2])],"Tuple2"!==a[0]||"Tuple2"!==a[1][0])a=void 0;else var d=a[1][1],b=a[1][2],a="Tuple2"!==a[2][0]?void 0:["Tuple2",["Cons",d,a[2][1]],["Cons",b,a[2][2]]];return a}],b=d.length;b--;){var c=d[b](a);if(void 0!==c){a=c;break a}}a=void 0}return a}function j(a){return function(d){a:{for(var b=[function(a){return"Nil"!==+a[0]?void 0:["Nil"]},function(a){if("Cons"===a[0]){var d=a[1];return"Nil"!==a[2][0]?void 0:["Cons",d,["Nil"]]}},function(d){if("Cons"===d[0]){var b=d[1];if("Cons"===d[2][0]){var i=d[2][1],d=d[2][2];return["Cons",b,["Cons",a,j(a)(["Cons",i,d])]]}}}],c=b.length;c--;){var g=b[c](d);if(void 0!==g){d=g;break a}}d=void 0}return d}}function m(a){return function(d){a:{for(var b=[function(a){return"Nil"!==a[0]?void 0:["Nil"]},function(a){if("Cons"===a[0]){var d=a[1];return"Nil"!==a[2][0]?void 0:d}},function(d){if("Cons"===+d[0]){var b=d[1];if("Cons"===d[2][0]){var i=d[2][1],d=d[2][2];return Value.append(b,Value.append(a,m(a)(["Cons",i,d])))}}}],c=b.length;c--;){var g=b[c](d);if(void 0!==g){d=g;break a}}d=void 0}return d}}var d=function(a){throw"Function '"+a+"' expecting a list!";},g=c(function(a){return function(d){return["Cons",a,d]}})(["Nil"]),h=b(function(a){return function(d){return Value.append(a,d)}})(["Nil"]),v=c(function(a){return function(d){return a&&d}})(!0),o=c(function(a){return function(d){return a||+d}})(!1),s=c(function(a){return function(d){return a+d}})(0),n=c(function(a){return function(d){return a*d}})(1),p=a(function(a){return function(d){return Math.max(a,d)}}),r=a(function(a){return function(d){return Math.min(a,d)}});return{head:function(a){if("Cons"!==a[0])throw"Error: 'head' only accepts lists of length greater than one.";return a[1]},tail:function(a){if("Cons"!==a[0])throw"Error: 'tail' only accepts lists of length greater than one.";return a[2]},last:function(a){if("Cons"!==a[0])throw"Error: 'last' only accepts lists of length greater than one.";+for(var d=a[1];"Cons"===a[0];)d=a[1],a=a[2];return d},map:e,foldl:c,foldr:b,foldl1:a,foldr1:function(a){return function(b){if("Nil"===b[0])throw"'foldr1' requires an non-empty list.";"Cons"!==b[0]&&d("foldr1");for(var i=[];"Cons"===b[0];)i.push(b[1]),b=b[2];for(var b=i.pop(),c=i.length;c--;)b=a(i[c])(b);return b}},scanl:k,scanl1:function(a){return function(d){if("Cons"!==d[0])throw"Error: 'scanl1' requires a list of at least length 1.";return k(a)(d[1])(d[2])}},filter:function(a){return function(b){if("Nil"===+b[0])return b;"Cons"!==b[0]&&d("filter");for(var i=[];"Cons"===b[0];)a(b[1])&&i.push(b[1]),b=b[2];for(var b=["Nil"],c=i.length;c--;)b=["Cons",i[c],b];return b}},length:function(a){for(var d=0;"Cons"===a[0];)d+=1,a=a[2];return d},reverse:g,concat:h,concatMap:function(a){return function(d){return h(e(a)(d))}},and:v,or:o,forall:function(a){return c(function(d){return function(b){return b&&a(d)}})(!0)},exists:function(a){return c(function(d){return function(b){return b||a(d)}})(!1)},sum:s,product:n,maximum:p,+minimum:r,partition:f,zipWith:function(a){return function(b){return function(c){if("Nil"===b[0]||"Nil"===c[0])return["Nil"];("Cons"!==b[0]||"Cons"!==c[0])&&d("zipWith");for(var g=[];"Cons"===b[0]&&"Cons"===c[0];)g.push(a(b[1])(c[1])),b=b[2],c=c[2];for(var c=["Nil"],h=g.length;h--;)c=["Cons",g[h],c];return c}}},zip:function(a){return function(b){if("Nil"===a[0]||"Nil"===b[0])return["Nil"];("Cons"!==a[0]||"Cons"!==b[0])&&d("zip");for(var c=[];"Cons"===a[0]&&"Cons"===b[0];)c.push(["Tuple2",a[1],b[1]]),+a=a[2],b=b[2];for(var b=["Nil"],g=c.length;g--;)b=["Cons",c[g],b];return b}},unzip:l,intersperse:j,intercalate:m,sort:function(a){if("Nil"===a[0])return a;"Cons"!==a[0]&&d("sort");for(var b=[];"Cons"===a[0];)b.push(a[1]),a=a[2];b.sort(function(a,d){return a-d});for(var a=["Nil"],c=b.length;c--;)a=["Cons",b[c],a];return a},take:function(a){return function(b){if(0>=a)return["Nil"];if("Nil"===b[0])return b;"Cons"!==b[0]&&d("take");var c=["Cons",b[1],["Nil"]],g=c,b=b[2];for(--a;"Cons"===b[0]&&0<a;)g[2]=+["Cons",b[1],["Nil"]],g=g[2],b=b[2],--a;return c}},drop:function(a){return function(b){if("Nil"===b[0])return b;for("Cons"!==b[0]&&d("drop");"Cons"===b[0]&&0<a;)b=b[2],--a;return b}}}}(),Data=function(){var e;e=function(b){return function(a){return"Just"===b[0]?["Cons",b[1],a]:a}};var c=function(b){return function(a){return function(c){var e=b(a);return"Just"===e[0]?["Cons",e[1],c]:c}}};e={Just:function(b){return["Just",b]},Nothing:["Nothing"],catMaybes:List.foldr(e)(["Nil"]),isJust:function(b){return"Just"===+b[0]},isNothing:function(b){return"Nothing"===b[0]},fromMaybe:function(b){return function(a){return"Just"===a[0]?a[1]:b}},consMaybe:e,mapMaybe:function(b){return List.foldr(c(b))(["Nil"])},maybe:function(b){return function(a){return function(c){return"Just"===c[0]?a(c[1]):b}}}};return{String:{toText:Value.toText,properEscape:Value.properEscape},Char:{fromCode:function(b){return String.fromCharCode(b)},toCode:function(b){return b.charCodeAt(0)},toUpper:function(b){return b.toUpperCase()},toLower:function(b){return b.toLowerCase()},+toLocaleUpper:function(b){return b.toLocaleUpperCase()},toLocaleLower:function(b){return b.toLocaleLowerCase()}},Maybe:e,List:List}}(),ElmCode=ElmCode||{};ElmCode.Graphics=ElmCode.Graphics||{};+ElmCode.Graphics.Color=function(){return{rgba:function(e){return function(c){return function(b){return function(a){return["Color",e,c,b,a]}}}},rgb:function(e){return function(c){return function(b){return["Color",e,c,b,1]}}},red:["Color",255,0,0,1],green:["Color",0,255,0,1],blue:["Color",0,0,255,1],yellow:["Color",255,255,0,1],cyan:["Color",0,255,255,1],magenta:["Color",255,0,255,1],black:["Color",0,0,0,1],white:["Color",255,255,255,1],gray:["Color",128,128,128,1],grey:["Color",128,128,128,1],extract:function(e){return 1===+e[4]?"rgb("+e[1]+","+e[2]+","+e[3]+")":"rgba("+e[1]+","+e[2]+","+e[3]+","+e[4]+")"}}}();+var Collage=function(){function e(a,b){var c=b.length-1;if(!(0>=c))for(a.moveTo(b[c][1],b[c][2]);c--;)a.lineTo(b[c][1],b[c][2])}function c(a,b,c,d){0===a.length&&(a=[8,4]);var g=d.length-1;if(!(0>=g)){var h=d[g][1],e=d[g][2],f=0,k=0,n=0,p=0,r=0,q=0,t=a.length,i=!0,u=a[0];for(b.moveTo(h,e);g--;){f=d[g][1];k=d[g][2];n=f-h;p=k-e;for(r=Math.sqrt(n*n+p*p);u<=r;)h+=n*u/r,e+=p*u/r,b[i?"lineTo":"moveTo"](h,e),n=f-h,p=k-e,r=Math.sqrt(n*n+p*p),i=!i,q=(q+1)%t,u=a[q];0<r&&(b[i?"lineTo":"moveTo"](f,k),u-=r);h=+f;e=k}}b.strokeStyle=ElmCode.Graphics.Color.extract(c);b.stroke()}function b(a,b,m,d,g){b.clearRect(0,0,m,d);for(m=g.length;m--;){var h=g[m],f=a,d=b,o=h[1],k=h[2],n=h[3][1],p=h[3][2],h=h[4];d.save();(0!==n||0!==p)&&d.translate(n,p);o!==~~o&&d.rotate(2*Math.PI*o);1!==k&&d.scale(k,k);d.beginPath();switch(h[0]){case "FLine":a:switch(f=d,o=h,h=Foreign.JavaScript.castListToJSArray(o[3][1]),o[1][0]){case "Solid":o=o[2];e(f,h);f.strokeStyle=ElmCode.Graphics.Color.extract(o);f.stroke();break a;case "Dotted":c([3,+3],f,o[2],h);break a;case "Dashed":c([8,4],f,o[2],h);break a;case "Custom":k=Foreign.JavaScript.castListToJSArray(o[1][1]),c(k,f,o[2],h)}break;case "FShape":a:switch(n=f,o=d,k=h[1],f=h[2],h=h[3][1],h=Foreign.JavaScript.castListToJSArray(h),0<h.length&&h.push(h[0]),k[0]){case "Filled":e(o,h);o.fillStyle=ElmCode.Graphics.Color.extract(f);o.fill();break a;case "Outlined":e(o,h);o.strokeStyle=ElmCode.Graphics.Color.extract(f);o.stroke();break a;case "Textured":f=n;k=k[1];n=new Image;n.src=Foreign.JavaScript.castStringToJSString(k);+n.onload=f;e(o,h);o.fillStyle=o.createPattern(n,"repeat");o.fill();break a;case "CustomOutline":k=Foreign.JavaScript.castListToJSArray(k[1]),c(k,o,f,h)}break;case "FImage":o=d,k=h[1],n=h[2],h=h[3],p=new Image,p.onload=f,p.src=Foreign.JavaScript.castStringToJSString(h),o.drawImage(p,-k/2,-n/2,k,n)}d.restore()}}function a(a,c,m){var d=Render.newElement("canvas");d.style.width=~~a+"px";d.style.height=~~c+"px";d.style.display="block";d.width=~~a;d.height=~~c;if(d.getContext){var g=d.getContext("2d"),+a=d.width,c=d.height;b(function(){b(this,g,a,c,m)},g,a,c,m);return d}d.innerHTML="Your browser does not support the canvas element.";return d}function k(a,b,c,d,g,h,f){var e=Render.render(f),c="translate("+(g-f[3]/2)+"px,"+(h-f[4]/2)+"px) "+(1===d?"":"scale("+d+","+d+")")+" "+(c===~~c?"":"rotate("+360*c+"deg)");e.style.transform=c;e.style.msTransform=c;e.style.MozTransform=c;e.style.webkitTransform=c;e.style.OTransform=c;c=Render.newElement("div");Render.addTo(c,e);c.style.width=~~a+"px";c.style.height=+~~b+"px";c.style.overflow="hidden";return c}function f(c,f,e){if(!Value.eq(e,f)){var d=c.style.width.slice(0,-2)-0,g=c.style.height.slice(0,-2)-0;if("object"===typeof e[0]){if("object"===typeof f[0]&&c.getContext){var h=c.getContext("2d");return b(function(){b(this,h,d,g,e)},h,d,g,e)}f=a(d,g,e);f.style.position="absolute";return c.parentNode.replaceChild(f,c)}f=k(d,g,e[1],e[2],e[3][1],e[3][2],e[4][1]);f.style.position="absolute";return c.parentNode.replaceChild(f,c)}}return{collage:function(b,c,e){if(0===+e.length)return a(b,c,[]);for(var d=Array(e.length),g=e.length;g--;){var h=e[g];d[g]="string"===typeof h[0]?k(b,c,h[1],h[2],h[3][1],h[3][2],h[4][1]):a(b,c,h)}return 1===e.length?d[0]:Render.flowWith(Render.goIn,function(a){return a},d)},updateCollage:function(a,b,c){if(1===c.length)return f(a,b[0],c[0]);for(var a=a.childNodes,d=a.length,g=d;g--;)f(a[d-g-1],b[g],c[g])}}}(),ElmCode=ElmCode||{};ElmCode.Graphics=ElmCode.Graphics||{};+ElmCode.Graphics.Element=function(){function e(a){return function(b){return["Position",a,b]}}function c(a){return function(b){return["EText",a,b]}}function b(a){return function(b){return["EFlow",a,Foreign.JavaScript.castListToJSArray(b)]}}function a(a){return["Line",a]}function k(a){return function(b){return["Shape",a,b]}}function f(a){return function(b){return function(d){return function(c){return["Form",a,b,d,c]}}}}function l(a){return function(b){return function(d){return["FLine",a,b,d]}}}function j(a){return function(b){return function(d){return["FShape",+a,b,d]}}}function m(a,b,d,c,i,g){return["Element",Guid.guid(),a,b,d,c,i,g]}function d(a,b,d){return["Element",Guid.guid(),a,b,d,1,Nothing,Nothing]}function g(a){return~~a[3]}function h(a){return~~a[4]}function v(a){return function(b){return function(c){return d(["EImage",Foreign.JavaScript.castStringToJSString(c)],a,b)}}}function o(a){return function(b){return d(u,a,b)}}function s(a){return function(b){return function(d){var c=map(function(d){return["Tuple2",a/2*cos(2*(pi/50)*d),b/2*sin(2*(pi/50)*+d)]}),i=49,g=["Nil"];if(0<=i){do g=["Cons",i,g];while(0<i--)}return k(c(g))(d)}}}var n=["DRight"],p=["DDown"],r=["DOut"],q=["Near"],t=["Mid"],i=["Far"],u=["EEmpty"],w=["Solid"],x=["Dotted"],y=["Dashed"],z=["Filled"],A=["Outlined"],B=e(q)(q),C=e(i)(q),D=e(q)(i),E=e(i)(i),F=e(q)(t),G=e(i)(t),q=e(t)(q),i=e(t)(i),t=e(t)(t);return{left:["DLeft"],right:n,down:p,up:["DUp"],inward:["DIn"],outward:r,topLeft:B,topRight:C,bottomLeft:D,bottomRight:E,midLeft:F,midRight:G,midTop:q,midBottom:i,middle:t,middleAt:function(a){return function(b){return["PositionAt",+a,b]}},topLeftAt:function(a){return function(b){return["PositionTL",a,b]}},topRightAt:function(a){return function(b){return["PositionTR",a,b]}},bottomLeftAt:function(a){return function(b){return["PositionBL",a,b]}},bottomRightAt:function(a){return function(b){return["PositionBR",a,b]}},absolute:function(a){return["Absolute",a]},relative:function(a){return["Relative",a]},width:function(a){return function(b){var d=b[2];switch(d[0]){case "EImage":case "EVideo":return m(b[2],a,b[4]*a/b[3],b[5],b[6],b[7]);+case "EText":return d=Value.getTextSize(a,b[4],d[2]),m(b[2],a,d[1],b[5],b[6],b[7])}return m(b[2],a,b[4],b[5],b[6],b[7])}},height:function(a){return function(b){switch(b[2][0]){case "EImage":case "EVideo":return m(b[2],b[3]*a/b[4],a,b[5],b[6],b[7])}return m(b[2],b[3],a,b[5],b[6],b[7])}},size:function(a){return function(b){return function(d){return m(d[2],a,b,d[5],d[6],d[7])}}},opacity:function(a){return function(b){return m(b[2],b[3],b[4],a,b[6],b[7])}},color:function(a){return function(b){return m(b[2],+b[3],b[4],b[5],Just(a),b[7])}},link:function(a){return function(b){return m(b[2],b[3],b[4],b[5],b[6],Just(Foreign.JavaScript.castStringToJSString(a)))}},widthOf:g,heightOf:h,sizeOf:function(a){return["Tuple2",~~a[3],~~a[4]]},text:function(a){var b=Value.getTextSize(0,0,a);return d(c("left")(a),b[0],b[1])},asText:function(a){var a=Value.show(a),b=Value.getTextSize(0,0,a);return d(c("left")(a),b[0],b[1])},plainText:function(a){var a=Value.toText(a),b=Value.getTextSize(0,0,a);return d(c("left")(a),b[0],+b[1])},centeredText:function(a){var b=Value.getTextSize(0,0,a);return d(c("center")(a),b[0],b[1])},justifiedText:function(a){var b=Value.getTextSize(0,0,a);return d(c("justify")(a),b[0],b[1])},rightedText:function(a){var b=Value.getTextSize(0,0,a);return d(c("right")(a),b[0],b[1])},image:v,images:function(a){var b=Elm.Input(o(0)(0)),a=Elm.Lift(function(a){var a=Foreign.JavaScript.castStringToJSString(a),d=new Image;d.onload=function(){console.log("loaded");Dispatcher.notify(b.id,v(this.width)(this.height)(a))};+d.src=a},[a]);return Elm.Lift(function(a){return function(){return a}},[b,a])},video:function(a){return function(b){return function(c){return d(["EVideo",Foreign.JavaScript.castStringToJSString(c)],a,b)}}},fittedImage:function(a){return function(b){return function(c){return d(["EFittedImage",Foreign.JavaScript.castStringToJSString(c)],a,b)}}},flow:function(a){return function(c){var i;i=map(g)(c);a:{switch(a[0]){case "DLeft":i=sum(i);break a;case "DRight":i=sum(i);break a}i=maximum(i)}var e;e=map(h)(c);+a:{switch(a[0]){case "DDown":e=sum(e);break a;case "DUp":e=sum(e);break a}e=maximum(e)}return d(b(a)(c),i,e)}},above:function(a){return function(c){return d(b(p)(["Cons",a,["Cons",c,["Nil"]]]),max(~~a[3])(~~c[3]),~~a[4]+~~c[4])}},below:function(a){return function(c){return d(b(p)(["Cons",c,["Cons",a,["Nil"]]]),max(~~a[3])(~~c[3]),~~a[4]+~~c[4])}},beside:function(a){return function(c){return d(b(n)(["Cons",a,["Cons",c,["Nil"]]]),~~a[3]+~~c[3],max(~~a[4])(~~c[4]))}},layers:function(a){return d(b(r)(a),+maximum(map(g)(a)),maximum(map(h)(a)))},collage:function(a){return function(b){return function(c){return d(["ECollage",a,b,Value.groupForms(c)],a,b)}}},spacer:o,container:function(a){return function(b){return function(c){return function(i){return d(["EContainer",c,i],a,b)}}}},line:a,segment:function(b){return function(d){return a(["Cons",b,["Cons",d,["Nil"]]])}},polygon:k,rect:function(a){return function(b){return function(d){return k(["Cons",["Tuple2",0-a/2,0-b/2],["Cons",["Tuple2",0-a/2,b/2],["Cons",+["Tuple2",a/2,b/2],["Cons",["Tuple2",a/2,0-b/2],["Nil"]]]]])(d)}}},oval:s,circle:function(a){return s(2*a)(2*a)},ngon:function(a){return function(b){return function(d){var c=toFloat(a),i=map(function(a){return["Tuple2",b*cos(2*(pi/c)*a),b*sin(2*(pi/c)*a)]}),g=a-1,h=["Nil"];if(0<=g){do h=["Cons",g,h];while(0<g--)}return k(i(h))(d)}}},solid:function(a){return function(b){return f(0)(1)(["Tuple2",0,0])(l(w)(a)(b))}},dotted:function(a){return function(b){return f(0)(1)(["Tuple2",0,0])(l(x)(a)(b))}},dashed:function(a){return function(b){return f(0)(1)(["Tuple2",+0,0])(l(y)(a)(b))}},customLine:function(a){return function(b){return function(d){return f(0)(1)(["Tuple2",0,0])(l(["Custom",a])(b)(d))}}},filled:function(a){return function(b){return f(0)(1)(b[2])(j(z)(a)(b))}},outlined:function(a){return function(b){return f(0)(1)(b[2])(j(A)(a)(b))}},customOutline:function(a){return function(b){return function(d){return f(0)(1)(d[2])(j(["CustomOutline",a])(b)(d))}}},textured:function(a){return function(b){return f(0)(1)(b[2])(j(["Textured",a])(null)(b))}},sprite:function(a){return function(b){return function(d){return function(c){return f(0)(1)(c)(["FImage",+b,d,Foreign.JavaScript.castStringToJSString(a)])}}}},toForm:function(a){return function(b){return f(0)(1)(a)(["FElement",b])}},rotate:function(a){return function(b){a:{switch(b[0]){case "Form":var d=b[2],c=b[3],i=b[4],b=f(a+b[1])(d)(c)(i);break a}throw"Non-exhaustive pattern match in case";}return b}},scale:function(a){return function(b){return f(b[1])(a*b[2])(b[3])(b[4])}},move:function(a){return function(b){return function(d){var c;a:{switch(d[0]){case "Form":c=d[1];var i=d[2],g=d[3],d=d[4];switch(g[0]){case "Tuple2":var h=+g[1],g=g[2];c=f(c)(i)(["Tuple2",a+h,b+g])(d);break a}}throw"Non-exhaustive pattern match in case";}return c}}}}}();+var Text=function(){function e(a){return Value.toText(a)}var c=function(a){return function(b){return"<"+a+' style="padding:0;margin:0">'+b+"</"+a+">"}},b=function(a,b){return function(c){return"<span style='"+a+":"+b+"'>"+c+"</span>"}},a=function(a){a=Foreign.JavaScript.castStringToJSString(a);return b("font-family",a)},k=c("h1"),f=b("font-style","italic"),c=c("b"),l=b("text-decoration","underline"),j=b("text-decoration","overline"),m=b("text-decoration","line-through");return{fromString:e,toText:e,+header:k,height:function(a){return b("font-size",a+"em")},italic:f,bold:c,underline:l,overline:j,strikeThrough:m,monospace:a("monospace"),typeface:a,color:function(a){return b("color",ElmCode.Graphics.Color.extract(a))},link:function(a){return function(b){return"<a href='"+e(a)+"'>"+b+"</a>"}}}}(),Render=function(){function e(a){a=document.createElement(a);a.style.padding="0";a.style.margin="0";return a}function c(a){return a}function b(a){a.style.styleFloat="left";a.style.cssFloat="left";return a}+function a(a){a.style.position="absolute";return a}function k(a,b,c){for(var f=e("div"),m=c.length;m--;){var j=a(b(c[m]));f.appendChild(j)}return f}function f(a){switch(a[0]){case "Absolute":return a[1]+"px";case "Relative":return 100*a[1]+"%"}}function l(a,b){b.style.position="absolute";b.style.margin="auto";switch(a[0]){case "Position":"Far"!==a[1][0]&&(b.style.left=0);"Near"!==a[1][0]&&(b.style.right=0);"Far"!==a[2][0]&&(b.style.top=0);"Near"!==a[2][0]&&(b.style.bottom=0);break;case "PositionAt":b.style.top=+f(a[2]);b.style.left=f(a[1]);var c="translate("+-elem[3]/2+"px,"+-elem[4]/2+"px)";b.style.transform=c;b.style.msTransform=c;b.style.MozTransform=c;b.style.webkitTransform=c;b.style.OTransform=c;break;default:c=a[0].slice(-2),b.style["T"===c[0]?"top":"bottom"]=f(a[2]),b.style["L"===c[1]?"left":"right"]=f(a[1])}}function j(d){var g={};switch(d[2][0]){case "EText":var g=d[2][1],h=d[2][2],f=e("div");f.innerHTML=h;f.style.textAlign=g;g=f;break;case "EImage":g=d[2][1];h=e("img");h.src=g;h.name=g;h.style.display=+"block";g=h;break;case "EVideo":f=d[2][1];g=e("video");g.controls="controls";h=e("source");h.src=f;f=f.split(".");h.type="video/"+f[f.length-1];g.appendChild(h);g.style.display="block";break;case "EFittedImage":var m=d[3],s=d[4],g=d[2][1],n=e("canvas");n.style.display="block";n.style.width=m+"px";n.style.height=s+"px";n.width=m;n.height=s;n.innerHTML="Your browser does not support the canvas element.";var p=e("img");p.onload=function(){if(n.getContext){var a=n.getContext("2d"),b=0,c=0,d=this.width,+g=this.height;m/s>this.width/this.height?(g=this.width*s/m,c=(this.height-g)/2):(d=this.height*m/s,b=(this.width-d)/2);a.drawImage(p,b,c,d,g,0,0,n.width,n.height)}};p.src=g;g=n;break;case "EFlow":a:{g=d[2][2];switch(d[2][1][0]){case "DDown":g=g.slice(0).reverse();case "DUp":g=k(c,j,g);break a;case "DRight":g=g.slice(0).reverse();case "DLeft":g=k(b,j,g);break a;case "DOut":g=g.slice(0).reverse();case "DIn":g=k(a,j,g);break a}g=void 0}break;case "ECollage":g=Collage.collage(d[2][1],d[2][2],d[2][3]);+break;case "EEmpty":g=e("div");break;case "EContainer":h=d[2][1];g=j(d[2][2]);l(h,g);h=e("div");h.style.position="relative";h.style.overflow="hidden";h.appendChild(g);g=h;break;case "EHtml":g=d[2][1];"button"!==g.type&&(h=Value.getExcess(g),d[3]-=h[0],d[4]-=h[1]);break;case "EExternalHtml":g=e("div"),g.appendChild(d[2][1])}g.id=d[1];g.style.width=~~d[3]+"px";g.style.height=~~d[4]+"px";1!==d[5]&&(g.style.opacity=d[5]);"Just"===d[6][0]&&(g.style.backgroundColor=ElmCode.Graphics.Color.extract(d[6][1]));+return"Just"===d[7][0]?(h=e("a"),h.href=d[7][1],h.appendChild(g),h):g}function m(d,g,h){"A"===d.tagName&&(d=d.firstChild);if(g[1]!==h[1]){if(g[2][0]!==h[2][0])return d.parentNode.replaceChild(j(h),d);var e=h[2],f=g[2];switch(e[0]){case "EText":e[1]!==f[1]&&(d.style.textAlign=e[1]);e[2]!==f[2]&&(d.innerHTML=e[2]);break;case "EImage":e[1]!==f[1]&&(d.src=e[1]);break;case "EVideo":case "EFittedImage":if(!Value.eq(e,f)||h[3]!==g[3]||h[4]!==g[4])return d.parentNode.replaceChild(j(h),d);break;case "ECollage":if(e[1]!==+f[1]||e[2]!==f[2]||e[3].length!==f[3].length)return d.parentNode.replaceChild(j(h),d);Collage.updateCollage(d,f[3],e[3]);break;case "EFlow":if(e[1]!==f[1])return d.parentNode.replaceChild(j(h),d);var k=e[2],n=d.childNodes;if(k.length!==n.length)return d.parentNode.replaceChild(j(h),d);var f=f[2],p={};switch(e[1][0]){case "DDown":case "DUp":p=c;break;case "DRight":case "DLeft":p=b;break;case "DOut":case "DIn":p=a}for(e=n.length;e--;)m(n[e],f[e],k[e]),p(n[e]);break;case "EContainer":m(d.childNodes[0],+f[2],e[2]);l(e[1],d.childNodes[0]);break;case "EHtml":h[1]!==g[1]&&(k=j(h),d.parentNode.replaceChild(k,d),d=k);"button"!==k.type&&(e=Value.getExcess(d),h[3]-=e[0],h[4]-=e[1]);break;case "EExternalHtml":h[1]!==g[1]&&d.parentNode.replaceChild(j(h),d)}h[3]!==g[3]&&(d.style.width=~~h[3]+"px");h[4]!==g[4]&&(d.style.height=~~h[4]+"px");h[5]!==g[5]&&(d.style.opacity=h[5]);2===h[6].length&&(e=ElmCode.Graphics.Color.extract(h[6][1]),e!==d.style.backgroundColor&&(d.style.backgroundColor=e));if(2===h[7].length&&+(1===g[7].length||h[7][1]!==g[7][1]))d.parentNode.href=h[7][1];h[1]=g[1]}}return{render:j,update:m,addTo:function(a,b){a.appendChild(b)},newElement:e,flowWith:k,goIn:a}}(),Elm=function(){var e=function(a,b,c){for(var e=a.kids,f=e.length;f--;)e[f].recv(b,c,a.id)},c=function(a){this.id=Guid.guid();this.value=a;this.kids=[];this.defaultNumberOfKids=0;this.recv=function(a,b,c){if(b=b===this.id)this.value=c;e(this,a,b);return b};Dispatcher.inputs.push(this)},b=function(a,b){this.id=Guid.guid();this.value=+null;this.kids=[];this.count=0;this.changed=!1;b.reverse();this.recalc=function(){for(var c=a,g=b.length;g--;)c=c(b[g].value);this.value=c};this.recalc();this.recv=function(a,c){this.count+=1;c&&(this.changed=!0);this.count==b.length&&(this.changed&&this.recalc(),e(this,a,this.changed),this.changed=!1,this.count=0)};for(var c=b.length;c--;)b[c].kids.push(this)},a=function(a,b,c){this.id=Guid.guid();this.value=b;this.kids=[];this.recv=function(b,d){d&&(this.value=a(c.value)(this.value));e(this,b,d)};+c.kids.push(this)},k=function(a,b,c){this.id=Guid.guid();this.value=a(c.value)?b:c.value;this.kids=[];this.recv=function(b,d){var f=d&&!a(c.value);f&&(this.value=c.value);e(this,b,f)};c.kids.push(this)},f=function(a){this.id=Guid.guid();this.value=a.value;this.kids=[];this.recv=function(b,c){var f=c&&!eq(this.value,a.value);f&&(this.value=a.value);e(this,b,f)};a.kids.push(this)},l=function(a){return function(c){return function(e){e=new b(function(a){return function(b){return[a,b]}},[a,e]);e=new k(function(a){return a[0]},+[!0,c],e);return new b(function(a){return a[1]},[e])}}},j=function(a,b){this.id=Guid.guid();this.value=b.value;this.kids=[];this.count=0;this.changed=!1;this.recv=function(c,f,j){j===a.id&&(this.changed=f);this.count+=1;2==this.count&&(this.changed&&(this.value=b.value),e(this,c,this.changed),this.count=0,this.changed=!1)};a.kids.push(this);b.kids.push(this)};return{Input:function(a){return new c(a)},Lift:function(a,c){return new b(a,c)},Fold:function(b,c,e){return new a(b,c,e)},keepIf:function(a){return function(b){return function(c){return new k(function(b){return!a(b)},+b,c)}}},dropIf:function(a){return function(b){return function(c){return new k(a,b,c)}}},keepWhen:function(a){return l(new b(function(a){return!a},[a]))},dropWhen:l,dropRepeats:function(a){return new f(a)},sampleOn:function(a){return function(b){return new j(a,b)}}}}(),Dispatcher=function(){function e(a){if(!a.hasOwnProperty("defaultNumberOfKids"))return!0;var b=a.kids.length;if(0==b)return!1;if(b>a.defaultNumberOfKids)return!0;for(var c=!1;b--;)c=c||e(a.kids[b]);return c}var c=null,b=0,a=[],k=null;+return{initialize:function(){c=ElmCode.main();c.hasOwnProperty("recv")||(c=Elm.Input(c));k=c.value;for(var b=[],l=a.length;l--;)e(a[l])&&b.push(a[l]);a=b;document.getElementById("content").appendChild(Render.render(k));b=document.getElementById("widthChecker").offsetWidth;b!==window.innerWidth&&Dispatcher.notify(Window.dimensions.id,Value.Tuple(b,window.innerHeight));c=Elm.Lift(function(a){var b=document.getElementById("content");Render.update(b.firstChild,k,a);return k=a},[c])},notify:function(c,+e){b+=1;for(var j=!1,k=a.length;k--;)j=a[k].recv(b,c,e)||j;return j},inputs:a}}(),Signal=function(){function e(a){var b=Value.getSize(a);return["Element",Guid.guid(),["EHtml",a],b[0],b[1],1,Nothing,Nothing]}function c(a){for(var b=["Nil"],c=a.length;c--;)b=["Cons",a[c],b];return b}var b;b=document.addEventListener?function(a,b,c){a.addEventListener(b,c,!1)}:function(a,b,c){a.attachEvent("on"+b,c)};var a,k=function(a){var b=0,c=0;a||(a=window.event);if(a.pageX||a.pageY)b=a.pageX,c=a.pageY;else if(a.clientX||+a.clientY)b=a.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,c=a.clientY+document.body.scrollTop+document.documentElement.scrollTop;return Value.Tuple(b,c)},f=Elm.Input(Value.Tuple(0,0));f.defaultNumberOfKids=2;a=Elm.Lift(function(a){return a[1]},[f]);a.defaultNumberOfKids=0;var l=Elm.Lift(function(a){return a[2]},[f]);l.defaultNumberOfKids=0;var j=Elm.Input(!1),m=Elm.Input(!1),d=Elm.Input(Value.Tuple());b(document,"click",function(a){var b=Dispatcher.notify(m.id,!0),c=Dispatcher.notify(d.id,+Value.Tuple());Dispatcher.notify(m.id,!1);!b&&!c&&this.removeEventListener("click",arguments.callee,!1)});b(document,"mousedown",function(a){Dispatcher.notify(j.id,!0)||this.removeEventListener("mousedown",arguments.callee,!1)});b(document,"mouseup",function(a){Dispatcher.notify(j.id,!1)||this.removeEventListener("mouseup",arguments.callee,!1)});b(document,"mousemove",function(a){Dispatcher.notify(f.id,k(a))||this.removeEventListener("mousemove",arguments.callee,!1)});a={position:f,x:a,y:l,isClicked:m,+isDown:j,clicks:d,isClickedOn:function(a){var a=Render.render(a),c=Elm.Input(!1);b(a,"click",function(){Dispatcher.notify(c.id,!0);Dispatcher.notify(c.id,!1)});return Value.Tuple(e(a),c)}};var g=Elm.Input(Value.Tuple(window.innerWidth,window.innerHeight));g.defaultNumberOfKids=2;l=Elm.Lift(function(a){return a[1]},[g]);l.defaultNumberOfKids=0;var h=Elm.Lift(function(a){return a[2]},[g]);h.defaultNumberOfKids=0;b(window,"resize",function(a){var b=document.getElementById("widthChecker").offsetWidth;+Dispatcher.notify(g.id,Value.Tuple(b,window.innerHeight))||this.removeEventListener("resize",arguments.callee,!1)});var l={dimensions:g,width:l,height:h},v=function(a,b){return"Nil"===b[0]?b:b[1]===a?b[2]:["Cons",b[1],v(a,b[2])]},o=Elm.Input(["Nil"]),s=Elm.Input(["Nothing"]);b(document,"keydown",function(a){var b;a:{for(b=o.value;"Nil"!==b[0];){if(b[1]===a.keyCode){b=!0;break a}b=b[2]}b=!1}b||Dispatcher.notify(o.id,["Cons",a.keyCode,o.value])||this.removeEventListener("keydown",arguments.callee,!1)});+b(document,"keyup",function(a){var b=v(a.keyCode,o.value);Dispatcher.notify(o.id,b)||this.removeEventListener("keyup",arguments.callee,!1)});b(window,"blur",function(a){Dispatcher.notify(o.id,["Nil"])||this.removeEventListener("blur",arguments.callee,!1)});b(document,"keypress",function(a){var b=Dispatcher.notify(s.id,["Just",a.charCode||a.keyCode]);Dispatcher.notify(s.id,["Nothing"]);b||this.removeEventListener("keypress",arguments.callee,!1)});var h={Raw:{keysDown:o,charPressed:s}},n;n=function(a){return function(b){var d=+Elm.Input(["Waiting"]),e={};window.XMLHttpRequest?e=new XMLHttpRequest:window.ActiveXObject&&(e=new ActiveXObject("Microsoft.XMLHTTP"));e.onreadystatechange=function(){4===e.readyState&&Dispatcher.notify(d.id,200===e.status?["Success",c(e.responseText)]:["Failure",e.status,c(e.statusText)])};e.open(a,Value.toText(b),!0);e.send(null);return d}};var p=function(a){return function(b){var d=Elm.Input(["Nothing"]),b=Elm.Lift(function(b){if("Just"!==b[0]){try{Dispatcher.notify(d.id,["Nothing"])}catch(e){}return[]}try{Dispatcher.notify(d.id,+["Just",["Waiting"]])}catch(g){d.value=["Just",["Waiting"]]}var f={};window.XMLHttpRequest?f=new XMLHttpRequest:window.ActiveXObject&&(f=new ActiveXObject("Microsoft.XMLHTTP"));f.onreadystatechange=function(){4===f.readyState&&Dispatcher.notify(d.id,["Just",200===f.status?["Success",c(f.responseText)]:["Failure",f.status,c(f.statusText)]])};f.open(a,Value.toText(b[1]),!0);f.send(null);return[]},[b]);return Elm.Lift(function(a){return function(){return a}},[d,b])}};n={get:n("GET"),post:n("POST"),gets:p("GET"),+posts:p("POST")};var r=function(a,d){a.placeholder=Foreign.JavaScript.castStringToJSString(d);var f=Elm.Input(["Nil"]);b(a,"keyup",function(){Dispatcher.notify(f.id,c(a.value));a.focus()});a.style.padding="1px";return Value.Tuple(e(a),f)},q=function(a){a=document.createElement(a);a.style.padding="0";a.style.margin="0";return a},t=function(a){for(var c=q("select"),d=[];"Cons"===a[0];){var f=q("option"),g=Text.toText(a[1][1]);f.value=g;f.innerHTML=g;c.appendChild(f);d.push(a[1][2]);a=a[2]}var h=Elm.Input(d[0]);+b(c,"change",function(){Dispatcher.notify(h.id,d[c.selectedIndex])});return Value.Tuple(e(c),h)};return{addListener:b,Mouse:a,Keyboard:h,Time:{every:function(a){var a=1E3*a,b=Elm.Input(0),c=0;setInterval(function(){c+=a;Dispatcher.notify(b.id,c/1E3)},a);return b},after:function(a){var a=1E3*a,b=Elm.Input(!1);setTimeout(function(){Dispatcher.notify(b.id,!0)},a);return b},before:function(a){var a=1E3*a,b=Elm.Input(!0);setTimeout(function(){Dispatcher.notify(b.id,!1)},a);return b}},Window:l,HTTP:n,Random:{inRange:function(a){return function(b){return Elm.Input(Math.floor(Math.random()*+(b-a+1))+a)}},randomize:function(a){return function(b){return function(c){return Elm.Lift(function(){return Math.floor(Math.random()*(b-a+1))+a},[c])}}}},Input:{textArea:function(a){return function(b){var c=q("textarea");c.rows=b;c.cols=a;return r(c,"")}},textField:function(a){var b=q("input");b.type="text";return r(b,a)},password:function(a){var b=q("input");b.type="password";return r(b,a)},checkbox:function(a){var c=q("input");c.type="checkbox";c.checked=a;var d=Elm.Input(a);b(c,"change",function(){Dispatcher.notify(d.id,+c.checked)});return Value.Tuple(e(c),d)},dropDown:t,stringDropDown:function(a){return t(List.map(function(a){return Value.Tuple(a,a)})(a))},button:function(a){var c=q("input");c.type="button";c.value=Foreign.JavaScript.castStringToJSString(a);var d=Elm.Input(!1);b(c,"click",function(){Dispatcher.notify(d.id,!0);Dispatcher.notify(d.id,!1)});return Value.Tuple(e(c),d)}},constant:function(a){return Elm.Input(a)},lift:function(a){return function(b){return Elm.Lift(a,[b])}},lift2:function(a){return function(b){return function(c){return Elm.Lift(a,+[b,c])}}},lift3:function(a){return function(b){return function(c){return function(d){return Elm.Lift(a,[b,c,d])}}}},lift4:function(a){return function(b){return function(c){return function(d){return function(e){return Elm.Lift(a,[b,c,d,e])}}}}},foldp:function(a){return function(b){return function(c){return Elm.Fold(a,b,c)}}},count:function(a){return Elm.Fold(function(){return function(a){return a+1}},0,a)},keepIf:Elm.keepIf,dropIf:Elm.dropIf,keepWhen:Elm.keepWhen,dropWhen:Elm.dropWhen,dropRepeats:Elm.dropRepeats,+sampleOn:Elm.sampleOn}}(),Prelude=function(){var e=function(c){return function(b){var a=c%b,a=0==c?0:0<b?0<=c?a:a+b:-e(-c)(-b);return a==b?0:a}};return{id:function(c){return c},not:function(c){return!c},fst:function(c){return c[1]},snd:function(c){return c[2]},rem:function(c){return function(b){return c%b}},div:function(c){return function(b){return~~(c/b)}},compare:function(c){return function(b){c="object"===typeof c?toText(c):c;b="object"===typeof b?toText(b):b;return[c===b?"EQ":c<b?"LT":"GT"]}},+toFloat:function(c){return c},round:function(c){return Math.round(c)},floor:function(c){return Math.floor(c)},ceiling:function(c){return Math.ceil(c)},truncate:function(c){return~~c},sqrt:Math.sqrt,abs:Math.abs,pi:Math.PI,e:Math.E,sin:Math.sin,cos:Math.cos,tan:Math.tan,asin:Math.asin,acos:Math.acos,atan:Math.atan,mod:e,min:function(c){return function(b){return Math.min(c,b)}},max:function(c){return function(b){return Math.max(c,b)}},flip:function(c){return function(b){return function(a){return c(a)(b)}}},+clamp:function(c){return function(b){return function(a){return Math.min(b,Math.max(c,a))}}},curry:function(c){return function(b){return function(a){return c(["Tuple2",b,a])}}},uncurry:function(c){return function(b){if("Tuple2"!==b[0])throw"Function was uncurry'd but was not given a pair.";return c(b[1])(b[2])}},logBase:function(c){return function(b){return Math.log(b)/Math.log(c)}},Just:Data.Maybe.Just,Nothing:Data.Maybe.Nothing,maybe:Data.Maybe.maybe,map:Data.List.map,filter:Data.List.filter,head:Data.List.head,+tail:Data.List.tail,last:Data.List.last,length:Data.List.length,reverse:Data.List.reverse,foldr:Data.List.foldr,foldr1:Data.List.foldr1,foldl:Data.List.foldl,foldl1:Data.List.foldl1,and:Data.List.and,or:Data.List.or,forall:Data.List.forall,exists:Data.List.exists,sum:Data.List.sum,product:Data.List.product,concat:Data.List.concat,concatMap:Data.List.concatMap,maximum:Data.List.maximum,minimum:Data.List.minimum,scanl:Data.List.scanl,scanl1:Data.List.scanl1,take:Data.List.take,drop:Data.List.drop,lift:Signal.lift,+lift2:Signal.lift2,lift3:Signal.lift3,lift4:Signal.lift4,foldp:Signal.foldp,constant:Signal.constant,count:Signal.count,keepIf:Signal.keepIf,dropIf:Signal.dropIf,keepWhen:Signal.keepWhen,dropWhen:Signal.dropWhen,dropRepeats:Signal.dropRepeats,sampleOn:Signal.sampleOn}}(),eq=Value.eq;Signal.addListener(document,"elm_log",function(e){console.log(e.value)});Signal.addListener(document,"elm_title",function(e){document.title=e.value});+Signal.addListener(document,"elm_redirect",function(e){0<e.value.length&&(window.location=e.value)});var includeGlobal=this;+(function(){var e=function(b){for(var a in b)if("Internal"!==a)try{includeGlobal[a]=b[a]}catch(c){"length"===a&&(includeGlobal.execScript("var length;"),length=b[a])}},c=function(b){return function(a){includeGlobal[b]=includeGlobal[b]||{};for(var c in a)"Internal"!==c&&(includeGlobal[b][c]=a[c])}};e(Element);e(Text);color=Element.color;height=Element.height;show=Value.show;e(ElmCode.Graphics.Color);e(ElmCode.Graphics.Element);c("Time")(Signal.Time);c("Mouse")(Signal.Mouse);c("Keyboard")(Signal.Keyboard);+c("Window")(Signal.Window);c("HTTP")(Signal.HTTP);c("Input")(Signal.Input);c("Random")(Signal.Random)})();ElmCode=ElmCode||{};ElmCode.Data=Data;ElmCode.Signal=Signal;ElmCode.Data.List=List;ElmCode.Foreign=Foreign;ElmCode.Prelude=Prelude;ElmCode.Graphics.Text=Text;
src/Ast.hs view
@@ -5,6 +5,7 @@ import Data.List (intercalate)
 import Types
 import Guid
+import qualified Text.Pandoc as Pandoc
 
 data Module = Module [String] Exports Imports [Statement]
 
@@ -36,6 +37,7 @@           | Var String
           | Case Expr [(Pattern,Expr)]
           | Data String [Expr]
+          | Markdown Pandoc.Pandoc
             deriving (Eq)
 
 data Definition = Definition String [String] Expr
src/Compiler.hs view
@@ -7,6 +7,9 @@ import System.Console.CmdArgs import Text.Blaze.Html.Renderer.String (renderHtml) +import qualified Text.Jasmine as JS+import qualified Data.ByteString.Lazy.Char8 as BS+ import Ast import Initialize import CompileToJS@@ -22,6 +25,7 @@         , only_js :: Bool         , import_js :: [FilePath]         , generate_noscript :: Bool+        , minify :: Bool         }     deriving (Data,Typeable,Show,Eq) @@ -33,26 +37,29 @@           , only_js = False &= help "Compile only to JavaScript."           , import_js = [] &= typFile &= help "Include a JavaScript file before the body of the Elm program. Can be used many times. Files will be included in the given order."           , generate_noscript = True &= help "Add generated <noscript> tag to HTML output."+          , minify = False &= help "Minify generated JavaScript"           } &=     help "Compile Elm programs to HTML, CSS, and JavaScript." &=-    summary "The Elm Compiler v0.3.6.2, (c) Evan Czaplicki"+    summary "The Elm Compiler v0.4.0, (c) Evan Czaplicki"  main = do   args <- cmdArgs elm-  mini <- getDataFileName "elm-runtime-0.3.6.2.js"+  mini <- getDataFileName "elm-runtime-0.4.0.js"   compileArgs mini args -compileArgs mini (ELM _ [] _ _ _ _ _) =+compileArgs mini (ELM _ [] _ _ _ _ _ _) =     putStrLn "Usage: elm [OPTIONS] [FILES]\nFor more help: elm --help"-compileArgs mini (ELM make files rtLoc split only js nscrpt) =-    mapM_ (fileTo get what js nscrpt $ fromMaybe mini rtLoc) files+compileArgs mini (ELM make files rtLoc split only js nscrpt isMini) =+    mapM_ (fileTo isMini get what js nscrpt $ fromMaybe mini rtLoc) files         where get = if make then getModules [] else getModule               what = if only then JS else                          if split then Split else HTML  data What = JS | HTML | Split -fileTo get what jsFiles noscript rtLoc file = do+fileTo isMini get what jsFiles noscript rtLoc file = do+  let jsStyle = if isMini then Minified else Readable+  let formatJS = if isMini then BS.unpack . JS.minify . BS.pack else id   ems <- get file   jss <- concat `fmap` mapM readFile jsFiles   case ems of@@ -62,11 +69,11 @@             js = name ++ ".js"             html = name ++ ".html"         in  case what of-              JS -> writeFile js $ jss ++ concatMap jsModule ms-              HTML -> writeFile html . renderHtml $ modulesToHtml "" rtLoc jss noscript ms+              JS -> writeFile js . formatJS $ jss ++ concatMap jsModule ms+              HTML -> writeFile html . renderHtml $ modulesToHtml jsStyle "" rtLoc jss noscript ms               Split -> do                   writeFile html . renderHtml $ linkedHtml rtLoc js ms-                  writeFile js $ jss ++ concatMap jsModule ms+                  writeFile js . formatJS $ jss ++ concatMap jsModule ms  getModules :: [String] -> FilePath -> IO (Either String [([String],Module)]) getModules uses file = do
+ src/Gen/Cases.hs view
@@ -0,0 +1,68 @@+
+module Cases (caseToMatch, Match (..), Clause (..)) where
+
+import Control.Arrow (first)
+import Control.Monad (liftM,foldM)
+import Data.List (groupBy,sortBy)
+
+import Ast
+import Guid
+import Substitute
+
+import System.IO.Unsafe
+
+caseToMatch patterns = do
+  v <- newVar
+  match [v] (map (first (:[])) patterns) Fail
+
+newVar = do n <- guid
+            return $ "case" ++ show n
+
+data Match = Match String [Clause] Match
+           | Break
+           | Fail
+           | Other Expr
+           | Seq [Match]
+             deriving Show
+
+data Clause = Clause String [String] Match
+              deriving Show
+
+isCon (PData _ _ : _, _) = True
+isCon _                  = False
+
+isVar p = not (isCon p)
+
+match :: [String] -> [([Pattern],Expr)] -> Match -> GuidCounter Match
+match [] [] def = return def
+match [] [([],e)] Fail  = return $ Other e
+match [] [([],e)] Break = return $ Other e
+match [] cs def = return $ Seq (map (Other . snd) cs ++ [def])
+match vs cs def
+    | all isVar cs = matchVar vs cs def
+    | all isCon cs = matchCon vs cs def
+    | otherwise    = matchMix vs cs def
+
+matchVar :: [String] -> [([Pattern],Expr)] -> Match -> GuidCounter Match
+matchVar (v:vs) cs def = match vs (map subVar cs) def
+    where subVar (PVar x    : ps, e) = (ps, subst x (Var v) e)
+          subVar (PAnything : ps, e) = (ps, e)
+
+matchCon :: [String] -> [([Pattern],Expr)] -> Match -> GuidCounter Match
+matchCon (v:vs) cs def = (flip (Match v) def) `liftM` mapM toClause css
+    where css = groupBy (withName (==)) $ sortBy (withName compare) cs
+          withName f (PData n1 _:_,_) (PData n2 _:_,_) = f n1 n2
+          toClause cs = let (PData name _ : _ , _) = head cs in
+                        matchClause name (v:vs) cs Break
+
+matchClause :: String -> [String] -> [([Pattern],Expr)] -> Match -> GuidCounter Clause
+matchClause c (v:vs) cs def =
+    do vs' <- getVars
+       Clause c vs' `liftM` match (vs' ++ vs) (map flatten cs) def
+    where flatten (PData _ ps' : ps, e) = (ps' ++ ps, e)
+          getVars = let (PData _ ps : _, _) = head cs in
+                    mapM (\_ -> newVar) ps
+
+matchMix :: [String] -> [([Pattern],Expr)] -> Match -> GuidCounter Match
+matchMix vs cs def = foldM (flip $ match vs) def (reverse css)
+    where css = groupBy (\p1 p2 -> isCon p1 == isCon p2) cs
src/Gen/CompileToJS.hs view
@@ -3,14 +3,17 @@  import Ast import Control.Arrow (first)-import Control.Monad (liftM,(<=<),join)+import Control.Monad (liftM,(<=<),join,ap) import Data.Char (isAlpha,isDigit)-import Data.List (intercalate,sortBy,inits)+import Data.List (intercalate,sortBy,inits,foldl') import Data.Map (toList) import Data.Maybe (mapMaybe)+import qualified Text.Pandoc as Pan  import Initialize import Rename (derename)+import Cases+import Guid  showErr :: String -> String showErr err = mainEquals $ "text(monospace(" ++ msg ++ "))"@@ -81,8 +84,8 @@ jsImport' (modul, Importing vs) =     concatMap (\v -> assign v $ modul ++ "." ++ v) vs jsImport' (modul, Hiding vs) =-    concat [ "\nfor(var i in " ++ modul ++ "){"-           , assign "hiddenVars" . jsList $ map (\v -> "'" ++ v ++ "'") vs+    concat [ assign "hiddenVars" . jsList $ map (\v -> "'" ++ v ++ "'") vs+           , "\nfor(var i in " ++ modul ++ "){"            , "\nif (hiddenVars.indexOf(i) >= 0) continue;"            , globalAssign "this[i]" $ modul ++ "[i]"            , "}" ]@@ -116,58 +119,79 @@            ]  +toJS = run . toJS' -toJS :: Expr -> String-toJS expr =+toJS' :: Expr -> GuidCounter String+toJS' expr =     case expr of-      IntNum n -> show n-      FloatNum n -> show n-      Var x -> x-      Chr c -> show c-      Str s -> "Value.str" ++ parens (show s)-      Boolean b -> if b then "true" else "false"-      Range lo hi -> jsRange (toJS lo) (toJS hi)-      Access e lbl -> toJS e ++ "." ++ lbl-      Binop op e1 e2 -> binop op (toJS e1) (toJS e2)-      If eb et ef -> parens $ iff (toJS eb) (toJS et) (toJS ef)-      Lambda v e -> jsFunc v $ ret (toJS e)-      App (Var "toText") (Str s) -> "toText" ++ parens (show s)-      App (Var "link") (Str s) -> "link(" ++ show s ++ ")"-      App (Var "plainText") (Str s) -> "plainText(" ++ show s ++ ")"-      App e1 e2 -> toJS e1 ++ parens (toJS e2)+      IntNum n -> return $ show n+      FloatNum n -> return $ show n+      Var x -> return $ x+      Chr c -> return $ show c+      Str s -> return $ "Value.str" ++ parens (show s)+      Boolean b -> return $ if b then "true" else "false"+      Range lo hi -> jsRange `liftM` toJS' lo `ap` toJS' hi+      Access e lbl -> (\s -> s ++ "." ++ lbl) `liftM` toJS' e+      Binop op e1 e2 -> binop op `liftM` toJS' e1 `ap` toJS' e2+      If eb et ef -> parens `liftM` (iff `liftM` toJS' eb `ap` toJS' et `ap` toJS' ef)+      Lambda v e -> liftM (jsFunc v . ret) (toJS' e)+      App (Var "toText") (Str s) -> return $ "toText" ++ parens (show s)+      App (Var "link") (Str s) -> return $ "link(" ++ show s ++ ")"+      App (Var "plainText") (Str s) -> return $ "plainText(" ++ show s ++ ")"+      App e1 e2 -> (++) `liftM` (toJS' e1) `ap` (parens `liftM` toJS' e2)       Let defs e -> jsLet defs e-      Case e cases -> jsCase e cases-      Data name es -> jsList $ show name : map toJS es+      Case e cases -> caseToJS e cases+      Data name es -> (\ss -> jsList $ show name : ss) `liftM` mapM toJS' es+      Markdown doc -> return $ "text('" ++ pad ++ md ++ pad ++ "')"+          where md = formatMarkdown $ Pan.writeHtmlString Pan.defaultWriterOptions doc+                pad = "<div style=\"height:0;width:0;\">&nbsp;</div>" -jsLet defs e' = jsFunc "" (jsDefs defs ++ ret (toJS e')) ++ "()"+formatMarkdown = concatMap f+    where f '\'' = "\\'"+          f '\n' = "\\n"+          f '"'  = "\""+          f c = [c] -jsDefs defs = concatMap toDef $ sortBy f defs+jsLet defs e' = do+  body <- (++) `liftM` jsDefs defs `ap` (ret `liftM` toJS' e')+  return $ jsFunc "" body ++ "()"++jsDefs defs = concat `liftM` mapM toDef (sortBy f defs)     where f a b = compare (valueOf a) (valueOf b)           valueOf (Definition _ args _) = min 1 (length args)-          toDef (Definition x [] e) = assign x (toJS e)-          toDef (Definition f (a:as) e) = -              "\nfunction " ++ f ++ parens a ++ braces (ret . toJS $ foldr Lambda e as) ++ ";"+          toDef (Definition x [] e) = assign x `liftM` toJS' e+          toDef (Definition f (a:as) e) = do+            out <- toJS' $ foldr Lambda e as+            return $ "\nfunction " ++ f ++ parens a ++ braces (ret out) ++ ";" -jsCase e  [c]  = jsMatch c ++ parens (toJS e)-jsCase e cases = "(function(){" ++-                 assign "v" (toJS e) ++-                 assign "c" jsCases  ++-                 "for(var i=c.length;i--;){" ++-                 assign "r" "c[i](v)" ++-                 "if(r!==undefined){return r;}}}())"-    where jsCases = jsList $ map jsMatch (reverse cases)+caseToJS e ps = do+  match <- caseToMatch ps+  var <- liftM (\n -> "case" ++ show n) guid+  matches <- matchToJS var match+  e' <- toJS' e+  return $ concat [ "function(", var, "){"+                  , case match of { Match name _ _ -> assign name var ; _ -> "" }+                  , matches+                  , "}", parens e' ] -jsMatch (p,e) = jsFunc "v" . match p "v" . ret $ toJS e-match p v hole =-    case p of-      PAnything -> hole-      PVar x -> assign x v ++ hole-      PData name ps ->-          "if(" ++ show name ++ "!==" ++ v ++-          "[0]){return undefined;}else{"++body++"}"-              where matches = zipWith match ps vs-                    vs = map (\i -> v++"["++show (i+1)++"]") [0..length ps-1]-                    body = foldr ($) hole matches+matchToJS v (Match name clauses def) = do+  cases <- concat `liftM` mapM (clauseToJS name) clauses+  finally <- matchToJS v def+  return $ concat [ "\nswitch(", name, "[0]){", cases, "\n}", finally ]+matchToJS _ Fail  = return "\nthrow \"Non-exhaustive pattern match in case\";"+matchToJS _ Break = return "break;"+matchToJS _ (Other e) = ret `liftM` toJS' e+matchToJS v (Seq ms) = concat `liftM` mapM (matchToJS v) ms++clauseToJS var (Clause name vars e) = do+  s <- matchToJS var e+  return $ concat [ "\ncase ", show name, ":"+                  , defs+                  , s ]+        where toDef v n = v ++ "=" ++ var ++ "[" ++ show n ++ "]"+              defs = case vars of [] -> ""+                                  _ -> ("\nvar "++) . (++";") . intercalate "," $+                                         zipWith toDef vars [ 1 .. length vars ]  jsNil         = "[\"Nil\"]" jsCons  e1 e2 = jsList [ show "Cons", e1, e2 ]
src/Gen/ExtractNoscript.hs view
@@ -2,6 +2,7 @@ module ExtractNoscript (extract) where
 
 import Ast
+import qualified Text.Pandoc as Pan
 
 extract (Module _ _ _ stmts) =
     concatMap (\s -> "<p>" ++ s ++ "</p>") (concatMap stmtExtract stmts)
@@ -30,6 +31,7 @@       Var _ -> []
       Case e cases -> concatMap (f . snd) cases
       Data _ es -> concatMap f es
+      Markdown doc -> [ Pan.writeHtmlString Pan.defaultWriterOptions doc ]
       _ -> []
 
 tag t e = map (\s -> concat [ "<", t, ">", s, "</", t, ">" ]) (extract' e)
src/Gen/GenerateHtml.hs view
@@ -1,7 +1,8 @@ {-# LANGUAGE OverloadedStrings #-} module GenerateHtml (generateHtml,                      body, css, widgetBody,-                     modulesToHtml, linkedHtml+                     modulesToHtml, linkedHtml,+                     JSStyle (..)                     ) where  import Data.List (intercalate)@@ -11,6 +12,9 @@ import Text.Blaze.Html5 ((!)) import qualified Text.Blaze.Html5.Attributes as A +import Text.Jasmine (minify)+import qualified Data.ByteString.Lazy.Char8 as BS+ import Ast import Initialize import CompileToJS@@ -18,7 +22,7 @@  css = H.style ! A.type_ "text/css" $ preEscapedToMarkup       ("html,head,body { padding:0; margin:0; }\-       \body { font-family: Arial; }\+       \body { font-family: helvetica, arial, sans-serif; }\        \a:link {text-decoration: none}\        \a:visited {text-decoration: none}\        \a:active {text-decoration: none}\@@ -28,11 +32,15 @@        \ -webkit-hyphens: auto; -ms-hyphens: auto; }\ --} -makeScript :: Either String String -> H.Html-makeScript (Left s) =+data JSStyle = Minified | Readable++makeScript :: JSStyle -> Either String String -> H.Html+makeScript _ (Left s) =     H.script ! A.type_ "text/javascript" ! A.src (H.toValue s) $ ""-makeScript (Right s) = -    H.script ! A.type_ "text/javascript" $ preEscapedToMarkup s+makeScript jsStyle (Right s) = H.script ! A.type_ "text/javascript" $ preEscapedToMarkup content+    where content = case jsStyle of +                      Minified -> BS.unpack . minify . BS.pack $ s+                      Readable -> s  -- |This function compiles Elm code into simple HTML. --@@ -45,11 +53,11 @@              -> Html generateHtml libLoc title source =     case initialize source of-      Left err -> createHtml libLoc title (Right $ showErr err) (H.noscript "")-      Right (escs, modul) -> modulesToHtml title libLoc [] True [(escs,modul)]+      Left err -> createHtml Readable libLoc title (Right $ showErr err) (H.noscript "")+      Right (escs, modul) -> modulesToHtml Readable title libLoc [] True [(escs,modul)]  -modulesToHtml title libLoc jss nscrpt pairs = createHtml libLoc title' js noscript+modulesToHtml jsStyle title libLoc jss nscrpt pairs = createHtml jsStyle libLoc title' js noscript     where modules = map snd pairs           js = Right $ jss ++ concatMap jsModule pairs           noscript = if nscrpt then extract $ last modules else ""@@ -59,20 +67,21 @@                     linkedHtml rtLoc jsLoc modules =-    createHtml rtLoc title (Left jsLoc) (H.noscript "")+    createHtml Readable rtLoc title (Left jsLoc) (H.noscript "")     where title = (\(Module names _ _ _) -> intercalate "." names) $                   snd (last modules)  -createHtml libLoc title js noscript =+createHtml jsStyle libLoc title js noscript =     H.docTypeHtml $ do        H.head $ do         H.meta ! A.charset "UTF-8"         H.title . H.toHtml $ title-        makeScript (Left libLoc)-        makeScript js         css-      H.body $ body noscript+      H.body $ do+        makeScript Readable (Left libLoc)+        makeScript jsStyle js+        body noscript  body noscript = do   H.div ! A.id "widthChecker" ! A.style "width:100%; height:1px; position:absolute; top:-1px;" $ ""
src/Optimize.hs view
@@ -3,7 +3,7 @@ import Ast import Control.Arrow (second) import Data.Char (isAlpha)-+import Substitute  optimize (Module name ims exs stmts) =     Module name ims exs (map optimizeStmt stmts)@@ -21,6 +21,9 @@       Range e1 e2 -> Range (f e1) (f e2)       Binop op e1 e2 -> simp_binop op (f e1) (f e2)       Lambda x e -> Lambda x (f e)+      App (Lambda x e1) e2 -> +          if isValue e2' then subst x e2' e1' else App (Lambda x e1') e2'+              where { e1' = f e1 ; e2' = f e2 }       App e1 e2 -> App (f e1) (f e2)       If e1 e2 e3 -> simp_if (f e1) (f e2) (f e3)       Let defs e -> Let (map simpDef defs) (f e)@@ -32,6 +35,15 @@ simp_if (Boolean b) e2 e3 = if b then e2 else e3 simp_if a b c = If a b c +isValue e = case e of { IntNum _  -> True+                      ; FloatNum _ -> True+                      ; Chr _ -> True+                      ; Str _ -> True+                      ; Boolean _ -> True+                      ; Var _ -> True+                      ; Data _ _ -> True+                      ; _ -> False }+ simp_binop = binop  binop op (IntNum n) (IntNum m) = f n m@@ -87,6 +99,7 @@ binop "++" (Data "Cons" [h,t]) e = Data "Cons" [h, binop "++" t e]  binop "$" e1 e2 = App e1 e2+binop "." e1 e2 = Lambda "x" (App e1 (App e2 (Var "x")))  binop op e1 e2     | isAlpha (head op) || '_' == head op = App (App (Var op) e1) e2
src/Parse/ParseExpr.hs view
@@ -6,6 +6,7 @@ import Data.Char (isSymbol, isDigit)
 import Data.List (foldl')
 import Text.Parsec hiding (newline,spaces)
+import qualified Text.Pandoc as Pan
 
 import ParseLib
 import Patterns
@@ -14,7 +15,9 @@ import Guid
 import Types (Type (VarT), Scheme (Forall))
 
+import System.IO.Unsafe
 
+
 --------  Basic Terms  --------
 
 numTerm :: (Monad m) => ParsecT [Char] u m Expr
@@ -44,11 +47,13 @@ 
 --------  Complex Terms  --------
 
-listTerm = braces $ choice
-           [ try $ do { lo <- expr; whitespace; string ".." ; whitespace
-                      ; Range lo <$> expr }
-           , list <$> commaSep expr
-           ]
+listTerm = (do { try $ string "[markdown|"
+               ; md <- filter (/='\r') <$> manyTill anyChar (try $ string "|]")
+               ; return . Markdown $ Pan.readMarkdown Pan.defaultParserState md })
+           <|> (braces $ choice
+                [ try $ do { lo <- expr; whitespace; string ".." ; whitespace
+                           ; Range lo <$> expr }
+                , list <$> commaSep expr ])
 
 parensTerm = parens $ choice
              [ do op <- anyOp
src/Parse/Patterns.hs view
@@ -26,7 +26,7 @@ patternTerm = patternTuple <|> patternList <|> patternBasic <?> "pattern"  patternExpr :: Monad m => ParsecT [Char] u m Pattern-patternExpr = foldl1 pcons <$> consSep1 patternTerm <?> "pattern"+patternExpr = foldr1 pcons <$> consSep1 patternTerm <?> "pattern"   makeLambda pats body = foldr Lambda (makeBody pats body) (map getName pats)
+ src/Substitute.hs view
@@ -0,0 +1,26 @@+module Substitute (subst) where
+
+import Control.Arrow (second)
+
+import Ast
+
+subst :: String -> Expr -> Expr -> Expr
+subst old new expr =
+    let f = subst old new in
+    case expr of
+      Range e1 e2 -> Range (f e1) (f e2)
+      Access e x -> Access (f e) x
+      Binop op e1 e2 -> Binop op (f e1) (f e2)
+      Lambda x e -> if x == old then expr else Lambda x (f e)
+      App e1 e2 -> App (f e1) (f e2)
+      If e1 e2 e3 -> If (f e1) (f e2) (f e3)
+      Lift e es -> Lift (f e) (map f es)
+      Fold e1 e2 e3 -> Fold (f e1) (f e2) (f e3)
+      Async e -> Async (f e)
+      Input _ -> expr
+      Let defs e -> Let (map substDef defs) (f e)
+              where substDef (Definition name vs e) = Definition name vs (f e)
+      Var x -> if x == old then new else expr
+      Case e cases -> Case (f e) $ map (second f) cases
+      Data name es -> Data name (map f es)
+      _ -> expr
src/Types/Constrain.hs view
@@ -84,7 +84,13 @@ gen (Data name es) = gen $ foldl' App (Var name) es
 gen (Binop op e1 e2) = gen (Var op `App` e1 `App` e2)
 gen (Access (Var x) y) = gen . Var $ x ++ "." ++ y
-gen (Range e1 e2) = gen (Var "elmRange" `App` e1 `App` e2)
+gen (Range e1 e2) =
+    do (a1,c1,t1) <- gen e1
+       (a2,c2,t2) <- gen e2
+       return ( unionsA [a1,a2]
+              , Set.unions [ c1, c2, Set.fromList [ ctx e1 (t1 :=: int)
+                                                  , ctx e2 (t2 :=: int) ] ]
+              , listOf int )
 
 gen other =
     case other of
@@ -94,6 +100,7 @@       Chr _ -> primitive char
       Str _ -> primitive string
       Boolean _ -> primitive bool
+      Markdown _ -> primitive element
       _ -> beta >>= primitive 
 
 primitive t = return (Map.empty, Set.empty, t)
src/Types/Hints.hs view
@@ -9,13 +9,13 @@ 
 --------  Text and Elements  --------
 
-str2elem = hasType (string ==> element) [ "image","video","plainText" ]
+str2elem = hasType (string ==> element) [ "plainText" ]
 
 textToText = [ "header", "italic", "bold", "underline"
              , "overline", "strikeThrough", "monospace" ]
 
 textAttrs = [ "toText" -: string ==> text
-            , "link"   -: string ==> text ==> text
+            --, "link"   -: string ==> text ==> text
             , numScheme (\t -> t ==> text ==> text) "Text.height"
             ] ++ hasType (text ==> text) textToText
 
@@ -23,6 +23,8 @@            [ "flow"    -: direction ==> listOf element ==> element
            , "layers"  -: listOf element ==> element
            , "text"    -: text ==> element
+           , "image"   -: int ==> int ==> string ==> element
+           , "video"   -: int ==> int ==> string ==> element
            , "opacity" -: float ==> element ==> element
            , "width"   -: iee
            , "height"  -: iee
@@ -52,9 +54,9 @@          , "filled"        -: color ==> shape ==> form
          , "outlined"      -: color ==> shape ==> form
          , "customOutline" -: listOf int ==> color ==> shape ==> form
-         , scheme2 number transformable (\n t -> n ==> n ==> t ==> t) "move"
-         , scheme2 number transformable (\n t -> n ==> t ==> t) "rotate"
-         , scheme2 number transformable (\n t -> n ==> t ==> t) "scale"
+         , numScheme (\n -> n ==> n ==> form ==> form) "move"
+         , numScheme (\n -> n ==> form ==> form) "rotate"
+         , numScheme (\n -> n ==> form ==> form) "scale"
          ] ++ map (twoNums (\n m -> n ==> n ==> pairOf m ==> shape)) [ "ngon"
                                                                      , "rect"
                                                                      , "oval" ]
src/Types/Unify.hs view
@@ -79,14 +79,14 @@ 
 solver (Context ctx (ADT "List" [t] :<: Super ts) : cs) subs
     | any f (Set.toList ts) = solver cs subs
-    | otherwise = subtypeError ("aoeu" ++ ctx) (ADT "List" [t]) (Super ts)
+    | otherwise = subtypeError ctx (ADT "List" [t]) (Super ts)
         where f (ADT "List" [VarT _]) = True
               f (ADT "List" [t']) = t == t'
               f _ = False
 
 solver (Context ctx (t :<: Super ts) : cs) subs
     | Set.member t ts = solver cs subs
-    | otherwise = subtypeError ("htns" ++ ctx) t (Super ts)
+    | otherwise = subtypeError ctx t (Super ts)
 
 solver (Context ctx (x :<<: s) : cs) subs
     | any (\(Context _ c) -> x `elem` cFreeVars c) cs =