fay 0.4.0.1 → 0.4.0.4
raw patch · 53 files changed
+211/−179 lines, 53 filesPVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
API changes (from Hackage documentation)
+ Language.Fay: compilePAsPat :: JsExp -> Name -> Pat -> [JsStmt] -> Compile [JsStmt]
Files
- docs/home.hs +27/−18
- docs/home.js +6/−7
- docs/snippets/data.hs +0/−0
- docs/snippets/dom.hs +2/−0
- docs/snippets/ffi.hs +1/−1
- docs/snippets/tail.hs +1/−1
- examples/alert.hs +2/−2
- examples/canvaswater.hs +5/−5
- examples/console.hs +2/−2
- examples/data.hs +3/−3
- examples/dom.hs +3/−3
- examples/ref.hs +3/−3
- examples/tailrecursive.hs +2/−2
- fay.cabal +4/−5
- hs/stdlib.hs +0/−0
- js/runtime.js +5/−6
- src/Control/Monad/IO.hs +1/−1
- src/Docs.hs +13/−13
- src/Language/Fay.hs +25/−15
- src/Language/Fay/Compiler.hs +10/−8
- src/Language/Fay/FFI.hs +4/−4
- src/Language/Fay/Prelude.hs +6/−5
- src/Language/Fay/Print.hs +15/−16
- src/Language/Fay/Show.hs +5/−5
- src/Language/Fay/Stdlib.hs +2/−2
- src/Language/Fay/Types.hs +12/−12
- src/Main.hs +28/−16
- src/System/Process/Extra.hs +3/−3
- src/Tests.hs +11/−11
- src/Text/Blaze/Extra.hs +6/−6
- tests/10.hs +0/−0
- tests/11.hs +0/−0
- tests/13.hs +0/−0
- tests/14.hs +0/−0
- tests/15.hs +0/−0
- tests/16.hs +0/−0
- tests/17.hs +0/−0
- tests/18.hs +0/−0
- tests/19.hs +0/−0
- tests/20.hs +0/−0
- tests/21.hs +0/−0
- tests/22.hs +0/−0
- tests/23.hs +0/−0
- tests/24.hs +0/−0
- tests/25.hs +0/−0
- tests/26.hs +0/−0
- tests/27.hs +2/−2
- tests/28.hs +2/−2
- tests/3.hs +0/−0
- tests/4.hs +0/−0
- tests/5.hs +0/−0
- tests/6.hs +0/−0
- tests/7.hs +0/−0
docs/home.hs view
@@ -1,12 +1,12 @@-{-# LANGUAGE EmptyDataDecls #-}+{-# LANGUAGE EmptyDataDecls #-} {-# LANGUAGE NoImplicitPrelude #-} -- | The home page script:--- +-- -- 1) Make sure that the language samples are highlighted. -- 2) Add a show/hide button for the JS output on all samples. -- 3) For code samples that are too large, hide them.--- +-- -- Because dogfood. This is not necessarily a good example, indeed, it -- may very well be a very bad example of how to write client -- code. But that's the point, really. Even the quick scripts that@@ -15,26 +15,35 @@ module Home (main) where -import Language.Fay.FFI-import Language.Fay.Prelude+import Language.Fay.FFI+import Language.Fay.Prelude -- | Main entry point. main :: Fay () main = do- ready (wrap [thedocument]) $ do+ ready (wrap thedocument) $ do indentAndHighlight setupExpanders setupTableOfContents+ body <- query ".subheadline"+ addClassWith (\i f -> do alert (show i)+ alert f+ return f)+ body+ return () +addClassWith :: (Double -> String -> Fay String) -> JQuery -> Fay JQuery+addClassWith = ffi "%2.addClass(function(x,i){ return %1(x,Fay$$list(i)); })" FayNone++ -- | Setup highlighting/code re-indenting. indentAndHighlight :: Fay () indentAndHighlight = do samples <- query ".language-javascript" each samples $ \i this ->- let sample = wrap [this]+ let sample = wrap this in do text <- getText sample- setText sample- (beautify text 2)+ setText sample (beautify text 2) setTabReplace hljs " " initHighlightingOnLoad hljs @@ -44,7 +53,7 @@ wrapwidth <- query ".wrap" >>= getWidth examples <- query ".example" each examples $ \i this -> do- tr <- getFind (wrap [this]) "tr"+ tr <- getFind (wrap this) "tr" left <- getFind tr "td" >>= getFirst addClass left "left" right <- getNext left@@ -68,17 +77,17 @@ setupTableOfContents :: Fay () setupTableOfContents = do toc <- makeElement "<div class='table-of-contents'><p>Table of Contents</p></div>"- query ".subheadline" >>= flip after toc- ul <- makeElement "<ul></ul>" >>= flip appendTo toc+ query ".subheadline" >>= after toc+ ul <- makeElement "<ul></ul>" >>= appendTo toc headings <- query "h2" each headings $ \i heading -> let anchor = ("section-" ++ show i)- h = wrap [heading]+ h = wrap heading in do -- Make sure the anchor exists at the heading point. attr h "id" anchor -- Make the entry.- li <- makeElement "<li></li>" >>= flip appendTo ul- a <- makeElement "<a></a>" >>= flip appendTo li+ li <- makeElement "<li></li>" >>= appendTo ul+ a <- makeElement "<a></a>" >>= appendTo li getText h >>= setText a -- Link up to an anchor. attr a "href" ("#" ++ anchor)@@ -123,7 +132,7 @@ instance Show JQuery -- | Make a jQuery object out of an element.-wrap :: [Element] -> JQuery+wrap :: Element -> JQuery wrap = ffi "window['jQuery'](%1)" FayNone -- | Bind a handler for when the element is ready.@@ -202,7 +211,7 @@ -- | Append an element /after/ this one. after :: JQuery -> JQuery -> Fay JQuery-after = ffi "%1['after'](%2)" FayNone+after = ffi "%2['after'](%1)" FayNone -- | Append an element to this one. append :: JQuery -> JQuery -> Fay JQuery@@ -210,7 +219,7 @@ -- | Append this to an element. appendTo :: JQuery -> JQuery -> Fay JQuery-appendTo = ffi "%1['appendTo'](%2)" FayNone+appendTo = ffi "%2['appendTo'](%1)" FayNone -- | Make a new element. makeElement :: String -> Fay JQuery
docs/home.js view
@@ -111,7 +111,7 @@ str += obj.car; obj = _(obj.cdr); }- return str; + return str; } else if(type == "FunctionType" || typeof obj == 'function'){ return function(){ var out = obj;@@ -122,20 +122,20 @@ out = out(arguments[i]); } return _(out,true);- }; + }; } else if(type == "ListType" || (obj instanceof Fay$$Cons)){ var arr = []; while(obj instanceof Fay$$Cons) { arr.push(Fay$$serialize(null,obj.car)); obj = _(obj.cdr); }- return arr; + return arr; } // else if(type == "BoolType || obj == _(True) || obj == _(False)) { // return obj == _(True);- // } + // } else { return obj;- } + } } } @@ -364,8 +364,7 @@ * Application code. */ --var main = new $(function(){return _(_($36$)(_(ready)(_(wrap)(Fay$$list([thedocument])))))(_(_(Fay$$then)(indentAndHighlight))(_(_(Fay$$then)(setupExpanders))(setupTableOfContents)));});var indentAndHighlight = new $(function(){return _(_(Fay$$bind)(_(query)(Fay$$list(".language-javascript"))))(function($_a){var samples = $_a;return _(_(Fay$$then)(_(_($36$)(_(each)(samples)))(function($_a){var i = $_a;return function($_b){var _$this = $_b;return (function(){var sample = new $(function(){return _(wrap)(Fay$$list([_$this]));});return _(_(Fay$$bind)(_(getText)(sample)))(function($_a){var text = $_a;return _(_(setText)(sample))(_(_(beautify)(text))(2));});})();};})))(_(_(Fay$$then)(_(_(setTabReplace)(hljs))(Fay$$list(" "))))(_(initHighlightingOnLoad)(hljs)));});});var setupExpanders = new $(function(){return _(_(Fay$$bind)(_(_(Fay$$bind)(_(query)(Fay$$list(".wrap"))))(getWidth)))(function($_a){var wrapwidth = $_a;return _(_(Fay$$bind)(_(query)(Fay$$list(".example"))))(function($_a){var examples = $_a;return _(_($36$)(_(each)(examples)))(function($_a){var i = $_a;return function($_b){var _$this = $_b;return _(_(Fay$$bind)(_(_(getFind)(_(wrap)(Fay$$list([_$this]))))(Fay$$list("tr"))))(function($_a){var tr = $_a;return _(_(Fay$$bind)(_(_(Fay$$bind)(_(_(getFind)(tr))(Fay$$list("td"))))(getFirst)))(function($_a){var left = $_a;return _(_(Fay$$then)(_(_(addClass)(left))(Fay$$list("left"))))(_(_(Fay$$bind)(_(getNext)(left)))(function($_a){var right = $_a;return _(_(Fay$$bind)(_(makeElement)(Fay$$list("<a class='toggle' href='javascript:'>Show JavaScript</a>"))))(function($_a){var toggle = $_a;return _(_(Fay$$bind)(_(_($36$)(Fay$$return))(_(_(Fay$$bind)(_(_(getIs)(right))(Fay$$list(":visible"))))(function($_a){var visible = $_a;return _(visible) ? _(_(Fay$$then)(_(_(setText)(toggle))(Fay$$list("Hide JavaScript"))))(_(_(_(swapClasses)(toggle))(Fay$$list("toggle-hide")))(Fay$$list("toggle-show"))) : _(_(Fay$$then)(_(_(setText)(toggle))(Fay$$list("Show JavaScript"))))(_(_(_(swapClasses)(toggle))(Fay$$list("toggle-show")))(Fay$$list("toggle-hide")));}))))(function($_a){var toggleButton = $_a;return _(_(Fay$$then)(_(_($36$)(_(setClick)(toggle)))(_(_($36$)(_(fadeToggle)(right)))(toggleButton))))(_(_(Fay$$bind)(_(getWidth)(tr)))(function($_a){var width = $_a;return _(_(Fay$$then)(_(_($36$)(_(when)(_(width) > _(_(wrapwidth) + _(_(20 * _(wrapwidth)) / 100)))))(_(hide)(right))))(_(_(Fay$$then)(toggleButton))(_(_(Fay$$bind)(_(_(getFind)(left))(Fay$$list(".panel"))))(function($_a){var panel = $_a;return _(_(Fay$$then)(_(_(prepend)(panel))(toggle)))(_(Fay$$return)(Fay$$unit));})));}));});});}));});});};});});});});var setupTableOfContents = new $(function(){return _(_(Fay$$bind)(_(makeElement)(Fay$$list("<div class='table-of-contents'><p>Table of Contents</p></div>"))))(function($_a){var toc = $_a;return _(_(Fay$$then)(_(_(Fay$$bind)(_(query)(Fay$$list(".subheadline"))))(_(_(flip)(after))(toc))))(_(_(Fay$$bind)(_(_(Fay$$bind)(_(makeElement)(Fay$$list("<ul></ul>"))))(_(_(flip)(appendTo))(toc))))(function($_a){var ul = $_a;return _(_(Fay$$bind)(_(query)(Fay$$list("h2"))))(function($_a){var headings = $_a;return _(_($36$)(_(each)(headings)))(function($_a){var i = $_a;return function($_b){var heading = $_b;return (function(){var anchor = new $(function(){return _(_($43$$43$)(Fay$$list("section-")))(_(show)(i));});var h = new $(function(){return _(wrap)(Fay$$list([heading]));});return _(_(Fay$$then)(_(_(_(attr)(h))(Fay$$list("id")))(anchor)))(_(_(Fay$$bind)(_(_(Fay$$bind)(_(makeElement)(Fay$$list("<li></li>"))))(_(_(flip)(appendTo))(ul))))(function($_a){var li = $_a;return _(_(Fay$$bind)(_(_(Fay$$bind)(_(makeElement)(Fay$$list("<a></a>"))))(_(_(flip)(appendTo))(li))))(function($_a){var a = $_a;return _(_(Fay$$then)(_(_(Fay$$bind)(_(getText)(h)))(_(setText)(a))))(_(_(Fay$$then)(_(_(_(attr)(a))(Fay$$list("href")))(_(_($43$$43$)(Fay$$list("#")))(anchor))))(_(_(Fay$$bind)(_(getTagName)(heading)))(_(addClass)(li))));});}));})();};});});}));});});var print = new $(function(){return _(_($46$)(consolelog))(show);});var consolelog = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",console.log(Fay$$serialize(StringType,$_a))));});};var alert = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",window.alert(Fay$$serialize(StringType,$_a))));});};var thedocument = new $(function(){return Fay$$unserialize("",window.document);});var getTagName = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("string",_($_a)['tagName']));});};var wrap = function($_a){return new $(function(){return Fay$$unserialize("",window['jQuery'](Fay$$serialize(ListType,$_a)));});};var ready = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['ready'](Fay$$serialize(JsType,$_b))));});};};var each = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['each'](Fay$$serialize(FunctionType,$_b))));});};};var query = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",window['jQuery'](Fay$$serialize(StringType,$_a))));});};var setText = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['text'](Fay$$serialize(StringType,$_b))));});};};var attr = function($_a){return function($_b){return function($_c){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['attr'](Fay$$serialize(StringType,$_b),Fay$$serialize(StringType,$_c))));});};};};var setClick = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['click'](Fay$$serialize(JsType,$_b))));});};};var fadeToggle = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['fadeToggle'](Fay$$serialize(JsType,$_b))));});};};var hide = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['hide']()));});};var addClass = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['addClass'](Fay$$serialize(StringType,$_b))));});};};var removeClass = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['removeClass'](Fay$$serialize(StringType,$_b))));});};};var swapClasses = function($_a){return function($_b){return function($_c){return new $(function(){var removeme = $_c;var addme = $_b;var obj = $_a;return _(_(Fay$$then)(_(_(addClass)(obj))(addme)))(_(_(removeClass)(obj))(removeme));});};};};var getText = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("string",_($_a)['text']()));});};var getIs = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("bool",_($_a)['is'](Fay$$serialize(StringType,$_b))));});};};var getSize = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['length']));});};var getNext = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['next']()));});};var getFirst = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['first']()));});};var getFind = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['find'](Fay$$serialize(StringType,$_b))));});};};var prepend = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['prepend'](_($_b))));});};};var after = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['after'](_($_b))));});};};var append = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['append'](_($_b))));});};};var appendTo = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['appendTo'](_($_b))));});};};var makeElement = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",window['jQuery'](Fay$$serialize(StringType,$_a))));});};var getWidth = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['width']()));});};var beautify = function($_a){return function($_b){return new $(function(){return Fay$$unserialize("string",$jsBeautify(Fay$$serialize(StringType,$_a),Fay$$serialize(DoubleType,$_b)));});};};var hljs = new $(function(){return Fay$$unserialize("",window['hljs']);});var initHighlightingOnLoad = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['initHighlightingOnLoad']()));});};var setTabReplace = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",_($_a)['tabReplace']=Fay$$serialize(StringType,$_b)));});};};var DateType = new $(function(){return [new Fay$$Constructor("DateType")];});var FunctionType = new $(function(){return [new Fay$$Constructor("FunctionType")];});var JsType = new $(function(){return [new Fay$$Constructor("JsType")];});var StringType = new $(function(){return [new Fay$$Constructor("StringType")];});var DoubleType = new $(function(){return [new Fay$$Constructor("DoubleType")];});var ListType = new $(function(){return [new Fay$$Constructor("ListType")];});var BoolType = new $(function(){return [new Fay$$Constructor("BoolType")];});var UnknownType = new $(function(){return [new Fay$$Constructor("UnknownType")];});var Just = function(slot1){return new $(function(){return [new Fay$$Constructor("Just"),slot1];});};var Nothing = new $(function(){return [new Fay$$Constructor("Nothing")];});var show = function($_a){return new $(function(){return Fay$$unserialize("string",Fay$$encodeShow(_($_a)));});};var fromInteger = function($_a){return new $(function(){var x = $_a;return x;});};var fromRational = function($_a){return new $(function(){var x = $_a;return x;});};var snd = function($_a){return new $(function(){var x = Fay$$index(1)(_($_a));return x;throw ["unhandled case in Ident \"snd\"",[$_a]];});};var fst = function($_a){return new $(function(){var x = Fay$$index(0)(_($_a));return x;throw ["unhandled case in Ident \"fst\"",[$_a]];});};var find = function($_a){return function($_b){return new $(function(){var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var x = $_$_b.car;var xs = $_$_b.cdr;var p = $_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($_b) === null) {var p = $_a;return Nothing;}throw ["unhandled case in Ident \"find\"",[$_a,$_b]];});};};var any = function($_a){return function($_b){return new $(function(){var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var x = $_$_b.car;var xs = $_$_b.cdr;var p = $_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($_b) === null) {var p = $_a;return false;}throw ["unhandled case in Ident \"any\"",[$_a,$_b]];});};};var filter = function($_a){return function($_b){return new $(function(){var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var x = $_$_b.car;var xs = $_$_b.cdr;var p = $_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$_a,$_b]];});};};var not = function($_a){return new $(function(){var p = $_a;return _(p) ? false : true;});};var _$null = function($_a){return new $(function(){if (_($_a) === null) {return true;}return false;});};var map = function($_a){return function($_b){return new $(function(){if (_($_b) === null) {return null;}var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var x = $_$_b.car;var xs = $_$_b.cdr;var f = $_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$_a,$_b]];});};};var nub = function($_a){return new $(function(){var ls = $_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($_a){return function($_b){return new $(function(){if (_($_a) === null) {return null;}var ls = $_b;var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return _(_(_(elem)(x))(ls)) ? _(_(nub$39$)(xs))(ls) : _(_(Fay$$cons)(x))(_(_(nub$39$)(xs))(_(_(Fay$$cons)(x))(ls)));}throw ["unhandled case in Ident \"nub'\"",[$_a,$_b]];});};};var elem = function($_a){return function($_b){return new $(function(){var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var y = $_$_b.car;var ys = $_$_b.cdr;var x = $_a;return _(_(_(Fay$$eq)(x))(y)) || _(_(_(elem)(x))(ys));}if (_($_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$_a,$_b]];});};};var GT = new $(function(){return [new Fay$$Constructor("GT")];});var LT = new $(function(){return [new Fay$$Constructor("LT")];});var EQ = new $(function(){return [new Fay$$Constructor("EQ")];});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($_a){return function($_b){return new $(function(){var y = $_b;var x = $_a;return _(_(x) > _(y)) ? GT : _(_(x) < _(y)) ? LT : EQ;});};};var sortBy = function($_a){return new $(function(){var cmp = $_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($_a){return function($_b){return function($_c){return new $(function(){if (_($_c) === null) {var x = $_b;return Fay$$list([x]);}var ys = $_c;var x = $_b;var cmp = $_a;return (function($_ys){var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if ((_($tmp))[0].name === "GT") {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$_ys]); })();})(ys);});};};};var when = function($_a){return function($_b){return new $(function(){var m = $_b;var p = $_a;return _(p) ? _(_(Fay$$then)(m))(_(Fay$$return)(Fay$$unit)) : _(Fay$$return)(Fay$$unit);});};};var enumFrom = function($_a){return new $(function(){var i = $_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(i) + 1));});};var enumFromTo = function($_a){return function($_b){return new $(function(){var n = $_b;var i = $_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(i) + 1))(n));});};};var zipWith = function($_a){return function($_b){return function($_c){return new $(function(){var $_$_c = _($_c);if ($_$_c instanceof Fay$$Cons) {var b = $_$_c.car;var bs = $_$_c.cdr;var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var a = $_$_b.car;var as = $_$_b.cdr;var f = $_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($_a){return function($_b){return new $(function(){var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var b = $_$_b.car;var bs = $_$_b.cdr;var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var a = $_$_a.car;var as = $_$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($_a){return function($_b){return function($_c){return new $(function(){var y = $_c;var x = $_b;var f = $_a;return _(_(f)(y))(x);});};};};var maybe = function($_a){return function($_b){return function($_c){return new $(function(){if ((_($_c))[0].name === "Nothing") {var f = $_b;var m = $_a;return m;}if ((_($_c))[0].name === "Just") {var x = (_($_c))[1];var f = $_b;var m = $_a;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$_a,$_b,$_c]];});};};};var $46$ = function($_a){return function($_b){return function($_c){return new $(function(){var x = $_c;var g = $_b;var f = $_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($_a){return function($_b){return new $(function(){var y = $_b;var x = $_a;return _(_(conc)(x))(y);});};};var $36$ = function($_a){return function($_b){return new $(function(){var x = $_b;var f = $_a;return _(f)(x);});};};var conc = function($_a){return function($_b){return new $(function(){var ys = $_b;var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $_b;if (_($_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$_a,$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($_a){return function($_b){return function($_c){return new $(function(){if (_($_c) === null) {var z = $_b;var f = $_a;return z;}var $_$_c = _($_c);if ($_$_c instanceof Fay$$Cons) {var x = $_$_c.car;var xs = $_$_c.cdr;var z = $_b;var f = $_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$_a,$_b,$_c]];});};};};var foldl = function($_a){return function($_b){return function($_c){return new $(function(){if (_($_c) === null) {var z = $_b;var f = $_a;return z;}var $_$_c = _($_c);if ($_$_c instanceof Fay$$Cons) {var x = $_$_c.car;var xs = $_$_c.cdr;var z = $_b;var f = $_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$_a,$_b,$_c]];});};};};var lookup = function($_a){return function($_b){return new $(function(){if (_($_b) === null) {var _key = $_a;return Nothing;}var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($_$_b.car));var y = Fay$$index(1)(_($_$_b.car));var xys = $_$_b.cdr;var key = $_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$_a,$_b]];});};};var intersperse = function($_a){return function($_b){return new $(function(){if (_($_b) === null) {return null;}var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var x = $_$_b.car;var xs = $_$_b.cdr;var sep = $_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$_a,$_b]];});};};var prependToAll = function($_a){return function($_b){return new $(function(){if (_($_b) === null) {return null;}var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var x = $_$_b.car;var xs = $_$_b.cdr;var sep = $_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$_a,$_b]];});};};var intercalate = function($_a){return function($_b){return new $(function(){var xss = $_b;var xs = $_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($_a){return function($_b){return new $(function(){var m = $_b;var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return _(_(Fay$$then)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _(Fay$$return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$_a,$_b]];});};};var mapM_ = function($_a){return function($_b){return new $(function(){var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var x = $_$_b.car;var xs = $_$_b.cdr;var m = $_a;return _(_(Fay$$then)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _(Fay$$return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};+var main = new $(function(){return _(_($36$)(_(ready)(_(wrap)(thedocument))))(_(_(Fay$$then)(indentAndHighlight))(_(_(Fay$$then)(setupExpanders))(_(_(Fay$$then)(setupTableOfContents))(_(_(Fay$$bind)(_(query)(Fay$$list(".subheadline"))))(function($_a){var body = $_a;return _(_(Fay$$then)(_(_(addClassWith)(function($_a){var i = $_a;return function($_b){var f = $_b;return _(_(Fay$$then)(_(alert)(_(show)(i))))(_(_(Fay$$then)(_(alert)(f)))(_(Fay$$return)(f)));};}))(body)))(_(Fay$$return)(Fay$$unit));})))));});var addClassWith = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_b).addClass(function(x,i){ return Fay$$serialize(FunctionType,$_a)(x,Fay$$list(i)); })));});};};var indentAndHighlight = new $(function(){return _(_(Fay$$bind)(_(query)(Fay$$list(".language-javascript"))))(function($_a){var samples = $_a;return _(_(Fay$$then)(_(_($36$)(_(each)(samples)))(function($_a){var i = $_a;return function($_b){var _$this = $_b;return (function(){var sample = new $(function(){return _(wrap)(_$this);});return _(_(Fay$$bind)(_(getText)(sample)))(function($_a){var text = $_a;return _(_(setText)(sample))(_(_(beautify)(text))(2));});})();};})))(_(_(Fay$$then)(_(_(setTabReplace)(hljs))(Fay$$list(" "))))(_(initHighlightingOnLoad)(hljs)));});});var setupExpanders = new $(function(){return _(_(Fay$$bind)(_(_(Fay$$bind)(_(query)(Fay$$list(".wrap"))))(getWidth)))(function($_a){var wrapwidth = $_a;return _(_(Fay$$bind)(_(query)(Fay$$list(".example"))))(function($_a){var examples = $_a;return _(_($36$)(_(each)(examples)))(function($_a){var i = $_a;return function($_b){var _$this = $_b;return _(_(Fay$$bind)(_(_(getFind)(_(wrap)(_$this)))(Fay$$list("tr"))))(function($_a){var tr = $_a;return _(_(Fay$$bind)(_(_(Fay$$bind)(_(_(getFind)(tr))(Fay$$list("td"))))(getFirst)))(function($_a){var left = $_a;return _(_(Fay$$then)(_(_(addClass)(left))(Fay$$list("left"))))(_(_(Fay$$bind)(_(getNext)(left)))(function($_a){var right = $_a;return _(_(Fay$$bind)(_(makeElement)(Fay$$list("<a class='toggle' href='javascript:'>Show JavaScript</a>"))))(function($_a){var toggle = $_a;return _(_(Fay$$bind)(_(_($36$)(Fay$$return))(_(_(Fay$$bind)(_(_(getIs)(right))(Fay$$list(":visible"))))(function($_a){var visible = $_a;return _(visible) ? _(_(Fay$$then)(_(_(setText)(toggle))(Fay$$list("Hide JavaScript"))))(_(_(_(swapClasses)(toggle))(Fay$$list("toggle-hide")))(Fay$$list("toggle-show"))) : _(_(Fay$$then)(_(_(setText)(toggle))(Fay$$list("Show JavaScript"))))(_(_(_(swapClasses)(toggle))(Fay$$list("toggle-show")))(Fay$$list("toggle-hide")));}))))(function($_a){var toggleButton = $_a;return _(_(Fay$$then)(_(_($36$)(_(setClick)(toggle)))(_(_($36$)(_(fadeToggle)(right)))(toggleButton))))(_(_(Fay$$bind)(_(getWidth)(tr)))(function($_a){var width = $_a;return _(_(Fay$$then)(_(_($36$)(_(when)(_(width) > _(_(wrapwidth) + _(_(20 * _(wrapwidth)) / 100)))))(_(hide)(right))))(_(_(Fay$$then)(toggleButton))(_(_(Fay$$bind)(_(_(getFind)(left))(Fay$$list(".panel"))))(function($_a){var panel = $_a;return _(_(Fay$$then)(_(_(prepend)(panel))(toggle)))(_(Fay$$return)(Fay$$unit));})));}));});});}));});});};});});});});var setupTableOfContents = new $(function(){return _(_(Fay$$bind)(_(makeElement)(Fay$$list("<div class='table-of-contents'><p>Table of Contents</p></div>"))))(function($_a){var toc = $_a;return _(_(Fay$$then)(_(_(Fay$$bind)(_(query)(Fay$$list(".subheadline"))))(_(after)(toc))))(_(_(Fay$$bind)(_(_(Fay$$bind)(_(makeElement)(Fay$$list("<ul></ul>"))))(_(appendTo)(toc))))(function($_a){var ul = $_a;return _(_(Fay$$bind)(_(query)(Fay$$list("h2"))))(function($_a){var headings = $_a;return _(_($36$)(_(each)(headings)))(function($_a){var i = $_a;return function($_b){var heading = $_b;return (function(){var anchor = new $(function(){return _(_($43$$43$)(Fay$$list("section-")))(_(show)(i));});var h = new $(function(){return _(wrap)(heading);});return _(_(Fay$$then)(_(_(_(attr)(h))(Fay$$list("id")))(anchor)))(_(_(Fay$$bind)(_(_(Fay$$bind)(_(makeElement)(Fay$$list("<li></li>"))))(_(appendTo)(ul))))(function($_a){var li = $_a;return _(_(Fay$$bind)(_(_(Fay$$bind)(_(makeElement)(Fay$$list("<a></a>"))))(_(appendTo)(li))))(function($_a){var a = $_a;return _(_(Fay$$then)(_(_(Fay$$bind)(_(getText)(h)))(_(setText)(a))))(_(_(Fay$$then)(_(_(_(attr)(a))(Fay$$list("href")))(_(_($43$$43$)(Fay$$list("#")))(anchor))))(_(_(Fay$$bind)(_(getTagName)(heading)))(_(addClass)(li))));});}));})();};});});}));});});var print = new $(function(){return _(_($46$)(consolelog))(show);});var consolelog = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",console.log(Fay$$serialize(StringType,$_a))));});};var alert = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",window.alert(Fay$$serialize(StringType,$_a))));});};var thedocument = new $(function(){return Fay$$unserialize("",window.document);});var getTagName = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("string",Fay$$serialize(UnknownType,$_a)['tagName']));});};var wrap = function($_a){return new $(function(){return Fay$$unserialize("",window['jQuery'](Fay$$serialize(UnknownType,$_a)));});};var ready = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_a)['ready'](Fay$$serialize(JsType,$_b))));});};};var each = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_a)['each'](Fay$$serialize(FunctionType,$_b))));});};};var query = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",window['jQuery'](Fay$$serialize(StringType,$_a))));});};var setText = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_a)['text'](Fay$$serialize(StringType,$_b))));});};};var attr = function($_a){return function($_b){return function($_c){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_a)['attr'](Fay$$serialize(StringType,$_b),Fay$$serialize(StringType,$_c))));});};};};var setClick = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_a)['click'](Fay$$serialize(JsType,$_b))));});};};var fadeToggle = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_a)['fadeToggle'](Fay$$serialize(JsType,$_b))));});};};var hide = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_a)['hide']()));});};var addClass = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_a)['addClass'](Fay$$serialize(StringType,$_b))));});};};var removeClass = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_a)['removeClass'](Fay$$serialize(StringType,$_b))));});};};var swapClasses = function($_a){return function($_b){return function($_c){return new $(function(){var removeme = $_c;var addme = $_b;var obj = $_a;return _(_(Fay$$then)(_(_(addClass)(obj))(addme)))(_(_(removeClass)(obj))(removeme));});};};};var getText = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("string",Fay$$serialize(UnknownType,$_a)['text']()));});};var getIs = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("bool",Fay$$serialize(UnknownType,$_a)['is'](Fay$$serialize(StringType,$_b))));});};};var getSize = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_a)['length']));});};var getNext = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_a)['next']()));});};var getFirst = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_a)['first']()));});};var getFind = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_a)['find'](Fay$$serialize(StringType,$_b))));});};};var prepend = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_a)['prepend'](Fay$$serialize(UnknownType,$_b))));});};};var after = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_b)['after'](Fay$$serialize(UnknownType,$_a))));});};};var append = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_a)['append'](Fay$$serialize(UnknownType,$_b))));});};};var appendTo = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_b)['appendTo'](Fay$$serialize(UnknownType,$_a))));});};};var makeElement = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",window['jQuery'](Fay$$serialize(StringType,$_a))));});};var getWidth = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_a)['width']()));});};var beautify = function($_a){return function($_b){return new $(function(){return Fay$$unserialize("string",$jsBeautify(Fay$$serialize(StringType,$_a),Fay$$serialize(DoubleType,$_b)));});};};var hljs = new $(function(){return Fay$$unserialize("",window['hljs']);});var initHighlightingOnLoad = function($_a){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_a)['initHighlightingOnLoad']()));});};var setTabReplace = function($_a){return function($_b){return new $(function(){return new Fay$$Monad(Fay$$unserialize("",Fay$$serialize(UnknownType,$_a)['tabReplace']=Fay$$serialize(StringType,$_b)));});};};var DateType = new $(function(){return [new Fay$$Constructor("DateType")];});var FunctionType = new $(function(){return [new Fay$$Constructor("FunctionType")];});var JsType = new $(function(){return [new Fay$$Constructor("JsType")];});var StringType = new $(function(){return [new Fay$$Constructor("StringType")];});var DoubleType = new $(function(){return [new Fay$$Constructor("DoubleType")];});var ListType = new $(function(){return [new Fay$$Constructor("ListType")];});var BoolType = new $(function(){return [new Fay$$Constructor("BoolType")];});var UnknownType = new $(function(){return [new Fay$$Constructor("UnknownType")];});var Just = function(slot1){return new $(function(){return [new Fay$$Constructor("Just"),slot1];});};var Nothing = new $(function(){return [new Fay$$Constructor("Nothing")];});var show = function($_a){return new $(function(){return Fay$$unserialize("string",Fay$$encodeShow(Fay$$serialize(UnknownType,$_a)));});};var fromInteger = function($_a){return new $(function(){var x = $_a;return x;});};var fromRational = function($_a){return new $(function(){var x = $_a;return x;});};var snd = function($_a){return new $(function(){var x = Fay$$index(1)(_($_a));return x;throw ["unhandled case in Ident \"snd\"",[$_a]];});};var fst = function($_a){return new $(function(){var x = Fay$$index(0)(_($_a));return x;throw ["unhandled case in Ident \"fst\"",[$_a]];});};var find = function($_a){return function($_b){return new $(function(){var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var x = $_$_b.car;var xs = $_$_b.cdr;var p = $_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($_b) === null) {var p = $_a;return Nothing;}throw ["unhandled case in Ident \"find\"",[$_a,$_b]];});};};var any = function($_a){return function($_b){return new $(function(){var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var x = $_$_b.car;var xs = $_$_b.cdr;var p = $_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($_b) === null) {var p = $_a;return false;}throw ["unhandled case in Ident \"any\"",[$_a,$_b]];});};};var filter = function($_a){return function($_b){return new $(function(){var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var x = $_$_b.car;var xs = $_$_b.cdr;var p = $_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$_a,$_b]];});};};var not = function($_a){return new $(function(){var p = $_a;return _(p) ? false : true;});};var _$null = function($_a){return new $(function(){if (_($_a) === null) {return true;}return false;});};var map = function($_a){return function($_b){return new $(function(){if (_($_b) === null) {return null;}var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var x = $_$_b.car;var xs = $_$_b.cdr;var f = $_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$_a,$_b]];});};};var nub = function($_a){return new $(function(){var ls = $_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($_a){return function($_b){return new $(function(){if (_($_a) === null) {return null;}var ls = $_b;var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return _(_(_(elem)(x))(ls)) ? _(_(nub$39$)(xs))(ls) : _(_(Fay$$cons)(x))(_(_(nub$39$)(xs))(_(_(Fay$$cons)(x))(ls)));}throw ["unhandled case in Ident \"nub'\"",[$_a,$_b]];});};};var elem = function($_a){return function($_b){return new $(function(){var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var y = $_$_b.car;var ys = $_$_b.cdr;var x = $_a;return _(_(_(Fay$$eq)(x))(y)) || _(_(_(elem)(x))(ys));}if (_($_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$_a,$_b]];});};};var GT = new $(function(){return [new Fay$$Constructor("GT")];});var LT = new $(function(){return [new Fay$$Constructor("LT")];});var EQ = new $(function(){return [new Fay$$Constructor("EQ")];});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($_a){return function($_b){return new $(function(){var y = $_b;var x = $_a;return _(_(x) > _(y)) ? GT : _(_(x) < _(y)) ? LT : EQ;});};};var sortBy = function($_a){return new $(function(){var cmp = $_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($_a){return function($_b){return function($_c){return new $(function(){if (_($_c) === null) {var x = $_b;return Fay$$list([x]);}var ys = $_c;var x = $_b;var cmp = $_a;return (function($_ys){var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if ((_($tmp))[0].name === "GT") {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$_ys]); })();})(ys);});};};};var when = function($_a){return function($_b){return new $(function(){var m = $_b;var p = $_a;return _(p) ? _(_(Fay$$then)(m))(_(Fay$$return)(Fay$$unit)) : _(Fay$$return)(Fay$$unit);});};};var enumFrom = function($_a){return new $(function(){var i = $_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(i) + 1));});};var enumFromTo = function($_a){return function($_b){return new $(function(){var n = $_b;var i = $_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(i) + 1))(n));});};};var zipWith = function($_a){return function($_b){return function($_c){return new $(function(){var $_$_c = _($_c);if ($_$_c instanceof Fay$$Cons) {var b = $_$_c.car;var bs = $_$_c.cdr;var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var a = $_$_b.car;var as = $_$_b.cdr;var f = $_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($_a){return function($_b){return new $(function(){var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var b = $_$_b.car;var bs = $_$_b.cdr;var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var a = $_$_a.car;var as = $_$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($_a){return function($_b){return function($_c){return new $(function(){var y = $_c;var x = $_b;var f = $_a;return _(_(f)(y))(x);});};};};var maybe = function($_a){return function($_b){return function($_c){return new $(function(){if ((_($_c))[0].name === "Nothing") {var f = $_b;var m = $_a;return m;}if ((_($_c))[0].name === "Just") {var x = (_($_c))[1];var f = $_b;var m = $_a;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$_a,$_b,$_c]];});};};};var $46$ = function($_a){return function($_b){return function($_c){return new $(function(){var x = $_c;var g = $_b;var f = $_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($_a){return function($_b){return new $(function(){var y = $_b;var x = $_a;return _(_(conc)(x))(y);});};};var $36$ = function($_a){return function($_b){return new $(function(){var x = $_b;var f = $_a;return _(f)(x);});};};var conc = function($_a){return function($_b){return new $(function(){var ys = $_b;var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $_b;if (_($_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$_a,$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($_a){return function($_b){return function($_c){return new $(function(){if (_($_c) === null) {var z = $_b;var f = $_a;return z;}var $_$_c = _($_c);if ($_$_c instanceof Fay$$Cons) {var x = $_$_c.car;var xs = $_$_c.cdr;var z = $_b;var f = $_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$_a,$_b,$_c]];});};};};var foldl = function($_a){return function($_b){return function($_c){return new $(function(){if (_($_c) === null) {var z = $_b;var f = $_a;return z;}var $_$_c = _($_c);if ($_$_c instanceof Fay$$Cons) {var x = $_$_c.car;var xs = $_$_c.cdr;var z = $_b;var f = $_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$_a,$_b,$_c]];});};};};var lookup = function($_a){return function($_b){return new $(function(){if (_($_b) === null) {var _key = $_a;return Nothing;}var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($_$_b.car));var y = Fay$$index(1)(_($_$_b.car));var xys = $_$_b.cdr;var key = $_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$_a,$_b]];});};};var intersperse = function($_a){return function($_b){return new $(function(){if (_($_b) === null) {return null;}var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var x = $_$_b.car;var xs = $_$_b.cdr;var sep = $_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$_a,$_b]];});};};var prependToAll = function($_a){return function($_b){return new $(function(){if (_($_b) === null) {return null;}var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var x = $_$_b.car;var xs = $_$_b.cdr;var sep = $_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$_a,$_b]];});};};var intercalate = function($_a){return function($_b){return new $(function(){var xss = $_b;var xs = $_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($_a){return function($_b){return new $(function(){var m = $_b;var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return _(_(Fay$$then)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _(Fay$$return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$_a,$_b]];});};};var mapM_ = function($_a){return function($_b){return new $(function(){var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var x = $_$_b.car;var xs = $_$_b.cdr;var m = $_a;return _(_(Fay$$then)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _(Fay$$return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};}; // Exports this.main = main;
docs/snippets/data.hs view
docs/snippets/dom.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE EmptyDataDecls #-}+ main = do result <- documentGetElements "body" print result
docs/snippets/ffi.hs view
@@ -5,7 +5,7 @@ alert = ffi "window.alert(%1)" "" getInnerHtml :: Element -> Fay String-getInnerHtml = ffi "%1.innerHTML(%2)" FayString+getInnerHtml = ffi "%1.innerHTML" FayString setInnerHtml :: Element -> String -> Fay () setInnerHtml = ffi "%1.innerHTML=%2"
docs/snippets/tail.hs view
@@ -1,4 +1,4 @@--- Tail-recursive functions will use +-- Tail-recursive functions will use -- constant stack space sum 0 acc = acc sum n acc = sum (n - 1) (acc + n)
examples/alert.hs view
@@ -2,8 +2,8 @@ module Alert where -import Language.Fay.FFI-import Language.Fay.Prelude+import Language.Fay.FFI+import Language.Fay.Prelude main :: Fay () main = alert "Hello, World!"
examples/canvaswater.hs view
@@ -1,6 +1,6 @@ -- | Compile with: dist/build/fay/fay -autorun examples/canvaswater.hs -{-# LANGUAGE EmptyDataDecls #-}+{-# LANGUAGE EmptyDataDecls #-} {-# LANGUAGE NoImplicitPrelude #-} -- | A demonstration of Fay using the canvas element to display a@@ -8,8 +8,8 @@ module CanvasWater (main) where -import Language.Fay.FFI-import Language.Fay.Prelude+import Language.Fay.FFI+import Language.Fay.Prelude -- | Main entry point. main :: Fay ()@@ -93,8 +93,8 @@ -- | Draw an image onto a canvas rendering context. ----- Nine arguments: the element, source (x,y) coordinates, source width and --- height (for cropping), destination (x,y) coordinates, and destination width +-- Nine arguments: the element, source (x,y) coordinates, source width and+-- height (for cropping), destination (x,y) coordinates, and destination width -- and height (resize). -- -- context.drawImage(img_elem, sx, sy, sw, sh, dx, dy, dw, dh);
examples/console.hs view
@@ -2,8 +2,8 @@ module Console where -import Language.Fay.FFI-import Language.Fay.Prelude+import Language.Fay.FFI+import Language.Fay.Prelude main = print "Hello, World!"
examples/data.hs view
@@ -1,5 +1,5 @@ -- Generate Show value.--- +-- -- $ fay -autorun examples/data.hs -- $ node examples/data.js -- (Foo { x = 123, y = "abc", z = (Bar) })@@ -8,8 +8,8 @@ module Data where -import Language.Fay.Prelude-import Language.Fay.FFI+import Language.Fay.FFI+import Language.Fay.Prelude data Foo = Foo { x :: Double, y :: String, z :: Foo } | Bar deriving (Show)
examples/dom.hs view
@@ -1,10 +1,10 @@-{-# LANGUAGE EmptyDataDecls #-}+{-# LANGUAGE EmptyDataDecls #-} {-# LANGUAGE NoImplicitPrelude #-} module Dom where -import Language.Fay.FFI-import Language.Fay.Prelude+import Language.Fay.FFI+import Language.Fay.Prelude main :: Fay () main = addEventListener "load" printBody False
examples/ref.hs view
@@ -1,12 +1,12 @@ -- | Mutable references. -{-# LANGUAGE EmptyDataDecls #-}+{-# LANGUAGE EmptyDataDecls #-} {-# LANGUAGE NoImplicitPrelude #-} module Ref where -import Language.Fay.FFI-import Language.Fay.Prelude+import Language.Fay.FFI+import Language.Fay.Prelude main :: Fay () main = do
examples/tailrecursive.hs view
@@ -8,8 +8,8 @@ module Tailrecursive where -import Language.Fay.FFI-import Language.Fay.Prelude+import Language.Fay.FFI+import Language.Fay.Prelude main = do benchmark
fay.cabal view
@@ -1,7 +1,7 @@ name: fay-version: 0.4.0.1+version: 0.4.0.4 synopsis: A compiler for Fay, a Haskell subset that compiles to JavaScript.-description: Fay is a proper subset of Haskell which can be compiled (type-checked) +description: Fay is a proper subset of Haskell which can be compiled (type-checked) with GHC, and compiled to JavaScript. It is lazy, pure, with a Fay monad, an FFI, tail-recursion optimization (experimental). It implements no type system, for type-checking you should use GHC.@@ -15,15 +15,14 @@ > $ cabal install > $ dist/build/fay-docs/fay-docs .- . + . /Examples/ . See <http://fay-lang.org/#examples>. . /Release Notes/ .- * Collapse all the FFI types by using the type signature instead using UHC- approach. Check the docs and examples.+ * Added help to the fay compiler executable. . See full history at: <https://github.com/chrisdone/fay/commits> homepage: http://fay-lang.org/
hs/stdlib.hs view
js/runtime.js view
@@ -108,7 +108,7 @@ str += obj.car; obj = _(obj.cdr); }- return str; + return str; } else if(type == "FunctionType" || typeof obj == 'function'){ return function(){ var out = obj;@@ -119,20 +119,20 @@ out = out(arguments[i]); } return _(out,true);- }; + }; } else if(type == "ListType" || (obj instanceof Fay$$Cons)){ var arr = []; while(obj instanceof Fay$$Cons) { arr.push(Fay$$serialize(null,obj.car)); obj = _(obj.cdr); }- return arr; + return arr; } // else if(type == "BoolType || obj == _(True) || obj == _(False)) { // return obj == _(True);- // } + // } else { return obj;- } + } } } @@ -360,4 +360,3 @@ /******************************************************************************* * Application code. */-
src/Control/Monad/IO.hs view
@@ -1,6 +1,6 @@ module Control.Monad.IO where -import Control.Monad.Trans+import Control.Monad.Trans io :: MonadIO m => IO a -> m a io = liftIO
src/Docs.hs view
@@ -1,28 +1,28 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE CPP #-} {-# OPTIONS -fno-warn-missing-signatures -fno-warn-unused-do-bind #-} -- | Generate documentation for Fay. module Main where -import Language.Fay (compileViaStr,compileModule)-import Language.Fay.Compiler (compileFromTo)+import Language.Fay (compileModule, compileViaStr)+import Language.Fay.Compiler (compileFromTo) import Control.Exception import Control.Monad-import qualified Data.ByteString.Lazy as L+import qualified Data.ByteString.Lazy as L import Data.Char import Data.Default-import Data.List (isSuffixOf,sort)+import Data.List (isSuffixOf, sort) import Data.Time-import Prelude hiding (head,div)+import Prelude hiding (div, head) import System.Directory import System.FilePath import Text.Blaze.Extra-import Text.Blaze.Html5 as H hiding (contents,map,style)+import Text.Blaze.Html5 as H hiding (contents, map, style) import Text.Blaze.Html5.Attributes as A hiding (title)-import Text.Blaze.Renderer.Utf8 (renderMarkup)+import Text.Blaze.Renderer.Utf8 (renderMarkup) -- | Main entry point. main :: IO ()@@ -31,7 +31,7 @@ generate >>= L.writeFile file generateJs putStrLn $ "Documentation file written to " ++ file- + generate = do sources <- mapM readFile examples javascripts <- mapM compile examples@@ -40,7 +40,7 @@ return $ renderMarkup $ page now analytics (zip3 (map titlize examples) sources javascripts)- + where compile file = do contents <- readFile file putStrLn $ "Compiling " ++ file ++ " ..."@@ -58,7 +58,7 @@ generateJs = do putStrLn $ "Compiling " ++ inp ++ " to " ++ out ++ " ..." compileFromTo def True inp out- + where docs = ("docs" </>) inp = (docs "home.hs") out = (docs "home.js")@@ -91,7 +91,7 @@ thefooter now preEscapedToMarkup analytics -fork = +fork = a ! href "https://github.com/chrisdone/fay" $ img ! style "position: absolute; top: 0; right: 0; border: 0;" ! src "https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png"@@ -172,7 +172,7 @@ " The depths to which JavaScript sucks is well-documented and well-understood. Its main faults are: its lack of module system, weak-typing, verbose function syntax, late binding, which has led to the creation of various static analysis tools to alleviate this language flaw, but with limited success (there is even a static type checker), finicky equality/automatic conversion, this behaviour, and lack of static types." li $ do strong "We need JavaScript:" " Using it for what it is good for, i.e. providing a platform for browser development, but not using the language per se, is therefore desirable, and many are working to achieve this, in varying forms. There are various ways to do it, but we ought to opt for compiling an existing language, Haskell, to JavaScript, because we do not have time to learn or teach other people a new language, garner a new library set and a new type checker and all that Haskell implementations provide."- p $ a ! href "http://www.haskell.org/haskellwiki/The_JavaScript_Problem" $ + p $ a ! href "http://www.haskell.org/haskellwiki/The_JavaScript_Problem" $ "See here for more elaboration »" thecomparisons = do
src/Language/Fay.hs view
@@ -1,9 +1,9 @@-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE TupleSections #-}+{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TupleSections #-} {-# LANGUAGE TypeSynonymInstances #-} {-# LANGUAGE ViewPatterns #-} {-# OPTIONS -Wall -fno-warn-name-shadowing -fno-warn-orphans #-}@@ -14,7 +14,7 @@ where -import Language.Fay.Print ()+import Language.Fay.Print () import Language.Fay.Types import Control.Applicative@@ -110,10 +110,14 @@ -- | Compile the given import. compileImport :: ImportDecl -> Compile [JsStmt] compileImport (ImportDecl _ (ModuleName name) _ _ _ _ _)- | isPrefixOf "Language.Fay." name || name == "Prelude" = return []+ | elem name ["Language.Fay.Prelude","Language.Fay.FFI","Language.Fay.Types"] || name == "Prelude" = return [] compileImport (ImportDecl _ (ModuleName name) False _ Nothing Nothing Nothing) = do contents <- io (readFile (replace '.' '/' name ++ ".hs"))- compileFromStr compileModule contents+ cfg <- config id+ result <- liftIO $ compileToAst cfg compileModule contents+ case result of+ Right (stmts,state) -> return stmts+ Left err -> throwError err where replace c r = map (\x -> if x == c then r else x) compileImport i = error $ "Import syntax not supported. " ++@@ -178,7 +182,7 @@ case JS.parse (printJS (wrapReturn inner)) (prettyPrint name) of Left err -> throwError (FfiFormatInvalidJavaScript inner err) Right{} -> fmap return (bindToplevel True (UnQual name) (body inner))- + where body inner = foldr wrapParam (wrapReturn inner) params wrapParam name inner = JsFun [name] [] (Just inner) params = zipWith const uniqueNames [1..typeArity sig]@@ -215,7 +219,7 @@ go (x:xs) = do rest <- go xs return (x : rest) go [] = return []- + inject n = case listToMaybe (drop (n-1) args) of Nothing -> throwError (FfiFormatNoSuchArg n)@@ -226,7 +230,7 @@ serialize :: ArgType -> JsExp -> JsExp serialize typ exp = case typ of- UnknownType -> force exp+-- UnknownType -> force exp _ -> JsApp (JsName (hjIdent "serialize")) [JsName (fromString (show typ)),exp] @@ -353,7 +357,7 @@ JsWhile (JsLit (JsBool True)) (concatMap replaceTailStmt (reverse (zip (reverse stmts) [0::Integer ..])))- + where replaceTailStmt (JsIf cond sothen orelse,i) = [JsIf cond (concatMap (replaceTailStmt . (,i)) sothen) (concatMap (replaceTailStmt . (,i)) orelse)] replaceTailStmt (JsEarlyReturn exp,i) = expTailReplace i exp@@ -449,7 +453,7 @@ flattenApps <- config configFlattenApps if flattenApps then method2 else method1 where- -- Method 1: + -- Method 1: -- In this approach code ends up looking like this: -- a(a(a(a(a(a(a(a(a(a(L)(c))(b))(0))(0))(y))(t))(a(a(F)(3*a(a(d)+a(a(f)/20))))*a(a(f)/2)))(140+a(f)))(y))(t)}) -- Which might be OK for speed, but increases the JS stack a fair bit.@@ -480,14 +484,14 @@ | symbol `elem` words "* + - / < > || &&" -> do e1 <- compileExp exp1 e2 <- compileExp exp2- return (JsInfix symbol (forceInlinable config e1) (forceInlinable config e2)) + return (JsInfix symbol (forceInlinable config e1) (forceInlinable config e2)) _ -> do var <- resolveOpToVar op compileExp (App (App var exp1) exp2) where getOp (QVarOp op) = op getOp (QConOp op) = op- + -- | Compile a list expression. compileList :: [Exp] -> Compile JsExp compileList xs = do@@ -582,6 +586,7 @@ pat@PInfixApp{} -> compileInfixPat exp pat body PList pats -> compilePList pats body exp PTuple pats -> compilePList pats body exp+ PAsPat name pat -> compilePAsPat exp name pat body pat -> throwError (UnsupportedPattern pat) -- | Compile a literal value from a pattern match.@@ -592,9 +597,14 @@ body []] +compilePAsPat :: JsExp -> Name -> Pat -> [JsStmt] -> Compile [JsStmt]+compilePAsPat exp name pat body = do+ x <- compilePat exp pat body;+ return ([JsVar (UnQual name) exp] ++ x ++ body)+ -- | Equality test for two expressions, with some optimizations. equalExps :: JsExp -> JsExp -> JsExp-equalExps a b +equalExps a b | isConstant a && isConstant b = JsEq a b | isConstant a = JsEq a (force b) | isConstant b = JsEq (force a) b@@ -767,7 +777,7 @@ unserialize typ exp = JsApp (JsName (hjIdent "unserialize")) [JsLit (JsStr (showReturnType typ)),exp]- + where showReturnType typ = case typ of FayArray -> "array"@@ -831,7 +841,7 @@ -- | Emit exported names. emitExport :: ExportSpec -> Compile ()-emitExport spec = +emitExport spec = case spec of EVar (UnQual name) -> modify $ \s -> s { stateExports = name : stateExports s } EVar _ -> error "Emitted a qualifed export, not supported."
src/Language/Fay/Compiler.hs view
@@ -1,12 +1,14 @@-{-# LANGUAGE ViewPatterns #-}-{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ViewPatterns #-}+ module Language.Fay.Compiler where -import Control.Exception (throw)-import Language.Fay (compileViaStr,compileModule)-import Language.Fay.Types-import Language.Haskell.Exts.Syntax-import Paths_fay+import Control.Exception (throw)+import Language.Fay (compileModule, compileViaStr)+import Language.Fay.Types+import Language.Haskell.Exts.Syntax+import Paths_fay -- | Compile file program to… compileFromTo :: CompileConfig -> Bool -> FilePath -> FilePath -> IO ()@@ -26,7 +28,7 @@ case result of Right out -> writeFile fileout out Left err -> throw err- + where strip = unlines . dropWhile (/="-- START") . lines -- | Compile the given module to a runnable program.
src/Language/Fay/FFI.hs view
@@ -1,11 +1,11 @@-{-# LANGUAGE EmptyDataDecls #-}+{-# LANGUAGE EmptyDataDecls #-}+{-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE TypeSynonymInstances #-}-{-# LANGUAGE NoImplicitPrelude #-} module Language.Fay.FFI where -import Language.Fay.Types (Fay,FayReturnType(..))-import Prelude (Bool,String,Double,Char,error)+import Language.Fay.Types (Fay, FayReturnType(..))+import Prelude (Bool, Char, Double, String, error) data JsPtr a
src/Language/Fay/Prelude.hs view
@@ -33,12 +33,13 @@ ,module Language.Fay.Stdlib) where -import Language.Fay.Types (Fay,FayReturnType(..))-import Language.Fay.Stdlib+import Language.Fay.Stdlib+import Language.Fay.Types (Fay, FayReturnType(..)) -import Prelude ((>),(<),(==),(||),(&&),Maybe(..),Double,Ord,Integer,error,String,(+),Bool(..),Char,Show(..)- ,Read(..),read,(/=),(*),(-),(<=),(>=),(/))-import GHC.Real (Ratio)+import GHC.Real (Ratio)+import Prelude (Bool(..), Char, Double, Integer, Maybe(..), Ord, Read(..),+ Show(..), String, error, read, (&&), (*), (+), (-), (/), (/=), (<),+ (<=), (==), (>), (>=), (||)) -- | Just to satisfy GHC. fromInteger :: Integer -> Double
src/Language/Fay/Print.hs view
@@ -1,9 +1,8 @@ {-# OPTIONS -fno-warn-orphans #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TypeSynonymInstances #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE ViewPatterns #-} -- | Simple code (non-pretty) printing. --@@ -16,13 +15,13 @@ module Language.Fay.Print where -import Language.Fay.Types+import Language.Fay.Types -import Data.List-import Data.String-import Language.Haskell.Exts.Syntax-import Prelude hiding (exp)-import Text.JSON+import Data.List+import Data.String+import Language.Haskell.Exts.Syntax+import Prelude hiding (exp)+import Text.JSON -------------------------------------------------------------------------------- -- Printing@@ -123,9 +122,9 @@ printJS (JsSequence exprs) = intercalate "," (map (printJS) exprs) printJS (JsName name) = printJS name- printJS (JsApp op args) = + printJS (JsApp op args) = printJS (if isFunc op then JsParen op else op) ++- "(" ++ + "(" ++ intercalate "," (map (printJS) args) ++ ")" where isFunc JsFun{..} = True; isFunc _ = False@@ -136,14 +135,14 @@ , (printJS conseq) ++ " : " , (printJS alt)] printJS (JsList exps) =- "[" ++ + "[" ++ intercalate "," (map (printJS) exps) ++ "]" printJS (JsNew name args) = "new " ++ printJS (JsApp (JsName name) args) printJS (JsInstanceOf exp classname) = printJS exp ++ " instanceof " ++ printJS classname- printJS (JsIndex i exp) = + printJS (JsIndex i exp) = "(" ++ printJS exp ++ ")[" ++ show i ++ "]" printJS (JsEq exp1 exp2) = printJS exp1 ++ " === " ++ printJS exp2@@ -176,7 +175,7 @@ if isPrefixOf "$_" name then name else concat . map encode $ name- + where encode c | elem c allowed = [c] | otherwise = escapeChar c@@ -184,7 +183,7 @@ escapeChar c = "$" ++ charId c ++ "$" charId c = show (fromEnum c) --- | Helpful for writing qualified symbols (Fay.*). +-- | Helpful for writing qualified symbols (Fay.*). instance IsString ModuleName where fromString = ModuleName
src/Language/Fay/Show.hs view
@@ -2,9 +2,9 @@ module Language.Fay.Show where -import Data.List-import Text.JSON-import Text.Show.Pretty+import Data.List+import Text.JSON+import Text.Show.Pretty -- | Convert a Haskell value to a Fay value. To read this in from JS, -- use Fay.eval() which will evaluate the code in the context of Fay.@@ -12,7 +12,7 @@ showToFay a = case reify a of Nothing -> error $ "Unable to reify data type: " ++ show a Just a -> convert a- + where convert a = case a of Con "Date" [String s] -> "Fay$$date(" ++ encode (read s :: String) ++ ")" Con name [] -> name@@ -28,6 +28,6 @@ Float x -> x Char x -> encode (read x :: Char) String x -> "Fay$$list(" ++ encode (read x :: String) ++ ")"- + con name values = foldr app name (reverse values) where app arg rest = rest ++ "(" ++ convert arg ++ ")"
src/Language/Fay/Stdlib.hs view
@@ -34,7 +34,7 @@ ,when) where -import Prelude (Maybe(..),(==),(>>),return,(+),(<),(>),Bool(..),Ord,(||))+import Prelude (Bool(..), Maybe(..), Ord, return, (+), (<), (==), (>), (>>), (||)) -- START @@ -88,7 +88,7 @@ insertBy _ x [] = [x] insertBy cmp x ys = case ys of- y:ys' -> + y:ys' -> case cmp x y of GT -> y : insertBy cmp x ys' _ -> x : ys
src/Language/Fay/Types.hs view
@@ -1,7 +1,7 @@-{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE FunctionalDependencies #-}-{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE MultiParamTypeClasses #-} -- | All Fay types and instances. @@ -22,14 +22,14 @@ ,ArgType(..)) where -import Control.Exception-import Control.Applicative-import Control.Monad.Error (Error,ErrorT,MonadError)-import Control.Monad.Identity (Identity)-import Control.Monad.State-import Data.Data-import Data.Default-import Language.Haskell.Exts+import Control.Applicative+import Control.Exception+import Control.Monad.Error (Error, ErrorT, MonadError)+import Control.Monad.Identity (Identity)+import Control.Monad.State+import Data.Data+import Data.Default+import Language.Haskell.Exts -------------------------------------------------------------------------------- -- Compiler types@@ -124,7 +124,7 @@ | JsSetProp JsName JsName JsExp | JsContinue deriving (Show,Eq)- + -- | Expression type. data JsExp = JsName JsName
src/Main.hs view
@@ -1,16 +1,15 @@-{-# LANGUAGE ViewPatterns #-} -- | Main compiler executable. module Main where -import Language.Fay.Compiler-import Language.Fay.Types+import Language.Fay.Compiler+import Language.Fay.Types -import Control.Monad-import Data.Default-import Data.List-import System.Environment+import Control.Monad+import Data.Default+import Data.List+import System.Environment -- | Main entry point. main :: IO ()@@ -18,12 +17,25 @@ args <- getArgs let files = filter (not . isPrefixOf "-") args opts = map (drop 1) $ filter (isPrefixOf "-") args- forM_ files $ \file -> do- compileFromTo def { configTCO = elem "tco" opts- , configInlineForce = elem "inline-force" opts- , configFlattenApps = elem "flatten-apps" opts- , configExportBuiltins = not (elem "no-export-builtins" opts)- }- (elem "autorun" opts)- file- (toJsName file)+ if (elem "help" opts) || null files+ then putStrLn helpText+ else forM_ files $ \file -> do+ compileFromTo def { configTCO = elem "tco" opts+ , configInlineForce = elem "inline-force" opts+ , configFlattenApps = elem "flatten-apps" opts+ , configExportBuiltins = not (elem "no-export-builtins" opts)+ }+ (elem "autorun" opts)+ file+ (toJsName file)+++helpText = unlines+ ["fay -- compiler from (a proper subset of) Haskell to JavaScript"+ ,""+ ,"USAGE"+ ," fay [OPTIONS] <hs-input-file> ... "+ ,""+ ,"OPTIONS"+ ," -autorun automatically call main in generated JavaScript"+ ]
src/System/Process/Extra.hs view
@@ -2,9 +2,9 @@ module System.Process.Extra where -import System.Exit-import System.IO-import System.Process+import System.Exit+import System.IO+import System.Process -- | Read all stuff from a process. readAllFromProcess :: FilePath -> String -> IO (Either String String)
src/Tests.hs view
@@ -5,17 +5,17 @@ module Main where -import Language.Fay.Compiler+import Language.Fay.Compiler -import Data.Default-import Data.List-import System.Directory-import System.Exit-import System.FilePath-import System.IO-import System.Process-import System.Process.Extra-import Test.HUnit+import Data.Default+import Data.List+import System.Directory+import System.Exit+import System.FilePath+import System.IO+import System.Process+import System.Process.Extra+import Test.HUnit -- | Main test runner. main :: IO ()@@ -26,7 +26,7 @@ runUnitTests = do files <- fmap (map ("tests" </>) . sort . filter dotHs) $ getDirectoryContents "tests" runTestTT (makeTests files)- + where dotHs = isSuffixOf ".hs" makeTests files = TestList $ flip map files $ \file -> TestLabel file $ TestCase $ do
src/Text/Blaze/Extra.hs view
@@ -1,15 +1,15 @@ {-# OPTIONS -fno-warn-orphans #-}-{-# LANGUAGE RecordWildCards #-} {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RecordWildCards #-} {-# OPTIONS -fno-warn-name-shadowing -fno-warn-unused-do-bind #-} module Text.Blaze.Extra where -import Control.Monad-import Data.Monoid-import Text.Blaze.Html5 as H hiding (map)-import Text.Blaze.Html5.Attributes as A-import Text.Blaze.Internal (Attributable)+import Control.Monad+import Data.Monoid+import Text.Blaze.Html5 as H hiding (map)+import Text.Blaze.Html5.Attributes as A+import Text.Blaze.Internal (Attributable) (!.) :: (Attributable h) => h -> AttributeValue -> h elem !. className = elem ! class_ className
tests/10.hs view
tests/11.hs view
tests/13.hs view
tests/14.hs view
tests/15.hs view
tests/16.hs view
tests/17.hs view
tests/18.hs view
tests/19.hs view
tests/20.hs view
tests/21.hs view
tests/22.hs view
tests/23.hs view
tests/24.hs view
tests/25.hs view
tests/26.hs view
tests/27.hs view
@@ -4,8 +4,8 @@ module Fib where -import Language.Fay.FFI-import Language.Fay.Prelude+import Language.Fay.FFI+import Language.Fay.Prelude main = do print (sum 100000 0 :: Double)
tests/28.hs view
@@ -1,8 +1,8 @@ {-# LANGUAGE NoImplicitPrelude #-} module Test where -import Language.Fay.Prelude-import Language.Fay.FFI+import Language.Fay.FFI+import Language.Fay.Prelude print :: String -> Fay () print = ffi "console.log(%1)" FayNone
tests/3.hs view
tests/4.hs view
tests/5.hs view
tests/6.hs view
tests/7.hs view