Elm 0.4.0.2 → 0.4.0.3
raw patch · 8 files changed
+600/−579 lines, 8 files
Files
- Elm.cabal +6/−4
- elm-runtime-0.4.0.2.js +0/−87
- elm-runtime-0.4.0.3.js +90/−0
- src/Compiler.hs +2/−2
- src/Language/Elm.hs +5/−1
- src/Types/Hints.hs +279/−276
- src/Types/Substitutions.hs +99/−98
- src/Types/Unify.hs +119/−111
Elm.cabal view
@@ -1,6 +1,6 @@ Name: Elm-Version: 0.4.0.2+Version: 0.4.0.3 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.2.js+Data-files: elm-runtime-0.4.0.3.js Cabal-version: >=1.8 source-repository head@@ -55,7 +55,8 @@ Types.Constrain, Types.Hints, Types.Substitutions,- Types.Unify+ Types.Unify,+ Paths_Elm Build-depends: base >=4.2 && <5, containers >= 0.3,@@ -97,7 +98,8 @@ Types.Constrain, Types.Hints, Types.Substitutions,- Types.Unify+ Types.Unify,+ Paths_Elm Build-depends: base >=4.2 && <5, containers >= 0.3,
− elm-runtime-0.4.0.2.js
@@ -1,87 +0,0 @@-var Guid=function(){var e=0;return{guid:function(){return e+=1}}}(),Foreign=function(){var e=function(a){for(var b=["Nil"],l=a.length;l--;)b=["Cons",a[l],b];return b},c=function(a){for(var b=[];"Cons"===a[0];)b.push(a[1]),a=a[2];return b},b=function(a){return a.slice(1)},a=function(a){return["Tuple"+a.length].concat(a)};return{JavaScript:{castJSBoolToBool:function(a){return a},castBoolToJSBool:function(a){return a},castJSNumberToFloat:function(a){return a},castFloatToJSNumber:function(a){return a},-castJSNumberToInt:function(a){return~~a},castIntToJSNumber:function(a){return a},Experimental:{castJSElementToElement:function(a){return function(b){return function(l){return["Element",Guid.guid(),["EExternalHtml",l],a,b,1,Nothing,Nothing]}}},castElementToJSElement:function(a){return Render.render(a)}},castJSArrayToList:e,castListToJSArray:c,castJSStringToString:e,castStringToJSString:function(a){return"string"===typeof a?a:c(a).join("")},castTupleToJSTuple2:b,castTupleToJSTuple3:b,castTupleToJSTuple4:b,-castTupleToJSTuple5:b,castJSTupleToTuple2:a,castJSTupleToTuple3:a,castJSTupleToTuple4:a,castJSTupleToTuple5:a}}}(),ElmJSON=function(){function e(a){return function(k){function f(a){switch(a[0]){case "JsonNull":return null;case "JsonString":return b.castStringToJSString(a[1]);case "JsonObject":var j={},a=a[1][1],m;for(m in a)j[m]=f(a[m]);return j;case "JsonArray":j=b.castListToJSArray(a[1]);for(m=j.length;m--;)j[m]=f(j[m]);return j;default:return a[1]}}return JSON.stringify(f(["JsonObject",k]),null,-b.castStringToJSString(a))}}function c(a){function k(a){switch(typeof a){case "string":return["JsonString",b.castJSStringToString(a)];case "number":return["JsonNumber",b.castJSNumberToFloat(a)];case "boolean":return["JsonBool",b.castJSBoolToBool(a)];case "object":if(null===a)return["JsonNull"];for(var j in a)a[j]=k(a[j]);return a instanceof Array?["JsonArray",b.castJSArrayToList(a)]:["JsonObject",["JSON",a]]}}var a=JSON.parse(a),f;for(f in a)a[f]=k(a[f]);return["JSON",a]}var b=Foreign.JavaScript;-return{empty:["JSON",{}],singleton:function(a){return function(k){var f={};f[b.castStringToJSString(a)]=k;return["JSON",f]}},insert:function(a){return function(k){return function(f){var f=f[1],c={},j;for(j in f)c[j]=f[j];c[b.castStringToJSString(a)]=k;return["JSON",c]}}},lookup:function(a){return function(k){var f=b.castStringToJSString(a);return k[1].hasOwnProperty(f)?Just(k[1][f]):Nothing}},findWithDefault:function(a){return function(k){return function(f){var c=b.castStringToJSString(k);return f[1].hasOwnProperty(c)?-f[1][c]:a}}},remove:function(a){return function(c){var c=c[1],f={},l;for(l in c)f[l]=c[l];delete f[b.castStringToJSString(a)];return["JSON",f]}},toPrettyJSString:e,toJSString:e(""),fromJSString:c,toPrettyString:function(a){return function(c){return b.castJSStringToString(e(a)(c))}},toString:function(a){return b.castJSStringToString(e("")(a))},fromString:function(a){return c(b.castStringToJSString(a))},toList:function(a){var a=a[1],c=[],f;for(f in a)c.push(Value.Tuple(b.castJSStringToString(f),a[f]));-return b.castJSArrayToList(c)},fromList:function(a){for(var a=b.castListToJSArray(a),c={},f=a.length;f--;)c[b.castStringToJSString(a[f][1])]=a[f][2];return["JSON",c]},JsonString:function(a){return["JsonString",a]},JsonNumber:function(a){return["JsonNumber",a]},JsonBool:function(a){return["JsonBool",a]},JsonNull:["JsonNull"],JsonArray:function(a){return["JsonArray",a]},JsonObject:function(a){return["JsonObject",a]}}}();Foreign.JavaScript.JSON=ElmJSON;-var Value=function(){function e(a){if(0==a.length)return a;for(var a=a.replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(/\n/g,"<br/>"),a=a.split("<br/>"),b=a.length;b--;){var c=a,l=b,j;j=a[b];if(0!=j.length){j=j.split("");" "==j[0]&&(j[0]=" ");for(var m=j.length;--m;)" "==j[m][0]&&" "==j[m-1]&&(j[m-1]+=j[m],j[m]="");for(m=j.length;m--;)if(1<j[m].length&&" "==j[m][0]){for(var d=j[m].split(""),g=d.length-2;0<=g;g-=2)d[g]=" ";j[m]=d.join("")}j=-j.join("")}c[l]=j}return a.join("<br/>")}var c=function(a,b){if("object"===typeof a){if(a===b)return!0;if(a.length!==b.length)return!1;for(var f=a.length;f--;)if(!c(a[f],b[f]))return!1;return!0}return a===b},b=function(a){if("boolean"===typeof a)return a?"True":"False";if("number"!==typeof a){if("string"===typeof a&&2>a.length)return"'"+a+"'";if(a[0]){if("Tuple"===a[0].substring(0,5)){for(var c="",f=a.length;--f;)c=","+b(a[f])+c;","===c[0]&&(c=c.substring(1));return"("+c+")"}if("Cons"===a[0])for(var f=-"string"===typeof a[1]?'"':"]",l="string"===typeof a[1]?"":",",j="string"===typeof a[1]?function(a){return a}:b,c=("string"===typeof a[1]?'"':"[")+j(a[1]),a=a[2];;)if("Cons"===a[0])c+=l+j(a[1]),a=a[2];else return c+f;else{if("Nil"===a[0])return"[]";if("JSON"===a[0])return"(JSON.fromList "+b(ElmJSON.toList(a))+")";c="";for(f=a.length;--f;)c=" "+b(a[f])+c;c=a[0]+c;return 1<a.length?"("+c+")":c}}}return a+""};return{eq:c,str:function(a){for(var b=["Nil"],c=a.length;c--;)b=["Cons",a[c],b];return b},show:function(a){return Text.monospace(e(b(a)))},-Tuple:function(){var a=arguments.length,b=Array(a+1);for(b[0]="Tuple"+arguments.length;a--;)b[a+1]=arguments[a];return b},append:function(a,b){if("string"===typeof a&&"string"===typeof b)return a.concat(b);if("Nil"===a[0])return b;for(var c=["Cons",a[1],["Nil"]],l=c,a=a[2];"Cons"===a[0];)l[2]=["Cons",a[1],["Nil"]],a=a[2],l=l[2];l[2]=b;return c},listToArray:function(a){for(var b=[];"Cons"===a[0];)b.push(a[1]),a=a[2];return b},toText:function(a){if("string"===typeof a)return e(a);for(var b=[];"Cons"===-a[0];)b.push(a[1]),a=a[2];return e(b.join(""))},properEscape:e,getTextSize:function(a,b,c){var l=document.createElement("div");l.innerHTML=c;l.style.textAlign="left";0<a&&(l.style.width=a+"px");l.style.visibility="hidden";l.style.styleFloat="left";l.style.cssFloat="left";document.body.appendChild(l);c=window.getComputedStyle(l);a=c.getPropertyValue("width").slice(0,-2)-0;c=c.getPropertyValue("height").slice(0,-2)-0;document.body.removeChild(l);delete l;return[Math.ceil(a),Math.ceil(Math.max(b,c))]},-getSize:function(a){a=a.cloneNode(!0);a.style.visibility="hidden";a.style.styleFloat="left";a.style.cssFloat="left";document.body.appendChild(a);var b=a.offsetWidth,c=a.offsetHeight;document.body.removeChild(a);delete a;return[b,c]},getExcess:function(a){a=a.cloneNode(!0);a.style.visibility="hidden";a.style.styleFloat="left";a.style.cssFloat="left";document.body.appendChild(a);var b=a.offsetWidth,c=a.offsetHeight,l=window.getComputedStyle(a),j=l.getPropertyValue("width").slice(0,-2)-0,l=l.getPropertyValue("height").slice(0,--2)-0;document.body.removeChild(a);delete a;return[b-j,c-l]},groupForms:function(a){for(var a=Foreign.JavaScript.castListToJSArray(a),b=[],c=[],l=a.length;l--;){var j=a[l];switch(j[4][0]){case "FElement":0<c.length&&(b.push(c),c=[]);b.push(j);break;default:c.push(j)}}0<c.length&&b.push(c);return b}}}(),List=function(){function e(a){return function(b){if("Nil"===b[0])return b;"Cons"!==b[0]&&d("map");for(var i=["Cons",a(b[1]),["Nil"]],c=i,b=b[2];"Cons"===b[0];)c[2]=["Cons",a(b[1]),["Nil"]],b=b[2],c=-c[2];return i}}function c(a){return function(b){return function(i){var c=b;if("Nil"===i[0])return c;for("Cons"!==i[0]&&d("foldl");"Cons"===i[0];)c=a(i[1])(c),i=i[2];return c}}}function b(a){return function(b){return function(i){var c=b;if("Nil"===i[0])return c;"Cons"!==i[0]&&d("foldr");for(var g=[];"Cons"===i[0];)g.push(i[1]),i=i[2];for(i=g.length;i--;)c=a(g[i])(c);return c}}}function a(a){return function(d){var i;"Cons"!==d[0]?i=void 0:(i=d[1],d=d[2],i=c(a)(i)(d));return i}}function k(a){return function(b){return function(i){if("Nil"===-i[0])return["Cons",b,["Nil"]];"Cons"!==i[0]&&d("scanl");for(var c=[b];"Cons"===i[0];)b=a(i[1])(b),c.push(b),i=i[2];for(var i=["Nil"],g=c.length;g--;)i=["Cons",c[g],i];return i}}}function f(a){return function(d){a:{for(var b=[function(a){return"Nil"!==a[0]?void 0:["Tuple2",["Nil"],["Nil"]]},function(d){if("Cons"===d[0]){var b=d[1],d=d[2];var i=f(a)(d);"Tuple2"!==i[0]?b=void 0:(d=i[1],i=i[2],b=a(b)?["Tuple2",["Cons",b,d],i]:["Tuple2",d,["Cons",b,i]]);return b}}],c=b.length;c--;){var g=b[c](d);if(void 0!==-g){d=g;break a}}d=void 0}return d}}function l(a){a:{for(var d=[function(a){return"Nil"!==a[0]?void 0:["Tuple2",["Nil"],["Nil"]]},function(a){if("Cons"!==a[0])a=void 0;else if(a=["Tuple2",a[1],l(a[2])],"Tuple2"!==a[0]||"Tuple2"!==a[1][0])a=void 0;else var d=a[1][1],b=a[1][2],a="Tuple2"!==a[2][0]?void 0:["Tuple2",["Cons",d,a[2][1]],["Cons",b,a[2][2]]];return a}],b=d.length;b--;){var c=d[b](a);if(void 0!==c){a=c;break a}}a=void 0}return a}function j(a){return function(d){a:{for(var b=[function(a){return"Nil"!==-a[0]?void 0:["Nil"]},function(a){if("Cons"===a[0]){var d=a[1];return"Nil"!==a[2][0]?void 0:["Cons",d,["Nil"]]}},function(d){if("Cons"===d[0]){var b=d[1];if("Cons"===d[2][0]){var i=d[2][1],d=d[2][2];return["Cons",b,["Cons",a,j(a)(["Cons",i,d])]]}}}],c=b.length;c--;){var g=b[c](d);if(void 0!==g){d=g;break a}}d=void 0}return d}}function m(a){return function(d){a:{for(var b=[function(a){return"Nil"!==a[0]?void 0:["Nil"]},function(a){if("Cons"===a[0]){var d=a[1];return"Nil"!==a[2][0]?void 0:d}},function(d){if("Cons"===-d[0]){var b=d[1];if("Cons"===d[2][0]){var i=d[2][1],d=d[2][2];return Value.append(b,Value.append(a,m(a)(["Cons",i,d])))}}}],c=b.length;c--;){var g=b[c](d);if(void 0!==g){d=g;break a}}d=void 0}return d}}var d=function(a){throw"Function '"+a+"' expecting a list!";},g=c(function(a){return function(d){return["Cons",a,d]}})(["Nil"]),h=b(function(a){return function(d){return Value.append(a,d)}})(["Nil"]),v=c(function(a){return function(d){return a&&d}})(!0),o=c(function(a){return function(d){return a||-d}})(!1),s=c(function(a){return function(d){return a+d}})(0),n=c(function(a){return function(d){return a*d}})(1),p=a(function(a){return function(d){return Math.max(a,d)}}),r=a(function(a){return function(d){return Math.min(a,d)}});return{head:function(a){if("Cons"!==a[0])throw"Error: 'head' only accepts lists of length greater than one.";return a[1]},tail:function(a){if("Cons"!==a[0])throw"Error: 'tail' only accepts lists of length greater than one.";return a[2]},last:function(a){if("Cons"!==a[0])throw"Error: 'last' only accepts lists of length greater than one.";-for(var d=a[1];"Cons"===a[0];)d=a[1],a=a[2];return d},map:e,foldl:c,foldr:b,foldl1:a,foldr1:function(a){return function(b){if("Nil"===b[0])throw"'foldr1' requires an non-empty list.";"Cons"!==b[0]&&d("foldr1");for(var i=[];"Cons"===b[0];)i.push(b[1]),b=b[2];for(var b=i.pop(),c=i.length;c--;)b=a(i[c])(b);return b}},scanl:k,scanl1:function(a){return function(d){if("Cons"!==d[0])throw"Error: 'scanl1' requires a list of at least length 1.";return k(a)(d[1])(d[2])}},filter:function(a){return function(b){if("Nil"===-b[0])return b;"Cons"!==b[0]&&d("filter");for(var i=[];"Cons"===b[0];)a(b[1])&&i.push(b[1]),b=b[2];for(var b=["Nil"],c=i.length;c--;)b=["Cons",i[c],b];return b}},length:function(a){for(var d=0;"Cons"===a[0];)d+=1,a=a[2];return d},reverse:g,concat:h,concatMap:function(a){return function(d){return h(e(a)(d))}},and:v,or:o,forall:function(a){return c(function(d){return function(b){return b&&a(d)}})(!0)},exists:function(a){return c(function(d){return function(b){return b||a(d)}})(!1)},sum:s,product:n,maximum:p,-minimum:r,partition:f,zipWith:function(a){return function(b){return function(c){if("Nil"===b[0]||"Nil"===c[0])return["Nil"];("Cons"!==b[0]||"Cons"!==c[0])&&d("zipWith");for(var g=[];"Cons"===b[0]&&"Cons"===c[0];)g.push(a(b[1])(c[1])),b=b[2],c=c[2];for(var c=["Nil"],h=g.length;h--;)c=["Cons",g[h],c];return c}}},zip:function(a){return function(b){if("Nil"===a[0]||"Nil"===b[0])return["Nil"];("Cons"!==a[0]||"Cons"!==b[0])&&d("zip");for(var c=[];"Cons"===a[0]&&"Cons"===b[0];)c.push(["Tuple2",a[1],b[1]]),-a=a[2],b=b[2];for(var b=["Nil"],g=c.length;g--;)b=["Cons",c[g],b];return b}},unzip:l,intersperse:j,intercalate:m,sort:function(a){if("Nil"===a[0])return a;"Cons"!==a[0]&&d("sort");for(var b=[];"Cons"===a[0];)b.push(a[1]),a=a[2];b.sort(function(a,d){return a-d});for(var a=["Nil"],c=b.length;c--;)a=["Cons",b[c],a];return a},take:function(a){return function(b){if(0>=a)return["Nil"];if("Nil"===b[0])return b;"Cons"!==b[0]&&d("take");var c=["Cons",b[1],["Nil"]],g=c,b=b[2];for(--a;"Cons"===b[0]&&0<a;)g[2]=-["Cons",b[1],["Nil"]],g=g[2],b=b[2],--a;return c}},drop:function(a){return function(b){if("Nil"===b[0])return b;for("Cons"!==b[0]&&d("drop");"Cons"===b[0]&&0<a;)b=b[2],--a;return b}}}}(),Data=function(){var e;e=function(b){return function(a){return"Just"===b[0]?["Cons",b[1],a]:a}};var c=function(b){return function(a){return function(c){var e=b(a);return"Just"===e[0]?["Cons",e[1],c]:c}}};e={Just:function(b){return["Just",b]},Nothing:["Nothing"],catMaybes:List.foldr(e)(["Nil"]),isJust:function(b){return"Just"===-b[0]},isNothing:function(b){return"Nothing"===b[0]},fromMaybe:function(b){return function(a){return"Just"===a[0]?a[1]:b}},consMaybe:e,mapMaybe:function(b){return List.foldr(c(b))(["Nil"])},maybe:function(b){return function(a){return function(c){return"Just"===c[0]?a(c[1]):b}}}};return{String:{toText:Value.toText,properEscape:Value.properEscape},Char:{fromCode:function(b){return String.fromCharCode(b)},toCode:function(b){return b.charCodeAt(0)},toUpper:function(b){return b.toUpperCase()},toLower:function(b){return b.toLowerCase()},-toLocaleUpper:function(b){return b.toLocaleUpperCase()},toLocaleLower:function(b){return b.toLocaleLowerCase()}},Maybe:e,List:List}}(),ElmCode=ElmCode||{};ElmCode.Graphics=ElmCode.Graphics||{};-ElmCode.Graphics.Color=function(){return{rgba:function(e){return function(c){return function(b){return function(a){return["Color",e,c,b,a]}}}},rgb:function(e){return function(c){return function(b){return["Color",e,c,b,1]}}},red:["Color",255,0,0,1],green:["Color",0,255,0,1],blue:["Color",0,0,255,1],yellow:["Color",255,255,0,1],cyan:["Color",0,255,255,1],magenta:["Color",255,0,255,1],black:["Color",0,0,0,1],white:["Color",255,255,255,1],gray:["Color",128,128,128,1],grey:["Color",128,128,128,1],extract:function(e){return 1===-e[4]?"rgb("+e[1]+","+e[2]+","+e[3]+")":"rgba("+e[1]+","+e[2]+","+e[3]+","+e[4]+")"}}}();-var Collage=function(){function e(a,b){var c=b.length-1;if(!(0>=c))for(a.moveTo(b[c][1],b[c][2]);c--;)a.lineTo(b[c][1],b[c][2])}function c(a,b,c,d){0===a.length&&(a=[8,4]);var g=d.length-1;if(!(0>=g)){var h=d[g][1],e=d[g][2],f=0,k=0,n=0,p=0,r=0,q=0,t=a.length,i=!0,u=a[0];for(b.moveTo(h,e);g--;){f=d[g][1];k=d[g][2];n=f-h;p=k-e;for(r=Math.sqrt(n*n+p*p);u<=r;)h+=n*u/r,e+=p*u/r,b[i?"lineTo":"moveTo"](h,e),n=f-h,p=k-e,r=Math.sqrt(n*n+p*p),i=!i,q=(q+1)%t,u=a[q];0<r&&(b[i?"lineTo":"moveTo"](f,k),u-=r);h=-f;e=k}}b.strokeStyle=ElmCode.Graphics.Color.extract(c);b.stroke()}function b(a,b,m,d,g){b.clearRect(0,0,m,d);for(m=g.length;m--;){var h=g[m],f=a,d=b,o=h[1],k=h[2],n=h[3][1],p=h[3][2],h=h[4];d.save();(0!==n||0!==p)&&d.translate(n,p);o!==~~o&&d.rotate(2*Math.PI*o);1!==k&&d.scale(k,k);d.beginPath();switch(h[0]){case "FLine":a:switch(f=d,o=h,h=Foreign.JavaScript.castListToJSArray(o[3][1]),o[1][0]){case "Solid":o=o[2];e(f,h);f.strokeStyle=ElmCode.Graphics.Color.extract(o);f.stroke();break a;case "Dotted":c([3,-3],f,o[2],h);break a;case "Dashed":c([8,4],f,o[2],h);break a;case "Custom":k=Foreign.JavaScript.castListToJSArray(o[1][1]),c(k,f,o[2],h)}break;case "FShape":a:switch(n=f,o=d,k=h[1],f=h[2],h=h[3][1],h=Foreign.JavaScript.castListToJSArray(h),0<h.length&&h.push(h[0]),k[0]){case "Filled":e(o,h);o.fillStyle=ElmCode.Graphics.Color.extract(f);o.fill();break a;case "Outlined":e(o,h);o.strokeStyle=ElmCode.Graphics.Color.extract(f);o.stroke();break a;case "Textured":f=n;k=k[1];n=new Image;n.src=Foreign.JavaScript.castStringToJSString(k);-n.onload=f;e(o,h);o.fillStyle=o.createPattern(n,"repeat");o.fill();break a;case "CustomOutline":k=Foreign.JavaScript.castListToJSArray(k[1]),c(k,o,f,h)}break;case "FImage":o=d,k=h[1],n=h[2],h=h[3],p=new Image,p.onload=f,p.src=Foreign.JavaScript.castStringToJSString(h),o.drawImage(p,-k/2,-n/2,k,n)}d.restore()}}function a(a,c,m){var d=Render.newElement("canvas");d.style.width=~~a+"px";d.style.height=~~c+"px";d.style.display="block";d.width=~~a;d.height=~~c;if(d.getContext){var g=d.getContext("2d"),-a=d.width,c=d.height;b(function(){b(this,g,a,c,m)},g,a,c,m);return d}d.innerHTML="Your browser does not support the canvas element.";return d}function k(a,b,c,d,g,h,f){var e=Render.render(f),c="translate("+(g-f[3]/2)+"px,"+(h-f[4]/2)+"px) "+(1===d?"":"scale("+d+","+d+")")+" "+(c===~~c?"":"rotate("+360*c+"deg)");e.style.transform=c;e.style.msTransform=c;e.style.MozTransform=c;e.style.webkitTransform=c;e.style.OTransform=c;c=Render.newElement("div");Render.addTo(c,e);c.style.width=~~a+"px";c.style.height=-~~b+"px";c.style.overflow="hidden";return c}function f(c,f,e){if(!Value.eq(e,f)){var d=c.style.width.slice(0,-2)-0,g=c.style.height.slice(0,-2)-0;if("object"===typeof e[0]){if("object"===typeof f[0]&&c.getContext){var h=c.getContext("2d");return b(function(){b(this,h,d,g,e)},h,d,g,e)}f=a(d,g,e);f.style.position="absolute";return c.parentNode.replaceChild(f,c)}f=k(d,g,e[1],e[2],e[3][1],e[3][2],e[4][1]);f.style.position="absolute";return c.parentNode.replaceChild(f,c)}}return{collage:function(b,c,e){if(0===-e.length)return a(b,c,[]);for(var d=Array(e.length),g=e.length;g--;){var h=e[g];d[g]="string"===typeof h[0]?k(b,c,h[1],h[2],h[3][1],h[3][2],h[4][1]):a(b,c,h)}return 1===e.length?d[0]:Render.flowWith(Render.goIn,function(a){return a},d)},updateCollage:function(a,b,c){if(1===c.length)return f(a,b[0],c[0]);for(var a=a.childNodes,d=a.length,g=d;g--;)f(a[d-g-1],b[g],c[g])}}}(),ElmCode=ElmCode||{};ElmCode.Graphics=ElmCode.Graphics||{};-ElmCode.Graphics.Element=function(){function e(a){return function(b){return["Position",a,b]}}function c(a){return function(b){return["EText",a,b]}}function b(a){return function(b){return["EFlow",a,Foreign.JavaScript.castListToJSArray(b)]}}function a(a){return["Line",a]}function k(a){return function(b){return["Shape",a,b]}}function f(a){return function(b){return function(d){return function(c){return["Form",a,b,d,c]}}}}function l(a){return function(b){return function(d){return["FLine",a,b,d]}}}function j(a){return function(b){return function(d){return["FShape",-a,b,d]}}}function m(a,b,d,c,i,g){return["Element",Guid.guid(),a,b,d,c,i,g]}function d(a,b,d){return["Element",Guid.guid(),a,b,d,1,Nothing,Nothing]}function g(a){return~~a[3]}function h(a){return~~a[4]}function v(a){return function(b){return function(c){return d(["EImage",Foreign.JavaScript.castStringToJSString(c)],a,b)}}}function o(a){return function(b){return d(u,a,b)}}function s(a){return function(b){return function(d){var c=map(function(d){return["Tuple2",a/2*cos(2*(pi/50)*d),b/2*sin(2*(pi/50)*-d)]}),i=49,g=["Nil"];if(0<=i){do g=["Cons",i,g];while(0<i--)}return k(c(g))(d)}}}var n=["DRight"],p=["DDown"],r=["DOut"],q=["Near"],t=["Mid"],i=["Far"],u=["EEmpty"],w=["Solid"],x=["Dotted"],y=["Dashed"],z=["Filled"],A=["Outlined"],B=e(q)(q),C=e(i)(q),D=e(q)(i),E=e(i)(i),F=e(q)(t),G=e(i)(t),q=e(t)(q),i=e(t)(i),t=e(t)(t);return{left:["DLeft"],right:n,down:p,up:["DUp"],inward:["DIn"],outward:r,topLeft:B,topRight:C,bottomLeft:D,bottomRight:E,midLeft:F,midRight:G,midTop:q,midBottom:i,middle:t,middleAt:function(a){return function(b){return["PositionAt",-a,b]}},topLeftAt:function(a){return function(b){return["PositionTL",a,b]}},topRightAt:function(a){return function(b){return["PositionTR",a,b]}},bottomLeftAt:function(a){return function(b){return["PositionBL",a,b]}},bottomRightAt:function(a){return function(b){return["PositionBR",a,b]}},absolute:function(a){return["Absolute",a]},relative:function(a){return["Relative",a]},width:function(a){return function(b){var d=b[2];switch(d[0]){case "EImage":case "EVideo":return m(b[2],a,b[4]*a/b[3],b[5],b[6],b[7]);-case "EText":return d=Value.getTextSize(a,b[4],d[2]),m(b[2],a,d[1],b[5],b[6],b[7])}return m(b[2],a,b[4],b[5],b[6],b[7])}},height:function(a){return function(b){switch(b[2][0]){case "EImage":case "EVideo":return m(b[2],b[3]*a/b[4],a,b[5],b[6],b[7])}return m(b[2],b[3],a,b[5],b[6],b[7])}},size:function(a){return function(b){return function(d){return m(d[2],a,b,d[5],d[6],d[7])}}},opacity:function(a){return function(b){return m(b[2],b[3],b[4],a,b[6],b[7])}},color:function(a){return function(b){return m(b[2],-b[3],b[4],b[5],Just(a),b[7])}},link:function(a){return function(b){return m(b[2],b[3],b[4],b[5],b[6],Just(Foreign.JavaScript.castStringToJSString(a)))}},widthOf:g,heightOf:h,sizeOf:function(a){return["Tuple2",~~a[3],~~a[4]]},text:function(a){var b=Value.getTextSize(0,0,a);return d(c("left")(a),b[0],b[1])},asText:function(a){var a=Value.show(a),b=Value.getTextSize(0,0,a);return d(c("left")(a),b[0],b[1])},plainText:function(a){var a=Value.toText(a),b=Value.getTextSize(0,0,a);return d(c("left")(a),b[0],-b[1])},centeredText:function(a){var b=Value.getTextSize(0,0,a);return d(c("center")(a),b[0],b[1])},justifiedText:function(a){var b=Value.getTextSize(0,0,a);return d(c("justify")(a),b[0],b[1])},rightedText:function(a){var b=Value.getTextSize(0,0,a);return d(c("right")(a),b[0],b[1])},image:v,images:function(a){var b=Elm.Input(o(0)(0)),a=Elm.Lift(function(a){var a=Foreign.JavaScript.castStringToJSString(a),d=new Image;d.onload=function(){console.log("loaded");Dispatcher.notify(b.id,v(this.width)(this.height)(a))};-d.src=a},[a]);return Elm.Lift(function(a){return function(){return a}},[b,a])},video:function(a){return function(b){return function(c){return d(["EVideo",Foreign.JavaScript.castStringToJSString(c)],a,b)}}},fittedImage:function(a){return function(b){return function(c){return d(["EFittedImage",Foreign.JavaScript.castStringToJSString(c)],a,b)}}},flow:function(a){return function(c){var i;i=map(g)(c);a:{switch(a[0]){case "DLeft":i=sum(i);break a;case "DRight":i=sum(i);break a}i=maximum(i)}var e;e=map(h)(c);-a:{switch(a[0]){case "DDown":e=sum(e);break a;case "DUp":e=sum(e);break a}e=maximum(e)}return d(b(a)(c),i,e)}},above:function(a){return function(c){return d(b(p)(["Cons",a,["Cons",c,["Nil"]]]),max(~~a[3])(~~c[3]),~~a[4]+~~c[4])}},below:function(a){return function(c){return d(b(p)(["Cons",c,["Cons",a,["Nil"]]]),max(~~a[3])(~~c[3]),~~a[4]+~~c[4])}},beside:function(a){return function(c){return d(b(n)(["Cons",a,["Cons",c,["Nil"]]]),~~a[3]+~~c[3],max(~~a[4])(~~c[4]))}},layers:function(a){return d(b(r)(a),-maximum(map(g)(a)),maximum(map(h)(a)))},collage:function(a){return function(b){return function(c){return d(["ECollage",a,b,Value.groupForms(c)],a,b)}}},spacer:o,container:function(a){return function(b){return function(c){return function(i){return d(["EContainer",c,i],a,b)}}}},line:a,segment:function(b){return function(d){return a(["Cons",b,["Cons",d,["Nil"]]])}},polygon:k,rect:function(a){return function(b){return function(d){return k(["Cons",["Tuple2",0-a/2,0-b/2],["Cons",["Tuple2",0-a/2,b/2],["Cons",-["Tuple2",a/2,b/2],["Cons",["Tuple2",a/2,0-b/2],["Nil"]]]]])(d)}}},oval:s,circle:function(a){return s(2*a)(2*a)},ngon:function(a){return function(b){return function(d){var c=toFloat(a),i=map(function(a){return["Tuple2",b*cos(2*(pi/c)*a),b*sin(2*(pi/c)*a)]}),g=a-1,h=["Nil"];if(0<=g){do h=["Cons",g,h];while(0<g--)}return k(i(h))(d)}}},solid:function(a){return function(b){return f(0)(1)(["Tuple2",0,0])(l(w)(a)(b))}},dotted:function(a){return function(b){return f(0)(1)(["Tuple2",0,0])(l(x)(a)(b))}},dashed:function(a){return function(b){return f(0)(1)(["Tuple2",-0,0])(l(y)(a)(b))}},customLine:function(a){return function(b){return function(d){return f(0)(1)(["Tuple2",0,0])(l(["Custom",a])(b)(d))}}},filled:function(a){return function(b){return f(0)(1)(b[2])(j(z)(a)(b))}},outlined:function(a){return function(b){return f(0)(1)(b[2])(j(A)(a)(b))}},customOutline:function(a){return function(b){return function(d){return f(0)(1)(d[2])(j(["CustomOutline",a])(b)(d))}}},textured:function(a){return function(b){return f(0)(1)(b[2])(j(["Textured",a])(null)(b))}},sprite:function(a){return function(b){return function(d){return function(c){return f(0)(1)(c)(["FImage",-b,d,Foreign.JavaScript.castStringToJSString(a)])}}}},toForm:function(a){return function(b){return f(0)(1)(a)(["FElement",b])}},rotate:function(a){return function(b){a:{switch(b[0]){case "Form":var d=b[2],c=b[3],i=b[4],b=f(a+b[1])(d)(c)(i);break a}throw"Non-exhaustive pattern match in case";}return b}},scale:function(a){return function(b){return f(b[1])(a*b[2])(b[3])(b[4])}},move:function(a){return function(b){return function(d){var c;a:{switch(d[0]){case "Form":c=d[1];var i=d[2],g=d[3],d=d[4];switch(g[0]){case "Tuple2":var h=-g[1],g=g[2];c=f(c)(i)(["Tuple2",a+h,b+g])(d);break a}}throw"Non-exhaustive pattern match in case";}return c}}}}}();-var Text=function(){function e(a){return Value.toText(a)}var c=function(a){return function(b){return"<"+a+' style="padding:0;margin:0">'+b+"</"+a+">"}},b=function(a,b){return function(c){return"<span style='"+a+":"+b+"'>"+c+"</span>"}},a=function(a){a=Foreign.JavaScript.castStringToJSString(a);return b("font-family",a)},k=c("h1"),f=b("font-style","italic"),c=c("b"),l=b("text-decoration","underline"),j=b("text-decoration","overline"),m=b("text-decoration","line-through");return{fromString:e,toText:e,-header:k,height:function(a){return b("font-size",a+"em")},italic:f,bold:c,underline:l,overline:j,strikeThrough:m,monospace:a("monospace"),typeface:a,color:function(a){return b("color",ElmCode.Graphics.Color.extract(a))},link:function(a){return function(b){return"<a href='"+e(a)+"'>"+b+"</a>"}}}}(),Render=function(){function e(a){a=document.createElement(a);a.style.padding="0";a.style.margin="0";return a}function c(a){return a}function b(a){a.style.styleFloat="left";a.style.cssFloat="left";return a}-function a(a){a.style.position="absolute";return a}function k(a,b,c){for(var f=e("div"),m=c.length;m--;){var j=a(b(c[m]));f.appendChild(j)}return f}function f(a){switch(a[0]){case "Absolute":return a[1]+"px";case "Relative":return 100*a[1]+"%"}}function l(a,b){b.style.position="absolute";b.style.margin="auto";switch(a[0]){case "Position":"Far"!==a[1][0]&&(b.style.left=0);"Near"!==a[1][0]&&(b.style.right=0);"Far"!==a[2][0]&&(b.style.top=0);"Near"!==a[2][0]&&(b.style.bottom=0);break;case "PositionAt":b.style.top=-f(a[2]);b.style.left=f(a[1]);var c="translate("+-elem[3]/2+"px,"+-elem[4]/2+"px)";b.style.transform=c;b.style.msTransform=c;b.style.MozTransform=c;b.style.webkitTransform=c;b.style.OTransform=c;break;default:c=a[0].slice(-2),b.style["T"===c[0]?"top":"bottom"]=f(a[2]),b.style["L"===c[1]?"left":"right"]=f(a[1])}}function j(d){var g={};switch(d[2][0]){case "EText":var g=d[2][1],h=d[2][2],f=e("div");f.innerHTML=h;f.style.textAlign=g;g=f;break;case "EImage":g=d[2][1];h=e("img");h.src=g;h.name=g;h.style.display=-"block";g=h;break;case "EVideo":f=d[2][1];g=e("video");g.controls="controls";h=e("source");h.src=f;f=f.split(".");h.type="video/"+f[f.length-1];g.appendChild(h);g.style.display="block";break;case "EFittedImage":var m=d[3],s=d[4],g=d[2][1],n=e("canvas");n.style.display="block";n.style.width=m+"px";n.style.height=s+"px";n.width=m;n.height=s;n.innerHTML="Your browser does not support the canvas element.";var p=e("img");p.onload=function(){if(n.getContext){var a=n.getContext("2d"),b=0,c=0,d=this.width,-g=this.height;m/s>this.width/this.height?(g=this.width*s/m,c=(this.height-g)/2):(d=this.height*m/s,b=(this.width-d)/2);a.drawImage(p,b,c,d,g,0,0,n.width,n.height)}};p.src=g;g=n;break;case "EFlow":a:{g=d[2][2];switch(d[2][1][0]){case "DDown":g=g.slice(0).reverse();case "DUp":g=k(c,j,g);break a;case "DRight":g=g.slice(0).reverse();case "DLeft":g=k(b,j,g);break a;case "DOut":g=g.slice(0).reverse();case "DIn":g=k(a,j,g);break a}g=void 0}break;case "ECollage":g=Collage.collage(d[2][1],d[2][2],d[2][3]);-break;case "EEmpty":g=e("div");break;case "EContainer":h=d[2][1];g=j(d[2][2]);l(h,g);h=e("div");h.style.position="relative";h.style.overflow="hidden";h.appendChild(g);g=h;break;case "EHtml":g=d[2][1];"button"!==g.type&&(h=Value.getExcess(g),d[3]-=h[0],d[4]-=h[1]);break;case "EExternalHtml":g=e("div"),g.appendChild(d[2][1])}g.id=d[1];g.style.width=~~d[3]+"px";g.style.height=~~d[4]+"px";1!==d[5]&&(g.style.opacity=d[5]);"Just"===d[6][0]&&(g.style.backgroundColor=ElmCode.Graphics.Color.extract(d[6][1]));-return"Just"===d[7][0]?(h=e("a"),h.href=d[7][1],h.appendChild(g),h):g}function m(d,g,h){"A"===d.tagName&&(d=d.firstChild);if(g[1]!==h[1]){if(g[2][0]!==h[2][0])return d.parentNode.replaceChild(j(h),d);var e=h[2],f=g[2];switch(e[0]){case "EText":e[1]!==f[1]&&(d.style.textAlign=e[1]);e[2]!==f[2]&&(d.innerHTML=e[2]);break;case "EImage":e[1]!==f[1]&&(d.src=e[1]);break;case "EVideo":case "EFittedImage":if(!Value.eq(e,f)||h[3]!==g[3]||h[4]!==g[4])return d.parentNode.replaceChild(j(h),d);break;case "ECollage":if(e[1]!==-f[1]||e[2]!==f[2]||e[3].length!==f[3].length)return d.parentNode.replaceChild(j(h),d);Collage.updateCollage(d,f[3],e[3]);break;case "EFlow":if(e[1]!==f[1])return d.parentNode.replaceChild(j(h),d);var k=e[2],n=d.childNodes;if(k.length!==n.length)return d.parentNode.replaceChild(j(h),d);var f=f[2],p={};switch(e[1][0]){case "DDown":case "DUp":p=c;break;case "DRight":case "DLeft":p=b;break;case "DOut":case "DIn":p=a}for(e=n.length;e--;)m(n[e],f[e],k[e]),p(n[e]);break;case "EContainer":m(d.childNodes[0],-f[2],e[2]);l(e[1],d.childNodes[0]);break;case "EHtml":h[1]!==g[1]&&(k=j(h),d.parentNode.replaceChild(k,d),d=k);"button"!==k.type&&(e=Value.getExcess(d),h[3]-=e[0],h[4]-=e[1]);break;case "EExternalHtml":h[1]!==g[1]&&d.parentNode.replaceChild(j(h),d)}h[3]!==g[3]&&(d.style.width=~~h[3]+"px");h[4]!==g[4]&&(d.style.height=~~h[4]+"px");h[5]!==g[5]&&(d.style.opacity=h[5]);2===h[6].length&&(e=ElmCode.Graphics.Color.extract(h[6][1]),e!==d.style.backgroundColor&&(d.style.backgroundColor=e));if(2===h[7].length&&-(1===g[7].length||h[7][1]!==g[7][1]))d.parentNode.href=h[7][1];h[1]=g[1]}}return{render:j,update:m,addTo:function(a,b){a.appendChild(b)},newElement:e,flowWith:k,goIn:a}}(),Elm=function(){var e=function(a,b,c){for(var e=a.kids,f=e.length;f--;)e[f].recv(b,c,a.id)},c=function(a){this.id=Guid.guid();this.value=a;this.kids=[];this.defaultNumberOfKids=0;this.recv=function(a,b,c){if(b=b===this.id)this.value=c;e(this,a,b);return b};Dispatcher.inputs.push(this)},b=function(a,b){this.id=Guid.guid();this.value=-null;this.kids=[];this.count=0;this.changed=!1;b.reverse();this.recalc=function(){for(var c=a,g=b.length;g--;)c=c(b[g].value);this.value=c};this.recalc();this.recv=function(a,c){this.count+=1;c&&(this.changed=!0);this.count==b.length&&(this.changed&&this.recalc(),e(this,a,this.changed),this.changed=!1,this.count=0)};for(var c=b.length;c--;)b[c].kids.push(this)},a=function(a,b,c){this.id=Guid.guid();this.value=b;this.kids=[];this.recv=function(b,d){d&&(this.value=a(c.value)(this.value));e(this,b,d)};-c.kids.push(this)},k=function(a,b,c){this.id=Guid.guid();this.value=a(c.value)?b:c.value;this.kids=[];this.recv=function(b,d){var f=d&&!a(c.value);f&&(this.value=c.value);e(this,b,f)};c.kids.push(this)},f=function(a){this.id=Guid.guid();this.value=a.value;this.kids=[];this.recv=function(b,c){var f=c&&!eq(this.value,a.value);f&&(this.value=a.value);e(this,b,f)};a.kids.push(this)},l=function(a){return function(c){return function(e){e=new b(function(a){return function(b){return[a,b]}},[a,e]);e=new k(function(a){return a[0]},-[!0,c],e);return new b(function(a){return a[1]},[e])}}},j=function(a,b){this.id=Guid.guid();this.value=b.value;this.kids=[];this.count=0;this.changed=!1;this.recv=function(c,f,j){j===a.id&&(this.changed=f);this.count+=1;2==this.count&&(this.changed&&(this.value=b.value),e(this,c,this.changed),this.count=0,this.changed=!1)};a.kids.push(this);b.kids.push(this)};return{Input:function(a){return new c(a)},Lift:function(a,c){return new b(a,c)},Fold:function(b,c,e){return new a(b,c,e)},keepIf:function(a){return function(b){return function(c){return new k(function(b){return!a(b)},-b,c)}}},dropIf:function(a){return function(b){return function(c){return new k(a,b,c)}}},keepWhen:function(a){return l(new b(function(a){return!a},[a]))},dropWhen:l,dropRepeats:function(a){return new f(a)},sampleOn:function(a){return function(b){return new j(a,b)}}}}(),Dispatcher=function(){function e(a){if(!a.hasOwnProperty("defaultNumberOfKids"))return!0;var b=a.kids.length;if(0==b)return!1;if(b>a.defaultNumberOfKids)return!0;for(var c=!1;b--;)c=c||e(a.kids[b]);return c}var c=null,b=0,a=[],k=null;-return{initialize:function(){c=ElmCode.main();c.hasOwnProperty("recv")||(c=Elm.Input(c));k=c.value;for(var b=[],l=a.length;l--;)e(a[l])&&b.push(a[l]);a=b;document.getElementById("content").appendChild(Render.render(k));b=document.getElementById("widthChecker").offsetWidth;b!==window.innerWidth&&Dispatcher.notify(Window.dimensions.id,Value.Tuple(b,window.innerHeight));c=Elm.Lift(function(a){var b=document.getElementById("content");Render.update(b.firstChild,k,a);return k=a},[c])},notify:function(c,-e){b+=1;for(var j=!1,k=a.length;k--;)j=a[k].recv(b,c,e)||j;return j},inputs:a}}(),Signal=function(){function e(a){var b=Value.getSize(a);return["Element",Guid.guid(),["EHtml",a],b[0],b[1],1,Nothing,Nothing]}function c(a){for(var b=["Nil"],c=a.length;c--;)b=["Cons",a[c],b];return b}var b;b=document.addEventListener?function(a,b,c){a.addEventListener(b,c,!1)}:function(a,b,c){a.attachEvent("on"+b,c)};var a,k=function(a){var b=0,c=0;a||(a=window.event);if(a.pageX||a.pageY)b=a.pageX,c=a.pageY;else if(a.clientX||-a.clientY)b=a.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,c=a.clientY+document.body.scrollTop+document.documentElement.scrollTop;return Value.Tuple(b,c)},f=Elm.Input(Value.Tuple(0,0));f.defaultNumberOfKids=2;a=Elm.Lift(function(a){return a[1]},[f]);a.defaultNumberOfKids=0;var l=Elm.Lift(function(a){return a[2]},[f]);l.defaultNumberOfKids=0;var j=Elm.Input(!1),m=Elm.Input(!1),d=Elm.Input(Value.Tuple());b(document,"click",function(a){var b=Dispatcher.notify(m.id,!0),c=Dispatcher.notify(d.id,-Value.Tuple());Dispatcher.notify(m.id,!1);!b&&!c&&this.removeEventListener("click",arguments.callee,!1)});b(document,"mousedown",function(a){Dispatcher.notify(j.id,!0)||this.removeEventListener("mousedown",arguments.callee,!1)});b(document,"mouseup",function(a){Dispatcher.notify(j.id,!1)||this.removeEventListener("mouseup",arguments.callee,!1)});b(document,"mousemove",function(a){Dispatcher.notify(f.id,k(a))||this.removeEventListener("mousemove",arguments.callee,!1)});a={position:f,x:a,y:l,isClicked:m,-isDown:j,clicks:d,isClickedOn:function(a){var a=Render.render(a),c=Elm.Input(!1);b(a,"click",function(){Dispatcher.notify(c.id,!0);Dispatcher.notify(c.id,!1)});return Value.Tuple(e(a),c)}};var g=Elm.Input(Value.Tuple(window.innerWidth,window.innerHeight));g.defaultNumberOfKids=2;l=Elm.Lift(function(a){return a[1]},[g]);l.defaultNumberOfKids=0;var h=Elm.Lift(function(a){return a[2]},[g]);h.defaultNumberOfKids=0;b(window,"resize",function(a){var b=document.getElementById("widthChecker").offsetWidth;-Dispatcher.notify(g.id,Value.Tuple(b,window.innerHeight))||this.removeEventListener("resize",arguments.callee,!1)});var l={dimensions:g,width:l,height:h},v=function(a,b){return"Nil"===b[0]?b:b[1]===a?b[2]:["Cons",b[1],v(a,b[2])]},o=Elm.Input(["Nil"]),s=Elm.Input(["Nothing"]);b(document,"keydown",function(a){var b;a:{for(b=o.value;"Nil"!==b[0];){if(b[1]===a.keyCode){b=!0;break a}b=b[2]}b=!1}b||Dispatcher.notify(o.id,["Cons",a.keyCode,o.value])||this.removeEventListener("keydown",arguments.callee,!1)});-b(document,"keyup",function(a){var b=v(a.keyCode,o.value);Dispatcher.notify(o.id,b)||this.removeEventListener("keyup",arguments.callee,!1)});b(window,"blur",function(a){Dispatcher.notify(o.id,["Nil"])||this.removeEventListener("blur",arguments.callee,!1)});b(document,"keypress",function(a){var b=Dispatcher.notify(s.id,["Just",a.charCode||a.keyCode]);Dispatcher.notify(s.id,["Nothing"]);b||this.removeEventListener("keypress",arguments.callee,!1)});var h={Raw:{keysDown:o,charPressed:s}},n;n=function(a){return function(b){var d=-Elm.Input(["Waiting"]),e={};window.XMLHttpRequest?e=new XMLHttpRequest:window.ActiveXObject&&(e=new ActiveXObject("Microsoft.XMLHTTP"));e.onreadystatechange=function(){4===e.readyState&&Dispatcher.notify(d.id,200===e.status?["Success",c(e.responseText)]:["Failure",e.status,c(e.statusText)])};e.open(a,Value.toText(b),!0);e.send(null);return d}};var p=function(a){return function(b){var d=Elm.Input(["Nothing"]),b=Elm.Lift(function(b){if("Just"!==b[0]){try{Dispatcher.notify(d.id,["Nothing"])}catch(e){}return[]}try{Dispatcher.notify(d.id,-["Just",["Waiting"]])}catch(g){d.value=["Just",["Waiting"]]}var f={};window.XMLHttpRequest?f=new XMLHttpRequest:window.ActiveXObject&&(f=new ActiveXObject("Microsoft.XMLHTTP"));f.onreadystatechange=function(){4===f.readyState&&Dispatcher.notify(d.id,["Just",200===f.status?["Success",c(f.responseText)]:["Failure",f.status,c(f.statusText)]])};f.open(a,Value.toText(b[1]),!0);f.send(null);return[]},[b]);return Elm.Lift(function(a){return function(){return a}},[d,b])}};n={get:n("GET"),post:n("POST"),gets:p("GET"),-posts:p("POST")};var r=function(a,d){a.placeholder=Foreign.JavaScript.castStringToJSString(d);var f=Elm.Input(["Nil"]);b(a,"keyup",function(){Dispatcher.notify(f.id,c(a.value));a.focus()});a.style.padding="1px";return Value.Tuple(e(a),f)},q=function(a){a=document.createElement(a);a.style.padding="0";a.style.margin="0";return a},t=function(a){for(var c=q("select"),d=[];"Cons"===a[0];){var f=q("option"),g=Text.toText(a[1][1]);f.value=g;f.innerHTML=g;c.appendChild(f);d.push(a[1][2]);a=a[2]}var h=Elm.Input(d[0]);-b(c,"change",function(){Dispatcher.notify(h.id,d[c.selectedIndex])});return Value.Tuple(e(c),h)};return{addListener:b,Mouse:a,Keyboard:h,Time:{every:function(a){var a=1E3*a,b=Elm.Input(0),c=0;setInterval(function(){c+=a;Dispatcher.notify(b.id,c/1E3)},a);return b},after:function(a){var a=1E3*a,b=Elm.Input(!1);setTimeout(function(){Dispatcher.notify(b.id,!0)},a);return b},before:function(a){var a=1E3*a,b=Elm.Input(!0);setTimeout(function(){Dispatcher.notify(b.id,!1)},a);return b}},Window:l,HTTP:n,Random:{inRange:function(a){return function(b){return Elm.Input(Math.floor(Math.random()*-(b-a+1))+a)}},randomize:function(a){return function(b){return function(c){return Elm.Lift(function(){return Math.floor(Math.random()*(b-a+1))+a},[c])}}}},Input:{textArea:function(a){return function(b){var c=q("textarea");c.rows=b;c.cols=a;return r(c,"")}},textField:function(a){var b=q("input");b.type="text";return r(b,a)},password:function(a){var b=q("input");b.type="password";return r(b,a)},checkbox:function(a){var c=q("input");c.type="checkbox";c.checked=a;var d=Elm.Input(a);b(c,"change",function(){Dispatcher.notify(d.id,-c.checked)});return Value.Tuple(e(c),d)},dropDown:t,stringDropDown:function(a){return t(List.map(function(a){return Value.Tuple(a,a)})(a))},button:function(a){var c=q("input");c.type="button";c.value=Foreign.JavaScript.castStringToJSString(a);var d=Elm.Input(!1);b(c,"click",function(){Dispatcher.notify(d.id,!0);Dispatcher.notify(d.id,!1)});return Value.Tuple(e(c),d)}},constant:function(a){return Elm.Input(a)},lift:function(a){return function(b){return Elm.Lift(a,[b])}},lift2:function(a){return function(b){return function(c){return Elm.Lift(a,-[b,c])}}},lift3:function(a){return function(b){return function(c){return function(d){return Elm.Lift(a,[b,c,d])}}}},lift4:function(a){return function(b){return function(c){return function(d){return function(e){return Elm.Lift(a,[b,c,d,e])}}}}},foldp:function(a){return function(b){return function(c){return Elm.Fold(a,b,c)}}},count:function(a){return Elm.Fold(function(){return function(a){return a+1}},0,a)},keepIf:Elm.keepIf,dropIf:Elm.dropIf,keepWhen:Elm.keepWhen,dropWhen:Elm.dropWhen,dropRepeats:Elm.dropRepeats,-sampleOn:Elm.sampleOn}}(),Prelude=function(){var e=function(c){return function(b){var a=c%b,a=0==c?0:0<b?0<=c?a:a+b:-e(-c)(-b);return a==b?0:a}};return{id:function(c){return c},not:function(c){return!c},fst:function(c){return c[1]},snd:function(c){return c[2]},rem:function(c){return function(b){return c%b}},div:function(c){return function(b){return~~(c/b)}},compare:function(c){return function(b){c="object"===typeof c?toText(c):c;b="object"===typeof b?toText(b):b;return[c===b?"EQ":c<b?"LT":"GT"]}},-toFloat:function(c){return c},round:function(c){return Math.round(c)},floor:function(c){return Math.floor(c)},ceiling:function(c){return Math.ceil(c)},truncate:function(c){return~~c},sqrt:Math.sqrt,abs:Math.abs,pi:Math.PI,e:Math.E,sin:Math.sin,cos:Math.cos,tan:Math.tan,asin:Math.asin,acos:Math.acos,atan:Math.atan,mod:e,min:function(c){return function(b){return Math.min(c,b)}},max:function(c){return function(b){return Math.max(c,b)}},flip:function(c){return function(b){return function(a){return c(a)(b)}}},-clamp:function(c){return function(b){return function(a){return Math.min(b,Math.max(c,a))}}},curry:function(c){return function(b){return function(a){return c(["Tuple2",b,a])}}},uncurry:function(c){return function(b){if("Tuple2"!==b[0])throw"Function was uncurry'd but was not given a pair.";return c(b[1])(b[2])}},logBase:function(c){return function(b){return Math.log(b)/Math.log(c)}},Just:Data.Maybe.Just,Nothing:Data.Maybe.Nothing,maybe:Data.Maybe.maybe,map:Data.List.map,filter:Data.List.filter,head:Data.List.head,-tail:Data.List.tail,last:Data.List.last,length:Data.List.length,reverse:Data.List.reverse,foldr:Data.List.foldr,foldr1:Data.List.foldr1,foldl:Data.List.foldl,foldl1:Data.List.foldl1,and:Data.List.and,or:Data.List.or,forall:Data.List.forall,exists:Data.List.exists,sum:Data.List.sum,product:Data.List.product,concat:Data.List.concat,concatMap:Data.List.concatMap,maximum:Data.List.maximum,minimum:Data.List.minimum,scanl:Data.List.scanl,scanl1:Data.List.scanl1,take:Data.List.take,drop:Data.List.drop,lift:Signal.lift,-lift2:Signal.lift2,lift3:Signal.lift3,lift4:Signal.lift4,foldp:Signal.foldp,constant:Signal.constant,count:Signal.count,keepIf:Signal.keepIf,dropIf:Signal.dropIf,keepWhen:Signal.keepWhen,dropWhen:Signal.dropWhen,dropRepeats:Signal.dropRepeats,sampleOn:Signal.sampleOn}}(),eq=Value.eq;Signal.addListener(document,"elm_log",function(e){console.log(e.value)});Signal.addListener(document,"elm_title",function(e){document.title=e.value});-Signal.addListener(document,"elm_redirect",function(e){0<e.value.length&&(window.location=e.value)});var includeGlobal=this;-(function(){var e=function(b){for(var a in b)if("Internal"!==a)try{includeGlobal[a]=b[a]}catch(c){"length"===a&&(includeGlobal.execScript("var length;"),length=b[a])}},c=function(b){return function(a){includeGlobal[b]=includeGlobal[b]||{};for(var c in a)"Internal"!==c&&(includeGlobal[b][c]=a[c])}};e(Element);e(Text);color=Element.color;height=Element.height;show=Value.show;e(ElmCode.Graphics.Color);e(ElmCode.Graphics.Element);c("Time")(Signal.Time);c("Mouse")(Signal.Mouse);c("Keyboard")(Signal.Keyboard);-c("Window")(Signal.Window);c("HTTP")(Signal.HTTP);c("Input")(Signal.Input);c("Random")(Signal.Random)})();ElmCode=ElmCode||{};ElmCode.Data=Data;ElmCode.Signal=Signal;ElmCode.Data.List=List;ElmCode.Foreign=Foreign;ElmCode.Prelude=Prelude;ElmCode.Graphics.Text=Text;
+ elm-runtime-0.4.0.3.js view
@@ -0,0 +1,90 @@+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;
src/Compiler.hs view
@@ -40,11 +40,11 @@ , minify = False &= help "Minify generated JavaScript" } &= help "Compile Elm programs to HTML, CSS, and JavaScript." &=- summary "The Elm Compiler v0.4.0.2, (c) Evan Czaplicki"+ summary ("The Elm Compiler " ++ show version ++ ", (c) Evan Czaplicki") main = do args <- cmdArgs elm- mini <- getDataFileName "elm-runtime-0.4.0.2.js"+ mini <- getDataFileName ("elm-runtime-" ++ show version ++ ".js") compileArgs mini args compileArgs mini (ELM _ [] _ _ _ _ _ _) =
src/Language/Elm.hs view
@@ -12,7 +12,8 @@ Example implementations using Yesod and Happstack are available at <https://github.com/tazjin/Elm/tree/master/Examples> -} module Language.Elm ( - ElmSource (..) + ElmSource (..), + runtimeLocation ) where import CompileToJS @@ -21,9 +22,12 @@ import Initialize import Text.Blaze.Html (Html) import Language.Elm.Quasi +import Paths_Elm import qualified Data.Text as TS import qualified Data.Text.Lazy as TL + +runtimeLocation = getDataFileName ("elm-runtime-" ++ show version ++ ".js") class ElmSource a where -- |This function compiles Elm code to three separate parts: HTML, CSS,
src/Types/Hints.hs view
@@ -1,276 +1,279 @@- -module Types.Hints (hints) where - -import Control.Monad (liftM,mapM) -import Control.Arrow (first) -import Types -import Types.Substitutions (rescheme) - - --------- Text and Elements -------- - -str2elem = hasType (string ==> element) [ "plainText" ] - -textToText = [ "header", "italic", "bold", "underline" - , "overline", "strikeThrough", "monospace" ] - -textAttrs = [ "toText" -: string ==> text - , "typeface" -: string ==> text ==> text - , "link" -:: string ==> a ==> a - , numScheme (\t -> t ==> text ==> text) "Text.height" - ] ++ 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 - ] - -directions = hasType direction ["up","down","left","right","inward","outward"] -positions = - hasType position ["topLeft","midLeft","bottomLeft","midTop","middle" - ,"midBottom","topRight","midRight","bottomRight"] ++ - hasType (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" - , "customLine" -: listOf int ==> color ==> line ==> form - ] ++ hasType (color ==> line ==> form) ["solid","dashed","dotted"] - -shapes = [ twoNums (\n m -> listOf (pairOf n) ==> pairOf m ==> shape) "polygon" - , "filled" -: color ==> shape ==> form - , "outlined" -: color ==> shape ==> form - , "textured" -: string ==> shape ==> form - , "customOutline" -: listOf int ==> color ==> shape ==> form - ] ++ map (twoNums (\n m -> n ==> n ==> pairOf m ==> shape)) [ "ngon" - , "rect" - , "oval" ] - -collages = [ numScheme (\n -> pairOf n ==> element ==> form) "toForm" - , numScheme (\n -> string ==> n ==> n ==> pairOf n ==> form) "sprite" - , numScheme (\n -> n ==> n ==> form ==> form) "move" - , numScheme (\n -> n ==> form ==> form) "rotate" - , numScheme (\n -> n ==> form ==> form) "scale" - ] - --------- Foreign -------- - -casts = - [ "castJSBoolToBool" -: jsBool ==> bool - , "castBoolToJSBool" -: bool ==> jsBool - , "castJSNumberToInt" -: jsNumber ==> int - , "castIntToJSNumber" -: int ==> jsNumber - , "castJSElementToElement" -: int ==> int ==> jsElement ==> element - , "castElementToJSElement" -: element ==> jsElement - , "castJSStringToString" -: jsString ==> string - , "castStringToJSString" -: string ==> jsString - , "castJSNumberToFloat" -: jsNumber ==> float - , "castFloatToJSNumber" -: float ==> jsNumber - ] - -castToTuple n = (,) name $ Forall [1..n] [] (jsTuple vs ==> tupleOf vs) - where vs = map VarT [1..n] - name = "castJSTupleToTuple" ++ show n -castToJSTuple n = (,) name $ Forall [1..n] [] (tupleOf vs ==> jsTuple vs) - where vs = map VarT [1..n] - name = "castTupleToJSTuple" ++ show n - -polyCasts = - map castToTuple [2..5] ++ map castToJSTuple [2..5] ++ - [ "castJSArrayToList" -:: jsArray a ==> listOf a - , "castListToJSArray" -:: listOf a ==> jsArray a - ] - -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 - , "toPrettyJSString" -: string ==> jsonObject ==> jsString - , "toJSString" -: jsonObject ==> jsString - ] - - --------- Signals -------- - -sig n name = (,) name $ Forall [1..n] [] (fn ts ==> fn (map signalOf ts)) - where fn = foldr1 (==>) - ts = map VarT [1..n] - -signals = - [ sig 1 "constant" - , sig 2 "lift" - , sig 3 "lift2" - , sig 4 "lift3" - , sig 5 "lift4" - , "foldp" -:: (a ==> b ==> b) ==> 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 - , "dropRepeats" -:: signalOf a ==> signalOf a - , "sampleOn" -:: signalOf a ==> signalOf b ==> signalOf b - ] - -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] - ] - --------- Math and Binops -------- - -binop t = t ==> t ==> t -scheme1 super t name = - (name, Forall [0] [ Context ("`" ++ name ++ "'") $ VarT 0 :<: super - ] (t (VarT 0))) -scheme2 s1 s2 t name = - (name, Forall [0,1] [ Context ("`" ++ name ++ "'") $ VarT 0 :<: s1 - , Context ("`" ++ name ++ "'") $ VarT 1 :<: s2 - ] (t (VarT 0) (VarT 1))) -numScheme t name = scheme1 number t name -timeScheme name t = scheme1 time t name -twoNums f name = scheme2 number number f name - -math = - map (numScheme (\t -> t ==> binop t)) ["clamp"] ++ - map (numScheme (\t -> binop t)) ["+","-","*","max","min"] ++ - [ numScheme (\t -> t ==> t) "abs" ] ++ - hasType (binop float) [ "/", "logBase" ] ++ - hasType (binop int) ["rem","div","mod"] ++ - 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"] - -bools = - [ "not" -: bool ==> bool ] ++ - hasType (binop bool) ["&&","||"] ++ - map (scheme1 comparable (\t -> t ==> t ==> bool)) ["<",">","<=",">="] ++ - [ ( "compare" - , Forall [0,1] [ Context "`compare'" $ VarT 0 :<: comparable ] (VarT 0 ==> VarT 0 ==> VarT 1) ) - ] - --------- Polymorphic Functions -------- - -[a,b,c] = map VarT [1,2,3] - -infix 8 -:: -name -:: tipe = (name, Forall [1,2,3] [] tipe) - -funcs = - [ "id" -:: a ==> a - , "==" -:: a ==> a ==> bool - , "/=" -:: a ==> a ==> bool - , "flip" -:: (a ==> b ==> c) ==> (b ==> a ==> c) - , "." -:: (b ==> c) ==> (a ==> b) ==> (a ==> c) - , "$" -:: (a ==> b) ==> a ==> b - , ":" -:: a ==> listOf a ==> listOf a - , (,) "++" . Forall [0,1] [ Context "`++'" $ VarT 0 :<: appendable (VarT 1) ] $ VarT 0 ==> VarT 0 ==> VarT 0 - , "Cons" -:: a ==> listOf a ==> listOf a - , "Nil" -:: listOf a - , "Just" -:: a ==> maybeOf a - , "Nothing" -:: maybeOf a - , "curry" -:: (tupleOf [a,b] ==> c) ==> a ==> b ==> c - , "uncurry" -:: (a ==> b ==> c) ==> tupleOf [a,b] ==> c - ] ++ map tuple [0..8] - -tuple n = ("Tuple" ++ show n, Forall [1..n] [] $ foldr (==>) (tupleOf vs) vs) - where vs = map VarT [1..n] - -lists = - [ "and" -:: listOf bool ==> bool - , "or" -:: listOf bool ==> bool - , numScheme (\n -> listOf n ==> listOf n) "sort" - , "head" -:: listOf a ==> a - , "tail" -:: listOf a ==> listOf a - , "length" -:: listOf a ==> int - , "filter" -:: (a ==> bool) ==> listOf a ==> listOf a - , "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 - , "reverse" -:: listOf a ==> listOf a - , "take" -:: int ==> listOf a ==> listOf a - , "drop" -:: int ==> listOf a ==> listOf a - , "partition" -:: (a ==> bool) ==> listOf a ==> tupleOf [listOf a,listOf a] - , "intersperse" -:: a ==> listOf a ==> listOf a - , "zip" -:: listOf a ==>listOf b ==>listOf(tupleOf [a,b]) - , "map" -:: (a ==> b) ==> listOf a ==> listOf b - , "foldr" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b - , "foldl" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b - , "scanl" -:: (a ==> b ==> b) ==> b ==> listOf a ==> listOf b - , (,) "concat" . Forall [0,1] [ Context "`concat'" $ VarT 0 :<: appendable (VarT 1) ] $ - listOf (VarT 0) ==> VarT 0 - , (,) "concatMap" . Forall [0,1,2] [ Context "`concatMap'" $ VarT 0 :<: appendable (VarT 1) ] $ - (VarT 2 ==> VarT 0) ==> listOf (VarT 2) ==> VarT 0 - , (,) "intercalate" . Forall [0,1] [ Context "`intercalate'" $ VarT 0 :<: appendable (VarT 1) ] $ - VarT 0 ==> listOf (VarT 0) ==> VarT 0 - , "zipWith" -:: (a ==> b ==> c) ==> listOf a ==> listOf b ==> listOf c - ] ++ map (numScheme (\n -> listOf n ==> n)) [ "sum", "product" - , "maximum", "minimum" ] - -maybeFuncs = - [ "maybe" -:: b ==> (a ==> b) ==> maybeOf a ==> b - , "isJust" -:: maybeOf a ==> bool - , "isNothing" -:: maybeOf a ==> bool - , "fromMaybe" -:: a ==> maybeOf a ==> a - , "consMaybe" -:: maybeOf a ==> listOf a ==> listOf a - , "catMaybes" -:: listOf (maybeOf a) ==> listOf a - , "catMaybes" -:: (a ==> maybeOf b) ==> listOf a ==> listOf b - ] - --------- 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 - ] ++module Types.Hints (hints) where++import Control.Monad (liftM,mapM)+import Control.Arrow (first)+import Types+import Types.Substitutions (rescheme)+++-------- Text and Elements --------++str2elem = hasType (string ==> element) [ "plainText" ]++textToText = [ "header", "italic", "bold", "underline"+ , "overline", "strikeThrough", "monospace" ]++textAttrs = [ "toText" -: string ==> text+ , "typeface" -: string ==> text ==> text+ , "link" -:: string ==> a ==> a+ , numScheme (\t -> t ==> text ==> text) "Text.height"+ ] ++ 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+ ]++directions = hasType direction ["up","down","left","right","inward","outward"]+positions =+ hasType position ["topLeft","midLeft","bottomLeft","midTop","middle"+ ,"midBottom","topRight","midRight","bottomRight"] +++ 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"+ , "customLine" -: listOf int ==> color ==> line ==> form+ ] ++ hasType (color ==> line ==> form) ["solid","dashed","dotted"]++shapes = [ twoNums (\n m -> listOf (pairOf n) ==> pairOf m ==> shape) "polygon"+ , "filled" -: color ==> shape ==> form+ , "outlined" -: color ==> shape ==> form+ , "textured" -: string ==> shape ==> form+ , "customOutline" -: listOf int ==> color ==> shape ==> form+ ] ++ map (twoNums (\n m -> n ==> n ==> pairOf m ==> shape)) [ "ngon"+ , "rect"+ , "oval" ]++collages = [ numScheme (\n -> pairOf n ==> element ==> form) "toForm"+ , numScheme (\n -> string ==> n ==> n ==> pairOf n ==> form) "sprite"+ , numScheme (\n -> n ==> n ==> form ==> form) "move"+ , numScheme (\n -> n ==> form ==> form) "rotate"+ , numScheme (\n -> n ==> form ==> form) "scale"+ , numScheme (\n -> pairOf n ==> form ==> bool) "isWithin"+ ]++-------- Foreign --------++casts =+ [ "castJSBoolToBool" -: jsBool ==> bool+ , "castBoolToJSBool" -: bool ==> jsBool+ , "castJSNumberToInt" -: jsNumber ==> int+ , "castIntToJSNumber" -: int ==> jsNumber+ , "castJSElementToElement" -: int ==> int ==> jsElement ==> element+ , "castElementToJSElement" -: element ==> jsElement+ , "castJSStringToString" -: jsString ==> string+ , "castStringToJSString" -: string ==> jsString+ , "castJSNumberToFloat" -: jsNumber ==> float + , "castFloatToJSNumber" -: float ==> jsNumber+ ]++castToTuple n = (,) name $ Forall [1..n] [] (jsTuple vs ==> tupleOf vs)+ where vs = map VarT [1..n]+ name = "castJSTupleToTuple" ++ show n+castToJSTuple n = (,) name $ Forall [1..n] [] (tupleOf vs ==> jsTuple vs)+ where vs = map VarT [1..n]+ name = "castTupleToJSTuple" ++ show n++polyCasts =+ map castToTuple [2..5] ++ map castToJSTuple [2..5] +++ [ "castJSArrayToList" -:: jsArray a ==> listOf a+ , "castListToJSArray" -:: listOf a ==> jsArray a+ ]++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+ , "toPrettyJSString" -: string ==> jsonObject ==> jsString+ , "toJSString" -: jsonObject ==> jsString+ ]+++-------- Signals --------++sig n name = (,) name $ Forall [1..n] [] (fn ts ==> fn (map signalOf ts))+ where fn = foldr1 (==>)+ ts = map VarT [1..n]++signals =+ [ sig 1 "constant"+ , sig 2 "lift" + , sig 3 "lift2"+ , sig 4 "lift3"+ , sig 5 "lift4"+ , "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+ , "dropRepeats" -:: signalOf a ==> signalOf a+ , "sampleOn" -:: signalOf a ==> signalOf b ==> signalOf b+ ]++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]+ ]++-------- Math and Binops --------++binop t = t ==> t ==> t+scheme1 super t name =+ (name, Forall [0] [ Context ("`" ++ name ++ "'") $ VarT 0 :<: super+ ] (t (VarT 0)))+scheme2 s1 s2 t name =+ (name, Forall [0,1] [ Context ("`" ++ name ++ "'") $ VarT 0 :<: s1+ , Context ("`" ++ name ++ "'") $ VarT 1 :<: s2+ ] (t (VarT 0) (VarT 1)))+numScheme t name = scheme1 number t name+timeScheme name t = scheme1 time t name+twoNums f name = scheme2 number number f name++math =+ map (numScheme (\t -> t ==> binop t)) ["clamp"] +++ map (numScheme (\t -> binop t)) ["+","-","*","max","min"] +++ [ numScheme (\t -> t ==> t) "abs" ] +++ hasType (binop float) [ "/", "logBase" ] +++ hasType (binop int) ["rem","div","mod"] +++ 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"]++bools =+ [ "not" -: bool ==> bool ] +++ hasType (binop bool) ["&&","||"] +++ map (scheme1 comparable (\t -> t ==> t ==> bool)) ["<",">","<=",">="] +++ [ ( "compare"+ , Forall [0,1] [ Context "`compare'" $ VarT 0 :<: comparable ] (VarT 0 ==> VarT 0 ==> VarT 1) )+ ]++-------- Polymorphic Functions --------++[a,b,c] = map VarT [1,2,3]++infix 8 -::+name -:: tipe = (name, Forall [1,2,3] [] tipe)++funcs =+ [ "id" -:: a ==> a+ , "==" -:: a ==> a ==> bool+ , "/=" -:: a ==> a ==> bool+ , "flip" -:: (a ==> b ==> c) ==> (b ==> a ==> c)+ , "." -:: (b ==> c) ==> (a ==> b) ==> (a ==> c)+ , "$" -:: (a ==> b) ==> a ==> b+ , ":" -:: a ==> listOf a ==> listOf a+ , (,) "++" . Forall [0,1] [ Context "`++'" $ VarT 0 :<: appendable (VarT 1) ] $ VarT 0 ==> VarT 0 ==> VarT 0+ , "Cons" -:: a ==> listOf a ==> listOf a + , "Nil" -:: listOf a+ , "Just" -:: a ==> maybeOf a+ , "Nothing" -:: maybeOf a+ , "curry" -:: (tupleOf [a,b] ==> c) ==> a ==> b ==> c+ , "uncurry" -:: (a ==> b ==> c) ==> tupleOf [a,b] ==> c+ ] ++ map tuple [0..8]++tuple n = ("Tuple" ++ show n, Forall [1..n] [] $ foldr (==>) (tupleOf vs) vs)+ where vs = map VarT [1..n]++lists =+ [ "and" -:: listOf bool ==> bool+ , "or" -:: listOf bool ==> bool+ , numScheme (\n -> listOf n ==> listOf n) "sort"+ , "head" -:: listOf a ==> a+ , "tail" -:: listOf a ==> listOf a+ , "length" -:: listOf a ==> int+ , "filter" -:: (a ==> bool) ==> listOf a ==> listOf a+ , "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+ , "reverse" -:: listOf a ==> listOf a+ , "take" -:: int ==> listOf a ==> listOf a+ , "drop" -:: int ==> listOf a ==> listOf a+ , "partition" -:: (a ==> bool) ==> listOf a ==> tupleOf [listOf a,listOf a]+ , "intersperse" -:: a ==> listOf a ==> listOf a+ , "zip" -:: listOf a ==>listOf b ==>listOf(tupleOf [a,b])+ , "map" -:: (a ==> b) ==> listOf a ==> listOf b+ , "foldr" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b+ , "foldl" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b+ , "scanl" -:: (a ==> b ==> b) ==> b ==> listOf a ==> listOf b+ , (,) "concat" . Forall [0,1] [ Context "`concat'" $ VarT 0 :<: appendable (VarT 1) ] $+ listOf (VarT 0) ==> VarT 0+ , (,) "concatMap" . Forall [0,1,2] [ Context "`concatMap'" $ VarT 0 :<: appendable (VarT 1) ] $+ (VarT 2 ==> VarT 0) ==> listOf (VarT 2) ==> VarT 0+ , (,) "intercalate" . Forall [0,1] [ Context "`intercalate'" $ VarT 0 :<: appendable (VarT 1) ] $+ VarT 0 ==> listOf (VarT 0) ==> VarT 0+ , "zipWith" -:: (a ==> b ==> c) ==> listOf a ==> listOf b ==> listOf c+ ] ++ map (numScheme (\n -> listOf n ==> n)) [ "sum", "product"+ , "maximum", "minimum" ]++maybeFuncs =+ [ "maybe" -:: b ==> (a ==> b) ==> maybeOf a ==> b+ , "isJust" -:: maybeOf a ==> bool+ , "isNothing" -:: maybeOf a ==> bool+ , "fromMaybe" -:: a ==> maybeOf a ==> a+ , "consMaybe" -:: maybeOf a ==> listOf a ==> listOf a+ , "catMaybes" -:: listOf (maybeOf a) ==> listOf a+ , "catMaybes" -:: (a ==> maybeOf b) ==> listOf a ==> listOf b+ ]++-------- 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+ ]
src/Types/Substitutions.hs view
@@ -1,98 +1,99 @@- -module Types.Substitutions (cSub - ,tSub - ,cSubNoContext - ,cFreeVars - ,schemeSub - ,concretize - ,rescheme - ,generalize) where - -import Control.DeepSeq (NFData (..), deepseq) -import Control.Monad (liftM) -import Data.List (foldl') -import qualified Data.Set as Set -import Guid -import Types - -force x = x `deepseq` x - -instance (NFData a) => NFData (Context c a) where - rnf (Context _ a) = a `deepseq` () - -instance NFData Constraint where - rnf (t1 :=: t2) = t1 `deepseq` t2 `deepseq` () - rnf (t :<: _) = t `deepseq` () - rnf (t :<<: _) = t `deepseq` () - -instance NFData Type where - rnf (LambdaT t1 t2) = t1 `deepseq` t2 `deepseq` () - rnf (ADT _ ts) = foldl' (\acc x -> x `deepseq` acc) () ts - 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 (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, []) - -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' ] - -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 (Super _ ) = False - -cSub k v (Context ctx c) = 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' - where poly' | k `elem` vs = poly - | otherwise = let cs' = map (cSub k v) cs in - Forall vs cs' (tSub k v 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 ) - -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 - -freeVars (VarT v) = [v] -freeVars (LambdaT t1 t2) = freeVars t1 ++ freeVars t2 -freeVars (ADT _ ts) = concatMap freeVars ts -freeVars (Super _ ) = [] - -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 - -decontext (Context _ c) = c - -generalize :: [X] -> Scheme -> GuidCounter Scheme -generalize exceptions (Forall xs cs t) = rescheme (Forall (xs ++ frees) cs t) - where allFrees = Set.fromList $ freeVars t ++ concatMap (cFreeVars . decontext) cs - frees = Set.toList $ Set.difference allFrees (Set.fromList exceptions) - ++module Types.Substitutions (cSub+ ,tSub+ ,cSubNoContext+ ,cFreeVars+ ,freeVars+ ,schemeSub+ ,concretize+ ,rescheme+ ,generalize) where++import Control.DeepSeq (NFData (..), deepseq)+import Control.Monad (liftM)+import Data.List (foldl')+import qualified Data.Set as Set+import Guid+import Types++force x = x `deepseq` x++instance (NFData a) => NFData (Context c a) where+ rnf (Context _ a) = a `deepseq` ()++instance NFData Constraint where+ rnf (t1 :=: t2) = t1 `deepseq` t2 `deepseq` ()+ rnf (t :<: _) = t `deepseq` ()+ rnf (t :<<: _) = t `deepseq` ()++instance NFData Type where+ rnf (LambdaT t1 t2) = t1 `deepseq` t2 `deepseq` ()+ rnf (ADT _ ts) = foldl' (\acc x -> x `deepseq` acc) () ts+ 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 (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, [])++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' ]++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 (Super _ ) = False++cSub k v (Context ctx c) = 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'+ where poly' | k `elem` vs = poly+ | otherwise = let cs' = map (cSub k v) cs in+ Forall vs cs' (tSub k v 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 )++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++freeVars (VarT v) = [v]+freeVars (LambdaT t1 t2) = freeVars t1 ++ freeVars t2+freeVars (ADT _ ts) = concatMap freeVars ts+freeVars (Super _ ) = []++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++decontext (Context _ c) = c++generalize :: [X] -> Scheme -> GuidCounter Scheme+generalize exceptions (Forall xs cs t) = rescheme (Forall (xs ++ frees) cs t)+ where allFrees = Set.fromList $ freeVars t ++ concatMap (cFreeVars . decontext) cs+ frees = Set.toList $ Set.difference allFrees (Set.fromList exceptions)+
src/Types/Unify.hs view
@@ -1,111 +1,119 @@- -module Types.Unify (unify) where - -import Control.Arrow (second) -import Control.Monad (liftM) -import Data.List (foldl') -import qualified Data.Set as Set -import qualified Data.Map as Map -import Guid -import Types -import Types.Constrain -import Types.Substitutions - ---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) - -eq ctx t1 t2 = Context ctx (t1 :=: t2) - -solver [] subs = prints (Map.toList subs) $ return $ Right subs - --------- Destruct Type-constructors -------- - -solver ((Context ctx (t1@(ADT n1 ts1) :=: t2@(ADT n2 ts2))) : cs) subs = - if n1 /= n2 then uniError ctx t1 t2 else - solver (zipWith (eq ctx) ts1 ts2 ++ cs) subs -solver ((Context ctx (LambdaT t1 t2 :=: LambdaT t1' t2')) : cs) subs = - solver ([ eq ctx t1 t1', eq ctx t2 t2' ] ++ cs) subs - --------- Type-equality -------- - -solver (Context ctx (VarT x :=: VarT y) : cs) subs - | x == y = solver cs subs - | otherwise = - case (Map.lookup x subs, Map.lookup y subs) of - (Just (Super xts), Just (Super yts)) -> - let ts = Set.intersection xts yts - 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 - _ -> solver cs $ setXY (Super ts) subs - (Just (Super xts), _) -> - solver (map (cSub y (VarT x)) cs) $ Map.insert y (VarT x) subs - (_, _) -> - solver (map (cSub x (VarT y)) cs) $ Map.insert x (VarT y) subs -solver (Context ctx (VarT x :=: t) : cs) subs = - case Map.lookup x subs of - Nothing -> solver (map (cSub x t) cs) . 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 - _ -> solver cs $ Map.insert x (Super ts') subs - Just t' -> solver (Context ctx (t' :=: t) : cs) subs -solver ((Context ctx (t :=: VarT x)) : cs) subs = - solver ((Context ctx (VarT x :=: t)) : cs) subs -solver ((Context ctx (t1 :=: t2)) : cs) subs - | t1 == t2 = solver cs subs - | otherwise = uniError ctx t1 t2 - - --------- subtypes -------- - -solver (Context ctx (VarT x :<: Super ts) : cs) subs = - case Map.lookup x subs of - Nothing -> solver cs $ Map.insert x (Super ts) subs - Just (Super ts') -> - case Set.toList $ Set.intersection ts ts' of - [] -> unionError ctx ts ts' - [t] -> solver (map (cSub x t) cs) $ Map.insert x t subs - ts'' -> solver cs $ Map.insert x (Super $ Set.fromList ts'') subs - -solver (Context ctx (ADT "List" [t] :<: Super ts) : cs) subs - | any f (Set.toList ts) = solver cs subs - | otherwise = subtypeError ctx (ADT "List" [t]) (Super ts) - where f (ADT "List" [VarT _]) = True - f (ADT "List" [t']) = t == t' - f _ = False - -solver (Context ctx (t :<: Super ts) : cs) subs - | Set.member t ts = solver cs subs - | otherwise = subtypeError 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 - | otherwise = - do (t,cs') <- concretize s - let cs'' = (cs ++ Context ctx (VarT x :=: t) : map (extendCtx ctx) cs') - prints cs'' $ solver cs'' subs - - -uniError ctx t1 t2 = - return . Left $ "Type error: " ++ show t1 ++ - " is not equal to " ++ show t2 ++ - " in context " ++ ctx -unionError ctx ts ts' = - return . Left $ concat [ "Type error: There are no types in both " - , show (Super ts), " and ", show (Super ts') - , " in context ", ctx ] -subtypeError ctx t s = - return . Left $ concat [ "Type error: ", show t, " is not a ", show s - , " in context ", ctx ] ++module Types.Unify (unify) where++import Control.Arrow (second)+import Control.Monad (liftM)+import Data.List (foldl')+import qualified Data.Set as Set+import qualified Data.Map as Map+import Guid+import Types+import Types.Constrain+import Types.Substitutions++--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)++eq ctx t1 t2 = Context ctx (t1 :=: t2)++solver [] subs = prints (Map.toList subs) $ return $ Right subs++-------- Destruct Type-constructors --------++solver ((Context ctx (t1@(ADT n1 ts1) :=: t2@(ADT n2 ts2))) : cs) subs =+ if n1 /= n2 then uniError ctx t1 t2 else+ solver (zipWith (eq ctx) ts1 ts2 ++ cs) subs+solver ((Context ctx (LambdaT t1 t2 :=: LambdaT t1' t2')) : cs) subs =+ solver ([ eq ctx t1 t1', eq ctx t2 t2' ] ++ cs) subs++-------- Type-equality --------++solver (Context ctx (VarT x :=: VarT y) : cs) subs+ | x == y = solver cs subs+ | otherwise =+ case (Map.lookup x subs, Map.lookup y subs) of+ (Just (Super xts), Just (Super yts)) ->+ let ts = Set.intersection xts yts+ 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+ _ -> solver cs $ setXY (Super ts) subs+ (Just (Super xts), _) ->+ solver (map (cSub y (VarT x)) cs) $ Map.insert y (VarT x) subs+ (_, _) ->+ solver (map (cSub x (VarT y)) cs) $ 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+ 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+ _ -> solver cs $ Map.insert x (Super ts') subs+ Just t' -> solver (Context ctx (t' :=: t) : cs) subs+ )+solver ((Context ctx (t :=: VarT x)) : cs) subs =+ solver ((Context ctx (VarT x :=: t)) : cs) subs+solver ((Context ctx (t1 :=: t2)) : cs) subs+ | t1 == t2 = solver cs subs+ | otherwise = uniError ctx t1 t2+++-------- subtypes --------++solver (Context ctx (VarT x :<: Super ts) : cs) subs =+ case Map.lookup x subs of+ Nothing -> solver cs $ Map.insert x (Super ts) subs+ Just (Super ts') ->+ case Set.toList $ Set.intersection ts ts' of+ [] -> unionError ctx ts ts'+ [t] -> solver (map (cSub x t) cs) $ Map.insert x t subs+ ts'' -> solver cs $ Map.insert x (Super $ Set.fromList ts'') subs++solver (Context ctx (ADT "List" [t] :<: Super ts) : cs) subs+ | any f (Set.toList ts) = solver cs subs+ | otherwise = subtypeError ctx (ADT "List" [t]) (Super ts)+ where f (ADT "List" [VarT _]) = True+ f (ADT "List" [t']) = t == t'+ f _ = False++solver (Context ctx (t :<: Super ts) : cs) subs+ | Set.member t ts = solver cs subs+ | otherwise = subtypeError 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+ | otherwise =+ do (t,cs') <- concretize s+ let cs'' = (cs ++ Context ctx (VarT x :=: t) : map (extendCtx ctx) cs')+ prints cs'' $ solver cs'' subs+++occursError ctx t1 t2 =+ return . Left $ "Type error: Occurs check: cannot construct the infinite type: " ++ show t1 +++ " = " ++ show t2 +++ " in context " ++ ctx+uniError ctx t1 t2 =+ return . Left $ "Type error: " ++ show t1 +++ " is not equal to " ++ show t2 +++ " in context " ++ ctx+unionError ctx ts ts' =+ return . Left $ concat [ "Type error: There are no types in both "+ , show (Super ts), " and ", show (Super ts')+ , " in context ", ctx ]+subtypeError ctx t s =+ return . Left $ concat [ "Type error: ", show t, " is not a ", show s+ , " in context ", ctx ]++occursIn x t = x `elem` freeVars t