diff --git a/docs/home.hs b/docs/home.hs
--- a/docs/home.hs
+++ b/docs/home.hs
@@ -34,6 +34,7 @@
     let sample = wrap this
     in do text <- getText sample
           setText sample (beautify text 2)
+          return True
   setTabReplace hljs "    "
   initHighlightingOnLoad hljs
 
@@ -61,7 +62,7 @@
     toggleButton
     panel <- getFind left ".panel"
     prepend panel toggle
-    return ()
+    return True
 
 -- | Generate a table of contents.
 setupTableOfContents :: Fay ()
@@ -83,21 +84,7 @@
           attr a "href" ("#" ++ anchor)
           -- For the indentation.
           getTagName heading >>= addClass li
-
---------------------------------------------------------------------------------
--- Window object
-
--- | Print something.
-print :: Show a => a -> Fay ()
-print = consolelog . show
-
--- | Console log.
-consolelog :: String -> Fay ()
-consolelog = ffi "console.log(%1)" FayNone
-
--- | Pop-up an alert.
-alert :: String -> Fay ()
-alert = ffi "window.alert(%1)" FayNone
+          return True
 
 --------------------------------------------------------------------------------
 -- DOM
@@ -108,11 +95,11 @@
 
 -- | The document.
 thedocument :: Element
-thedocument = ffi "window.document" FayNone
+thedocument = ffi "window.document"
 
 -- | Get the size of the given jquery array.
 getTagName :: Element -> Fay String
-getTagName = ffi "%1['tagName']" FayString
+getTagName = ffi "%1['tagName']"
 
 --------------------------------------------------------------------------------
 -- jQuery
@@ -123,47 +110,47 @@
 
 -- | Make a jQuery object out of an element.
 wrap :: Element -> JQuery
-wrap = ffi "window['jQuery'](%1)" FayNone
+wrap = ffi "window['jQuery'](%1)"
 
 -- | Bind a handler for when the element is ready.
 ready :: JQuery -> Fay () -> Fay ()
-ready = ffi "%1['ready'](%2)" FayNone
+ready = ffi "%1['ready'](%2)"
 
 -- | Bind a handler for when the element is ready.
-each :: JQuery -> (Double -> Element -> Fay ()) -> Fay ()
-each = ffi "%1['each'](%2)" FayNone
+each :: JQuery -> (Double -> Element -> Fay Bool) -> Fay ()
+each = ffi "%1['each'](%2)"
 
 -- | Query for elements.
 query :: String -> Fay JQuery
-query = ffi "window['jQuery'](%1)" FayNone
+query = ffi "window['jQuery'](%1)"
 
 -- | Set the text of the given object.
 setText :: JQuery -> String -> Fay ()
-setText = ffi "%1['text'](%2)" FayNone
+setText = ffi "%1['text'](%2)"
 
 -- | Set the text of the given object.
 attr :: JQuery -> String -> String -> Fay ()
-attr = ffi "%1['attr'](%2,%3)" FayNone
+attr = ffi "%1['attr'](%2,%3)"
 
 -- | Set the click of the given object.
 setClick :: JQuery -> Fay () -> Fay ()
-setClick = ffi "%1['click'](%2)" FayNone
+setClick = ffi "%1['click'](%2)"
 
 -- | Toggle the visibility of an element, faded.
 fadeToggle :: JQuery -> Fay () -> Fay ()
-fadeToggle = ffi "%1['fadeToggle'](%2)" FayNone
+fadeToggle = ffi "%1['fadeToggle'](%2)"
 
 -- | Hide an element.
 hide :: JQuery -> Fay ()
-hide = ffi "%1['hide']()" FayNone
+hide = ffi "%1['hide']()"
 
 -- | Add a class to the given object.
 addClass :: JQuery -> String -> Fay ()
-addClass = ffi "%1['addClass'](%2)" FayNone
+addClass = ffi "%1['addClass'](%2)"
 
 -- | Remove a class from the given object.
 removeClass :: JQuery -> String -> Fay ()
-removeClass = ffi "%1['removeClass'](%2)" FayNone
+removeClass = ffi "%1['removeClass'](%2)"
 
 -- | Swap the given classes on the object.
 swapClasses :: JQuery -> String -> String -> Fay ()
@@ -173,51 +160,51 @@
 
 -- | Get the text of the given object.
 getText :: JQuery -> Fay String
-getText = ffi "%1['text']()" FayString
+getText = ffi "%1['text']()"
 
 -- | Get the text of the given object.
 getIs :: JQuery -> String -> Fay Bool
-getIs = ffi "%1['is'](%2)" FayBool
+getIs = ffi "%1['is'](%2)"
 
 -- | Get the size of the given jquery array.
 getSize :: JQuery -> Fay Double
-getSize = ffi "%1['length']" FayNone
+getSize = ffi "%1['length']"
 
 -- | Get the next of the given object.
 getNext :: JQuery -> Fay JQuery
-getNext = ffi "%1['next']()" FayNone
+getNext = ffi "%1['next']()"
 
 -- | Get the first of the given object.
 getFirst :: JQuery -> Fay JQuery
-getFirst = ffi "%1['first']()" FayNone
+getFirst = ffi "%1['first']()"
 
 -- | Get the find of the given object.
 getFind :: JQuery -> String -> Fay JQuery
-getFind = ffi "%1['find'](%2)" FayNone
+getFind = ffi "%1['find'](%2)"
 
 -- | Prepend an element to this one.
 prepend :: JQuery -> JQuery -> Fay JQuery
-prepend = ffi "%1['prepend'](%2)" FayNone
+prepend = ffi "%1['prepend'](%2)"
 
 -- | Append an element /after/ this one.
 after :: JQuery -> JQuery -> Fay JQuery
-after = ffi "%2['after'](%1)" FayNone
+after = ffi "%2['after'](%1)"
 
 -- | Append an element to this one.
 append :: JQuery -> JQuery -> Fay JQuery
-append = ffi "%1['append'](%2)" FayNone
+append = ffi "%1['append'](%2)"
 
 -- | Append this to an element.
 appendTo :: JQuery -> JQuery -> Fay JQuery
-appendTo = ffi "%2['appendTo'](%1)" FayNone
+appendTo = ffi "%2['appendTo'](%1)"
 
 -- | Make a new element.
 makeElement :: String -> Fay JQuery
-makeElement = ffi "window['jQuery'](%1)" FayNone
+makeElement = ffi "window['jQuery'](%1)"
 
 -- | Get the width of the given object.
 getWidth :: JQuery -> Fay Double
-getWidth = ffi "%1['width']()" FayNone
+getWidth = ffi "%1['width']()"
 
 --------------------------------------------------------------------------------
 -- Pretty printing / highlighting
@@ -226,19 +213,19 @@
 beautify :: String -- ^ The JS code.
          -> Double -- ^ The indentation level.
          -> String -- ^ The reformatted JS code.
-beautify = ffi "$jsBeautify(%1,%2)" FayString
+beautify = ffi "$jsBeautify(%1,%2)"
 
 data Highlighter
 instance Foreign Highlighter
 
 -- | Get the highlighter.
 hljs :: Highlighter
-hljs = ffi "window['hljs']" FayNone
+hljs = ffi "window['hljs']"
 
 -- | Init syntax highlighting on load.
 initHighlightingOnLoad :: Highlighter -> Fay ()
-initHighlightingOnLoad = ffi "%1['initHighlightingOnLoad']()" FayNone
+initHighlightingOnLoad = ffi "%1['initHighlightingOnLoad']()"
 
 -- | Init syntax highlighting on load.
 setTabReplace :: Highlighter -> String -> Fay ()
-setTabReplace = ffi "%1['tabReplace']=%2" FayNone
+setTabReplace = ffi "%1['tabReplace']=%2"
diff --git a/docs/home.js b/docs/home.js
--- a/docs/home.js
+++ b/docs/home.js
@@ -111,26 +111,29 @@
     case "function": {
         // A proper function.
         jsObj = function(){
+            var fayFunc = fayObj;
             var return_type = args[args.length-1];
             var len = args.length;
             // If some arguments.
             if (len > 1) {
                 // Apply to all the arguments.
-                fayObj = _(fayObj,true);
-                for (var i = 0, len = len; i < len - 1; i++) {
+                fayFunc = _(fayFunc,true);
+                // TODO: Perhaps we should throw an error when JS
+                // passes more arguments than Haskell accepts.
+                for (var i = 0, len = len; i < len - 1 && fayFunc instanceof Function; i++) {
                     // Unserialize the JS values to Fay for the Fay callback.
-                    fayObj = _(fayObj(Fay$$unserialize(args[i],arguments[i])),true);
+                    fayFunc = _(fayFunc(Fay$$unserialize(args[i],arguments[i])),true);
                 }
                 // Finally, serialize the Fay return value back to JS.
                 var return_base = return_type[0];
                 var return_args = return_type[1];
                 // If it's a monadic return value, get the value instead.
                 if(return_base == "action") {
-                    return Fay$$serialize(return_args[0],fayObj.value);
+                    return Fay$$serialize(return_args[0],fayFunc.value);
                 }
                 // Otherwise just serialize the value direct.
                 else {
-                    return Fay$$serialize(return_type,fayObj);
+                    return Fay$$serialize(return_type,fayFunc);
                 }
             } else {
                 throw new Error("Nullary function?");
@@ -217,6 +220,11 @@
         fayObj = jsObj;
         break;
     }
+    case "bool": {
+        // Bools are unboxed.
+        fayObj = jsObj;
+        break;
+    }
     default: throw new Error("Unhandled unserialize type: " + base);
     }
     return fayObj;
@@ -435,7 +443,7 @@
  * Application code.
  */
 
-var main = new $(function(){return _(_($36$)(_(ready)(_(wrap)(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)(_$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 = new $(function(){return _(_(ffi)(Fay$$list("console.log(%1)")))(FayNone);});var alert = new $(function(){return _(_(ffi)(Fay$$list("window.alert(%1)")))(FayNone);});var thedocument = new $(function(){return _(_(ffi)(Fay$$list("window.document")))(FayNone);});var getTagName = new $(function(){return _(_(ffi)(Fay$$list("%1['tagName']")))(FayString);});var wrap = new $(function(){return _(_(ffi)(Fay$$list("window['jQuery'](%1)")))(FayNone);});var ready = new $(function(){return _(_(ffi)(Fay$$list("%1['ready'](%2)")))(FayNone);});var each = new $(function(){return _(_(ffi)(Fay$$list("%1['each'](%2)")))(FayNone);});var query = new $(function(){return _(_(ffi)(Fay$$list("window['jQuery'](%1)")))(FayNone);});var setText = new $(function(){return _(_(ffi)(Fay$$list("%1['text'](%2)")))(FayNone);});var attr = new $(function(){return _(_(ffi)(Fay$$list("%1['attr'](%2,%3)")))(FayNone);});var setClick = new $(function(){return _(_(ffi)(Fay$$list("%1['click'](%2)")))(FayNone);});var fadeToggle = new $(function(){return _(_(ffi)(Fay$$list("%1['fadeToggle'](%2)")))(FayNone);});var hide = new $(function(){return _(_(ffi)(Fay$$list("%1['hide']()")))(FayNone);});var addClass = new $(function(){return _(_(ffi)(Fay$$list("%1['addClass'](%2)")))(FayNone);});var removeClass = new $(function(){return _(_(ffi)(Fay$$list("%1['removeClass'](%2)")))(FayNone);});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 = new $(function(){return _(_(ffi)(Fay$$list("%1['text']()")))(FayString);});var getIs = new $(function(){return _(_(ffi)(Fay$$list("%1['is'](%2)")))(FayBool);});var getSize = new $(function(){return _(_(ffi)(Fay$$list("%1['length']")))(FayNone);});var getNext = new $(function(){return _(_(ffi)(Fay$$list("%1['next']()")))(FayNone);});var getFirst = new $(function(){return _(_(ffi)(Fay$$list("%1['first']()")))(FayNone);});var getFind = new $(function(){return _(_(ffi)(Fay$$list("%1['find'](%2)")))(FayNone);});var prepend = new $(function(){return _(_(ffi)(Fay$$list("%1['prepend'](%2)")))(FayNone);});var after = new $(function(){return _(_(ffi)(Fay$$list("%2['after'](%1)")))(FayNone);});var append = new $(function(){return _(_(ffi)(Fay$$list("%1['append'](%2)")))(FayNone);});var appendTo = new $(function(){return _(_(ffi)(Fay$$list("%2['appendTo'](%1)")))(FayNone);});var makeElement = new $(function(){return _(_(ffi)(Fay$$list("window['jQuery'](%1)")))(FayNone);});var getWidth = new $(function(){return _(_(ffi)(Fay$$list("%1['width']()")))(FayNone);});var beautify = new $(function(){return _(_(ffi)(Fay$$list("$jsBeautify(%1,%2)")))(FayString);});var hljs = new $(function(){return _(_(ffi)(Fay$$list("window['hljs']")))(FayNone);});var initHighlightingOnLoad = new $(function(){return _(_(ffi)(Fay$$list("%1['initHighlightingOnLoad']()")))(FayNone);});var setTabReplace = new $(function(){return _(_(ffi)(Fay$$list("%1['tabReplace']=%2")))(FayNone);});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(["unknown"],$_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))(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)(_$this);});return _(_(Fay$$bind)(_(getText)(sample)))(function($_a){var text = $_a;return _(_(Fay$$then)(_(_(setText)(sample))(_(_(beautify)(text))(2))))(_(Fay$$return)(true));});})();};})))(_(_(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)(true));})));}));});});}));});});};});});});});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$$then)(_(_(Fay$$bind)(_(getTagName)(heading)))(_(addClass)(li))))(_(Fay$$return)(true))));});}));})();};});});}));});});var thedocument = new $(function(){return Fay$$unserialize(["unknown"],window.document);});var getTagName = function($_a){return new $(function(){return Fay$$unserialize(["action",[["string"]]],Fay$$serialize(["unknown"],$_a)['tagName']);});};var wrap = function($_a){return new $(function(){return Fay$$unserialize(["unknown"],window['jQuery'](Fay$$serialize(["unknown"],$_a)));});};var ready = function($_a){return function($_b){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],Fay$$serialize(["unknown"],$_a)['ready'](Fay$$serialize(["action",[["unknown"]]],$_b)));});};};var each = function($_a){return function($_b){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],Fay$$serialize(["unknown"],$_a)['each'](Fay$$serialize(["function",[["double"],["unknown"],["action",[["bool"]]]]],$_b)));});};};var query = function($_a){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],window['jQuery'](Fay$$serialize(["string"],$_a)));});};var setText = function($_a){return function($_b){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],Fay$$serialize(["unknown"],$_a)['text'](Fay$$serialize(["string"],$_b)));});};};var attr = function($_a){return function($_b){return function($_c){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],Fay$$serialize(["unknown"],$_a)['attr'](Fay$$serialize(["string"],$_b),Fay$$serialize(["string"],$_c)));});};};};var setClick = function($_a){return function($_b){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],Fay$$serialize(["unknown"],$_a)['click'](Fay$$serialize(["action",[["unknown"]]],$_b)));});};};var fadeToggle = function($_a){return function($_b){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],Fay$$serialize(["unknown"],$_a)['fadeToggle'](Fay$$serialize(["action",[["unknown"]]],$_b)));});};};var hide = function($_a){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],Fay$$serialize(["unknown"],$_a)['hide']());});};var addClass = function($_a){return function($_b){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],Fay$$serialize(["unknown"],$_a)['addClass'](Fay$$serialize(["string"],$_b)));});};};var removeClass = function($_a){return function($_b){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],Fay$$serialize(["unknown"],$_a)['removeClass'](Fay$$serialize(["string"],$_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 Fay$$unserialize(["action",[["string"]]],Fay$$serialize(["unknown"],$_a)['text']());});};var getIs = function($_a){return function($_b){return new $(function(){return Fay$$unserialize(["action",[["bool"]]],Fay$$serialize(["unknown"],$_a)['is'](Fay$$serialize(["string"],$_b)));});};};var getSize = function($_a){return new $(function(){return Fay$$unserialize(["action",[["double"]]],Fay$$serialize(["unknown"],$_a)['length']);});};var getNext = function($_a){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],Fay$$serialize(["unknown"],$_a)['next']());});};var getFirst = function($_a){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],Fay$$serialize(["unknown"],$_a)['first']());});};var getFind = function($_a){return function($_b){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],Fay$$serialize(["unknown"],$_a)['find'](Fay$$serialize(["string"],$_b)));});};};var prepend = function($_a){return function($_b){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],Fay$$serialize(["unknown"],$_a)['prepend'](Fay$$serialize(["unknown"],$_b)));});};};var after = function($_a){return function($_b){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],Fay$$serialize(["unknown"],$_b)['after'](Fay$$serialize(["unknown"],$_a)));});};};var append = function($_a){return function($_b){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],Fay$$serialize(["unknown"],$_a)['append'](Fay$$serialize(["unknown"],$_b)));});};};var appendTo = function($_a){return function($_b){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],Fay$$serialize(["unknown"],$_b)['appendTo'](Fay$$serialize(["unknown"],$_a)));});};};var makeElement = function($_a){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],window['jQuery'](Fay$$serialize(["string"],$_a)));});};var getWidth = function($_a){return new $(function(){return Fay$$unserialize(["action",[["double"]]],Fay$$serialize(["unknown"],$_a)['width']());});};var beautify = function($_a){return function($_b){return new $(function(){return Fay$$unserialize(["string"],$jsBeautify(Fay$$serialize(["string"],$_a),Fay$$serialize(["double"],$_b)));});};};var hljs = new $(function(){return Fay$$unserialize(["unknown"],window['hljs']);});var initHighlightingOnLoad = function($_a){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],Fay$$serialize(["unknown"],$_a)['initHighlightingOnLoad']());});};var setTabReplace = function($_a){return function($_b){return new $(function(){return Fay$$unserialize(["action",[["unknown"]]],Fay$$serialize(["unknown"],$_a)['tabReplace']=Fay$$serialize(["string"],$_b));});};};var Just_RecConstr = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new Just_RecConstr(slot1);});};var Nothing_RecConstr = function(){};var Nothing = new $(function(){return new Nothing_RecConstr();});var show = function($_a){return new $(function(){return Fay$$unserialize(["string"],Fay$$encodeShow(Fay$$serialize(["unknown"],$_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_RecConstr = function(){};var GT = new $(function(){return new GT_RecConstr();});var LT_RecConstr = function(){};var LT = new $(function(){return new LT_RecConstr();});var EQ_RecConstr = function(){};var EQ = new $(function(){return new EQ_RecConstr();});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) instanceof GT_RecConstr) {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) instanceof Nothing_RecConstr) {var f = $_b;var m = $_a;return m;}if (_($_c) instanceof Just_RecConstr) {var x = _($_c).slot1;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;
 
diff --git a/docs/snippets/patterns.hs b/docs/snippets/patterns.hs
--- a/docs/snippets/patterns.hs
+++ b/docs/snippets/patterns.hs
@@ -1,3 +1,9 @@
+data Math = Math
+  { root :: Double -> Double
+  , square :: Double -> Double
+  , cube :: Double -> Double
+  }
+
 race (winner,runners) = print (winner,runners)
 
 first (x:xs) = x
diff --git a/fay.cabal b/fay.cabal
--- a/fay.cabal
+++ b/fay.cabal
@@ -1,5 +1,5 @@
 name:                fay
-version:             0.5.1.0
+version:             0.5.2.0
 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)
                      with GHC, and compiled to JavaScript. It is lazy, pure, with a Fay monad,
@@ -22,8 +22,18 @@
                      .
                      /Release Notes/
                      .
-                     * New representation for records and support for RecDecl (closes #43)
+                     * Add Paths_fay to cabal.
                      .
+                     * Update docs and fix runtime regressions.
+                     .
+                     * Fix FFI callbacks when too many arguments are provided.
+                     .
+                     * Fix patterns snippet.
+                     .
+                     * Fixed a bug where  would produce invalid code. And some minor refactorings.
+                     .
+                     * Records are now stored in CompileState, _fields dropped from record representation
+                     .
                      See full history at: <https://github.com/chrisdone/fay/commits>
 homepage:            http://fay-lang.org/
 license:             BSD3
@@ -69,7 +79,7 @@
 library
   hs-source-dirs:    src
   exposed-modules:   Language.Fay, Language.Fay.Types, Language.Fay.FFI, Language.Fay.Prelude, Language.Fay.Show
-  other-modules:     Language.Fay.Print, Control.Monad.IO, Language.Fay.Stdlib, System.Process.Extra
+  other-modules:     Language.Fay.Print, Control.Monad.IO, Language.Fay.Stdlib, System.Process.Extra, Paths_fay
   ghc-options:       -O2
   build-depends:     base >= 4 && < 5,
                      mtl,
diff --git a/js/runtime.js b/js/runtime.js
--- a/js/runtime.js
+++ b/js/runtime.js
@@ -108,26 +108,29 @@
     case "function": {
         // A proper function.
         jsObj = function(){
+            var fayFunc = fayObj;
             var return_type = args[args.length-1];
             var len = args.length;
             // If some arguments.
             if (len > 1) {
                 // Apply to all the arguments.
-                fayObj = _(fayObj,true);
-                for (var i = 0, len = len; i < len - 1; i++) {
+                fayFunc = _(fayFunc,true);
+                // TODO: Perhaps we should throw an error when JS
+                // passes more arguments than Haskell accepts.
+                for (var i = 0, len = len; i < len - 1 && fayFunc instanceof Function; i++) {
                     // Unserialize the JS values to Fay for the Fay callback.
-                    fayObj = _(fayObj(Fay$$unserialize(args[i],arguments[i])),true);
+                    fayFunc = _(fayFunc(Fay$$unserialize(args[i],arguments[i])),true);
                 }
                 // Finally, serialize the Fay return value back to JS.
                 var return_base = return_type[0];
                 var return_args = return_type[1];
                 // If it's a monadic return value, get the value instead.
                 if(return_base == "action") {
-                    return Fay$$serialize(return_args[0],fayObj.value);
+                    return Fay$$serialize(return_args[0],fayFunc.value);
                 }
                 // Otherwise just serialize the value direct.
                 else {
-                    return Fay$$serialize(return_type,fayObj);
+                    return Fay$$serialize(return_type,fayFunc);
                 }
             } else {
                 throw new Error("Nullary function?");
@@ -211,6 +214,11 @@
     }
     case "unknown": {
         // Any unknown values can be left as-is.
+        fayObj = jsObj;
+        break;
+    }
+    case "bool": {
+        // Bools are unboxed.
         fayObj = jsObj;
         break;
     }
diff --git a/src/Language/Fay.hs b/src/Language/Fay.hs
--- a/src/Language/Fay.hs
+++ b/src/Language/Fay.hs
@@ -46,6 +46,7 @@
                        , stateExports = []
                        , stateModuleName = "Main"
                        , stateExportAll = True
+                       , stateRecords = []
                        }
 
 -- | Compile a Haskell source string to a JavaScript source string.
@@ -297,58 +298,53 @@
     forM constructors $ \(QualConDecl _ _ _ condecl) ->
       case condecl of
         ConDecl (UnQual -> name) types  -> do
-          cons <- makeConstructor name (slots types)
-          func <- makeFunc name (slots types)
+          let fields =  map (Ident . ("slot"++) . show . fst) . zip [1 :: Integer ..] $ types
+          addRecordState name fields
+          cons <- makeConstructor name fields
+          func <- makeFunc name fields
           return [cons, func]
-        RecDecl (UnQual -> name) fields -> do
-          cons <- makeConstructor name $ map (head . fst) fields
-          func <- makeFunc name $ map (head . fst) fields
-          funs <- makeAccessors (map fst fields)
+        RecDecl (UnQual -> name) fields' -> do
+          let fields = concatMap fst fields'
+          addRecordState name fields
+          cons <- makeConstructor name fields
+          func <- makeFunc name fields
+          funs <- makeAccessors fields
           return (cons : func : funs)
         _ -> throwError (UnsupportedDeclaration decl)
 
   where
-    slots :: [a] -> [Name]
-    slots = map (Ident . ("slot"++) . show . fst) . zip [1 :: Integer ..]
-
     constructorName = fromString . (++ "_RecConstr") . qname
 
+    addRecordState :: QName -> [Name] -> Compile ()
+    addRecordState name fields = modify $ \s -> s { stateRecords = (Ident (qname name), fields) : stateRecords s }
+
     -- Creates a constructor R_RecConstr for a Record
     makeConstructor name fields = do
           let fieldParams = map (fromString . unname) fields
-          -- this._fields = [fieldName1, fieldName2, ..]
-          let setFields = JsSetProp (fromString ":this") (fromString "_fields")
-                 (JsList . flip map fields $ \(Ident field) -> JsLit . JsStr $ field)
-
           return $
             JsVar (constructorName name) $
               JsFun fieldParams
-                (setFields :
-                  (flip map fields $
-                     \field@(Ident s) ->
-                       JsSetProp (fromString ":this") (UnQual field) (JsName (fromString s))))
+                  (flip map fields $ \field@(Ident s) ->
+                     JsSetProp (fromString ":this") (UnQual field) (JsName (fromString s)))
                 Nothing
 
     -- Creates a function to initialize the record by regular application
     makeFunc name fields = do
           let fieldParams = map (\(Ident s) -> fromString s) fields
           let fieldExps = map (JsName . UnQual) fields
-          return $
-            JsVar name $
-              foldr (\slot inner -> JsFun [slot] [] (Just inner))
-                (thunk $ JsNew (constructorName name) fieldExps)
-                fieldParams
+          return $ JsVar name $
+            foldr (\slot inner -> JsFun [slot] [] (Just inner))
+              (thunk $ JsNew (constructorName name) fieldExps)
+              fieldParams
 
     -- Creates getters for a RecDecl's values
     makeAccessors fields = do
-          fmap concat $
-            forM fields $ \field ->
-              forM field $ \name@(Ident nameStr) ->
-                bindToplevel toplevel
-                             (UnQual name)
-                             (JsFun ["x"]
-                                    []
-                                    (Just (thunk (JsGetProp (force (JsName "x")) (UnQual (Ident nameStr))))))
+      forM fields $ \(Ident name) ->
+           bindToplevel toplevel
+                        (fromString name)
+                        (JsFun ["x"]
+                               []
+                               (Just (thunk (JsGetProp (force (JsName "x")) (fromString name)))))
 
 -- | Extract the string from a qname.
 qname :: QName -> String
@@ -697,22 +693,24 @@
 compilePApp :: QName -> [Pat] -> JsExp -> [JsStmt] -> Compile [JsStmt]
 compilePApp cons pats exp body = do
   let forcedExp = force exp
-  substmts <- foldM (\body (fieldIndex,pat) ->
-                       -- r[r._fields[N]]
-                       compilePat (JsLookup forcedExp
-                                   (JsIndex fieldIndex
-                                    (JsGetProp forcedExp "_fields"))) pat body)
-                    body
-                    (reverse (zip [0..] pats))
-  let compareConstructorNames
-        -- Special-casing on the booleans.
-        | cons == "True" = JsEq forcedExp (JsLit (JsBool True))
-        | cons == "False" = JsEq forcedExp (JsLit (JsBool False))
-        -- Everything else, generic:
-        | otherwise = forcedExp `JsInstanceOf` (UnQual (Ident ((qname cons) ++ "_RecConstr")))
-  return [JsIf compareConstructorNames
-               substmts
-               []]
+  let boolIf b = return [JsIf (JsEq forcedExp (JsLit (JsBool b))) body []]
+  case cons of
+    -- Special-casing on the booleans.
+    "True" -> boolIf True
+    "False" -> boolIf False
+    -- Everything else, generic:
+    _ -> do
+      rf <- lookup (Ident (qname cons)) <$> gets stateRecords
+      recordFields <- return $ case rf of
+        Just x -> x
+        Nothing -> error "Record name was not found in stateRecords, should be impossible"
+      substmts <- foldM (\body (Ident field,pat) ->
+                             compilePat (JsGetProp forcedExp (fromString field)) pat body)
+                  body
+                  (reverse (zip recordFields pats))
+      return [JsIf (forcedExp `JsInstanceOf` (UnQual (Ident ((qname cons) ++ "_RecConstr"))))
+                   substmts
+                   []]
 
 -- | Compile a pattern list.
 compilePList :: [Pat] -> [JsStmt] -> JsExp -> Compile [JsStmt]
diff --git a/src/Language/Fay/Types.hs b/src/Language/Fay/Types.hs
--- a/src/Language/Fay/Types.hs
+++ b/src/Language/Fay/Types.hs
@@ -51,7 +51,8 @@
   , stateExports    :: [Name]
   , stateExportAll  :: Bool
   , stateModuleName :: ModuleName
-  } deriving (Show)
+  , stateRecords :: [(Name,[Name])] -- records with field names
+} deriving (Show)
 
 -- | Compile monad.
 newtype Compile a = Compile { unCompile :: StateT CompileState (ErrorT CompileError IO) a }
