Elm 0.4.0.4 → 0.5.0
raw patch · 18 files changed
+546/−302 lines, 18 filesdep ~blaze-html
Dependency ranges changed: blaze-html
Files
- Elm.cabal +4/−4
- changelog.txt +29/−0
- elm-runtime-0.4.0.4.js +0/−90
- elm-runtime-0.5.0.js +123/−0
- src/Ast.hs +1/−0
- src/Compiler.hs +6/−6
- src/Gen/Cases.hs +13/−4
- src/Gen/CompileToJS.hs +42/−37
- src/Gen/GenerateHtml.hs +1/−9
- src/Language/Elm.hs +4/−1
- src/Parse/ParseExpr.hs +16/−9
- src/Parse/ParseModules.hs +2/−2
- src/Parse/ParseTypes.hs +5/−2
- src/Parse/Patterns.hs +6/−4
- src/Types/Constrain.hs +36/−10
- src/Types/Hints.hs +169/−67
- src/Types/Substitutions.hs +65/−43
- src/Types/Unify.hs +24/−14
Elm.cabal view
@@ -1,6 +1,6 @@ Name: Elm-Version: 0.4.0.4+Version: 0.5.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.4.0.4.js+Data-files: elm-runtime-0.5.0.js Cabal-version: >=1.8 source-repository head@@ -63,7 +63,7 @@ transformers >= 0.2, mtl >= 2, parsec >= 3.1.1,- blaze-html == 0.5.0.*,+ blaze-html == 0.5.*, blaze-markup == 0.5.1.*, deepseq, text,@@ -106,7 +106,7 @@ transformers >= 0.2, mtl >= 2, parsec >= 3.1.1,- blaze-html == 0.5.0.*,+ blaze-html == 0.5.*, blaze-markup == 0.5.1.*, deepseq, cmdargs,
changelog.txt view
@@ -1,4 +1,33 @@ +Release 0.5.0 +============= + +* Add Dict, Set, and Automaton libraries! + +* Add (,,) notation for creating tuples. + +* Redo HTTP library, allowing any kind of request and more flexibility. + +* Remove the library prefixes `Data.`, `Graphics.`, and `Signal.` because + they were more confusing than helpful. + +* Better type error reporting for ambiguous uses of variables and for + variables in aliased modules. + +* Add `readInt` and `readFloat` functions. +* Add `complement` function to compute complementary colors. +* Ensure that `String` is treated as an alias of `[Char]`. + +* Fix bug in pattern parsing. `A B _ _` was parsed as `A (B _ _)`. +* Make pattern matching a bit more compact in generated code. +* Make generated JS more readable. + +* The Haskell API exports the absolute path to the Elm runtime + system (with the corresponding version number). This makes it easier + to run Elm programs with less setup. + + + Release 0.4.0 =============
− elm-runtime-0.4.0.4.js
@@ -1,90 +0,0 @@-var Guid=function(){var g=0;return{guid:function(){return g+=1}}}(),Foreign=function(){var g=function(a){for(var b=["Nil"],c=a.length;c--;)b=["Cons",a[c],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(c){return["Element",Guid.guid(),["EExternalHtml",c],a,b,1,Nothing,Nothing]}}},castElementToJSElement:function(a){return Render.render(a)}},castJSArrayToList:g,castListToJSArray:c,castJSStringToString:g,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 g(a){return function(h){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],l;for(l in a)j[l]=f(a[l]);return j;case "JsonArray":j=b.castListToJSArray(a[1]);for(l=j.length;l--;)j[l]=f(j[l]);return j;default:return a[1]}}return JSON.stringify(f(["JsonObject",h]),null,-b.castStringToJSString(a))}}function c(a){function h(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]=h(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]=h(a[f]);return["JSON",a]}var b=Foreign.JavaScript;-return{empty:["JSON",{}],singleton:function(a){return function(h){var f={};f[b.castStringToJSString(a)]=h;return["JSON",f]}},insert:function(a){return function(h){return function(f){var f=f[1],c={},j;for(j in f)c[j]=f[j];c[b.castStringToJSString(a)]=h;return["JSON",c]}}},lookup:function(a){return function(c){var f=b.castStringToJSString(a);return c[1].hasOwnProperty(f)?Just(c[1][f]):Nothing}},findWithDefault:function(a){return function(c){return function(f){var g=b.castStringToJSString(c);return f[1].hasOwnProperty(g)?-f[1][g]:a}}},remove:function(a){return function(c){var c=c[1],f={},g;for(g in c)f[g]=c[g];delete f[b.castStringToJSString(a)];return["JSON",f]}},toPrettyJSString:g,toJSString:g(""),fromJSString:c,toPrettyString:function(a){return function(c){return b.castJSStringToString(g(a)(c))}},toString:function(a){return b.castJSStringToString(g("")(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 g(a){if(0==a.length)return a;for(var a=a.replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(/\n/g,"<br/>"),a=a.split("<br/>"),b=a.length;b--;){var c=a,g=b,j;j=a[b];if(0!=j.length){j=j.split("");" "==j[0]&&(j[0]=" ");for(var l=j.length;--l;)" "==j[l][0]&&" "==j[l-1]&&(j[l-1]+=j[l],j[l]="");for(l=j.length;l--;)if(1<j[l].length&&" "==j[l][0]){for(var d=j[l].split(""),e=d.length-2;0<=e;e-=2)d[e]=" ";j[l]=d.join("")}j=-j.join("")}c[g]=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]?'"':"]",g="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+=g+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(g(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"]],g=c,a=a[2];"Cons"===a[0];)g[2]=["Cons",a[1],["Nil"]],a=a[2],g=g[2];g[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 g(a);for(var b=[];"Cons"===-a[0];)b.push(a[1]),a=a[2];return g(b.join(""))},properEscape:g,getTextSize:function(a,b,c){var g=document.createElement("div");g.innerHTML=c;g.style.textAlign="left";0<a&&(g.style.width=a+"px");g.style.visibility="hidden";g.style.styleFloat="left";g.style.cssFloat="left";document.body.appendChild(g);c=window.getComputedStyle(g);a=c.getPropertyValue("width").slice(0,-2)-0;c=c.getPropertyValue("height").slice(0,-2)-0;document.body.removeChild(g);delete g;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,g=window.getComputedStyle(a),j=g.getPropertyValue("width").slice(0,-2)-0,g=g.getPropertyValue("height").slice(0,--2)-0;document.body.removeChild(a);delete a;return[b-j,c-g]},groupForms:function(a){for(var a=Foreign.JavaScript.castListToJSArray(a),b=[],c=[],g=a.length;g--;){var j=a[g];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 g(a){return function(b){if("Nil"===b[0])return b;"Cons"!==b[0]&&d("map");for(var i=["Cons",a(b[1]),["Nil"]],e=i,b=b[2];"Cons"===b[0];)e[2]=["Cons",a(b[1]),["Nil"]],b=b[2],e=-e[2];return i}}function c(a){return function(b){return function(i){var e=b;if("Nil"===i[0])return e;for("Cons"!==i[0]&&d("foldl");"Cons"===i[0];)e=a(i[1])(e),i=i[2];return e}}}function b(a){return function(b){return function(i){var e=b;if("Nil"===i[0])return e;"Cons"!==i[0]&&d("foldr");for(var c=[];"Cons"===i[0];)c.push(i[1]),i=i[2];for(i=c.length;i--;)e=a(c[i])(e);return e}}}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 h(a){return function(b){return function(i){if("Nil"===-i[0])return["Cons",b,["Nil"]];"Cons"!==i[0]&&d("scanl");for(var e=[b];"Cons"===i[0];)b=a(i[1])(b),e.push(b),i=i[2];for(var i=["Nil"],c=e.length;c--;)i=["Cons",e[c],i];return i}}}function f(a){return function(d){a:{for(var i=[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}}],b=i.length;b--;){var e=i[b](d);if(void 0!==-e){d=e;break a}}d=void 0}return d}}function n(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],n(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 e=d[b](a);if(void 0!==e){a=e;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])]]}}}],e=b.length;e--;){var c=b[e](d);if(void 0!==c){d=c;break a}}d=void 0}return d}}function l(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 e=d[2][1],d=d[2][2];return Value.append(b,Value.append(a,l(a)(["Cons",e,d])))}}}],e=b.length;e--;){var c=b[e](d);if(void 0!==c){d=c;break a}}d=void 0}return d}}var d=function(a){throw"Function '"+a+"' expecting a list!";},e=c(function(a){return function(d){return["Cons",a,d]}})(["Nil"]),u=b(function(a){return function(d){return Value.append(a,d)}})(["Nil"]),q=c(function(a){return function(d){return a&&d}})(!0),s=c(function(a){return function(d){return a||-d}})(!1),k=c(function(a){return function(d){return a+d}})(0),m=c(function(a){return function(d){return a*d}})(1),r=a(function(a){return function(d){return Math.max(a,d)}}),v=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:g,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 e=[];"Cons"===b[0];)e.push(b[1]),b=b[2];for(var b=e.pop(),c=e.length;c--;)b=a(e[c])(b);return b}},scanl:h,scanl1:function(a){return function(d){if("Cons"!==d[0])throw"Error: 'scanl1' requires a list of at least length 1.";return h(a)(d[1])(d[2])}},filter:function(a){return function(b){if("Nil"===-b[0])return b;"Cons"!==b[0]&&d("filter");for(var e=[];"Cons"===b[0];)a(b[1])&&e.push(b[1]),b=b[2];for(var b=["Nil"],c=e.length;c--;)b=["Cons",e[c],b];return b}},length:function(a){for(var d=0;"Cons"===a[0];)d+=1,a=a[2];return d},reverse:e,concat:u,concatMap:function(a){return function(d){return u(g(a)(d))}},and:q,or:s,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:k,product:m,maximum:r,-minimum:v,partition:f,zipWith:function(a){return function(b){return function(e){if("Nil"===b[0]||"Nil"===e[0])return["Nil"];("Cons"!==b[0]||"Cons"!==e[0])&&d("zipWith");for(var c=[];"Cons"===b[0]&&"Cons"===e[0];)c.push(a(b[1])(e[1])),b=b[2],e=e[2];for(var e=["Nil"],l=c.length;l--;)e=["Cons",c[l],e];return e}}},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 e=[];"Cons"===a[0]&&"Cons"===b[0];)e.push(["Tuple2",a[1],b[1]]),-a=a[2],b=b[2];for(var b=["Nil"],c=e.length;c--;)b=["Cons",e[c],b];return b}},unzip:n,intersperse:j,intercalate:l,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"],e=b.length;e--;)a=["Cons",b[e],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 e=["Cons",b[1],["Nil"]],c=e,b=b[2];for(--a;"Cons"===b[0]&&0<a;)c[2]=-["Cons",b[1],["Nil"]],c=c[2],b=b[2],--a;return e}},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 g;g=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 g=b(a);return"Just"===g[0]?["Cons",g[1],c]:c}}};g={Just:function(b){return["Just",b]},Nothing:["Nothing"],catMaybes:List.foldr(g)(["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:g,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:g,List:List}}(),ElmCode=ElmCode||{};ElmCode.Graphics=ElmCode.Graphics||{};-ElmCode.Graphics.Color=function(){return{rgba:function(g){return function(c){return function(b){return function(a){return["Color",g,c,b,a]}}}},rgb:function(g){return function(c){return function(b){return["Color",g,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(g){return 1===-g[4]?"rgb("+g[1]+","+g[2]+","+g[3]+")":"rgba("+g[1]+","+g[2]+","+g[3]+","+g[4]+")"}}}();-var Collage=function(){function g(a,b){var d=b.length-1;if(!(0>=d))for(a.moveTo(b[d][1],b[d][2]);d--;)a.lineTo(b[d][1],b[d][2])}function c(a,b,d,e){0===a.length&&(a=[8,4]);var c=e.length-1;if(!(0>=c)){var g=e[c][1],s=e[c][2],f=0,m=0,r=0,h=0,p=0,n=0,i=a.length,x=!0,w=a[0];for(b.moveTo(g,s);c--;){f=e[c][1];m=e[c][2];r=f-g;h=m-s;for(p=Math.sqrt(r*r+h*h);w<=p;)g+=r*w/p,s+=h*w/p,b[x?"lineTo":"moveTo"](g,s),r=f-g,h=m-s,p=Math.sqrt(r*r+h*h),x=!x,n=(n+1)%i,w=a[n];0<p&&(b[x?"lineTo":"moveTo"](f,m),w-=p);g=-f;s=m}}b.strokeStyle=ElmCode.Graphics.Color.extract(d);b.stroke()}function b(a,b,d,e,u){b.clearRect(0,0,d,e);for(d=u.length;d--;){var q=u[d],f=a,e=b,k=q[1],m=q[2],h=q[3][1],n=q[3][2],q=q[4];e.save();(0!==h||0!==n)&&e.translate(h,n);k!==~~k&&e.rotate(2*Math.PI*k);1!==m&&e.scale(m,m);e.beginPath();switch(q[0]){case "FLine":a:switch(f=e,k=q,q=k[3][1],k[1][0]){case "Solid":k=k[2];g(f,q);f.strokeStyle=ElmCode.Graphics.Color.extract(k);f.stroke();break;case "Dotted":c([3,3],f,k[2],q);break a;case "Dashed":c([8,-4],f,k[2],q);break a;case "Custom":c(k[1][1],f,k[2],q)}break;case "FShape":a:switch(h=f,m=e,f=q[1],k=q[2],q=q[3][1],f[0]){case "Filled":f=m;g(f,q);f.fillStyle=ElmCode.Graphics.Color.extract(k);f.fill();break a;case "Outlined":f=m;g(f,q);f.strokeStyle=ElmCode.Graphics.Color.extract(k);f.stroke();break a;case "Textured":k=h;f=f[1];h=new Image;h.src=Foreign.JavaScript.castStringToJSString(f);h.onload=k;g(m,q);m.fillStyle=m.createPattern(h,"repeat");m.fill();break a;case "CustomOutline":c(f[1],m,k,q)}break;-case "FImage":k=e,m=q[1],h=q[2],q=q[3],n=new Image,n.onload=f,n.src=Foreign.JavaScript.castStringToJSString(q),k.drawImage(n,-m/2,-h/2,m,h)}e.restore()}}function a(a,c,d){var e=Render.newElement("canvas");e.style.width=~~a+"px";e.style.height=~~c+"px";e.style.display="block";e.width=~~a;e.height=~~c;if(e.getContext){var g=e.getContext("2d"),a=e.width,c=e.height;b(function(){b(this,g,a,c,d)},g,a,c,d);return e}e.innerHTML="Your browser does not support the canvas element.";return e}function h(a,b,d,-e,c,g,f){var k=Render.render(f),d="translate("+(c-f[3]/2)+"px,"+(g-f[4]/2)+"px) "+(1===e?"":"scale("+e+","+e+")")+" "+(d===~~d?"":"rotate("+360*d+"deg)");k.style.transform=d;k.style.msTransform=d;k.style.MozTransform=d;k.style.webkitTransform=d;k.style.OTransform=d;d=Render.newElement("div");Render.addTo(d,k);d.style.width=~~a+"px";d.style.height=~~b+"px";d.style.overflow="hidden";return d}function f(c,g,d){if(!Value.eq(d,g)){var e=c.style.width.slice(0,-2)-0,u=c.style.height.slice(0,-2)-0;if("object"===-typeof d[0]){if("object"===typeof g[0]&&c.getContext){var f=c.getContext("2d");return b(function(){b(this,f,e,u,d)},f,e,u,d)}g=a(e,u,d);g.style.position="absolute";return c.parentNode.replaceChild(g,c)}g=h(e,u,d[1],d[2],d[3][1],d[3][2],d[4][1]);g.style.position="absolute";return c.parentNode.replaceChild(g,c)}}function n(a,b,d,e,c){var g=0,f,k=(a[1]-e[1])/d,a=(a[2]-e[2])/d;0!==b&&(b*=2*Math.PI,b=0===k?(0<a?Math.PI/2:-Math.PI/2)-b:Math.atan(a/k)+(0<k?0:Math.PI)-b,a=Math.sqrt(k*k+a*a),k=a*Math.cos(b),-a*=Math.sin(b));if(0===c.length)return!1;f=c[0];for(d=c.length-1;d--;){b=c[d];e=f[1];f=f[2];var h=b[1],n=b[2];if(f<n)var v=f,p=n;else v=n,p=f;if(e<h)var t=e,i=h;else t=h,i=e;v<a&&a<=p&&k<=i&&(k<=t||k<=(a-f)*(h-e)/(n-f)+e)&&++g;f=b}return 1===g%2}return{collage:function(b,c,d){if(0===d.length)return a(b,c,[]);for(var e=Array(d.length),g=d.length;g--;){var f=d[g];e[g]="string"===typeof f[0]?h(b,c,f[1],f[2],f[3][1],f[3][2],f[4][1]):a(b,c,f)}return 1===d.length?e[0]:Render.flowWith(Render.goIn,function(a){return a},-e)},updateCollage:function(a,b,d){if(1===d.length)return f(a,b[0],d[0]);for(var a=a.childNodes,e=a.length,c=e;c--;)f(a[e-c-1],b[c],d[c])},insideForm:function(a){return function(b){var d=a[1],c=a[2];if(6>b.length){var g=b[3][1],f=b[3][2],h=0,k=b[2];switch(b[4][0]){case "FShape":for(var m=b[4][3][1],r=m.length;--r;)var v=m[r],h=Math.max(h,v[1]*v[1]+v[2]*v[2]);h*=k*k;break;case "FImage":m=k*b[4][1]/2;k=k*b[4][2]/2;h=m*m+k*k;break;case "FElement":m=k*b[4][1][3]/2,k=k*b[4][1][4]/2,h=m*m+k*k}b.push(function(a,-b){var d=a-g,c=b-f;return d*d+c*c<h+1})}if(!b[5](d,c))return!1;var p,t;switch(b[4][0]){case "FShape":return n(a,b[1],b[2],b[3],b[4][3][1]);case "FLine":return!1;case "FImage":p=b[4][1]/2;t=b[4][2]/2;break;case "FElement":p=b[4][1][3]/2,t=b[4][1][4]/2}return n(a,b[1],b[2],b[3],[[null,p,t],[null,-p,t],[null,-p,-t],[null,p,-t],[null,p,t]])}}}}(),ElmCode=ElmCode||{};ElmCode.Graphics=ElmCode.Graphics||{};-ElmCode.Graphics.Element=function(){function g(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",Foreign.JavaScript.castListToJSArray(a)]}function h(a){return function(b){var d=Foreign.JavaScript.castListToJSArray(a);0<d.length&&d.push(d[0]);return["Shape",d,b]}}function f(a){return function(b){return function(d){return function(c){return["Form",-a,b,d,c]}}}}function n(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 l(a,b,d,c,e,i){return["Element",Guid.guid(),a,b,d,c,e,i]}function d(a,b,d){return["Element",Guid.guid(),a,b,d,1,Nothing,Nothing]}function e(a){return~~a[3]}function u(a){return~~a[4]}function q(a){return function(b){return function(c){return d(["EImage",Foreign.JavaScript.castStringToJSString(c)],a,b)}}}function s(a){return function(b){return d(x,-a,b)}}function k(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)]}),e=49,i=["Nil"];if(0<=e){do i=["Cons",e,i];while(0<e--)}return h(c(i))(d)}}}var m=["DRight"],r=["DDown"],v=["DOut"],p=["Near"],t=["Mid"],i=["Far"],x=["EEmpty"],w=["Solid"],y=["Dotted"],z=["Dashed"],A=["Filled"],B=["Outlined"],C=g(p)(p),D=g(i)(p),E=g(p)(i),F=g(i)(i),G=g(p)(t),H=g(i)(t),p=g(t)(p),i=g(t)(i),t=g(t)(t);return{left:["DLeft"],right:m,down:r,up:["DUp"],-inward:["DIn"],outward:v,topLeft:C,topRight:D,bottomLeft:E,bottomRight:F,midLeft:G,midRight:H,midTop:p,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 l(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]),l(b[2],a,d[1],b[5],b[6],b[7])}return l(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 l(b[2],b[3]*a/b[4],a,b[5],b[6],b[7])}return l(b[2],b[3],a,b[5],b[6],b[7])}},size:function(a){return function(b){return function(d){return l(d[2],-a,b,d[5],d[6],d[7])}}},opacity:function(a){return function(b){return l(b[2],b[3],b[4],a,b[6],b[7])}},color:function(a){return function(b){return l(b[2],b[3],b[4],b[5],Just(a),b[7])}},link:function(a){return function(b){return l(b[2],b[3],b[4],b[5],b[6],Just(Foreign.JavaScript.castStringToJSString(a)))}},widthOf:e,heightOf:u,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:q,images:function(a){var b=Elm.Input(s(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,q(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(e)(c);a:{switch(a[0]){case "DLeft":i=sum(i);break a;case "DRight":i=sum(i);break a}i=maximum(i)}var g;g=map(u)(c);a:{switch(a[0]){case "DDown":g=sum(g);break a;case "DUp":g=sum(g);break a}g=maximum(g)}return d(b(a)(c),i,g)}},above:function(a){return function(c){return d(b(r)(["Cons",a,["Cons",c,["Nil"]]]),max(~~a[3])(~~c[3]),~~a[4]+~~c[4])}},below:function(a){return function(c){return d(b(r)(["Cons",c,["Cons",a,["Nil"]]]),max(~~a[3])(~~c[3]),~~a[4]+~~c[4])}},beside:function(a){return function(c){return d(b(m)(["Cons",-a,["Cons",c,["Nil"]]]),~~a[3]+~~c[3],max(~~a[4])(~~c[4]))}},layers:function(a){return d(b(v)(a),maximum(map(e)(a)),maximum(map(u)(a)))},collage:function(a){return function(b){return function(c){return d(["ECollage",a,b,Value.groupForms(c)],a,b)}}},spacer:s,container:function(a){return function(b){return function(c){return function(e){return d(["EContainer",c,e],a,b)}}}},line:a,segment:function(b){return function(d){return a(["Cons",b,["Cons",d,["Nil"]]])}},polygon:h,rect:function(a){return function(b){return function(d){return h(["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:k,circle:function(a){return k(2*a)(2*a)},ngon:function(a){return function(b){return function(d){var c=toFloat(a),e=map(function(a){return["Tuple2",b*cos(2*(pi/c)*a),b*sin(2*(pi/c)*a)]}),i=a-1,g=["Nil"];if(0<=i){do g=["Cons",i,g];while(0<i--)}return h(e(g))(d)}}},solid:function(a){return function(b){return f(0)(1)(["Tuple2",0,0])(n(w)(a)(b))}},dotted:function(a){return function(b){return f(0)(1)(["Tuple2",-0,0])(n(y)(a)(b))}},dashed:function(a){return function(b){return f(0)(1)(["Tuple2",0,0])(n(z)(a)(b))}},customLine:function(a){return function(b){return function(d){return f(0)(1)(["Tuple2",0,0])(n(["Custom",Foreign.JavaScript.castListToJSArray(a)])(b)(d))}}},filled:function(a){return function(b){return f(0)(1)(b[2])(j(A)(a)(b))}},outlined:function(a){return function(b){return f(0)(1)(b[2])(j(B)(a)(b))}},customOutline:function(a){return function(b){return function(d){return f(0)(1)(d[2])(j(["CustomOutline",-Foreign.JavaScript.castListToJSArray(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],e=b[4],b=f(a+b[1])(d)(c)(e);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 e=d[2],i=d[3],d=d[4];switch(i[0]){case "Tuple2":var g=i[1],i=i[2];c=f(c)(e)(["Tuple2",a+g,b+i])(d);break a}}throw"Non-exhaustive pattern match in case";}return c}}},isWithin:Collage.insideForm}}();-var Text=function(){function g(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)},h=c("h1"),f=b("font-style","italic"),c=c("b"),n=b("text-decoration","underline"),j=b("text-decoration","overline"),l=b("text-decoration","line-through");return{fromString:g,toText:g,-header:h,height:function(a){return b("font-size",a+"em")},italic:f,bold:c,underline:n,overline:j,strikeThrough:l,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='"+g(a)+"'>"+b+"</a>"}}}}(),Render=function(){function g(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 h(a,b,c){for(var f=g("div"),l=c.length;l--;){var j=a(b(c[l]));f.appendChild(j)}return f}function f(a){switch(a[0]){case "Absolute":return a[1]+"px";case "Relative":return 100*a[1]+"%"}}function n(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 e={};switch(d[2][0]){case "EText":var e=d[2][1],f=d[2][2],l=g("div");l.innerHTML=f;l.style.textAlign=e;e=l;break;case "EImage":e=d[2][1];f=g("img");f.src=e;f.name=e;f.style.display=-"block";e=f;break;case "EVideo":l=d[2][1];e=g("video");e.controls="controls";f=g("source");f.src=l;l=l.split(".");f.type="video/"+l[l.length-1];e.appendChild(f);e.style.display="block";break;case "EFittedImage":var s=d[3],k=d[4],e=d[2][1],m=g("canvas");m.style.display="block";m.style.width=s+"px";m.style.height=k+"px";m.width=s;m.height=k;m.innerHTML="Your browser does not support the canvas element.";var r=g("img");r.onload=function(){if(m.getContext){var a=m.getContext("2d"),b=0,d=0,c=this.width,-e=this.height;s/k>this.width/this.height?(e=this.width*k/s,d=(this.height-e)/2):(c=this.height*s/k,b=(this.width-c)/2);a.drawImage(r,b,d,c,e,0,0,m.width,m.height)}};r.src=e;e=m;break;case "EFlow":a:{e=d[2][2];switch(d[2][1][0]){case "DDown":e=e.slice(0).reverse();case "DUp":e=h(c,j,e);break a;case "DRight":e=e.slice(0).reverse();case "DLeft":e=h(b,j,e);break a;case "DOut":e=e.slice(0).reverse();case "DIn":e=h(a,j,e);break a}e=void 0}break;case "ECollage":e=Collage.collage(d[2][1],d[2][2],d[2][3]);-break;case "EEmpty":e=g("div");break;case "EContainer":f=d[2][1];e=j(d[2][2]);n(f,e);f=g("div");f.style.position="relative";f.style.overflow="hidden";f.appendChild(e);e=f;break;case "EHtml":e=d[2][1];"button"!==e.type&&(f=Value.getExcess(e),d[3]-=f[0],d[4]-=f[1]);break;case "EExternalHtml":e=g("div"),e.appendChild(d[2][1])}e.id=d[1];e.style.width=~~d[3]+"px";e.style.height=~~d[4]+"px";1!==d[5]&&(e.style.opacity=d[5]);"Just"===d[6][0]&&(e.style.backgroundColor=ElmCode.Graphics.Color.extract(d[6][1]));-return"Just"===d[7][0]?(f=g("a"),f.href=d[7][1],f.appendChild(e),f):e}function l(d,e,g){"A"===d.tagName&&(d=d.firstChild);if(e[1]!==g[1]){if(e[2][0]!==g[2][0])return d.parentNode.replaceChild(j(g),d);var f=g[2],h=e[2];switch(f[0]){case "EText":f[1]!==h[1]&&(d.style.textAlign=f[1]);f[2]!==h[2]&&(d.innerHTML=f[2]);break;case "EImage":f[1]!==h[1]&&(d.src=f[1]);break;case "EVideo":case "EFittedImage":if(!Value.eq(f,h)||g[3]!==e[3]||g[4]!==e[4])return d.parentNode.replaceChild(j(g),d);break;case "ECollage":if(f[1]!==-h[1]||f[2]!==h[2]||f[3].length!==h[3].length)return d.parentNode.replaceChild(j(g),d);Collage.updateCollage(d,h[3],f[3]);break;case "EFlow":if(f[1]!==h[1])return d.parentNode.replaceChild(j(g),d);var k=f[2],m=d.childNodes;if(k.length!==m.length)return d.parentNode.replaceChild(j(g),d);var h=h[2],r={};switch(f[1][0]){case "DDown":case "DUp":r=c;break;case "DRight":case "DLeft":r=b;break;case "DOut":case "DIn":r=a}for(f=m.length;f--;)l(m[f],h[f],k[f]),r(m[f]);break;case "EContainer":l(d.childNodes[0],-h[2],f[2]);n(f[1],d.childNodes[0]);break;case "EHtml":g[1]!==e[1]&&(k=j(g),d.parentNode.replaceChild(k,d),d=k);"button"!==k.type&&(f=Value.getExcess(d),g[3]-=f[0],g[4]-=f[1]);break;case "EExternalHtml":g[1]!==e[1]&&d.parentNode.replaceChild(j(g),d)}g[3]!==e[3]&&(d.style.width=~~g[3]+"px");g[4]!==e[4]&&(d.style.height=~~g[4]+"px");g[5]!==e[5]&&(d.style.opacity=g[5]);2===g[6].length&&(f=ElmCode.Graphics.Color.extract(g[6][1]),f!==d.style.backgroundColor&&(d.style.backgroundColor=f));if(2===g[7].length&&-(1===e[7].length||g[7][1]!==e[7][1]))d.parentNode.href=g[7][1];g[1]=e[1]}}return{render:j,update:l,addTo:function(a,b){a.appendChild(b)},newElement:g,flowWith:h,goIn:a}}(),Elm=function(){var g=function(a,b,c){for(var g=a.kids,f=g.length;f--;)g[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;g(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,e=b.length;e--;)c=c(b[e].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(),g(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,f){this.id=Guid.guid();this.value=c?b(f.value):b;this.kids=[];this.recv=function(b,c){c&&(this.value=a(f.value)(this.value));-g(this,b,c)};f.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,d){var f=d&&!a(c.value);f&&(this.value=c.value);g(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);g(this,b,f)};a.kids.push(this)},n=function(a){return function(c){return function(e){e=new b(function(a){return function(b){return[a,b]}},[a,-e]);e=new h(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,h){h===a.id&&(this.changed=f);this.count+=1;2==this.count&&(this.changed&&(this.value=b.value),g(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,!1,e)},Fold1:function(b,c,e){return new a(b,c,!0,e)},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 n(new b(function(a){return!a},[a]))},dropWhen:n,dropRepeats:function(a){return new f(a)},sampleOn:function(a){return function(b){return new j(a,b)}}}}(),Dispatcher=function(){function g(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||g(a.kids[b]);return c}var c=null,b=0,a=[],h=null;return{initialize:function(){c=ElmCode.main();c.hasOwnProperty("recv")||(c=Elm.Input(c));h=c.value;for(var b=[],n=a.length;n--;)g(a[n])&&b.push(a[n]);a=b;document.getElementById("content").appendChild(Render.render(h));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,h,a);return h=a},[c])},notify:function(c,g){b+=1;for(var h=!1,l=a.length;l--;)h=a[l].recv(b,c,g)||h;return h},inputs:a}}(),Signal=function(){function g(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,h=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 n=Elm.Lift(function(a){return a[2]},[f]);n.defaultNumberOfKids=-0;var j=Elm.Input(!1),l=Elm.Input(!1),d=Elm.Input(Value.Tuple());b(document,"click",function(a){var b=Dispatcher.notify(l.id,!0),c=Dispatcher.notify(d.id,Value.Tuple());Dispatcher.notify(l.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,h(a))||this.removeEventListener("mousemove",arguments.callee,!1)});a={position:f,x:a,y:n,isClicked:l,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(g(a),c)}};var e=Elm.Input(Value.Tuple(window.innerWidth,window.innerHeight));e.defaultNumberOfKids=2;n=Elm.Lift(function(a){return a[1]},[e]);n.defaultNumberOfKids=-0;var u=Elm.Lift(function(a){return a[2]},[e]);u.defaultNumberOfKids=0;b(window,"resize",function(a){var b=document.getElementById("widthChecker").offsetWidth;Dispatcher.notify(e.id,Value.Tuple(b,window.innerHeight))||this.removeEventListener("resize",arguments.callee,!1)});var n={dimensions:e,width:n,height:u},q=function(a,b){return"Nil"===b[0]?b:b[1]===a?b[2]:["Cons",b[1],q(a,b[2])]},s=Elm.Input(["Nil"]),k=Elm.Input(["Nothing"]);b(document,"keydown",function(a){var b;a:{for(b=s.value;"Nil"!==b[0];){if(b[1]===-a.keyCode){b=!0;break a}b=b[2]}b=!1}b||Dispatcher.notify(s.id,["Cons",a.keyCode,s.value])||this.removeEventListener("keydown",arguments.callee,!1)});b(document,"keyup",function(a){var b=q(a.keyCode,s.value);Dispatcher.notify(s.id,b)||this.removeEventListener("keyup",arguments.callee,!1)});b(window,"blur",function(a){Dispatcher.notify(s.id,["Nil"])||this.removeEventListener("blur",arguments.callee,!1)});b(document,"keypress",function(a){var b=Dispatcher.notify(k.id,["Just",a.charCode||a.keyCode]);-Dispatcher.notify(k.id,["Nothing"]);b||this.removeEventListener("keypress",arguments.callee,!1)});var u={Raw:{keysDown:s,charPressed:k}},m;m=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 r=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])}};m={get:m("GET"),post:m("POST"),gets:r("GET"),posts:r("POST")};var v=function(a,d){a.placeholder=Foreign.JavaScript.castStringToJSString(d);var e=Elm.Input(["Nil"]);b(a,"keyup",function(){Dispatcher.notify(e.id,c(a.value));a.focus()});a.style.padding="1px";return Value.Tuple(g(a),e)},p=function(a){a=document.createElement(a);a.style.padding=-"0";a.style.margin="0";return a},t=function(a){for(var c=p("select"),d=[];"Cons"===a[0];){var e=p("option"),f=Text.toText(a[1][1]);e.value=f;e.innerHTML=f;c.appendChild(e);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(g(c),h)};return{addListener:b,Mouse:a,Keyboard:u,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:n,HTTP:m,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=-p("textarea");c.rows=b;c.cols=a;return v(c,"")}},textField:function(a){var b=p("input");b.type="text";return v(b,a)},password:function(a){var b=p("input");b.type="password";return v(b,a)},checkbox:function(a){var c=p("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(g(c),d)},dropDown:t,stringDropDown:function(a){return t(List.map(function(a){return Value.Tuple(a,a)})(a))},button:function(a){var c=p("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(g(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)}}},foldp_:function(a){return function(b){return function(c){return Elm.Fold1(a,b,c)}}},foldp1:function(a){return function(b){return Elm.Fold1(a,function(a){return a},b)}},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 g=-function(c){return function(b){var a=c%b,a=0==c?0:0<b?0<=c?a:a+b:-g(-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:g,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,foldp1:Signal.foldp1,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(g){console.log(g.value)});Signal.addListener(document,"elm_title",function(g){document.title=g.value});-Signal.addListener(document,"elm_redirect",function(g){0<g.value.length&&(window.location=g.value)});var includeGlobal=this;-(function(){var g=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])}};g(Element);g(Text);color=Element.color;height=Element.height;show=Value.show;g(ElmCode.Graphics.Color);g(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;
+ elm-runtime-0.5.0.js view
@@ -0,0 +1,123 @@+var Guid=function(){var e=0;return{guid:function(){return e+=1}}}(),Elm=Elm||{};+Elm.JavaScript=function(){function e(a){for(var b=["Nil"],k=a.length;k--;)b=["Cons",a[k],b];return b}function a(a){for(var b=[];"Cons"===a[0];)b.push(a[1]),a=a[2];return b}function d(a){return a.slice(1)}function j(a){return["Tuple"+a.length].concat(a)}return{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(k){return["Element",Guid.guid(),["EExternalHtml",k],a,b,1,Nothing,Nothing]}}},castElementToJSElement:function(a){return Render.render(a)}},castJSArrayToList:e,castListToJSArray:a,castJSStringToString:e,castStringToJSString:function(d){return"string"===typeof d?d:a(d).join("")},castTupleToJSTuple2:d,castTupleToJSTuple3:d,castTupleToJSTuple4:d,castTupleToJSTuple5:d,castJSTupleToTuple2:j,castJSTupleToTuple3:j,castJSTupleToTuple4:j,+castJSTupleToTuple5:j}}();var Elm=Elm||{},JSjson=JSON;+Elm.JSON=function(){function e(b,a){return function(g){return function(h){var c=j.castStringToJSString(g);return h[1].hasOwnProperty(c)&&(h=h[1][c],h[0]===b)?h[1]:a}}}function a(b){return function(a){function g(b){switch(b[0]){case "JsonNull":return null;case "JsonString":return j.castStringToJSString(b[1]);case "JsonObject":var c={},b=b[1][1],i;for(i in b)c[i]=g(b[i]);return c;case "JsonArray":c=j.castListToJSArray(b[1]);for(i=c.length;i--;)c[i]=g(c[i]);return c;default:return b[1]}}return JSjson.stringify(g(["JsonObject",+a]),null,j.castStringToJSString(b))}}function d(b){function a(b){switch(typeof b){case "string":return["JsonString",j.castJSStringToString(b)];case "number":return["JsonNumber",j.castJSNumberToFloat(b)];case "boolean":return["JsonBool",j.castJSBoolToBool(b)];case "object":if(null===b)return["JsonNull"];for(var c in b)b[c]=a(b[c]);return b instanceof Array?["JsonArray",j.castJSArrayToList(b)]:["JsonObject",["JSON",b]]}}var b=JSjson.parse(b),g;for(g in b)b[g]=a(b[g]);return["JSON",b]}var j=Elm.JavaScript,+f=["JSON",{}];return{empty:f,singleton:function(b){return function(a){var g={};g[j.castStringToJSString(b)]=a;return["JSON",g]}},insert:function(b){return function(a){return function(g){var g=g[1],h={},c;for(c in g)h[c]=g[c];h[j.castStringToJSString(b)]=a;return["JSON",h]}}},lookup:function(b){return function(a){var g=j.castStringToJSString(b);return a[1].hasOwnProperty(g)?Just(a[1][g]):Nothing}},findString:e("JsonString",["Nil"]),findObject:e("JsonObject",f),findArray:e("JsonArray",["Nil"]),findWithDefault:function(b){return function(a){return function(g){var h=+j.castStringToJSString(a);return g[1].hasOwnProperty(h)?g[1][h]:b}}},remove:function(b){return function(a){var a=a[1],g={},h;for(h in a)g[h]=a[h];delete g[j.castStringToJSString(b)];return["JSON",g]}},toPrettyJSString:a,toJSString:a(""),fromJSString:d,toPrettyString:function(b){return function(d){return j.castJSStringToString(a(b)(d))}},toString:function(b){return j.castJSStringToString(a("")(b))},fromString:function(b){return d(j.castStringToJSString(b))},toList:function(b){var b=b[1],a=[],g;for(g in b)a.push(Value.Tuple(j.castJSStringToString(g),+b[g]));return j.castJSArrayToList(a)},fromList:function(b){for(var b=j.castListToJSArray(b),a={},g=b.length;g--;)a[j.castStringToJSString(b[g][1])]=b[g][2];return["JSON",a]},JsonString:function(b){return["JsonString",b]},JsonNumber:function(b){return["JsonNumber",b]},JsonBool:function(b){return["JsonBool",b]},JsonNull:["JsonNull"],JsonArray:function(b){return["JsonArray",b]},JsonObject:function(b){return["JsonObject",b]}}}();+var Value=function(){function e(b){if(0==b.length)return b;for(var b=b.replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(/\n/g,"<br/>"),b=b.split("<br/>"),a=b.length;a--;){var g=b,h=a,c;c=b[a];if(0!=c.length){c=c.split("");" "==c[0]&&(c[0]=" ");for(var i=c.length;--i;)" "==c[i][0]&&" "==c[i-1]&&(c[i-1]+=c[i],c[i]="");for(i=c.length;i--;)if(1<c[i].length&&" "==c[i][0]){for(var t=c[i].split(""),d=t.length-2;0<=d;d-=2)t[d]=" ";c[i]=t.join("")}c=+c.join("");c=" "===c[c.length-1]?c.slice(0,-1)+" ":c}g[h]=c}return b.join("<br/>")}var a=function(b,d){if("object"===typeof b){if(b===d)return!0;if(b.length!==d.length)return!1;for(var g=b.length;g--;)if(!a(b[g],d[g]))return!1;return!0}return b===d},d=function(b){if("boolean"===typeof b)return b?"True":"False";if("number"!==typeof b){if("string"===typeof b&&2>b.length)return"'"+b+"'";if(b[0]){if("Tuple"===b[0].substring(0,5)){for(var a="",g=b.length;--g;)a=","+d(b[g])+a;","===a[0]&&(a=a.substring(1));+return"("+a+")"}if("Cons"===b[0])for(var g="string"===typeof b[1]?'"':"]",h="string"===typeof b[1]?"":",",c="string"===typeof b[1]?function(c){return c}:d,a=("string"===typeof b[1]?'"':"[")+c(b[1]),b=b[2];;)if("Cons"===b[0])a+=h+c(b[1]),b=b[2];else return a+g;else{if("Nil"===b[0])return"[]";if("JSON"===b[0])return"(JSON.fromList "+d(Elm.JSON.toList(b))+")";if("RBNode"===b[0]||"RBEmpty"===b[0])return"(Map.fromList "+d(Elm.Dict.fold(function(c){return function(b){return function(a){return["Cons",["Tuple2",+c,b],a]}}})(["Nil"])(b))+")";a="";for(g=b.length;--g;)a=" "+d(b[g])+a;a=b[0]+a;return 1<b.length?"("+a+")":a}}}return b+""},j=function(b){for(var a=["Nil"],d=b.length;d--;)a=["Cons",b[d],a];return a},f;f=document.addEventListener?function(b,a,d){b.addEventListener(a,d,!1)}:function(b,a,d){b.attachEvent("on"+a,d)};return{eq:a,str:j,show:function(b){return j(d(b))},Tuple:function(){var b=arguments.length,a=Array(b+1);for(a[0]="Tuple"+arguments.length;b--;)a[b+1]=arguments[b];return a},append:function(b,+a){if("string"===typeof b&&"string"===typeof a)return b.concat(a);if("Nil"===b[0])return a;for(var d=["Cons",b[1],["Nil"]],h=d,b=b[2];"Cons"===b[0];)h[2]=["Cons",b[1],["Nil"]],b=b[2],h=h[2];h[2]=a;return d},listToArray:function(b){for(var a=[];"Cons"===b[0];)a.push(b[1]),b=b[2];return a},toText:function(b){if("string"===typeof b)return e(b);for(var a=[];"Cons"===b[0];)a.push(b[1]),b=b[2];return e(a.join(""))},properEscape:e,getTextSize:function(b,a,d){var h=document.createElement("div");h.innerHTML=+d;h.style.textAlign="left";0<b&&(h.style.width=b+"px");h.style.visibility="hidden";h.style.styleFloat="left";h.style.cssFloat="left";document.body.appendChild(h);d=window.getComputedStyle(h);b=d.getPropertyValue("width").slice(0,-2)-0;d=d.getPropertyValue("height").slice(0,-2)-0;document.body.removeChild(h);delete h;return[Math.ceil(b),Math.ceil(Math.max(a,d))]},getSize:function(b){b=b.cloneNode(!0);b.style.visibility="hidden";b.style.styleFloat="left";b.style.cssFloat="left";document.body.appendChild(b);+var a=b.offsetWidth,d=b.offsetHeight;document.body.removeChild(b);delete b;return[a,d]},getExcess:function(b){b=b.cloneNode(!0);b.style.visibility="hidden";b.style.styleFloat="left";b.style.cssFloat="left";document.body.appendChild(b);var a=b.offsetWidth,d=b.offsetHeight,h=window.getComputedStyle(b),c=h.getPropertyValue("width").slice(0,-2)-0,h=h.getPropertyValue("height").slice(0,-2)-0;document.body.removeChild(b);delete b;return[a-c,d-h]},groupForms:function(a){for(var a=Elm.JavaScript.castListToJSArray(a),+d=[],g=[],h=a.length;h--;){var c=a[h];switch(c[4][0]){case "FElement":0<g.length&&(d.push(g),g=[]);d.push(c);break;default:g.push(c)}}0<g.length&&d.push(g);return d},wrap:function(a){var d=Value.getSize(a);return["Element",Guid.guid(),["EHtml",a],d[0],d[1],1,Nothing,Nothing]},addListener:f}}(),Elm=Elm||{};+Elm.List=function(){function e(a){return function(b){if("Nil"===b[0])return b;"Cons"!==b[0]&&c("map");for(var i=["Cons",a(b[1]),["Nil"]],d=i,b=b[2];"Cons"===b[0];)d[2]=["Cons",a(b[1]),["Nil"]],b=b[2],d=d[2];return i}}function a(a){return function(b){return function(i){var d=b;if("Nil"===i[0])return d;for("Cons"!==i[0]&&c("foldl");"Cons"===i[0];)d=a(i[1])(d),i=i[2];return d}}}function d(a){return function(b){return function(i){var d=b;if("Nil"===i[0])return d;"Cons"!==i[0]&&c("foldr");for(var h=[];"Cons"===+i[0];)h.push(i[1]),i=i[2];for(i=h.length;i--;)d=a(h[i])(d);return d}}}function j(c){return function(b){var i;"Cons"!==b[0]?i=void 0:(i=b[1],b=b[2],i=a(c)(i)(b));return i}}function f(a){return function(b){return function(i){if("Nil"===i[0])return["Cons",b,["Nil"]];"Cons"!==i[0]&&c("scanl");for(var d=[b];"Cons"===i[0];)b=a(i[1])(b),d.push(b),i=i[2];for(var i=["Nil"],h=d.length;h--;)i=["Cons",d[h],i];return i}}}function b(c){return function(a){a:{for(var i=[function(c){return"Nil"!==c[0]?void 0:["Tuple2",+["Nil"],["Nil"]]},function(a){if("Cons"===a[0]){var i=a[1],a=a[2];var d=b(c)(a);"Tuple2"!==d[0]?i=void 0:(a=d[1],d=d[2],i=c(i)?["Tuple2",["Cons",i,a],d]:["Tuple2",a,["Cons",i,d]]);return i}}],d=i.length;d--;){var h=i[d](a);if(void 0!==h){a=h;break a}}a=void 0}return a}}function k(c){a:{for(var a=[function(c){return"Nil"!==c[0]?void 0:["Tuple2",["Nil"],["Nil"]]},function(c){if("Cons"!==c[0])c=void 0;else if(c=["Tuple2",c[1],k(c[2])],"Tuple2"!==c[0]||"Tuple2"!==c[1][0])c=void 0;else var a=c[1][1],b=+c[1][2],c="Tuple2"!==c[2][0]?void 0:["Tuple2",["Cons",a,c[2][1]],["Cons",b,c[2][2]]];return c}],b=a.length;b--;){var i=a[b](c);if(void 0!==i){c=i;break a}}c=void 0}return c}function g(c){return function(a){a:{for(var b=[function(c){return"Nil"!==c[0]?void 0:["Nil"]},function(c){if("Cons"===c[0]){var a=c[1];return"Nil"!==c[2][0]?void 0:["Cons",a,["Nil"]]}},function(a){if("Cons"===a[0]){var b=a[1];if("Cons"===a[2][0]){var i=a[2][1],a=a[2][2];return["Cons",b,["Cons",c,g(c)(["Cons",i,a])]]}}}],i=b.length;i--;){var d=+b[i](a);if(void 0!==d){a=d;break a}}a=void 0}return a}}function h(c){return function(a){a:{for(var b=[function(c){return"Nil"!==c[0]?void 0:["Nil"]},function(c){if("Cons"===c[0]){var a=c[1];return"Nil"!==c[2][0]?void 0:a}},function(a){if("Cons"===a[0]){var b=a[1];if("Cons"===a[2][0]){var i=a[2][1],a=a[2][2];return Value.append(b,Value.append(c,h(c)(["Cons",i,a])))}}}],i=b.length;i--;){var d=b[i](a);if(void 0!==d){a=d;break a}}a=void 0}return a}}var c=function(c){throw"Function '"+c+"' expecting a list!";+},i=a(function(c){return function(a){return["Cons",c,a]}})(["Nil"]),t=d(function(c){return function(a){return Value.append(c,a)}})(["Nil"]),m=a(function(c){return function(a){return c&&a}})(!0),r=a(function(c){return function(a){return c||a}})(!1),n=a(function(c){return function(a){return c+a}})(0),l=a(function(c){return function(a){return c*a}})(1),v=j(function(c){return function(a){return Math.max(c,a)}}),s=j(function(c){return function(a){return Math.min(c,a)}});return{head:function(c){if("Cons"!==+c[0])throw"Error: 'head' only accepts lists of length greater than one.";return c[1]},tail:function(c){if("Cons"!==c[0])throw"Error: 'tail' only accepts lists of length greater than one.";return c[2]},last:function(c){if("Cons"!==c[0])throw"Error: 'last' only accepts lists of length greater than one.";for(var a=c[1];"Cons"===c[0];)a=c[1],c=c[2];return a},map:e,foldl:a,foldr:d,foldl1:j,foldr1:function(a){return function(b){if("Nil"===b[0])throw"'foldr1' requires an non-empty list.";"Cons"!==b[0]&&+c("foldr1");for(var i=[];"Cons"===b[0];)i.push(b[1]),b=b[2];for(var b=i.pop(),d=i.length;d--;)b=a(i[d])(b);return b}},scanl:f,scanl1:function(c){return function(a){if("Cons"!==a[0])throw"Error: 'scanl1' requires a list of at least length 1.";return f(c)(a[1])(a[2])}},filter:function(a){return function(b){if("Nil"===b[0])return b;"Cons"!==b[0]&&c("filter");for(var i=[];"Cons"===b[0];)a(b[1])&&i.push(b[1]),b=b[2];for(var b=["Nil"],d=i.length;d--;)b=["Cons",i[d],b];return b}},length:function(c){for(var a=+0;"Cons"===c[0];)a+=1,c=c[2];return a},reverse:i,concat:t,concatMap:function(c){return function(a){return t(e(c)(a))}},and:m,or:r,all:function(c){return a(function(a){return function(b){return b&&c(a)}})(!0)},any:function(c){return a(function(a){return function(b){return b||c(a)}})(!1)},sum:n,product:l,maximum:v,minimum:s,partition:b,zipWith:function(a){return function(b){return function(i){if("Nil"===b[0]||"Nil"===i[0])return["Nil"];("Cons"!==b[0]||"Cons"!==i[0])&&c("zipWith");for(var d=[];"Cons"===+b[0]&&"Cons"===i[0];)d.push(a(b[1])(i[1])),b=b[2],i=i[2];for(var i=["Nil"],h=d.length;h--;)i=["Cons",d[h],i];return i}}},zip:function(a){return function(b){if("Nil"===a[0]||"Nil"===b[0])return["Nil"];("Cons"!==a[0]||"Cons"!==b[0])&&c("zip");for(var i=[];"Cons"===a[0]&&"Cons"===b[0];)i.push(["Tuple2",a[1],b[1]]),a=a[2],b=b[2];for(var b=["Nil"],d=i.length;d--;)b=["Cons",i[d],b];return b}},unzip:k,intersperse:g,intercalate:h,sort:function(a){if("Nil"===a[0])return a;"Cons"!==a[0]&&c("sort");for(var b=+[];"Cons"===a[0];)b.push(a[1]),a=a[2];b.sort(function(c,a){return c-a});for(var a=["Nil"],i=b.length;i--;)a=["Cons",b[i],a];return a},take:function(a){return function(b){if(0>=a)return["Nil"];if("Nil"===b[0])return b;"Cons"!==b[0]&&c("take");var i=["Cons",b[1],["Nil"]],d=i,b=b[2];for(--a;"Cons"===b[0]&&0<a;)d[2]=["Cons",b[1],["Nil"]],d=d[2],b=b[2],--a;return i}},drop:function(a){return function(b){if("Nil"===b[0])return b;for("Cons"!==b[0]&&c("drop");"Cons"===b[0]&&0<a;)b=b[2],--a;return b}}}}();+Elm=Elm||{};+Elm.Maybe=function(){function e(a){return function(e){return"Just"===a[0]?["Cons",a[1],e]:e}}function a(a){return function(e){return function(f){var b=a(e);return"Just"===b[0]?["Cons",b[1],f]:f}}}return{Just:function(a){return["Just",a]},Nothing:["Nothing"],catMaybes:Elm.List.foldr(e)(["Nil"]),isJust:function(a){return"Just"===a[0]},isNothing:function(a){return"Nothing"===a[0]},fromMaybe:function(a){return function(e){return"Just"===e[0]?e[1]:a}},consMaybe:e,mapMaybe:function(d){return Elm.List.foldr(a(d))(["Nil"])},maybe:function(a){return function(e){return function(f){return"Just"===+f[0]?e(f[1]):a}}}}}();+(function(){for(var e in Elm)this[e]=Elm[e];if(Elm.Dict)throw"Module name collision, 'Dict' is already defined.";Elm.Dict=function(){function a(a){return function(c){return function(b){return function(i){return function(d){return["RBNode",a,c,b,i,d]}}}}}function d(a){return function(){switch(a[0]){case "RBEmpty":return z(Value.str("(min RBEmpty) is not defined"));case "RBNode":switch(a[4][0]){case "RBEmpty":return["Tuple2",a[2],a[3]]}return d(a[4])}throw"Non-exhaustive pattern match in case";}()}+function e(a){return function(c){var b;a:{switch(c[0]){case "RBEmpty":b=Nothing;break a;case "RBNode":b=function(){switch(compare(a)(c[2])[0]){case "EQ":return Just(c[3]);case "GT":return e(a)(c[5]);case "LT":return e(a)(c[4])}throw"Non-exhaustive pattern match in case";}();break a}throw"Non-exhaustive pattern match in case";}return b}}function f(a){return function(c){return function(b){var i;a:{switch(b[0]){case "RBEmpty":i=a;break a;case "RBNode":i=function(){switch(compare(c)(b[2])[0]){case "EQ":return b[3];+case "GT":return f(a)(c)(b[5]);case "LT":return f(a)(c)(b[4])}throw"Non-exhaustive pattern match in case";}();break a}throw"Non-exhaustive pattern match in case";}return i}}}function b(a){return function(c){return A(e(a)(c))}}function k(c){a:{switch(c[0]){case "RBNode":switch(c[5][0]){case "RBNode":c=a(c[1])(c[5][2])(c[5][3])(a(x)(c[2])(c[3])(c[4])(c[5][4]))(c[5][5]);break a}}c=z(Value.str("rotateLeft of a node without enough children"))}return c}function g(c){a:{switch(c[0]){case "RBNode":switch(c[4][0]){case "RBNode":c=+a(c[1])(c[4][2])(c[4][3])(c[4][4])(a(x)(c[2])(c[3])(c[4][5])(c[5]));break a}}c=z(Value.str("rotateRight of a node without enough children"))}return c}function h(c){a:{switch(c[0]){case "Black":c=x;break a;case "Red":c=C;break a}throw"Non-exhaustive pattern match in case";}return c}function c(c){a:{switch(c[0]){case "RBNode":switch(c[4][0]){case "RBNode":switch(c[5][0]){case "RBNode":c=a(h(c[1]))(c[2])(c[3])(a(h(c[4][1]))(c[4][2])(c[4][3])(c[4][4])(c[4][5]))(a(h(c[5][1]))(c[5][2])(c[5][3])(c[5][4])(c[5][5]));+break a}}}c=z(Value.str("color_flip called on a RBEmpty or RBNode with a RBEmpty child"))}return c}function i(a){a:switch(a[0]){case "RBNode":switch(a[5][0]){case "RBNode":switch(a[5][1][0]){case "Red":a=k(a);break a}}}a:switch(a[0]){case "RBNode":switch(a[4][0]){case "RBNode":switch(a[4][1][0]){case "Red":switch(a[4][4][0]){case "RBNode":switch(a[4][4][1][0]){case "Red":a=g(a);break a}}}}}a:switch(a[0]){case "RBNode":switch(a[4][0]){case "RBNode":switch(a[4][1][0]){case "Red":switch(a[5][0]){case "RBNode":switch(a[5][1][0]){case "Red":a=+c(a);break a}}}}}return a}function t(c){a:switch(c[0]){case "RBNode":switch(c[1][0]){case "Red":c=a(C)(c[2])(c[3])(c[4])(c[5]);break a}}return c}function m(c){return function(b){return function(d){var h=function(d){var t;a:{switch(d[0]){case "RBEmpty":t=a(x)(c)(b)(y)(y);break a;case "RBNode":t=function(){switch(compare(c)(d[2])[0]){case "EQ":return a(d[1])(d[2])(b)(d[4])(d[5]);case "GT":return a(d[1])(d[2])(d[3])(d[4])(h(d[5]));case "LT":return a(d[1])(d[2])(d[3])(h(d[4]))(d[5])}throw"Non-exhaustive pattern match in case";+}();t=i(t);break a}throw"Non-exhaustive pattern match in case";}return t};return t(h(d))}}}function r(c){a:{switch(c[0]){case "RBNode":switch(c[4][0]){case "RBNode":switch(c[4][1][0]){case "Red":c=!0;break a}}}c=!1}return c}function n(c){a:{switch(c[0]){case "RBNode":switch(c[4][0]){case "RBNode":switch(c[4][4][0]){case "RBNode":switch(c[4][4][1][0]){case "Red":c=!0;break a}}}}c=!1}return c}function l(b){if(not(r(b))&¬(n(b))){b=c(b);a:switch(b[0]){case "RBNode":b:switch(b[5][0]){case "RBNode":switch(b[5][4][0]){case "RBNode":switch(b[5][4][1][0]){case "Red":b=+c(k(a(b[1])(b[2])(b[3])(b[4])(g(b[5]))));break b}}}break a}}return b}function v(b){return function(h){var e;a:{switch(h[0]){case "RBEmpty":e=y;break a;case "RBNode":if("LT"===compare(b)(h[2])[0]){e=l(h);b:{switch(e[0]){case "RBEmpty":e=z(Value.str("delLT on RBEmpty"));break b;case "RBNode":e=i(a(e[1])(e[2])(e[3])(del(e[4]))(e[5]));break b}break}}else{h=r(h)?g(h):h;b:{switch(h[0]){case "RBNode":switch(h[5][0]){case "RBEmpty":h=eq(b,h[2]);break b}}h=!1}if(h)e=y;else{var h=not,j;b:{switch(e[0]){case "RBNode":switch(e[5][0]){case "RBNode":switch(e[5][1][0]){case "Red":j=+!0;break b}}}j=!1}if(h=h(j)){h=not;b:{switch(e[0]){case "RBNode":switch(e[5][0]){case "RBNode":switch(e[5][4][0]){case "RBNode":switch(e[5][4][1][0]){case "Red":j=!0;break b}}}}j=!1}h=h(j)}h&&(e=c(e),e=n(e)?c(g(e)):e);b:{switch(e[0]){case "RBNode":h=eq(b,e[2]);break b}h=!1}if(h)b:{switch(e[0]){case "RBEmpty":e=z(Value.str("delEQ called on a RBEmpty"));break b;case "RBNode":j=d(e[5]);c:{switch(j[0]){case "Tuple2":h=j[1];break c}break}c:{switch(j[0]){case "Tuple2":j=j[2];break c}break}var h=a(e[1])(h)(j)(e[4]),+f=function(c){a:{switch(c[0]){case "RBNode":switch(c[4][0]){case "RBEmpty":c=y;break a}}c=l(c);b:{switch(c[0]){case "RBEmpty":c=y;break b;case "RBNode":c=i(a(c[1])(c[2])(c[3])(f(c[4]))(c[5]));break b}throw"Non-exhaustive pattern match in case";}}return c};e=t(f(e[5]));e=i(h(e));break b}break}else b:{switch(e[0]){case "RBEmpty":e=z(Value.str("delGT called on a RBEmpty"));break b;case "RBNode":e=i(a(e[1])(e[2])(e[3])(e[4])(del(e[5])));break b}break}}}break a}throw"Non-exhaustive pattern match in case";+}return t(e)}}function s(c){return function(b){a:{switch(b[0]){case "RBEmpty":b=y;break a;case "RBNode":b=a(b[1])(b[2])(c(b[3]))(s(c)(b[4]))(s(c)(b[5]));break a}throw"Non-exhaustive pattern match in case";}return b}}function p(c){return function(a){return function(b){a:{switch(b[0]){case "RBEmpty":b=a;break a;case "RBNode":b=p(c)(c(b[2])(b[3])(p(c)(a)(b[4])))(b[5]);break a}throw"Non-exhaustive pattern match in case";}return b}}}function q(c){return function(a){return function(b){a:{switch(b[0]){case "RBEmpty":b=+a;break a;case "RBNode":b=q(c)(c(b[2])(b[3])(q(c)(a)(b[5])))(b[4]);break a}throw"Non-exhaustive pattern match in case";}return b}}}var u=[],w;for(w in Elm.Prelude)0<=u.indexOf(w)||(this[w]=Elm.Prelude[w]);var A=Elm.Maybe.isJust,x=["Red"],C=["Black"],y=["RBEmpty"],B=y,z=console.log;return{empty:B,lookup:e,findWithDefault:f,member:b,insert:m,singleton:function(c){return function(a){return m(c)(a)(y)}},remove:v,map:s,foldl:p,foldr:q,union:function(c){return function(a){return p(m)(a)(c)}},intersect:function(c){return function(a){return p(function(c){return function(i){return function(d){return b(c)(a)?+m(c)(i)(d):d}}})(B)(c)}},diff:function(c){return function(a){return p(function(c){return function(){return function(a){return v(c)(a)}}})(c)(a)}},keys:function(c){return p(function(c){return function(){return function(a){return["Cons",c,a]}}})(["Nil"])(c)},values:function(c){return p(function(){return function(c){return function(a){return["Cons",c,a]}}})(["Nil"])(c)},toList:function(c){return p(function(c){return function(a){return function(b){return["Cons",["Tuple2",c,a],b]}}})(["Nil"])(c)},fromList:function(c){return List.foldl(uncurry(m))(B)(c)}}}()})();+(function(){for(var e in Elm)this[e]=Elm[e];Elm.Set=function(){var a=[],d;for(d in Elm.Prelude)0<=a.indexOf(d)||(this[d]=Elm.Prelude[d]);a=Dict.empty;d=Dict.remove;var e=Dict.member,f=Dict.union,b=Dict.intersect,k=Dict.diff,g=Dict.keys,h=List.foldl(function(c){return function(a){return Dict.insert(c)(["Tuple0"])(a)}})(a);return{empty:a,singleton:function(c){return Dict.singleton(c)(["Tuple0"])},insert:function(c){return Dict.insert(c)(["Tuple0"])},remove:d,member:e,union:f,intersect:b,diff:k,toList:g,+fromList:h,foldl:function(c){return Dict.foldl(function(a){return function(){return function(b){return c(a)(b)}}})},foldr:function(c){return Dict.foldr(function(a){return function(){return function(b){return c(a)(b)}}})},map:function(c){return function(a){a=g(a);return h(List.map(c)(a))}}}}()})();Elm=Elm||{};+Elm.Char=function(){function e(a,b){return function(d){d=d.charCodeAt(0);return a<=d&&d<=b}}var a=e(48,57),d=e(97,102),j=e(65,70);return{fromCode:function(a){return String.fromCharCode(a)},toCode:function(a){return a.charCodeAt(0)},toUpper:function(a){return a.toUpperCase()},toLower:function(a){return a.toLowerCase()},toLocaleUpper:function(a){return a.toLocaleUpperCase()},toLocaleLower:function(a){return a.toLocaleLowerCase()},isLower:e(97,122),isUpper:e(65,90),isDigit:a,isOctDigit:e(48,55),isHexDigit:function(e){return a(e)||+d(e)||j(e)}}}();var String={toText:Value.toText,properEscape:Value.properEscape},Elm=Elm||{};+Elm.Color=function(){return{rgba:function(e){return function(a){return function(d){return function(j){return["Color",e,a,d,j]}}}},rgb:function(e){return function(a){return function(d){return["Color",e,a,d,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],complement:function(e){var a,+d=e[1]/255;a=e[2]/255;var j=e[3]/255,e=Math.max(d,a,j),f=Math.min(d,a,j),f=e-f,b=0;0===f?b=0:e===d?b=(a-j)/f%6:e===a?b=(j-d)/f+2:e===j&&(b=(d-a)/f+4);a=60*b;var d=e*(0===e?0:f/e),b=(a+180)%360/60,k=d*(1-Math.abs(b%2-1)),f=j=a=0;0<=b&&1>b?(a=d,j=k,f=0):1<=b&&2>b?(a=k,j=d,f=0):2<=b&&3>b?(a=0,j=d,f=k):3<=b&&4>b?(a=0,j=k,f=d):4<=b&&5>b?(a=k,j=0,f=d):5<=b&&6>b&&(a=d,j=0,f=k);e-=d;return["Color",Math.round(255*(a+e)),Math.round(255*(j+e)),Math.round(255*(f+e)),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,c){var b=c.length-1;if(!(0>=b))for(a.moveTo(c[b][1],c[b][2]);b--;)a.lineTo(c[b][1],c[b][2])}function a(a,c,b,d){0===a.length&&(a=[8,4]);var e=d.length-1;if(!(0>=e)){var g=d[e][1],j=d[e][2],l=0,f=0,k=0,p=0,q=0,u=0,w=a.length,A=!0,x=a[0];for(c.moveTo(g,j);e--;){l=d[e][1];f=d[e][2];k=l-g;p=f-j;for(q=Math.sqrt(k*k+p*p);x<=q;)g+=k*x/q,j+=p*x/q,c[A?"lineTo":"moveTo"](g,j),k=l-g,p=f-j,q=Math.sqrt(k*k+p*p),A=!A,u=(u+1)%w,x=a[u];0<q&&(c[A?"lineTo":"moveTo"](l,f),x-=q);g=+l;j=f}}c.strokeStyle=Elm.Color.extract(b);c.stroke()}function d(b,c,i,d,j){c.clearRect(0,0,i,d);for(i=j.length;i--;){var f=j[i],n=b,d=c,l=f[1],k=f[2],s=f[3][1],p=f[3][2],f=f[4];d.save();(0!==s||0!==p)&&d.translate(s,p);l!==~~l&&d.rotate(2*Math.PI*l);1!==k&&d.scale(k,k);d.beginPath();switch(f[0]){case "FLine":a:switch(n=d,l=f,f=l[3][1],l[1][0]){case "Solid":l=l[2];e(n,f);n.strokeStyle=Elm.Color.extract(l);n.stroke();break;case "Dotted":a([3,3],n,l[2],f);break a;case "Dashed":a([8,4],n,l[2],f);break a;+case "Custom":a(l[1][1],n,l[2],f)}break;case "FShape":a:switch(s=n,k=d,n=f[1],l=f[2],f=f[3][1],n[0]){case "Filled":n=k;e(n,f);n.fillStyle=Elm.Color.extract(l);n.fill();break a;case "Outlined":n=k;e(n,f);n.strokeStyle=Elm.Color.extract(l);n.stroke();break a;case "Textured":l=s;n=n[1];s=new Image;s.src=g.castStringToJSString(n);s.onload=l;e(k,f);k.fillStyle=k.createPattern(s,"repeat");k.fill();break a;case "CustomOutline":a(n[1],k,l,f)}break;case "FImage":l=d,k=f[1],s=f[2],f=f[3],p=new Image,p.onload=+n,p.src=g.castStringToJSString(f),l.drawImage(p,-k/2,-s/2,k,s)}d.restore()}}function j(a,c,b){var e=Render.newElement("canvas");e.style.width=~~a+"px";e.style.height=~~c+"px";e.style.display="block";e.width=~~a;e.height=~~c;if(e.getContext){var g=e.getContext("2d"),a=e.width,c=e.height;d(function(){d(this,g,a,c,b)},g,a,c,b);return e}e.innerHTML="Your browser does not support the canvas element.";return e}function f(a,c,b,d,e,g,j){var f=Render.render(j),b="translate("+(e-j[3]/2)+"px,"+(g-j[4]/2)+"px) "++(1===d?"":"scale("+d+","+d+")")+" "+(b===~~b?"":"rotate("+360*b+"deg)");f.style.transform=b;f.style.msTransform=b;f.style.MozTransform=b;f.style.webkitTransform=b;f.style.OTransform=b;b=Render.newElement("div");Render.addTo(b,f);b.style.width=~~a+"px";b.style.height=~~c+"px";b.style.overflow="hidden";return b}function b(a,c,b){if(!Value.eq(b,c)){var e=a.style.width.slice(0,-2)-0,g=a.style.height.slice(0,-2)-0;if("object"===typeof b[0]){if("object"===typeof c[0]&&a.getContext){var k=a.getContext("2d");+return d(function(){d(this,k,e,g,b)},k,e,g,b)}c=j(e,g,b);c.style.position="absolute";return a.parentNode.replaceChild(c,a)}c=f(e,g,b[1],b[2],b[3][1],b[3][2],b[4][1]);c.style.position="absolute";return a.parentNode.replaceChild(c,a)}}function k(a,c,b,d,e){var g=0,j,f=(a[1]-d[1])/b,a=(a[2]-d[2])/b;0!==c&&(c*=-2*Math.PI,b=f*Math.cos(c)-a*Math.sin(c),a=f*Math.sin(c)+a*Math.cos(c),f=b);if(0===e.length)return!1;j=e[0];for(b=e.length-1;b--;){c=e[b];d=j[1];j=j[2];var k=c[1],s=c[2];if(j<s)var p=j,q=s;else p=+s,q=j;if(d<k)var u=d,w=k;else u=k,w=d;p<a&&a<=q&&f<=w&&(f<=u||f<=(a-j)*(k-d)/(s-j)+d)&&++g;j=c}return 1===g%2}var g=Elm.JavaScript;return{collage:function(a,c,b){if(0===b.length)return j(a,c,[]);for(var d=Array(b.length),e=b.length;e--;){var g=b[e];d[e]="string"===typeof g[0]?f(a,c,g[1],g[2],g[3][1],g[3][2],g[4][1]):j(a,c,g)}return 1===b.length?d[0]:Render.flowWith(Render.goIn,function(c){return c},d)},updateCollage:function(a,c,d){if(1===d.length)return b(a,c[0],d[0]);for(var a=a.childNodes,e=a.length,+g=e;g--;)b(a[e-g-1],c[g],d[g])},insideForm:function(a){return function(c){var b=a[1],d=a[2];if(6>c.length){var e=c[3][1],g=c[3][2],j=0,f=c[2];switch(c[4][0]){case "FShape":for(var v=c[4][3][1],s=v.length;--s;)var p=v[s],j=Math.max(j,p[1]*p[1]+p[2]*p[2]);j*=f*f;break;case "FImage":v=f*c[4][1]/2;f=f*c[4][2]/2;j=v*v+f*f;break;case "FElement":v=f*c[4][1][3]/2,f=f*c[4][1][4]/2,j=v*v+f*f}c.push(function(a,c){var b=a-e,d=c-g;return b*b+d*d<j+1})}if(!c[5](b,d))return!1;var q,u;switch(c[4][0]){case "FShape":return k(a,+c[1],c[2],c[3],c[4][3][1]);case "FLine":return!1;case "FImage":q=c[4][1]/2;u=c[4][2]/2;break;case "FElement":q=c[4][1][3]/2,u=c[4][1][4]/2}return k(a,c[1],c[2],c[3],[[null,q,u],[null,-q,u],[null,-q,-u],[null,q,-u],[null,q,u]])}}}}(),Elm=Elm||{};+Elm.Graphics=function(){function e(a){return function(c){return["Position",a,c]}}function a(a){return function(c){return["EText",a,c]}}function d(a){return function(c){return["EFlow",a,l.castListToJSArray(c)]}}function j(a){return["Line",l.castListToJSArray(a)]}function f(a){return function(c){var b=l.castListToJSArray(a);0<b.length&&b.push(b[0]);return["Shape",b,c]}}function b(a){return function(c){return function(b){return function(d){return["Form",a,c,b,d]}}}}function k(a){return function(c){return function(b){return["FLine",+a,c,b]}}}function g(a){return function(c){return function(b){return["FShape",a,c,b]}}}function h(a,c,b,d,i,e){return["Element",Guid.guid(),a,c,b,d,i,e]}function c(a,c,b){return["Element",Guid.guid(),a,c,b,1,Nothing,Nothing]}function i(a){return~~a[3]}function t(a){return~~a[4]}function m(a){return function(b){return function(d){return c(["EImage",l.castStringToJSString(d)],a,b)}}}function r(a){return function(b){return c(A,a,b)}}function n(a){return function(c){return function(b){var d=map(function(b){return["Tuple2",+a/2*cos(2*(pi/50)*b),c/2*sin(2*(pi/50)*b)]}),i=49,e=["Nil"];if(0<=i){do e=["Cons",i,e];while(0<i--)}return f(d(e))(b)}}}var l=Elm.JavaScript,v=["DRight"],s=["DDown"],p=["DOut"],q=["Near"],u=["Mid"],w=["Far"],A=["EEmpty"],x=["Solid"],C=["Dotted"],y=["Dashed"],B=["Filled"],z=["Outlined"],D=e(q)(q),E=e(w)(q),F=e(q)(w),G=e(w)(w),H=e(q)(u),I=e(w)(u),q=e(u)(q),w=e(u)(w),u=e(u)(u);return{left:["DLeft"],right:v,down:s,up:["DUp"],inward:["DIn"],outward:p,topLeft:D,topRight:E,bottomLeft:F,bottomRight:G,midLeft:H,+midRight:I,midTop:q,midBottom:w,middle:u,middleAt:function(a){return function(c){return["PositionAt",a,c]}},topLeftAt:function(a){return function(c){return["PositionTL",a,c]}},topRightAt:function(a){return function(c){return["PositionTR",a,c]}},bottomLeftAt:function(a){return function(c){return["PositionBL",a,c]}},bottomRightAt:function(a){return function(c){return["PositionBR",a,c]}},absolute:function(a){return["Absolute",a]},relative:function(a){return["Relative",a]},width:function(a){return function(c){var b=+c[2];switch(b[0]){case "EImage":case "EVideo":return h(c[2],a,c[4]*a/c[3],c[5],c[6],c[7]);case "EText":return b=Value.getTextSize(a,c[4],b[2]),h(c[2],a,b[1],c[5],c[6],c[7])}return h(c[2],a,c[4],c[5],c[6],c[7])}},height:function(a){return function(c){switch(c[2][0]){case "EImage":case "EVideo":return h(c[2],c[3]*a/c[4],a,c[5],c[6],c[7])}return h(c[2],c[3],a,c[5],c[6],c[7])}},size:function(c){return function(a){return function(b){return h(b[2],c,a,b[5],b[6],b[7])}}},opacity:function(c){return function(a){return h(a[2],+a[3],a[4],c,a[6],a[7])}},color:function(c){return function(a){return h(a[2],a[3],a[4],a[5],Just(c),a[7])}},link:function(a){return function(c){return h(c[2],c[3],c[4],c[5],c[6],Just(l.castStringToJSString(a)))}},widthOf:i,heightOf:t,sizeOf:function(c){return["Tuple2",~~c[3],~~c[4]]},text:function(b){var d=Value.getTextSize(0,0,b);return c(a("left")(b),d[0],d[1])},asText:function(b){var b=monospace(Value.toText(Value.show(b))),d=Value.getTextSize(0,0,b);return c(a("left")(b),d[0],d[1])},plainText:function(b){var b=+Value.toText(b),d=Value.getTextSize(0,0,b);return c(a("left")(b),d[0],d[1])},centeredText:function(b){var d=Value.getTextSize(0,0,b);return c(a("center")(b),d[0],d[1])},justifiedText:function(b){var d=Value.getTextSize(0,0,b);return c(a("justify")(b),d[0],d[1])},rightedText:function(b){var d=Value.getTextSize(0,0,b);return c(a("right")(b),d[0],d[1])},image:m,images:function(c){var a=Elm.Signal.constant(r(0)(0)),c=Elm.Signal.lift(function(c){var c=l.castStringToJSString(c),b=new Image;b.onload=function(){Dispatcher.notify(a.id,+m(this.width)(this.height)(c))};b.src=c})(c);return Elm.Signal.lift2(function(c){return function(){return c}})(a)(c)},video:function(a){return function(b){return function(d){return c(["EVideo",l.castStringToJSString(d)],a,b)}}},fittedImage:function(a){return function(b){return function(d){return c(["EFittedImage",l.castStringToJSString(d)],a,b)}}},flow:function(a){return function(b){var e;e=map(i)(b);a:{switch(a[0]){case "DLeft":e=sum(e);break a;case "DRight":e=sum(e);break a}e=maximum(e)}var h;h=+map(t)(b);a:{switch(a[0]){case "DDown":h=sum(h);break a;case "DUp":h=sum(h);break a}h=maximum(h)}return c(d(a)(b),e,h)}},above:function(a){return function(b){return c(d(s)(["Cons",a,["Cons",b,["Nil"]]]),max(~~a[3])(~~b[3]),~~a[4]+~~b[4])}},below:function(a){return function(b){return c(d(s)(["Cons",b,["Cons",a,["Nil"]]]),max(~~a[3])(~~b[3]),~~a[4]+~~b[4])}},beside:function(a){return function(b){return c(d(v)(["Cons",a,["Cons",b,["Nil"]]]),~~a[3]+~~b[3],max(~~a[4])(~~b[4]))}},layers:function(a){return c(d(p)(a),+maximum(map(i)(a)),maximum(map(t)(a)))},collage:function(a){return function(b){return function(d){return c(["ECollage",a,b,Value.groupForms(d)],a,b)}}},spacer:r,container:function(a){return function(b){return function(d){return function(e){return c(["EContainer",d,e],a,b)}}}},line:j,segment:function(a){return function(c){return j(["Cons",a,["Cons",c,["Nil"]]])}},polygon:f,rect:function(a){return function(c){return function(b){return f(["Cons",["Tuple2",0-a/2,0-c/2],["Cons",["Tuple2",0-a/2,c/2],["Cons",+["Tuple2",a/2,c/2],["Cons",["Tuple2",a/2,0-c/2],["Nil"]]]]])(b)}}},oval:n,circle:function(a){return n(2*a)(2*a)},ngon:function(a){return function(c){return function(b){var d=toFloat(a),e=map(function(a){return["Tuple2",c*cos(2*(pi/d)*a),c*sin(2*(pi/d)*a)]}),i=a-1,h=["Nil"];if(0<=i){do h=["Cons",i,h];while(0<i--)}return f(e(h))(b)}}},solid:function(a){return function(c){return b(0)(1)(["Tuple2",0,0])(k(x)(a)(c))}},dotted:function(a){return function(c){return b(0)(1)(["Tuple2",0,0])(k(C)(a)(c))}},dashed:function(a){return function(c){return b(0)(1)(["Tuple2",+0,0])(k(y)(a)(c))}},customLine:function(a){return function(c){return function(d){return b(0)(1)(["Tuple2",0,0])(k(["Custom",l.castListToJSArray(a)])(c)(d))}}},filled:function(a){return function(c){return b(0)(1)(c[2])(g(B)(a)(c))}},outlined:function(a){return function(c){return b(0)(1)(c[2])(g(z)(a)(c))}},customOutline:function(a){return function(c){return function(d){return b(0)(1)(d[2])(g(["CustomOutline",l.castListToJSArray(a)])(c)(d))}}},textured:function(a){return function(c){return b(0)(1)(c[2])(g(["Textured",+a])(null)(c))}},sprite:function(a){return function(c){return function(d){return function(e){return b(0)(1)(e)(["FImage",c,d,l.castStringToJSString(a)])}}}},toForm:function(a){return function(c){return b(0)(1)(a)(["FElement",c])}},rotate:function(a){return function(c){a:{switch(c[0]){case "Form":var d=c[2],e=c[3],i=c[4],c=b(a+c[1])(d)(e)(i);break a}throw"Non-exhaustive pattern match in case";}return c}},scale:function(a){return function(c){return b(c[1])(a*c[2])(c[3])(c[4])}},move:function(a){return function(c){return function(d){var e;+a:{switch(d[0]){case "Form":e=d[1];var i=d[2],h=d[3],d=d[4];switch(h[0]){case "Tuple2":var g=h[1],h=h[2];e=b(e)(i)(["Tuple2",a+g,c+h])(d);break a}}throw"Non-exhaustive pattern match in case";}return e}}},isWithin:Collage.insideForm}}();Elm=Elm||{};+Elm.Text=function(){function e(a){return Value.toText(a)}var a=function(a){return function(b){return"<"+a+' style="padding:0;margin:0">'+b+"</"+a+">"}},d=function(a,b){return function(d){return"<span style='"+a+":"+b+"'>"+d+"</span>"}},j=function(a){a=Elm.JavaScript.castStringToJSString(a);return d("font-family",a)},f=a("h1"),b=d("font-style","italic"),a=a("b"),k=d("text-decoration","underline"),g=d("text-decoration","overline"),h=d("text-decoration","line-through");return{fromString:e,toText:e,header:f,+height:function(a){return d("font-size",a+"em")},italic:b,bold:a,underline:k,overline:g,strikeThrough:h,monospace:j("monospace"),typeface:j,color:function(a){return d("color",Elm.Color.extract(a))},link:function(a){return function(b){return"<a href='"+e(a)+"'>"+b+"</a>"}}}}();+var Render=function(){function e(a){a=document.createElement(a);a.style.padding="0";a.style.margin="0";return a}function a(a){return a}function d(a){a.style.styleFloat="left";a.style.cssFloat="left";return a}function j(a){a.style.position="absolute";return a}function f(a,b,d){for(var h=e("div"),g=d.length;g--;){var j=a(b(d[g]));h.appendChild(j)}return h}function b(a){switch(a[0]){case "Absolute":return a[1]+"px";case "Relative":return 100*a[1]+"%"}}function k(a,d){d.style.position="absolute";d.style.margin=+"auto";switch(a[0]){case "Position":"Far"!==a[1][0]&&(d.style.left=0);"Near"!==a[1][0]&&(d.style.right=0);"Far"!==a[2][0]&&(d.style.top=0);"Near"!==a[2][0]&&(d.style.bottom=0);break;case "PositionAt":d.style.top=b(a[2]);d.style.left=b(a[1]);var e="translate("+-elem[3]/2+"px,"+-elem[4]/2+"px)";d.style.transform=e;d.style.msTransform=e;d.style.MozTransform=e;d.style.webkitTransform=e;d.style.OTransform=e;break;default:e=a[0].slice(-2),d.style["T"===e[0]?"top":"bottom"]=b(a[2]),d.style["L"===e[1]?"left":+"right"]=b(a[1])}}function g(c){var b={};switch(c[2][0]){case "EText":var b=c[2][1],h=c[2][2],m=e("div");m.innerHTML=h;m.style.textAlign=b;b=m;break;case "EImage":b=c[2][1];h=e("img");h.src=b;h.name=b;h.style.display="block";b=h;break;case "EVideo":m=c[2][1];b=e("video");b.controls="controls";h=e("source");h.src=m;m=m.split(".");h.type="video/"+m[m.length-1];b.appendChild(h);b.style.display="block";break;case "EFittedImage":var r=c[3],n=c[4],b=c[2][1],l=e("canvas");l.style.display="block";l.style.width=+r+"px";l.style.height=n+"px";l.width=r;l.height=n;l.innerHTML="Your browser does not support the canvas element.";var v=e("img");v.onload=function(){if(l.getContext){var a=l.getContext("2d"),b=0,c=0,d=this.width,e=this.height;r/n>this.width/this.height?(e=this.width*n/r,c=(this.height-e)/2):(d=this.height*r/n,b=(this.width-d)/2);a.drawImage(v,b,c,d,e,0,0,l.width,l.height)}};v.src=b;b=l;break;case "EFlow":a:{b=c[2][2];switch(c[2][1][0]){case "DDown":b=b.slice(0).reverse();case "DUp":b=f(a,g,b);break a;+case "DRight":b=b.slice(0).reverse();case "DLeft":b=f(d,g,b);break a;case "DOut":b=b.slice(0).reverse();case "DIn":b=f(j,g,b);break a}b=void 0}break;case "ECollage":b=Collage.collage(c[2][1],c[2][2],c[2][3]);break;case "EEmpty":b=e("div");break;case "EContainer":h=c[2][1];b=g(c[2][2]);k(h,b);h=e("div");h.style.position="relative";h.style.overflow="hidden";h.appendChild(b);b=h;break;case "EHtml":b=c[2][1];"button"!==b.type&&(h=Value.getExcess(b),c[3]-=h[0],c[4]-=h[1]);break;case "EExternalHtml":b=+e("div"),b.appendChild(c[2][1])}b.id=c[1];b.style.width=~~c[3]+"px";b.style.height=~~c[4]+"px";1!==c[5]&&(b.style.opacity=c[5]);"Just"===c[6][0]&&(b.style.backgroundColor=Elm.Color.extract(c[6][1]));return"Just"===c[7][0]?(h=e("a"),h.href=c[7][1],h.appendChild(b),h):b}function h(b,e,f){"A"===b.tagName&&(b=b.firstChild);if(e[1]!==f[1]){if(e[2][0]!==f[2][0])return b.parentNode.replaceChild(g(f),b);var m=f[2],r=e[2];switch(m[0]){case "EText":m[1]!==r[1]&&(b.style.textAlign=m[1]);m[2]!==r[2]&&(b.innerHTML=+m[2]);break;case "EImage":m[1]!==r[1]&&(b.src=m[1]);break;case "EVideo":case "EFittedImage":if(!Value.eq(m,r)||f[3]!==e[3]||f[4]!==e[4])return b.parentNode.replaceChild(g(f),b);break;case "ECollage":if(m[1]!==r[1]||m[2]!==r[2]||m[3].length!==r[3].length)return b.parentNode.replaceChild(g(f),b);Collage.updateCollage(b,r[3],m[3]);break;case "EFlow":if(m[1]!==r[1])return b.parentNode.replaceChild(g(f),b);var n=m[2],l=b.childNodes;if(n.length!==l.length)return b.parentNode.replaceChild(g(f),b);var r=+r[2],v={};switch(m[1][0]){case "DDown":case "DUp":v=a;break;case "DRight":case "DLeft":v=d;break;case "DOut":case "DIn":v=j}for(m=l.length;m--;)h(l[m],r[m],n[m]),v(l[m]);break;case "EContainer":h(b.childNodes[0],r[2],m[2]);k(m[1],b.childNodes[0]);break;case "EHtml":f[1]!==e[1]&&(n=g(f),b.parentNode.replaceChild(n,b),b=n);"button"!==n.type&&(m=Value.getExcess(b),f[3]-=m[0],f[4]-=m[1]);break;case "EExternalHtml":f[1]!==e[1]&&b.parentNode.replaceChild(g(f),b)}f[3]!==e[3]&&(b.style.width=~~f[3]+"px");+f[4]!==e[4]&&(b.style.height=~~f[4]+"px");f[5]!==e[5]&&(b.style.opacity=f[5]);2===f[6].length&&(m=Elm.Color.extract(f[6][1]),m!==b.style.backgroundColor&&(b.style.backgroundColor=m));if(2===f[7].length&&(1===e[7].length||f[7][1]!==e[7][1]))b.parentNode.href=f[7][1];f[1]=e[1]}}return{render:g,update:h,addTo:function(a,b){a.appendChild(b)},newElement:e,flowWith:f,goIn:j}}(),Elm=Elm||{};+Elm.Signal=function(){var e=function(a,b,d){for(var e=a.kids,g=e.length;g--;)e[g].recv(b,d,a.id)},a=function(a){this.id=Guid.guid();this.value=a;this.kids=[];this.defaultNumberOfKids=0;this.recv=function(a,b,d){if(b=b===this.id)this.value=d;e(this,a,b);return b};Dispatcher.inputs.push(this)},d=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 d=a,e=b.length;e--;)d=d(b[e].value);this.value=d};this.recalc();this.recv=+function(a,d){this.count+=1;d&&(this.changed=!0);this.count==b.length&&(this.changed&&this.recalc(),e(this,a,this.changed),this.changed=!1,this.count=0)};for(var d=b.length;d--;)b[d].kids.push(this)},j=function(a,b,d,g){this.id=Guid.guid();this.value=d?b(g.value):b;this.kids=[];this.recv=function(b,c){c&&(this.value=a(g.value)(this.value));e(this,b,c)};g.kids.push(this)},f=function(a,b,d){this.id=Guid.guid();this.value=a(d.value)?b:d.value;this.kids=[];this.recv=function(b,c){var g=c&&!a(d.value);+g&&(this.value=d.value);e(this,b,g)};d.kids.push(this)},b=function(a){this.id=Guid.guid();this.value=a.value;this.kids=[];this.recv=function(b,d){var g=d&&!eq(this.value,a.value);g&&(this.value=a.value);e(this,b,g)};a.kids.push(this)},k=function(a){return function(b){return function(e){e=new d(function(a){return function(b){return[a,b]}},[a,e]);e=new f(function(a){return a[0]},[!0,b],e);return new d(function(a){return a[1]},[e])}}},g=function(a,b){this.id=Guid.guid();this.value=b.value;this.kids=+[];this.count=0;this.changed=!1;this.recv=function(d,g,f){f===a.id&&(this.changed=g);this.count+=1;2==this.count&&(this.changed&&(this.value=b.value),e(this,d,this.changed),this.count=0,this.changed=!1)};a.kids.push(this);b.kids.push(this)};return{constant:function(b){return new a(b)},lift:function(a){return function(b){return new d(a,[b])}},lift2:function(a){return function(b){return function(e){return new d(a,[b,e])}}},lift3:function(a){return function(b){return function(e){return function(g){return new d(a,+[b,e,g])}}}},lift4:function(a){return function(b){return function(e){return function(g){return function(f){return new d(a,[b,e,g,f])}}}}},foldp:function(a){return function(b){return function(d){return new j(a,b,!1,d)}}},foldp_:function(a){return function(b){return function(d){return new j(a,b,!0,d)}}},foldp1:function(a){return function(b){return new j(a,function(a){return a},!0,b)}},count:function(a){return new j(function(){return function(a){return a+1}},0,!1,a)},keepIf:function(a){return function(b){return function(d){return new f(function(b){return!a(b)},+b,d)}}},dropIf:function(a){return function(b){return function(d){return new f(a,b,d)}}},keepWhen:function(a){return k(new d(function(a){return!a},[a]))},dropWhen:k,dropRepeats:function(a){return new b(a)},sampleOn:function(a){return function(b){return new g(a,b)}}}}();+var Dispatcher=function(){function e(a){if(!a.hasOwnProperty("defaultNumberOfKids"))return!0;var d=a.kids.length;if(0==d)return!1;if(d>a.defaultNumberOfKids)return!0;for(var g=!1;d--;)g=g||e(a.kids[d]);return g}var a=null,d=0,j=[],f=null;return{initialize:function(){a=Elm.main();a.hasOwnProperty("recv")||(a=Elm.Signal.constant(a));f=a.value;for(var b=[],d=j.length;d--;)e(j[d])&&b.push(j[d]);j=b;document.getElementById("content").appendChild(Render.render(f));b=document.getElementById("widthChecker").offsetWidth;+b!==window.innerWidth&&Dispatcher.notify(Window.dimensions.id,Value.Tuple(b,window.innerHeight));a=Elm.Signal.lift(function(a){var b=document.getElementById("content");Render.update(b.firstChild,f,a);return f=a})(a)},notify:function(a,e){d+=1;for(var g=!1,f=j.length;f--;)g=j[f].recv(d,a,e)||g;return g},inputs:j}}();+Elm.HTTP=function(){function e(a){return function(b){return function(d){return function(c){return{"0":"Request",length:1,verb:f.castStringToJSString(a),url:f.castStringToJSString(b),data:null===d?null:f.castStringToJSString(d),headers:c}}}}}function a(a){return e("GET")(a)(null)(["Nil"])}function d(a){return function(d){Dispatcher.notify(a.id,["Waiting"]);var e=null;window.XMLHttpRequest?e=new XMLHttpRequest:window.ActiveXObject&&(e=new ActiveXObject("Microsoft.XMLHTTP"));e.onreadystatechange=function(){4===+e.readyState&&Dispatcher.notify(a.id,200===e.status?["Success",b(e.responseText)]:["Failure",e.status,b(e.statusText)])};e.open(d.verb,d.url,!0);Elm.List.map(function(a){e.setRequestHeader(f.castStringToJSString(a[1]),f.castStringToJSString(a[2]))})(d.headers);e.send(d.data);return null}}function j(a){var b=Elm.Signal.constant(["Waiting"]),a=Elm.Signal.lift(d(b))(a);return Elm.Signal.lift2(function(a){return function(){return a}})(b)(a)}var f=Elm.JavaScript,b=Elm.JavaScript.castJSStringToString;return{get:a,+post:function(a){return function(b){return e("POST")(a)(b)(["Nil"])}},request:e,send:j,sendGet:function(b){return j(Elm.Signal.lift(a)(b))}}}();+Elm.Input=function(){var e=Elm.JavaScript,a=Elm.JavaScript.castJSStringToString,d=function(b,d){b.placeholder=e.castStringToJSString(d);var g=Elm.Signal.constant(["Nil"]);Value.addListener(b,"keyup",function(){Dispatcher.notify(g.id,a(b.value));b.focus()});b.style.padding="1px";return Value.Tuple(Value.wrap(b),g)},j=function(a){a=document.createElement(a);a.style.padding="0";a.style.margin="0";return a},f=function(a){for(var d=j("select"),e=[];"Cons"===a[0];){var f=j("option"),c=Value.toText(a[1][1]);+f.value=c;f.innerHTML=c;d.appendChild(f);e.push(a[1][2]);a=a[2]}var i=Elm.Signal.constant(e[0]);Value.addListener(d,"change",function(){Dispatcher.notify(i.id,e[d.selectedIndex])});return Value.Tuple(Value.wrap(d),i)};return{textArea:function(a){return function(e){var f=j("textarea");f.rows=e;f.cols=a;return d(f,"")}},textField:function(a){var e=j("input");e.type="text";return d(e,a)},password:function(a){var e=j("input");e.type="password";return d(e,a)},checkbox:function(a){var d=j("input");d.type=+"checkbox";d.checked=a;var e=Elm.Signal.constant(a);Value.addListener(d,"change",function(){Dispatcher.notify(e.id,d.checked)});return Value.Tuple(Value.wrap(d),e)},dropDown:f,stringDropDown:function(a){return f(Elm.List.map(function(a){return Value.Tuple(a,a)})(a))},button:function(a){var d=j("input");d.type="button";d.value=e.castStringToJSString(a);var f=Elm.Signal.constant(!1);Value.addListener(d,"click",function(){Dispatcher.notify(f.id,!0);Dispatcher.notify(f.id,!1)});return Value.Tuple(Value.wrap(d),+f)}}}();+Elm.Keyboard={Raw:function(){function e(a,d){return"Nil"===d[0]?d:d[1]===a?d[2]:["Cons",d[1],e(a,d[2])]}var a=Elm.Signal.constant(["Nil"]),d=Elm.Signal.constant(["Nothing"]);Value.addListener(document,"keydown",function(d){var e;a:{for(e=a.value;"Nil"!==e[0];){if(e[1]===d.keyCode){e=!0;break a}e=e[2]}e=!1}e||Dispatcher.notify(a.id,["Cons",d.keyCode,a.value])||this.removeEventListener("keydown",arguments.callee,!1)});Value.addListener(document,"keyup",function(d){var f=e(d.keyCode,a.value);Dispatcher.notify(a.id,+f)||this.removeEventListener("keyup",arguments.callee,!1)});Value.addListener(window,"blur",function(d){Dispatcher.notify(a.id,["Nil"])||this.removeEventListener("blur",arguments.callee,!1)});Value.addListener(document,"keypress",function(a){var e=Dispatcher.notify(d.id,["Just",a.charCode||a.keyCode]);Dispatcher.notify(d.id,["Nothing"]);e||this.removeEventListener("keypress",arguments.callee,!1)});return{keysDown:a,charPressed:d}}()};+Elm.Mouse=function(){function e(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)}var a=Elm.Signal.constant(Value.Tuple(0,0));a.defaultNumberOfKids=2;var d=Elm.Signal.lift(function(a){return a[1]})(a);d.defaultNumberOfKids=0;var j=Elm.Signal.lift(function(a){return a[2]})(a);j.defaultNumberOfKids=+0;var f=Elm.Signal.constant(!1),b=Elm.Signal.constant(!1),k=Elm.Signal.constant(Value.Tuple());Value.addListener(document,"click",function(a){var d=Dispatcher.notify(b.id,!0),c=Dispatcher.notify(k.id,Value.Tuple());Dispatcher.notify(b.id,!1);!d&&!c&&this.removeEventListener("click",arguments.callee,!1)});Value.addListener(document,"mousedown",function(a){Dispatcher.notify(f.id,!0)||this.removeEventListener("mousedown",arguments.callee,!1)});Value.addListener(document,"mouseup",function(a){Dispatcher.notify(f.id,+!1)||this.removeEventListener("mouseup",arguments.callee,!1)});Value.addListener(document,"mousemove",function(b){Dispatcher.notify(a.id,e(b))||this.removeEventListener("mousemove",arguments.callee,!1)});return{position:a,x:d,y:j,isClicked:b,isDown:f,clicks:k,isClickedOn:function(a){var a=Render.render(a),b=Elm.Signal.constant(!1);Value.addListener(a,"click",function(){Dispatcher.notify(b.id,!0);Dispatcher.notify(b.id,!1)});return Value.Tuple(Value.wrap(a),b)}}}();+Elm.Random=function(){return{inRange:function(e){return function(a){return Elm.Signal.constant(Math.floor(Math.random()*(a-e+1))+e)}},randomize:function(e){return function(a){return function(d){return Elm.Signal.lift(function(){return Math.floor(Math.random()*(a-e+1))+e})(d)}}}}}();+Elm.Time=function(){return{every:function(e){var e=1E3*e,a=Elm.Signal.constant(0),d=0;setInterval(function(){d+=e;Dispatcher.notify(a.id,d/1E3)},e);return a},after:function(e){var e=1E3*e,a=Elm.Signal.constant(!1);setTimeout(function(){Dispatcher.notify(a.id,!0)},e);return a},before:function(e){var e=1E3*e,a=Elm.Signal.constant(!0);setTimeout(function(){Dispatcher.notify(a.id,!1)},e);return a}}}();+Elm.Window=function(){var e=Elm.Signal.constant(Value.Tuple(window.innerWidth,window.innerHeight));e.defaultNumberOfKids=2;var a=Elm.Signal.lift(function(a){return a[1]})(e);a.defaultNumberOfKids=0;var d=Elm.Signal.lift(function(a){return a[2]})(e);d.defaultNumberOfKids=0;Value.addListener(window,"resize",function(a){var d=document.getElementById("widthChecker").offsetWidth;Dispatcher.notify(e.id,Value.Tuple(d,window.innerHeight))||this.removeEventListener("resize",arguments.callee,!1)});return{dimensions:e,+width:a,height:d}}();Value.addListener(document,"elm_log",function(e){console.log(e.value)});Value.addListener(document,"elm_title",function(e){document.title=e.value});Value.addListener(document,"elm_redirect",function(e){0<e.value.length&&(window.location=e.value)});Elm=Elm||{};+Elm.Prelude=function(){var e=function(a){return function(d){var j=a%d,j=0==a?0:0<d?0<=a?j:j+d:-e(-a)(-d);return j==d?0:j}};return{eq:Value.eq,id:function(a){return a},not:function(a){return!a},fst:function(a){return a[1]},snd:function(a){return a[2]},rem:function(a){return function(d){return a%d}},div:function(a){return function(d){return~~(a/d)}},compare:function(a){return function(d){a="object"===typeof a?toText(a):a;d="object"===typeof d?toText(d):d;return[a===d?"EQ":a<d?"LT":"GT"]}},toFloat:function(a){return a},+round:function(a){return Math.round(a)},floor:function(a){return Math.floor(a)},ceiling:function(a){return Math.ceil(a)},truncate:function(a){return~~a},readInt:function(a){var a=JavaScript.castStringToJSString(a),d=a.length;if(0===d)return Nothing;var e=0;if("-"==a[0]){if(1===d)return Nothing;e=1}for(;e<d;++e)if(!Char.isDigit(a[e]))return Nothing;return Just(parseInt(a))},readFloat:function(a){var a=JavaScript.castStringToJSString(a),d=a.length;if(0===d)return Nothing;var e=0;if("-"==a[0]){if(1===+d)return Nothing;e=1}for(var f=0;e<d;++e)if(!Char.isDigit(a[e])){if("."===a[e]&&(f+=1,1>=f))continue;return Nothing}return Just(parseFloat(a))},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,atan2:function(a){return function(d){return Math.atan2(a,d)}},mod:e,min:function(a){return function(d){return Math.min(a,d)}},max:function(a){return function(d){return Math.max(a,d)}},flip:function(a){return function(d){return function(e){return a(e)(d)}}},+clamp:function(a){return function(d){return function(e){return Math.min(d,Math.max(a,e))}}},curry:function(a){return function(d){return function(e){return a(["Tuple2",d,e])}}},uncurry:function(a){return function(d){if("Tuple2"!==d[0])throw"Function was uncurry'd but was not given a pair.";return a(d[1])(d[2])}},logBase:function(a){return function(d){return Math.log(d)/Math.log(a)}},Just:Elm.Maybe.Just,Nothing:Elm.Maybe.Nothing,maybe:Elm.Maybe.maybe,map:Elm.List.map,filter:Elm.List.filter,head:Elm.List.head,+tail:Elm.List.tail,last:Elm.List.last,length:Elm.List.length,reverse:Elm.List.reverse,foldr:Elm.List.foldr,foldr1:Elm.List.foldr1,foldl:Elm.List.foldl,foldl1:Elm.List.foldl1,and:Elm.List.and,or:Elm.List.or,all:Elm.List.all,any:Elm.List.any,sum:Elm.List.sum,product:Elm.List.product,concat:Elm.List.concat,concatMap:Elm.List.concatMap,maximum:Elm.List.maximum,minimum:Elm.List.minimum,scanl:Elm.List.scanl,scanl1:Elm.List.scanl1,take:Elm.List.take,drop:Elm.List.drop,zip:Elm.List.zip,unzip:Elm.List.unzip,+lift:Elm.Signal.lift,lift2:Elm.Signal.lift2,lift3:Elm.Signal.lift3,lift4:Elm.Signal.lift4,foldp:Elm.Signal.foldp,foldp1:Elm.Signal.foldp1,foldp_:Elm.Signal.foldp_,constant:Elm.Signal.constant,count:Elm.Signal.count,keepIf:Elm.Signal.keepIf,dropIf:Elm.Signal.dropIf,keepWhen:Elm.Signal.keepWhen,dropWhen:Elm.Signal.dropWhen,dropRepeats:Elm.Signal.dropRepeats,sampleOn:Elm.Signal.sampleOn}}();+(function(){var e=function(a){for(var d in a)Elm.Prelude[d]=a[d]};e(Elm.Color);e(Elm.Text);e(Elm.Graphics);show=Value.show})();+(function(){for(var e in Elm)this[e]=Elm[e];Elm.Automaton=function(){function a(a){return["Automaton",a]}function d(a){return["DragFrom",a]}function e(b){return function(c){var d;a:{switch(b[0]){case "Automaton":d=b[1];break a}throw"Non-exhaustive pattern match in case";}var f;a:{switch(c[0]){case "Automaton":f=c[1];break a}throw"Non-exhaustive pattern match in case";}return a(function(a){var a=d(a),b;a:{switch(a[0]){case "Tuple2":b=a[1];break a}throw"Non-exhaustive pattern match in case";}a:{switch(a[0]){case "Tuple2":a=+a[2];break a}throw"Non-exhaustive pattern match in case";}var c=f(b);a:{switch(c[0]){case "Tuple2":b=c[1];break a}throw"Non-exhaustive pattern match in case";}a:{switch(c[0]){case "Tuple2":c=c[2];break a}throw"Non-exhaustive pattern match in case";}return["Tuple2",b,e(a)(c)]})}}function f(b){return a(function(a){var c=unzip(map(function(b){a:{switch(b[0]){case "Automaton":b=b[1](a);break a}throw"Non-exhaustive pattern match in case";}return b})(b)),d;a:{switch(c[0]){case "Tuple2":d=c[1];break a}throw"Non-exhaustive pattern match in case";+}a:{switch(c[0]){case "Tuple2":c=c[2];break a}throw"Non-exhaustive pattern match in case";}return["Tuple2",d,f(c)]})}function b(c){return a(function(a){return["Tuple2",c(a),b(c)]})}function k(b){return function(c){return a(function(a){a=c(a)(b);return["Tuple2",a,k(a)(c)]})}}function g(b){return function(c){return a(function(a){var d=c(a)(b);a:{switch(d[0]){case "Tuple2":a=d[1];break a}throw"Non-exhaustive pattern match in case";}a:{switch(d[0]){case "Tuple2":d=d[2];break a}throw"Non-exhaustive pattern match in case";+}return["Tuple2",a,g(d)(c)]})}}function h(a){return function(b){a:{switch(a[0]){case "Tuple2":b:{switch(b[0]){case "Tuple2":b=["Tuple2",a[1]-b[1],a[2]-b[2]];break b}break}break a}throw"Non-exhaustive pattern match in case";}return b}}function c(a){return function(b){var c;a:{switch(a[0]){case "Tuple2":b:{switch(b[0]){case "Tuple2":var e=function(a){return["Tuple2",b[2],["Tuple2",a,b[2]]]};c=function(){switch(b[1][0]){case "DragFrom":var c;a[1]?c=["Tuple2",uncurry(move)(h(a[2])(b[1][1]))(b[2]),["Tuple2",+d(b[1][1]),b[2]]]:(c=uncurry(move)(h(a[2])(b[1][1]))(b[2]),c=["Tuple2",c,["Tuple2",m,c]]);return c;case "Ignore":return e(a[1]?r:m);case "Listen":return e(not(a[1])?m:isWithin(a[2])(b[2])?d(a[2]):r)}throw"Non-exhaustive pattern match in case";}();break b}break}break a}throw"Non-exhaustive pattern match in case";}return c}}var i=[],t;for(t in Elm.Prelude)0<=i.indexOf(t)||(this[t]=Elm.Prelude[t]);var m=["Listen"],r=["Ignore"],i=k(0)(function(){return function(a){return 1+a}});return{Automaton:a,run:function(a){return function(b){a:{switch(a[0]){case "Automaton":b=+lift(fst)(foldp_(function(a){return function(b){a:{switch(b[0]){case "Tuple2":switch(b[2][0]){case "Automaton":b=b[2][1](a);break a}}throw"Non-exhaustive pattern match in case";}return b}})(a[1])(b));break a}throw"Non-exhaustive pattern match in case";}return b}},step:function(a){return function(b){a:{switch(a[0]){case "Automaton":b=a[1](b);break a}throw"Non-exhaustive pattern match in case";}return b}},composeAuto:e,combine:f,pure:b,init:k,init_:g,count:i,Listen:m,Ignore:r,DragFrom:d,vecSub:h,stepDrag:c,+draggable:function(a){return g(["Tuple2",m,a])(c)}}}()})();
src/Ast.hs view
@@ -13,6 +13,7 @@ type Imports = [(String, ImportMethod)] data ImportMethod = As String | Hiding [String] | Importing [String] + deriving (Eq,Ord) data Pattern = PData String [Pattern] | PVar String | PAnything
src/Compiler.hs view
@@ -101,10 +101,10 @@ toFilePath modul = map (\c -> if c == '.' then '/' else c) modul ++ ".elm" builtInModules =- concat [ map ("Data."++) [ "List", "Char", "Maybe" ]- , map ("Signal."++) [ "Mouse", "Keyboard.Raw"- , "Window", "Time", "HTTP", "Input", "Random" ]- , map ("Graphics."++) [ "Element", "Text", "Color" ]- , map ("Foreign.JavaScript"++) [ "", "JSON", "Experimental" ]- , [ "Prelude" ]+ concat [ [ "List", "Char", "Maybe", "Dict", "Set", "Automaton" ]+ , [ "Signal", "Mouse", "Keyboard.Raw"+ , "Window", "Time", "HTTP", "Input", "Random" ]+ , [ "Graphics", "Text", "Color" ]+ , map ("JavaScript"++) [ "", "Experimental" ]+ , [ "Prelude", "JSON" ] ]
src/Gen/Cases.hs view
@@ -1,16 +1,15 @@ -module Cases (caseToMatch, Match (..), Clause (..)) where +module Cases (caseToMatch, Match (..), Clause (..), matchSubst) where import Control.Arrow (first) import Control.Monad (liftM,foldM) -import Data.List (groupBy,sortBy) +import Data.List (groupBy,sortBy,lookup) +import Data.Maybe (fromMaybe) import Ast import Guid import Substitute -import System.IO.Unsafe - caseToMatch patterns = do v <- newVar match [v] (map (first (:[])) patterns) Fail @@ -27,6 +26,16 @@ data Clause = Clause String [String] Match deriving Show + +matchSubst :: [(String,String)] -> Match -> Match +matchSubst _ Break = Break +matchSubst _ Fail = Fail +matchSubst pairs (Seq ms) = Seq (map (matchSubst pairs) ms) +matchSubst pairs (Other e) = + Other $ foldr ($) e $ map (\(x,y) -> subst x (Var y)) pairs +matchSubst pairs (Match n cs m) = Match (varSubst n) (map clauseSubst cs) (matchSubst pairs m) + where clauseSubst (Clause c vs m) = Clause c (map varSubst vs) (matchSubst pairs m) + varSubst v = fromMaybe v (lookup v pairs) isCon (PData _ _ : _, _) = True isCon _ = False
src/Gen/CompileToJS.hs view
@@ -19,20 +19,24 @@ showErr err = mainEquals $ "text(monospace(" ++ msg ++ "))" where msg = show . concatMap (++"<br>") . lines $ err +indent = concatMap f+ where f '\n' = "\n "+ f c = [c]+ parens s = "(" ++ s ++ ")" braces s = "{" ++ s ++ "}" jsList ss = "["++ intercalate "," ss ++"]"-jsFunc args body = "function(" ++ args ++ "){" ++ body ++ "}"+jsFunc args body = "function(" ++ args ++ "){" ++ indent body ++ "}" assign x e = "\nvar " ++ x ++ "=" ++ e ++ ";" ret e = "\nreturn "++ e ++";" iff a b c = a ++ "?" ++ b ++ ":" ++ c -mainEquals s = globalAssign "ElmCode.main" (jsFunc "" (ret s))+mainEquals s = globalAssign "Elm.main" (jsFunc "" (ret s)) globalAssign m s = "\n" ++ m ++ "=" ++ s ++ ";" tryBlock escapees names e = - concat [ "\ntry{\n" ++ e ++ "\n\n} catch (e) {"- , "ElmCode.main=function() {"+ concat [ "\ntry{\n" ++ e ++ "\n} catch (e) {"+ , "Elm.main=function() {" , "var msg = ('<br/><h2>Your browser may not be supported. " ++ "Are you using a modern browser?</h2>' +" ++ " '<br/><span style=\"color:grey\">Runtime Error in " ++@@ -42,22 +46,27 @@ , "};}" ] where msg | escapees /= [] = concat [ "<br/><br/>The problem may stem from an improper usage of:<br/>"- , intercalate ", " escapees ]+ , intercalate ", " $ map (concatMap escape) escapees ] | otherwise = ""+ escape '\'' = "\\'"+ escape '"' = "\\\""+ escape c = [c] + jsModule (escapees, Module names exports imports stmts) = tryBlock escapees (tail modNames) $ concat- [ concatMap (\n -> globalAssign n $ n ++ " || {}") .+ [ "\nfor(var i in Elm) { this[i] = Elm[i]; }"+ , concatMap (\n -> globalAssign n $ n ++ " || {}") . map (intercalate ".") . drop 2 . inits $ take (length modNames - 1) modNames , "\nif (" ++ modName ++ ") throw \"Module name collision, '" ++ intercalate "." (tail modNames) ++ "' is already defined.\"; " , globalAssign modName $ jsFunc "" (includes ++body++ export) ++ "()" , mainEquals $ modName ++ ".main" ]- where modNames = if null names then ["ElmCode", "Main"]- else "ElmCode" : names+ where modNames = if null names then ["Elm", "Main"]+ else "Elm" : names modName = intercalate "." modNames- includes = concatMap jsImport $ map (first ("ElmCode."++)) imports+ includes = concatMap jsImport $ map (first ("Elm."++)) imports body = stmtsToJS stmts export = getExports exports stmts exps = if null exports then ["main"] else exports@@ -81,14 +90,13 @@ jsImport' (modul, how) jsImport' (modul, As name) = assign name modul-jsImport' (modul, Importing []) = jsImport' (modul, Hiding []) jsImport' (modul, Importing vs) = concatMap (\v -> assign v $ modul ++ "." ++ v) vs jsImport' (modul, Hiding 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]"+ , indent $ "\nif (hiddenVars.indexOf(i) >= 0) continue;"+ , indent $ globalAssign "this[i]" $ modul ++ "[i]" , "}" ] stmtsToJS :: [Statement] -> String@@ -103,13 +111,13 @@ stmtToJS :: Statement -> String stmtToJS (Def name [] e) = assign name (toJS e) stmtToJS (Def name (a:as) e) = "\nfunction " ++ name ++ parens a ++- braces (ret . toJS $ foldr Lambda e as) ++ ";"+ braces (indent . ret . toJS $ foldr Lambda e as) ++ ";" stmtToJS (Datatype _ _ tcs) = concatMap (stmtToJS . toDef) tcs where toDef (name,args) = Def name vars $ Data (derename name) (map Var vars) where vars = map (('a':) . show) [1..length args] stmtToJS (ImportEvent js base elm _) =- concat [ "\nvar " ++ elm ++ " = Elm.Input(" ++ toJS base ++ ");"- , "\nSignal.addListener(document, '" ++ js+ concat [ "\nvar " ++ elm ++ " = Elm.Signal.constant(" ++ toJS base ++ ");"+ , "\nValue.addListener(document, '" ++ js , "', function(e) { Dispatcher.notify(" ++ elm , ".id, e.value); });" ] stmtToJS (ExportEvent js elm _) =@@ -163,36 +171,31 @@ 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) ++ ";"+ return $ "\nfunction " ++ f ++ parens a ++ braces (indent $ ret out) ++ ";" 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' ]+ (match',stmt) <- case (match,e) of+ (Match name _ _, Var x) -> return (matchSubst [(name,x)] match, "")+ (Match name _ _, _ ) -> return (match, assign name e')+ _ -> liftM (\n -> (match, e')) guid+ matches <- matchToJS match'+ return $ concat [ "function(){", stmt, matches, "}()" ] -matchToJS v (Match name clauses def) = do+matchToJS (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+ finally <- matchToJS def+ return $ concat [ "\nswitch(", name, "[0]){", indent 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 (Seq ms) = concat `liftM` mapM matchToJS 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 ]+ let vars' = map (\n -> var ++ "[" ++ show n ++ "]") [ 1 .. length vars ]+ s <- matchToJS $ matchSubst (zip vars vars') e+ return $ concat [ "\ncase ", show name, ":", s ] jsNil = "[\"Nil\"]" jsCons e1 e2 = jsList [ show "Cons", e1, e2 ]@@ -215,6 +218,8 @@ ">" -> "(compare(" ++ e1 ++ ")(" ++ e2 ++ ")[0] === 'GT')" "<=" -> "function() { var ord = compare(" ++ e1 ++ ")(" ++ e2 ++ ")[0]; return ord === 'LT' || ord === 'EQ'; }()" ">=" -> "function() { var ord = compare(" ++ e1 ++ ")(" ++ e2 ++ ")[0]; return ord === 'GT' || ord === 'EQ'; }()"+ ">>>" -> "composeAuto(" ++ e1 ++ ")(" ++ e2 ++ ")"+ "<<<" -> "composeAuto(" ++ e2 ++ ")(" ++ e1 ++ ")" _ -> parens (e1 ++ (o:p) ++ e2) append e1 e2 = "Value.append" ++ parens (e1 ++ "," ++ e2)
src/Gen/GenerateHtml.hs view
@@ -22,15 +22,7 @@ css = H.style ! A.type_ "text/css" $ preEscapedToMarkup ("html,head,body { padding:0; margin:0; }\- \body { font-family: helvetica, arial, sans-serif; }\- \a:link {text-decoration: none}\- \a:visited {text-decoration: none}\- \a:active {text-decoration: none}\- \a:hover {text-decoration: underline; color: #ff8f12;}" :: String)-{--- \hyphens: auto; -moz-hyphens: auto;\- \ -webkit-hyphens: auto; -ms-hyphens: auto; }\---}+ \body { font-family: helvetica, arial, sans-serif; }" :: String) data JSStyle = Minified | Readable
src/Language/Elm.hs view
@@ -28,7 +28,10 @@ import qualified Data.Text as TS import qualified Data.Text.Lazy as TL -runtimeLocation = getDataFileName ("elm-runtime-" ++ showVersion version ++ ".js") +-- |The absolute path to Elm's runtime system. +runtimeLocation :: IO FilePath +runtimeLocation = + getDataFileName ("elm-runtime-" ++ showVersion version ++ ".js") class ElmSource a where -- |This function compiles Elm code to three separate parts: HTML, CSS,
src/Parse/ParseExpr.hs view
@@ -58,6 +58,10 @@ parensTerm = parens $ choice [ do op <- anyOp return . Lambda "x" . Lambda "y" $ Binop op (Var "x") (Var "y") + , do let comma = char ',' <?> "comma ','" + commas <- comma >> many (whitespace >> comma) + let vars = map (('v':) . show) [ 0 .. length commas + 1 ] + return $ foldr Lambda (tuple $ map Var vars) (vars) , do es <- commaSep expr return $ case es of { [e] -> e; _ -> tuple es } ] @@ -90,18 +94,21 @@ e <- expr return $ makeLambda pats e -letExpr = do - reserved "let" - brace <- optionMaybe . try $ do - whitespace +defSet = do + brace <- optionMaybe $ do char '{' <?> "a set of definitions { x = ... ; y = ... }" + whitespace case brace of - Nothing -> do whitespace; ds <- assignExpr - whitespace; reserved "in"; whitespace; Let ds <$> expr - Just '{' -> do whitespace ; dss <- semiSep1 assignExpr ; whitespace + Nothing -> assignExpr + Just '{' -> do dss <- semiSep1 assignExpr + whitespace string "}" <?> "closing bracket '}'" - whitespace; reserved "in"; whitespace; e <- expr - return $ Let (concat dss) e + return (concat dss) +letExpr = do + reserved "let" ; whitespace + defs <- defSet + whitespace ; reserved "in" ; whitespace + Let defs <$> expr caseExpr = do reserved "case"; whitespace; e <- expr; whitespace; reserved "of"; whitespace
src/Parse/ParseModules.hs view
@@ -28,8 +28,8 @@ reserved "import" whitespace name <- intercalate "." <$> dotSep1 capVar - method <- option (Importing []) $ try (whitespace >> - (as' <|> hiding' <|> importing')) + method <- option (Hiding []) $ try (whitespace >> + (as' <|> hiding' <|> importing')) return (name, method)
src/Parse/ParseTypes.hs view
@@ -33,7 +33,9 @@ typeUnambiguous = typeList <|> typeTuple typeSimple :: (Monad m) => ParsecT [Char] u m ParseType-typeSimple = VarPT <$> var+typeSimple = dealias <$> var+ where dealias "String" = listPT (VarPT "Char")+ dealias v = VarPT v typeApp :: (Monad m) => ParsecT [Char] u m ParseType typeApp = do name <- capVar <?> "type constructor"@@ -50,7 +52,8 @@ Nothing -> return t1 typeConstructor :: (Monad m) => ParsecT [Char] u m (String, [ParseType])-typeConstructor = (,) <$> (capVar <?> "another type constructor") <*> spacePrefix (typeSimple <|> typeUnambiguous)+typeConstructor = (,) <$> (capVar <?> "another type constructor")+ <*> spacePrefix (typeSimple <|> typeUnambiguous) datatype :: (Monad m) => ParsecT [Char] u m Statement datatype = do
src/Parse/Patterns.hs view
@@ -2,7 +2,7 @@ import Ast import Data.Char (isUpper)-import Control.Applicative ((<$>))+import Control.Applicative ((<$>),(<*>)) import Control.Monad import Text.Parsec import ParseLib@@ -11,8 +11,7 @@ patternBasic = choice [ char '_' >> return PAnything , do x@(c:_) <- var- if isUpper c then PData x <$> spacePrefix patternTerm- else return $ PVar x+ return $ if isUpper c then PData x [] else PVar x ] patternTuple :: Monad m => ParsecT [Char] u m Pattern@@ -25,8 +24,11 @@ patternTerm :: Monad m => ParsecT [Char] u m Pattern patternTerm = patternTuple <|> patternList <|> patternBasic <?> "pattern" +patternConstructor :: Monad m => ParsecT [Char] u m Pattern+patternConstructor = PData <$> capVar <*> spacePrefix patternTerm+ patternExpr :: Monad m => ParsecT [Char] u m Pattern-patternExpr = foldr1 pcons <$> consSep1 patternTerm <?> "pattern"+patternExpr = foldr1 pcons <$> consSep1 (patternConstructor <|> patternTerm) <?> "pattern" makeLambda pats body = foldr Lambda (makeBody pats body) (map getName pats)
src/Types/Constrain.hs view
@@ -3,7 +3,7 @@ import Ast import Types -import Data.List (foldl') +import Data.List (foldl',sort,group,isPrefixOf,intercalate,isSuffixOf) import qualified Data.Set as Set import qualified Data.Map as Map import Control.Arrow (second) @@ -20,15 +20,41 @@ unionA = Map.unionWith (++) unionsA = Map.unionsWith (++) -constrain hints (Module _ _ _ stmts) = do - (ass,css,schemess) <- unzip3 `liftM` mapM stmtGen stmts - allHints <- liftM (Map.fromList . (++ concat schemess)) hints - let insert as n = do v <- guid; return $ Map.insertWith' (\_ x -> x) n [v] as - assumptions <- foldM insert (unionsA ass) $ map fst (concat schemess) - let cs = let f k s vs = map (\v -> Context k $ v :<<: s) vs in - concat . Map.elems $ Map.intersectionWithKey f allHints assumptions - let escapees = Map.keys $ Map.difference assumptions allHints - return . (,) escapees $ cs ++ Set.toList (Set.unions css) +getAliases imports hints = hints ++ concatMap aliasesFrom imports' + where imports' = map head . group $ sort imports + aliasesFrom (name,method) = + case method of + As alias -> concatMap (findAlias name alias) hints + Hiding [] -> concatMap (findAlias name "") hints + _ -> [] + findAlias mName' mAlias (name,tipe) = + let mName = mName' ++ "." in + case mName `isPrefixOf` name of + True -> [ (mAlias ++ drop (length mName) name, tipe) ] + False -> [] + +findAmbiguous hints hints' assumptions continue = + let potentialDups = map head . filter (\g -> length g > 1) . group $ sort hints' + dups = filter (\k -> Map.member k assumptions) potentialDups + in case dups of + n:_ -> return . Left $ "Error: Ambiguous occurrence of '" ++ n ++ "' could refer to " ++ + intercalate ", " (filter (isSuffixOf n) hints) + _ -> continue + +constrain typeHints (Module _ _ imports stmts) = do + (ass,css,schemess) <- unzip3 `liftM` mapM stmtGen stmts + hints <- typeHints + let aliasHints = getAliases (imports ++ extraImports) hints + let allHints = Map.fromList (aliasHints ++ concat schemess) + assumptions <- foldM insert (unionsA ass) $ map fst (concat schemess) + findAmbiguous (map fst hints) (map fst aliasHints) assumptions $ + do let cs = let f k s vs = map (\v -> Context k $ v :<<: s) vs in + concat . Map.elems $ Map.intersectionWithKey f allHints assumptions + let escapees = Map.keys $ Map.difference assumptions allHints + return . Right . (,) escapees $ cs ++ Set.toList (Set.unions css) + where extraImports = + map (\n -> (n, Hiding [])) ["List","Signal","Text","Graphics","Color"] + insert as n = do v <- guid; return $ Map.insertWith' (\_ x -> x) n [v] as gen :: Expr -> GuidCounter (Map.Map String [X], Set.Set (Context String Constraint), Type)
src/Types/Hints.hs view
@@ -7,43 +7,45 @@ import Types.Substitutions (rescheme) --------- Text and Elements --------+prefix pre xs = map (first (\x -> pre ++ "." ++ x)) xs -str2elem = hasType (string ==> element) [ "plainText" ]+-------- Text and Elements -------- textToText = [ "header", "italic", "bold", "underline" , "overline", "strikeThrough", "monospace" ] textAttrs = [ "toText" -: string ==> text- , "typeface" -: string ==> text ==> text- , "link" -:: string ==> a ==> a+ , "Text.typeface" -: string ==> text ==> text+ , "Text.link" -:: string ==> text ==> text , numScheme (\t -> t ==> text ==> text) "Text.height"- ] ++ hasType (text ==> text) textToText+ ] ++ prefix "Text" (hasType (text ==> text) textToText) -elements = let iee = int ==> element ==> element in- [ "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- , "size" -: int ==> iee- , "widthOf" -: element ==> int- , "heightOf"-: element ==> int- , "sizeOf" -: element ==> pairOf int- , "color" -: color ==> element ==> element- , "container" -: int ==> int ==> position ==> element ==> element- , "spacer" -: int ==> int ==> element- , "rightedText" -: text ==> element- , "centeredText" -: text ==> element- , "justifiedText" -: text ==> element- , "asText" -:: a ==> element - , "show" -:: a ==> text- , "collage" -: int ==> int ==> listOf form ==> element- , "fittedImage" -: int ==> int ==> string ==> element- ]+elements =+ let iee = int ==> element ==> element in+ [ "plainText" -: string ==> element+ , "link" -:: string ==> element ==> element+ , "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+ , "size" -: int ==> iee+ , "widthOf" -: element ==> int+ , "heightOf"-: element ==> int+ , "sizeOf" -: element ==> pairOf int+ , "color" -: color ==> element ==> element+ , "container" -: int ==> int ==> position ==> element ==> element+ , "spacer" -: int ==> int ==> element+ , "rightedText" -: text ==> element+ , "centeredText" -: text ==> element+ , "justifiedText" -: text ==> element+ , "asText" -:: a ==> element + , "collage" -: int ==> int ==> listOf form ==> element+ , "fittedImage" -: int ==> int ==> string ==> element+ ] directions = hasType direction ["up","down","left","right","inward","outward"] positions =@@ -52,10 +54,6 @@ hasType (location ==> location ==> position) ["topLeftAt","bottomLeftAt","middleAt","topRightAt","bottomRightAt"] ++ [ "absolute" -: int ==> location, "relative" -: float ==> location ]-colors = [ numScheme (\n -> n ==> n ==> n ==> color) "rgb"- , numScheme (\n -> n ==> n ==> n ==> n ==> color) "rgba"- ] ++ hasType color ["red","green","blue","black","white"- ,"yellow","cyan","magenta","grey","gray"] lineTypes = [ numScheme (\n -> listOf (pairOf n) ==> line) "line" , numScheme (\n -> pairOf n ==> pairOf n ==> line) "segment"@@ -79,6 +77,16 @@ , numScheme (\n -> pairOf n ==> form ==> bool) "isWithin" ] +graphicsElement = prefix "Graphics"+ (concat [elements,directions,positions,lineTypes,shapes,collages])+graphicsColor = prefix "Color" clrs+ where clrs = [ numScheme (\n -> n ==> n ==> n ==> color) "rgb"+ , numScheme (\n -> n ==> n ==> n ==> n ==> color) "rgba"+ , "complement" -: color ==> color+ ] ++ hasType color ["red","green","blue","black","white"+ ,"yellow","cyan","magenta","grey","gray"]++ -------- Foreign -------- casts =@@ -107,16 +115,28 @@ , "castListToJSArray" -:: listOf a ==> jsArray a ] -json =+javascript = prefix "JavaScript" (concat [casts,polyCasts])++json = prefix "JSON" [ "JsonString" -: string ==> jsonValue , "JsonBool" -: bool ==> jsonValue , "JsonNull" -: jsonValue , "JsonArray" -: listOf jsonValue ==> jsonValue , "JsonObject" -: jsonObject ==> jsonValue , numScheme (\n -> n ==> jsonValue) "JsonNumber"- , "toPrettyString" -: string ==> jsonObject ==> string+ , "toString" -: jsonObject ==> string+ , "fromString" -: string ==> jsonObject+ , "lookup" -: string ==> jsonObject ==> maybeOf jsonValue+ , "findObject" -: string ==> jsonObject ==> jsonObject+ , "findArray" -: string ==> jsonObject ==> listOf jsonObject+ , "findString" -: string ==> jsonObject ==> string+ , "findWithDefault" -:: jsonValue ==> string ==> jsonObject ==> jsonValue+ , "toPrettyString" -: string ==> jsonObject ==> string , "toPrettyJSString" -: string ==> jsonObject ==> jsString- , "toJSString" -: jsonObject ==> jsString+ , "toList" -: jsonObject ==> listOf (tupleOf [string,jsonValue])+ , "fromList" -: listOf (tupleOf [string,jsonValue]) ==> jsonObject+ , "toJSString" -: jsonObject ==> jsString+ , "fromJSString" -: jsString ==> jsonObject ] @@ -126,7 +146,7 @@ where fn = foldr1 (==>) ts = map VarT [1..n] -signals =+signals = prefix "Signal" [ sig 1 "constant" , sig 2 "lift" , sig 3 "lift2"@@ -135,35 +155,51 @@ , "foldp" -:: (a ==> b ==> b) ==> b ==> signalOf a ==> signalOf b , "foldp1" -:: (a ==> a ==> a) ==> signalOf a ==> signalOf a , "foldp'" -:: (a ==> b ==> b) ==> (a ==> b) ==> signalOf a ==> signalOf b- , "randomize" -:: int ==> int ==> signalOf a ==> signalOf int , "count" -:: signalOf a ==> signalOf int , "keepIf" -:: (a==>bool) ==> a ==> signalOf a ==> signalOf a , "dropIf" -:: (a==>bool) ==> a ==> signalOf a ==> signalOf a- , "keepWhen" -:: signalOf bool ==>a==> signalOf a ==> signalOf a- , "dropWhen" -:: signalOf bool ==>a==> signalOf a ==> signalOf a+ , "keepWhen" -:: signalOf bool ==> a ==> signalOf a ==> signalOf a+ , "dropWhen" -:: signalOf bool ==> a ==> signalOf a ==> signalOf a , "dropRepeats" -:: signalOf a ==> signalOf a , "sampleOn" -:: signalOf a ==> signalOf b ==> signalOf b ] +http = prefix "HTTP"+ [ "send" -:: signalOf (request a) ==> signalOf (response string)+ , "sendGet" -:: signalOf string ==> signalOf (response string)+ , "get" -: string ==> request string+ , "post" -: string ==> string ==> request string+ , "request" -: string ==> string ==> string ==> listOf (pairOf string) ==> request string+ , "Waiting" -:: response a+ , "Failure" -:: int ==> string ==> response a+ , "Success" -:: a ==> response a ]+ where request t = ADT "Request" [t]+ response t = ADT "Response" [t]+ concreteSignals = - [ "keysDown" -: signalOf (listOf int)- , "charPressed" -: signalOf (maybeOf int)- , "inRange" -: int ==> int ==> signalOf int- , timeScheme "every" (\t -> t ==> signalOf t)- , timeScheme "before" (\t -> t ==> signalOf bool)- , timeScheme "after" (\t -> t ==> signalOf bool)- , "dimensions" -: signalOf point- , "position" -: signalOf point- , "x" -: signalOf int- , "y" -: signalOf int- , "isDown" -: signalOf bool- , "isClicked" -: signalOf bool- , "textField" -: string ==> tupleOf [element, signalOf string]- , "password" -: string ==> tupleOf [element, signalOf string]- , "textArea" -: int ==> int ==> tupleOf [element, signalOf string]- , "checkBox" -: bool ==> tupleOf [element, signalOf bool]- , "button" -: string ==> tupleOf [element, signalOf bool]- , "stringDropDown" -: listOf string ==> tupleOf [element, signalOf string]+ [ "Keyboard.Raw.keysDown" -: signalOf (listOf int)+ , "Keyboard.Raw.charPressed" -: signalOf (maybeOf int)+ , "Random.inRange" -: int ==> int ==> signalOf int+ , "Random.randomize" -:: int ==> int ==> signalOf a ==> signalOf int+ , timeScheme "Time.every" (\t -> t ==> signalOf t)+ , timeScheme "Time.before" (\t -> t ==> signalOf bool)+ , timeScheme "Time.after" (\t -> t ==> signalOf bool)+ , "Window.dimensions" -: signalOf point+ , "Window.width" -: signalOf int+ , "Window.height" -: signalOf int+ , "Mouse.position" -: signalOf point+ , "Mouse.x" -: signalOf int+ , "Mouse.y" -: signalOf int+ , "Mouse.isDown" -: signalOf bool+ , "Mouse.isClicked" -: signalOf bool+ , "Mouse.clicks" -: signalOf (tupleOf [])+ , "Input.textField" -: string ==> tupleOf [element, signalOf string]+ , "Input.password" -: string ==> tupleOf [element, signalOf string]+ , "Input.textArea" -: int ==> int ==> tupleOf [element, signalOf string]+ , "Input.checkBox" -: bool ==> tupleOf [element, signalOf bool]+ , "Input.button" -: string ==> tupleOf [element, signalOf bool]+ , "Input.stringDropDown" -: listOf string ==> tupleOf [element, signalOf string]+ , "Input.dropDown" -:: listOf (tupleOf [string,a]) ==> tupleOf [element, signalOf a] ] -------- Math and Binops --------@@ -189,7 +225,10 @@ hasType (float ==> float) ["sin","cos","tan","asin","acos","atan","sqrt"] ++ hasType float ["pi","e"] ++ hasType (int ==> float) ["toFloat","castIntToFloat"] ++- hasType (float ==> int) ["round","floor","ceiling","truncate"]+ hasType (float ==> int) ["round","floor","ceiling","truncate"] +++ [ "show" -:: a ==> string+ , "readInt" -: string ==> maybeOf int+ , "readFloat" -: string ==> maybeOf float ] bools = [ "not" -: bool ==> bool ] ++@@ -199,6 +238,14 @@ , Forall [0,1] [ Context "`compare'" $ VarT 0 :<: comparable ] (VarT 0 ==> VarT 0 ==> VarT 1) ) ] +chars = prefix "Char" (classify ++ convert1 ++ convert2)+ where classify = hasType (char ==> bool)+ ["isDigit","isOctDigit","isHexDigit","isUpper","isLower"]+ convert1 = hasType (char ==> char)+ ["toUpper","toLower","toLocaleUpper","toLocaleLower"]+ convert2 = [ "toCode" -: char ==> int, "fromCode" -: int ==> char ]+ + -------- Polymorphic Functions -------- [a,b,c] = map VarT [1,2,3]@@ -226,7 +273,7 @@ tuple n = ("Tuple" ++ show n, Forall [1..n] [] $ foldr (==>) (tupleOf vs) vs) where vs = map VarT [1..n] -lists =+lists = prefix "List" [ "and" -:: listOf bool ==> bool , "or" -:: listOf bool ==> bool , numScheme (\n -> listOf n ==> listOf n) "sort"@@ -237,8 +284,8 @@ , "foldr1" -:: (a ==> a ==> a) ==> listOf a ==> a , "foldl1" -:: (a ==> a ==> a) ==> listOf a ==> a , "scanl1" -:: (a ==> a ==> a) ==> listOf a ==> a- , "forall" -:: (a ==> bool) ==> listOf a ==> bool- , "exists" -:: (a ==> bool) ==> listOf a ==> bool+ , "all" -:: (a ==> bool) ==> listOf a ==> bool+ , "any" -:: (a ==> bool) ==> listOf a ==> bool , "reverse" -:: listOf a ==> listOf a , "take" -:: int ==> listOf a ==> listOf a , "drop" -:: int ==> listOf a ==> listOf a@@ -259,7 +306,7 @@ ] ++ map (numScheme (\n -> listOf n ==> n)) [ "sum", "product" , "maximum", "minimum" ] -maybeFuncs =+maybeFuncs = prefix "Maybe" [ "maybe" -:: b ==> (a ==> b) ==> maybeOf a ==> b , "isJust" -:: maybeOf a ==> bool , "isNothing" -:: maybeOf a ==> bool@@ -269,11 +316,66 @@ , "catMaybes" -:: (a ==> maybeOf b) ==> listOf a ==> listOf b ] +dictionary =+ let dict k v = ADT "Dict" [k,v] in+ prefix "Dict"+ [ "empty" -:: dict a b+ , "singleton" -:: a ==> b ==> dict a b+ , "insert" -:: a ==> b ==> dict a b ==> dict a b+ , "remove" -:: a ==> dict a b ==> dict a b+ , "member" -:: a ==> dict a b ==> bool+ , "lookup" -:: a ==> dict a b ==> maybeOf b+ , "findWithDefault" -:: b ==> a ==> dict a b ==> b+ , "intersect" -:: dict a b ==> dict a c ==> dict a b+ , "union" -:: dict a b ==> dict a b ==> dict a b+ , "diff" -:: dict a b ==> dict a c ==> dict a b+ , "map" -:: (b ==> c) ==> dict a b ==> dict a c+ , "foldl" -:: (a ==> b ==> c ==> c) ==> c ==> dict a b ==> c+ , "foldr" -:: (a ==> b ==> c ==> c) ==> c ==> dict a b ==> c+ , "keys" -:: dict a b ==> listOf a+ , "values" -:: dict a b ==> listOf b+ , "toList" -:: dict a b ==> listOf (tupleOf [a,b])+ , "fromList" -:: listOf (tupleOf [a,b]) ==> dict a b+ ]++sets =+ let set v = ADT "Set" [v] in+ prefix "Set"+ [ "empty" -:: set a+ , "singleton" -:: a ==> set a+ , "insert" -:: a ==> set a ==> set a+ , "remove" -:: a ==> set a ==> set a+ , "member" -:: a ==> set a ==> bool+ , "intersect" -:: set a ==> set a ==> set a+ , "union" -:: set a ==> set a ==> set a+ , "diff" -:: set a ==> set a ==> set a+ , "map" -:: (a ==> b) ==> set a ==> set b+ , "foldl" -:: (a ==> b ==> b) ==> b ==> set a ==> b+ , "foldr" -:: (a ==> b ==> b) ==> b ==> set a ==> b+ , "toList" -:: set a ==> listOf a+ , "fromList" -:: listOf a ==> set a+ ]++automaton =+ let auto a b = ADT "Automaton" [a,b] in+ prefix "Automaton"+ [ "pure" -:: (a ==> b) ==> auto a b+ , "init" -:: b ==> (a ==> b ==> b) ==> auto a b+ , "init'" -:: c ==> (a ==> c ==> tupleOf [b,c]) ==> auto a b+ , ">>>" -:: auto a b ==> auto b c ==> auto a c+ , "<<<" -:: auto b c ==> auto a b ==> auto a c+ , "combine" -:: listOf (auto a b) ==> auto a (listOf b)+ , "run" -:: auto a b ==> signalOf a ==> signalOf b+ , "step" -:: auto a b ==> a ==> tupleOf [b,auto a b]+ , "count" -:: auto a int+ , "draggable" -:: form ==> auto (tupleOf [bool,point]) form+ ]+ -------- Everything -------- hints = mapM (\(n,s) -> (,) n `liftM` rescheme s) hs- where hs = concat [ funcs, lists, signals, math, bools, str2elem, textAttrs- , elements, directions, colors, lineTypes, shapes- , concreteSignals, casts, polyCasts, json, maybeFuncs- , positions, collages+ where hs = concat [ funcs, lists, signals, math, bools, textAttrs+ , graphicsElement, graphicsColor+ , concreteSignals, javascript, json, maybeFuncs+ , http, dictionary, sets, automaton ]
src/Types/Substitutions.hs view
@@ -2,7 +2,7 @@ module Types.Substitutions (cSub ,tSub ,cSubNoContext- ,cFreeVars+ ,hasVarC ,freeVars ,schemeSub ,concretize@@ -17,14 +17,19 @@ import Types force x = x `deepseq` x+a ++++ b = foldl' (\tl hd -> hd : tl) b a+map' f xs = map (\x -> let v = f x in v `seq` v) xs instance (NFData a) => NFData (Context c a) where rnf (Context _ a) = a `deepseq` () +instance NFData Scheme where+ rnf (Forall vs cs t) = vs `deepseq` cs `deepseq` t `deepseq` ()+ instance NFData Constraint where rnf (t1 :=: t2) = t1 `deepseq` t2 `deepseq` ()- rnf (t :<: _) = t `deepseq` ()- rnf (t :<<: _) = t `deepseq` ()+ rnf (t1 :<: t2) = t1 `deepseq` t2 `deepseq` ()+ rnf (t :<<: s) = t `deepseq` s `deepseq` () instance NFData Type where rnf (LambdaT t1 t2) = t1 `deepseq` t2 `deepseq` ()@@ -32,63 +37,80 @@ rnf t = t `seq` () tSub k v t@(VarT x) = if k == x then v else t-tSub k v (LambdaT t1 t2) = force $ LambdaT (tSub k v t1) (tSub k v t2)-tSub k v (ADT name ts) = ADT name (map (force . tSub k v) ts)+tSub k v (LambdaT t1 t2) = tSub k v t1 `seq` tSub k v t2 `seq` LambdaT (tSub k v t1) (tSub k v t2)+tSub k v (ADT name ts) = map' (tSub k v) ts `seq` ADT name (map' (tSub k v) ts) tSub k v (Super ts) = Super ts schemeSubHelp k s c t1 t2 relation = do- (t1',cs1) <- f1 ; (t2',cs2) <- f2- return (Context c (relation t1' t2') : cs1 ++ cs2)- where f1 | hasVar k t1 = do (v, cs) <- concretize s; return (tSub k v t1, cs)- | otherwise = return (t1, [])- f2 | hasVar k t2 = do (v, cs) <- concretize s; return (tSub k v t2, cs)- | otherwise = return (t2, [])+ (t1',cs1) <- f t1+ (t2',cs2) <- f t2+ return $ Context c (relation t1' t2') : cs1 ++++ cs2+ where f t | hasVar k t = do (v, cs) <- concretize s; return (tSub k v t, cs)+ | otherwise = return (t, []) -schemeSub k s (Context ctx (t1 :=: t2)) = schemeSubHelp k s ctx t1 t2 (:=:)-schemeSub k s (Context ctx (t1 :<: t2)) = schemeSubHelp k s ctx t1 t2 (:<:)-schemeSub k s (Context ctx c@(x :<<: Forall cxs ccs ctipe))- | k `elem` cxs || k `notElem` cFreeVars c = return [Context ctx c]- | otherwise = do- Forall xs cs tipe <- rescheme s- let constraints = (map (cSub k tipe) $ cs ++ ccs)- let c' = x :<<: Forall (cxs ++ xs) constraints (tSub k tipe ctipe)- return [ Context ctx c' ]+schemeSub k s (Context ctx (t1 :=: t2)) = t1 `seq` t2 `seq` schemeSubHelp k s ctx t1 t2 (:=:)+schemeSub k s (Context ctx (t1 :<: t2)) = t1 `seq` t2 `seq` schemeSubHelp k s ctx t1 t2 (:<:)+schemeSub k s c@(Context ctx (x :<<: Forall cxs ccs ctipe)) =+ if not $ hasVarC k c then return [c]+ else do+ Forall xs cs tipe <- rescheme s+ let constraints = map' (cSub k tipe) $ cs ++ ccs+ let c' = x :<<: Forall (cxs ++ xs) constraints (tSub k tipe ctipe)+ return [ Context ctx c' ] hasVar v (VarT x) = v == x-hasVar v (LambdaT t1 t2) = hasVar v t1 || hasVar v t2-hasVar v (ADT _ ts) = any (hasVar v) ts+hasVar v (LambdaT t1 t2) = force (hasVar v t1 || hasVar v t2)+hasVar v (ADT _ ts) = force $ any (hasVar v) ts hasVar v (Super _ ) = False -cSub k v (Context ctx c) = Context ctx (cSubNoContext k v c)+cSub k v (Context ctx c) = out `deepseq` out+ where out = Context ctx (cSubNoContext' k v c) -cSubNoContext k v (t1 :=: t2) = force $ tSub k v t1 :=: tSub k v t2-cSubNoContext k v (t :<: super) = force $ tSub k v t :<: super-cSubNoContext k v (x :<<: poly@(Forall vs cs tipe)) = force $ x :<<: poly'+cSubNoContext k v c = c' `deepseq` c'+ where c' = cSubNoContext' k v c++cSubNoContext' k v (t1 :=: t2) = let { t1' = tSub k v $! t1 ; t2' = tSub k v $! t2 } in+ t1' `seq` t2' `seq` t1' :=: t2'+cSubNoContext' k v (t :<: super) = let t' = tSub k v t in t' `seq` t' :<: super+cSubNoContext' k v (x :<<: poly@(Forall vs cs tipe)) = (x :<<: poly') where poly' | k `elem` vs = poly- | otherwise = let cs' = map (cSub k v) cs in- Forall vs cs' (tSub k v tipe)+ | otherwise = let tipe' = tSub k v tipe in+ tipe' `deepseq` Forall vs (map' (cSub k v) cs) tipe' concretize (Forall xs cs t) = do- pairs <- mapM (\x -> liftM ((,) x) guid) xs- return ( foldl' (\t' (k,v) -> tSub k (VarT v) t') t pairs- , foldl' (\cs' (k,v) -> map (cSub k $ VarT v) cs') cs pairs )+ pairs <- zip xs `liftM` mapM (const guid) xs+ let tipe = foldl' (\t' (k,v) -> tSub k (VarT v) $! t') t pairs+ let f c = foldl' (\c (k,v) -> cSub k (VarT v) $! c) c $! pairs+ let cs' = f `seq` map' f cs+ tipe `deepseq` cs' `deepseq` return (tipe, cs') rescheme :: Scheme -> GuidCounter Scheme rescheme (Forall xs cs t) = do- pairs <- mapM (\x -> liftM ((,) x) guid) xs- let tipe = foldl' (\t' (k,v) -> tSub k (VarT v) t') t pairs- let cs' = foldl' (\cs' (k,v) -> map (cSub k $ VarT v) cs') cs pairs- return $ Forall (map snd pairs) cs' tipe+ pairs <- zip xs `liftM` mapM (const guid) xs+ let tipe = foldl' (\t' (k,v) -> tSub k (VarT v) $! t') t pairs+ let fs = map (\(k,v) -> cSub k (VarT v)) pairs+ let cs' = map (\c -> foldl' (\c f -> f $! c) c fs) cs+ tipe `deepseq` cs' `deepseq` (return $ Forall (map' snd pairs) cs' tipe) -freeVars (VarT v) = [v]-freeVars (LambdaT t1 t2) = freeVars t1 ++ freeVars t2-freeVars (ADT _ ts) = concatMap freeVars ts-freeVars (Super _ ) = []+freeVars t = let fs = freeVars' t in fs `deepseq` fs -cFreeVars (t1 :=: t2) = freeVars t1 ++ freeVars t2-cFreeVars (t1 :<: t2) = freeVars t1 ++ freeVars t2-cFreeVars (x :<<: Forall xs cs t) = filter (`notElem` xs) frees- where frees = concatMap (\(Context _ c) -> cFreeVars c) cs ++ freeVars t+freeVars' (VarT v) = [v]+freeVars' (LambdaT t1 t2) = freeVars' t1 ++++ freeVars' t2+freeVars' (ADT _ ts) = concatMap freeVars' ts+freeVars' (Super _ ) = []++cFreeVars c = let fs = cFreeVars' c in fs `deepseq` fs++cFreeVars' (t1 :=: t2) = freeVars' t1 ++++ freeVars' t2+cFreeVars' (t1 :<: t2) = freeVars' t1 ++++ freeVars' t2+cFreeVars' (x :<<: Forall xs cs t) = filter (`notElem` xs) frees+ where frees = concatMap (\(Context _ c) -> cFreeVars' c) cs ++++ freeVars' t+++hasVarC x (Context _ (t1 :=: t2)) = hasVar x t1 || hasVar x t2+hasVarC x (Context _ (t1 :<: t2)) = hasVar x t1 || hasVar x t2+hasVarC x (Context _ (y :<<: Forall xs cs t)) = x == y || hasVar x t || inCs+ where inCs = x `notElem` xs && any (hasVarC x) cs decontext (Context _ c) = c
src/Types/Unify.hs view
@@ -11,17 +11,22 @@ import Types.Constrain import Types.Substitutions +import Control.DeepSeq (deepseq) --import System.IO.Unsafe prints xs v = v --} unsafePerformIO (putStrLn "----------" >> mapM print xs) `seq` v unify hints modul = run $ do- (escapees, cs) <- constrain hints modul- subs <- solver cs Map.empty- prints cs $ return ((,) escapees `liftM` subs)+ constraints <- constrain hints modul+ case constraints of+ Left msg -> return (Left msg)+ Right (escapees, cs) ->+ do subs <- solver cs Map.empty+ return ((,) escapees `liftM` subs) eq ctx t1 t2 = Context ctx (t1 :=: t2) + solver [] subs = prints (Map.toList subs) $ return $ Right subs -------- Destruct Type-constructors --------@@ -43,21 +48,26 @@ setXY t = Map.insert x t . Map.insert y t in case Set.toList ts of [] -> unionError ctx xts yts- [t] -> solver (map (cSub x t . cSub y t) cs) $ setXY t subs+ [t] -> let cs1 = map (\c -> cSub y t c `seq` cSub x t (cSub y t c)) cs in+ cs1 `seq` solver cs1 (setXY t subs) _ -> solver cs $ setXY (Super ts) subs (Just (Super xts), _) ->- solver (map (cSub y (VarT x)) cs) $ Map.insert y (VarT x) subs+ let cs2 = map (cSub y (VarT x)) cs in+ cs2 `seq` solver cs2 $ Map.insert y (VarT x) subs (_, _) ->- solver (map (cSub x (VarT y)) cs) $ Map.insert x (VarT y) subs+ let cs3 = map (cSub x (VarT y)) cs in+ cs3 `deepseq` solver cs3 $ Map.insert x (VarT y) subs solver (Context ctx (VarT x :=: t) : cs) subs = do if x `occursIn` t then occursError ctx (VarT x) t else (case Map.lookup x subs of- Nothing -> solver (map (cSub x t) cs) . Map.map (tSub x t) $ Map.insert x t subs+ Nothing -> let cs4 = map (cSub x t) cs in+ cs4 `deepseq` (solver cs4 . Map.map (tSub x t) $ Map.insert x t subs) Just (Super ts) -> let ts' = Set.intersection ts (Set.singleton t) in case Set.toList ts' of [] -> solver (Context ctx (t :<: Super ts) : cs) subs- [t'] -> solver (map (cSub x t') cs) $ Map.insert x t' subs+ [t'] -> let cs5 = map (cSub x t) cs in+ cs5 `seq` solver cs5 $ Map.insert x t' subs _ -> solver cs $ Map.insert x (Super ts') subs Just t' -> solver (Context ctx (t' :=: t) : cs) subs )@@ -91,13 +101,13 @@ | otherwise = subtypeError ctx t (Super ts) solver (Context ctx (x :<<: s) : cs) subs- | any (\(Context _ c) -> x `elem` cFreeVars c) cs =- do cs' <- concat `liftM` mapM (schemeSub x s) cs- prints cs' $ solver cs' subs+ | any (hasVarC x) cs =+ do cs6 <- concat `liftM` mapM (schemeSub x s) cs+ solver cs6 subs | otherwise =- do (t,cs') <- concretize s- let cs'' = (cs ++ Context ctx (VarT x :=: t) : map (extendCtx ctx) cs')- prints cs'' $ solver cs'' subs+ do (t,cs7) <- concretize s+ let cs'' = (cs ++ Context ctx (VarT x :=: t) : map (extendCtx ctx) cs7)+ solver cs'' subs occursError ctx t1 t2 =