packages feed

fay 0.9.1.0 → 0.9.2.0

raw patch · 110 files changed

+5589/−1598 lines, 110 filesdep +optparse-applicativedep +splitdep −optionsdep ~blaze-htmlPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: optparse-applicative, split

Dependencies removed: options

Dependency ranges changed: blaze-html

API changes (from Hackage documentation)

- Language.Fay.Types: JsSequence :: [JsExp] -> JsExp
- Language.Fay.Types: configAutorun :: CompileConfig -> Bool
- Language.Fay.Types: instance Data CompileError
- Language.Fay.Types: instance Eq CompileError
- Language.Fay.Types: instance Eq FundamentalType
- Language.Fay.Types: instance Exception CompileError
- Language.Fay.Types: instance Show CompileConfig
- Language.Fay.Types: instance Show CompileState
- Language.Fay.Types: instance Typeable CompileError
+ Language.Fay.Compiler: compileFromToReturningStatus :: CompileConfig -> FilePath -> FilePath -> IO (Either CompileError ())
+ Language.Fay.FFI: instance Foreign Int
+ Language.Fay.Prelude: data Int :: *
+ Language.Fay.Prelude: fromIntegral :: Int -> Double
+ Language.Fay.Prelude: otherwise :: Bool
+ Language.Fay.Prelude: reverse :: [a] -> [a]
+ Language.Fay.Types: IntType :: FundamentalType
+ Language.Fay.Types: JsMappedVar :: SrcLoc -> JsName -> JsExp -> JsStmt
+ Language.Fay.Types: PrintState :: Int -> Int -> [(SrcLoc, SrcLoc)] -> Int -> [String] -> PrintState
+ Language.Fay.Types: Printer :: State PrintState a -> Printer a
+ Language.Fay.Types: configFilePath :: CompileConfig -> Maybe FilePath
+ Language.Fay.Types: configLibrary :: CompileConfig -> Bool
+ Language.Fay.Types: configTypecheck :: CompileConfig -> Bool
+ Language.Fay.Types: configWall :: CompileConfig -> Bool
+ Language.Fay.Types: configWarn :: CompileConfig -> Bool
+ Language.Fay.Types: data PrintState
+ Language.Fay.Types: instance Default PrintState
+ Language.Fay.Types: instance Functor Printer
+ Language.Fay.Types: instance Monad Printer
+ Language.Fay.Types: instance MonadState PrintState Printer
+ Language.Fay.Types: newtype Printer a
+ Language.Fay.Types: psColumn :: PrintState -> Int
+ Language.Fay.Types: psIndentLevel :: PrintState -> Int
+ Language.Fay.Types: psLine :: PrintState -> Int
+ Language.Fay.Types: psMapping :: PrintState -> [(SrcLoc, SrcLoc)]
+ Language.Fay.Types: psOutput :: PrintState -> [String]
+ Language.Fay.Types: runPrinter :: Printer a -> State PrintState a
+ Language.Fay.Types: stateImported :: CompileState -> [String]
- Language.Fay.Prelude: length :: Num a => [t] -> a
+ Language.Fay.Prelude: length :: [a] -> Int
- Language.Fay.Types: CompileConfig :: Bool -> Bool -> Bool -> Bool -> [FilePath] -> Bool -> Bool -> [FilePath] -> Bool -> CompileConfig
+ Language.Fay.Types: CompileConfig :: Bool -> Bool -> Bool -> Bool -> [FilePath] -> Bool -> Bool -> [FilePath] -> Bool -> Bool -> Maybe FilePath -> Bool -> Bool -> CompileConfig
- Language.Fay.Types: CompileState :: CompileConfig -> [Name] -> Bool -> ModuleName -> [(Name, [Name])] -> [JsStmt] -> [JsStmt] -> CompileState
+ Language.Fay.Types: CompileState :: CompileConfig -> [Name] -> Bool -> ModuleName -> [(Name, [Name])] -> [JsStmt] -> [JsStmt] -> [String] -> CompileState
- Language.Fay.Types: printJS :: Printable a => a -> String
+ Language.Fay.Types: printJS :: Printable a => a -> Printer ()

Files

examples/canvaswater.hs view
@@ -1,4 +1,4 @@--- | Compile with: dist/build/fay/fay -autorun examples/canvaswater.hs+-- | Compile with: fay examples/canvaswater.hs  {-# LANGUAGE EmptyDataDecls    #-} {-# LANGUAGE NoImplicitPrelude #-}
examples/data.hs view
@@ -1,6 +1,6 @@ -- Generate Show value. ----- $ fay -autorun examples/data.hs+-- $ fay examples/data.hs -- $ node examples/data.js -- (Foo { x = 123, y = "abc", z = (Bar) }) 
examples/tailrecursive.hs view
@@ -2,7 +2,7 @@ -- the JavaScript stack. -- -- See the ticket about optimizing tail-recursive functions for future--- work <https://github.com/chrisdone/fay/issues/19>+-- work <https://github.com/faylang/fay/issues/19>  {-# LANGUAGE NoImplicitPrelude #-} 
fay.cabal view
@@ -1,5 +1,5 @@ name:                fay-version:             0.9.1.0+version:             0.9.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,@@ -12,7 +12,7 @@                      .                      > $ cabal unpack fay                      > $ cd fay-*-                     > $ cabal install -fdevel+                     > $ cabal install                      > $ dist/build/fay-docs/fay-docs                      .                      .@@ -22,22 +22,44 @@                      .                      /Release Notes/                      .-                     * Infix constructor applications and infix operator constructors.+                     * Fix name encoding.                      .-                     * Warn when NoImplicitPrelude isn't specified.+                     * Add content-type to HTML generation.                      .-                     * Added fay --version.+                     * Add calculator example.                      .-                     * Html wrapper enhancements.+                     * Support built-in operators as (+), (*), etc.                      .-                     * Initial pass-through to collect record information. This means records can now be used before they're defined.+                     * Fix self-referential thunks (see #89).                      .-                     * Expose more prelude functions.+                     * Don't import modules twice.                      .-                     * Fixed doctype typo in HTML wrappers.+                     * Handle where bindings in function definitions.                      .-                     * Basic interactive shell+                     * Support record updates.                      .+                     * Move to GHC type-checking (with --no-ghc).+                     .+                     * Remove invalid chars from UTF-8 tests.+                     .+                     * Remove --autorun, now it's the default.+                     .+                     * Fix nullary constructor comparison.+                     .+                     * Replace . with $ in module name generation.+                     .+                     * Reverse -fdevel flag.+                     .+                     * Skip type declarations in where.+                     .+                     * Add true/false to keywords.+                     .+                     * Add laziness back to infix operators.+                     .+                     * Switch to applicative parsing of options.+                     .+                     * Fix parens in conversion functions.+                     .                      See full history at: <https://github.com/chrisdone/fay/commits> homepage:            http://fay-lang.org/ license:             BSD3@@ -55,6 +77,7 @@                      examples/tailrecursive.hs examples/data.hs examples/canvaswater.hs                      examples/canvaswater.html examples/haskell.png                      -- Test cases+                      tests/ints.hs tests/ints                       tests/asPatternMatch tests/caseList.hs                       tests/Double2.hs tests/fromInteger tests/List.hs                       tests/RecCon tests/recordPatternMatch@@ -137,7 +160,7 @@                      docs/home.hs  Flag devel-  Description:       Whether to build fay-tests and fay-docs+  Description:       Don't build fay-tests and fay-docs if this flag is supplied   Default:           False  library@@ -170,11 +193,12 @@                      -- Requirements for the executables which                      -- `cabal-dev ghci' needs.                      HUnit,-                     blaze-html,+                     blaze-html >= 0.5,                      blaze-markup,                      bytestring,                      time,-                     options,+                     optparse-applicative,+                     split,                      test-framework,                      test-framework-hunit,                      test-framework-th@@ -202,19 +226,19 @@                      directory,                      filepath,                      groom,-                     options,+                     optparse-applicative,+                     split,                      haskeline  executable fay-tests-  if !flag(devel)+  if flag(devel)     buildable:       False   hs-source-dirs:    src   ghc-options:       -O2 -Wall -threaded -with-rtsopts=-N   ghc-prof-options:  -fprof-auto   main-is:           Tests.hs   other-modules:     Language.Fay.Compiler Test.Convert Test.Api Test.CommandLine Test.Util-  if flag(devel)-    build-depends:   base >= 4 && < 5,+  build-depends:     base >= 4 && < 5,                      mtl,                      haskell-src-exts,                      aeson,@@ -238,14 +262,13 @@                      test-framework-th  executable fay-docs-  if !flag(devel)+  if flag(devel)     buildable:       False   hs-source-dirs:    src   ghc-options:       -O2 -Wall   main-is:           Docs.hs   other-modules:     Text.Blaze.Extra-  if flag(devel)-    build-depends:   base >= 4 && < 5,+  build-depends:     base >= 4 && < 5,                      mtl,                      haskell-src-exts,                      aeson,@@ -260,7 +283,7 @@                      process,                      filepath,                      directory,-                     blaze-html,+                     blaze-html >= 0.5,                      blaze-markup,                      bytestring,                      time,
js/runtime.js view
@@ -29,20 +29,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -161,6 +155,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -210,6 +209,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -271,30 +278,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -323,66 +342,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.
src/Docs.hs view
@@ -8,17 +8,15 @@  import           Language.Fay                (compileForDocs, compileViaStr) import           Language.Fay.Compiler       (compileFromTo)-import           Language.Fay.Types          (CompileConfig (..))+import           Language.Fay.Types          (CompileConfig(..)) -import           Control.Exception+ import           Control.Monad import qualified Data.ByteString.Lazy        as L import           Data.Char import           Data.Default- import           Data.Time import           Prelude                     hiding (div, head)- import           System.FilePath import           Text.Blaze.Extra import           Text.Blaze.Html5            as H hiding (contents, map, style)@@ -45,10 +43,13 @@   where compile file = do           contents <- readFile file           putStrLn $ "Generating " ++ file ++ " ..."-          result <- compileViaStr def { configFlattenApps = True, configTCO = True } compileForDocs contents+          result <- compileViaStr def { configFlattenApps = True+                                      , configTCO = True+                                      , configTypecheck = False }+                                  compileForDocs contents           case result of             Right (javascript,_) -> return javascript-            Left err -> throw err+            Left err -> error (show err)         titlize = takeWhile (/='.') . upperize . takeFileName           where upperize (x:xs) = toUpper x : xs                 upperize xs = xs@@ -58,7 +59,7 @@  generateJs = do   putStrLn $ "Compiling " ++ inp ++ " to " ++ out ++ " ..."-  compileFromTo def { configAutorun = True, configFlattenApps = True } inp out+  compileFromTo def { configFlattenApps = True, configTypecheck = False } inp out    where docs = ("docs" </>)         inp = docs "home.hs"@@ -155,14 +156,8 @@     li $ "Has fundamental data types (Double, String, etc.) based upon what JS can support"     li $ "Outputs minifier-aware code for small compressed size"     li $ "Has a trivial foreign function interface to JavaScript"-  p $ do "Because Fay is intended to be small and simple, it relies on GHC, the Haskell compiler, "-         "for static checking. So the workflow when working with Fay is: "-  pre $ do-    "$ ghc hello.hs\n"-    "$ fay hello.hs"-  p $ do "The "; code "ghc"; " call will compile the Fay (really, Haskell) code and run the type system, "-         "and the call to "; code "fay"-         " will actually generate JavaScript code under "; code "hello.js"; "."+    li $ "Typechecks using GHC"+   p $ a ! href "#examples" $ "Go to examples »"  thejsproblem = do@@ -233,13 +228,13 @@   pre $ code "$ cabal install"   h3 "Running"   p "If developing, you can run the tests (you will need nodejs installed):"-  pre $ code "$ cabal install -fdevel"+  pre $ code "$ cabal install"   pre $ code "$ fay-tests"   p "To compile a Fay program, run:"-  pre $ code "$ fay --autorun foo.hs"-  p $ do "The "; code "--autorun"; " flag will make sure that the "; code "main"; " function is called."+  pre $ code "$ fay foo.hs"+  p $ do "The "; code "--library"; " flag will prevent the "; code "main"; " function from being called."   p "You can also install this via cabal-dev, but be sure to run the commands from the cabal-dev bin dir: "-  pre $ code "$ cabal-dev install\n$ cabal-dev/bin/fay --autorun foo.hs"+  pre $ code "$ cabal-dev install\n$ cabal-dev/bin/fay --no-ghc foo.hs"   h3 "Generate this Documentation"   p "This web page is generated by the following call in the project directory:"   pre $ code "$ fay-docs"
src/Language/Fay.hs view
@@ -3,7 +3,6 @@ {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings     #-} {-# LANGUAGE TupleSections         #-}-{-# LANGUAGE TypeSynonymInstances  #-} {-# LANGUAGE ViewPatterns          #-} {-# OPTIONS -Wall -fno-warn-name-shadowing -fno-warn-orphans #-} @@ -24,8 +23,9 @@   ,prettyPrintString)   where -import           Language.Fay.Print          (jsEncodeName)+import           Language.Fay.Print          (jsEncodeName, printJSString) import           Language.Fay.Types+import           System.Process.Extra  import           Control.Applicative import           Control.Monad.Error@@ -36,7 +36,9 @@ import           Data.List import           Data.Maybe import           Data.String+import qualified Language.ECMAScript3.Parser as JS import           Language.Haskell.Exts+ import           Safe import           System.Directory            (doesFileExist, findExecutable) import           System.Exit@@ -44,8 +46,6 @@ import           System.IO import           System.Process -import qualified Language.ECMAScript3.Parser as JS- -------------------------------------------------------------------------------- -- Top level entry points @@ -66,7 +66,7 @@ compileViaStr config with from =   runCompile (defaultCompileState config)              (parseResult (throwError . uncurry ParseError)-                          (fmap printJS . with)+                          (fmap printJSString . with)                           (parseFay from))  -- | Compile a Haskell source string to a JavaScript source string.@@ -110,7 +110,7 @@  -- | Compile a String of Fay and print it as beautified JavaScript. printTestCompile :: String -> IO ()-printTestCompile = printCompile def compileToplevelModule+printTestCompile = printCompile def { configWarn = False } compileModule  -- | Compile the given Fay code for the documentation. This is -- specialised because the documentation isn't really “real”@@ -122,8 +122,13 @@  -- | Compile the top-level Fay module. compileToplevelModule :: Module -> Compile [JsStmt]-compileToplevelModule mod = do+compileToplevelModule mod@(Module _ (ModuleName modulename) _ _ _ _ _)  = do+  cfg <- gets stateConfig+  when (configTypecheck cfg) $+    typecheck (configDirectoryIncludes cfg) [] (configWall cfg) $+      fromMaybe modulename $ configFilePath cfg   initialPass mod+  modify $ \s -> s { stateImported = stateImported (defaultCompileState def) }   stmts <- compileModule mod   fay2js <- gets (fayToJsDispatcher . stateFayToJs)   js2fay <- gets (jsToFayDispatcher . stateJsToFay)@@ -140,21 +145,22 @@ initialPass mod = throwError (UnsupportedModuleSyntax mod)  initialPass_import :: ImportDecl -> Compile ()-initialPass_import (ImportDecl _ (ModuleName name) _ _ _ _ _)-  | elem name ["Language.Fay.Prelude","Language.Fay.FFI","Language.Fay.Types"] || name == "Prelude" = return () initialPass_import (ImportDecl _ (ModuleName name) False _ Nothing Nothing Nothing) = do-  dirs <- configDirectoryIncludes <$> gets stateConfig-  contents <- io (findImport dirs name)-  cs <- gets id-  result <- liftIO $ initialPass_records cs initialPass contents-  case result of-    Right ((),state) -> do-      -- Merges the state gotten from passing through an imported-      -- module with the current state. We can assume no duplicate-      -- records exist since GHC would pick that up.-      modify $ \s -> s { stateRecords = stateRecords state ++ stateRecords s }-    Left err -> throwError err-+  void $ unlessImported name $ do+    dirs <- configDirectoryIncludes <$> gets stateConfig+    contents <- io (findImport dirs name)+    cs <- gets id+    result <- liftIO $ initialPass_records cs initialPass contents+    case result of+      Right ((),state) -> do+        -- Merges the state gotten from passing through an imported+        -- module with the current state. We can assume no duplicate+        -- records exist since GHC would pick that up.+        modify $ \s -> s { stateRecords = stateRecords state+                         , stateImported = stateImported state+                         }+      Left err -> throwError err+    return []  initialPass_import i =   error $ "Initial pass: Import syntax not supported. " ++@@ -182,13 +188,13 @@ -- | Collect record definitions and store record name and field names. -- A ConDecl will have fields named slot1..slotN initialPass_dataDecl :: Bool -> Decl -> [QualConDecl] -> Compile ()-initialPass_dataDecl _ decl constructors =+initialPass_dataDecl _ _decl constructors =   forM_ constructors $ \(QualConDecl _ _ _ condecl) ->     case condecl of       ConDecl (UnQual -> name) types  -> do         let fields =  map (Ident . ("slot"++) . show . fst) . zip [1 :: Integer ..] $ types         addRecordState name fields-      InfixConDecl t1 (UnQual -> name) t2 ->+      InfixConDecl _t1 (UnQual -> name) _t2 ->         addRecordState name ["slot1", "slot2"]       RecDecl (UnQual -> name) fields' -> do         let fields = concatMap fst fields'@@ -198,7 +204,18 @@     addRecordState :: QName -> [Name] -> Compile ()     addRecordState name fields = modify $ \s -> s { stateRecords = (Ident (qname name), fields) : stateRecords s } +--------------------------------------------------------------------------------+-- Typechecking +typecheck :: [FilePath] -> [String] -> Bool -> String -> Compile ()+typecheck includeDirs ghcFlags wall fp = do+  res <- liftIO $ readAllFromProcess' "ghc" (+    ["-fno-code", "-package fay", fp] ++ map ("-i" ++) includeDirs ++ ghcFlags ++ wallF) ""+  either error (warn . fst) res+  where+    wallF | wall = ["-Wall"]+          | otherwise = []+ -------------------------------------------------------------------------------- -- Compilers @@ -216,10 +233,16 @@   return (imported ++ current) compileModule mod = throwError (UnsupportedModuleSyntax mod) +warn :: String -> Compile ()+warn "" = return ()+warn w = do+  shouldWarn <- configWarn <$> gets stateConfig+  when shouldWarn . liftIO . hPutStrLn stderr $ "Warning: " ++ w+ checkModulePragmas :: [ModulePragma] -> Compile () checkModulePragmas pragmas =   when (not $ any noImplicitPrelude pragmas) $-    liftIO $ hPutStrLn stderr "Warning: NoImplicitPrelude not specified"+    warn "NoImplicitPrelude not specified"   where     noImplicitPrelude :: ModulePragma -> Bool     noImplicitPrelude (LanguagePragma _ names) = any (== (Ident "NoImplicitPrelude")) names@@ -241,25 +264,35 @@  -- | Compile the given import. compileImport :: ImportDecl -> Compile [JsStmt]-compileImport (ImportDecl _ (ModuleName name) _ _ _ _ _)-  | elem name ["Language.Fay.Prelude","Language.Fay.FFI","Language.Fay.Types"] || name == "Prelude" = return [] compileImport (ImportDecl _ (ModuleName name) False _ Nothing Nothing Nothing) = do-  dirs <- configDirectoryIncludes <$> gets stateConfig-  contents <- io (findImport dirs name)-  state <- gets id-  result <- liftIO $ compileToAst state compileModule contents-  case result of-    Right (stmts,state) -> do-      modify $ \s -> s { stateFayToJs = stateFayToJs state ++ stateFayToJs s-                       , stateJsToFay = stateJsToFay state ++ stateJsToFay s-                       }-      return stmts-    Left err -> throwError err+  unlessImported name $ do+    dirs <- configDirectoryIncludes <$> gets stateConfig+    contents <- io (findImport dirs name)+    state <- gets id+    result <- liftIO $ compileToAst state compileModule contents+    case result of+      Right (stmts,state) -> do+        modify $ \s -> s { stateFayToJs = stateFayToJs state+                         , stateJsToFay = stateJsToFay state+                         , stateImported = stateImported state+                         }+        return stmts+      Left err -> throwError err compileImport i =   error $ "compileImport: Import syntax not supported. " ++         "The compiler writer was too lazy to support that.\n" ++         "It was: " ++ show i +-- | Don't re-import the same modules.+unlessImported :: String -> Compile [JsStmt] -> Compile [JsStmt]+unlessImported name importIt = do+  imported <- gets stateImported+  if elem name imported+     then return []+     else do+       modify $ \s -> s { stateImported = name : imported }+       importIt+ -- | Compile Haskell declaration. compileDecls :: Bool -> [Decl] -> Compile [JsStmt] compileDecls toplevel decls =@@ -295,29 +328,30 @@ compilePatBind :: Bool -> Maybe Type -> Decl -> Compile [JsStmt] compilePatBind toplevel sig pat =   case pat of-    PatBind _ (PVar ident) Nothing (UnGuardedRhs rhs) (BDecls []) ->+    PatBind srcloc (PVar ident) Nothing (UnGuardedRhs rhs) (BDecls []) ->       case ffiExp rhs of         Just formatstr -> case sig of-          Just sig -> compileFFI ident formatstr sig+          Just sig -> compileFFI srcloc ident formatstr sig           Nothing  -> throwError (FfiNeedsTypeSig pat)-        _ -> compileNormalPatBind toplevel ident rhs-    PatBind _ (PVar ident) Nothing (UnGuardedRhs rhs) bdecls ->-      compileNormalPatBind toplevel ident (Let bdecls rhs)+        _ -> compileUnguardedRhs srcloc toplevel ident rhs+    PatBind srcloc (PVar ident) Nothing (UnGuardedRhs rhs) bdecls ->+      compileUnguardedRhs srcloc toplevel ident (Let bdecls rhs)     _ -> throwError (UnsupportedDeclaration pat)    where ffiExp (App (Var (UnQual (Ident "ffi"))) (Lit (String formatstr))) = Just formatstr         ffiExp _ = Nothing  -- | Compile an FFI call.-compileFFI :: Name   -- ^ Name of the to-be binding.+compileFFI :: SrcLoc -- ^ Location of the original FFI decl.+           -> Name   -- ^ Name of the to-be binding.            -> String -- ^ The format string.            -> Type   -- ^ Type signature.            -> Compile [JsStmt]-compileFFI name formatstr sig = do+compileFFI srcloc name formatstr sig = do   inner <- formatFFI formatstr (zip params funcFundamentalTypes)-  case JS.parse JS.parseExpression (prettyPrint name) (printJS (wrapReturn inner)) of+  case JS.parse JS.parseExpression (prettyPrint name) (printJSString (wrapReturn inner)) of     Left err -> throwError (FfiFormatInvalidJavaScript inner (show err))-    Right{}  -> fmap return (bindToplevel True (UnQual name) (body inner))+    Right{}  -> fmap return (bindToplevel srcloc True (UnQual name) (body inner))    where body inner = foldr wrapParam (wrapReturn inner) params         wrapParam name inner = JsFun [name] [] (Just inner)@@ -359,7 +393,7 @@     case listToMaybe (drop (n-1) args) of       Nothing -> throwError (FfiFormatNoSuchArg n)       Just (arg,typ) -> do-        return (printJS (fayToJs (typeRep typ) (JsName arg)))+        return (printJSString (fayToJs (typeRep typ) (JsName arg)))  -- | Translate: Fay → JS. fayToJs :: JsExp -> JsExp -> JsExp@@ -381,6 +415,7 @@       where nom = case typ of               StringType -> "string"               DoubleType -> "double"+              IntType    -> "int"               BoolType   -> "bool"               DateType   -> "date"               _          -> "unknown"@@ -400,6 +435,7 @@   case t of     TyCon "String"        -> StringType     TyCon "Double"        -> DoubleType+    TyCon "Int"           -> IntType     TyCon "Bool"          -> BoolType     TyApp (TyCon "Fay") a -> JsType (argType a)     TyFun x xs            -> FunctionType (argType x : functionTypeArgs xs)@@ -434,10 +470,10 @@     _              -> 0  -- | Compile a normal simple pattern binding.-compileNormalPatBind :: Bool -> Name -> Exp -> Compile [JsStmt]-compileNormalPatBind toplevel ident rhs = do+compileUnguardedRhs :: SrcLoc -> Bool -> Name -> Exp -> Compile [JsStmt]+compileUnguardedRhs srcloc toplevel ident rhs = do   body <- compileExp rhs-  bind <- bindToplevel toplevel (UnQual ident) (thunk body)+  bind <- bindToplevel srcloc toplevel (UnQual ident) (thunk body)   return [bind]  convertGADT :: GadtDecl -> QualConDecl@@ -454,9 +490,9 @@  -- | Compile a data declaration. compileDataDecl :: Bool -> Decl -> [QualConDecl] -> Compile [JsStmt]-compileDataDecl toplevel decl constructors =+compileDataDecl toplevel _decl constructors =   fmap concat $-    forM constructors $ \(QualConDecl _ _ _ condecl) ->+    forM constructors $ \(QualConDecl srcloc _ _ condecl) ->       case condecl of         ConDecl (UnQual -> name) types  -> do           let fields =  map (Ident . ("slot"++) . show . fst) . zip [1 :: Integer ..] $ types@@ -478,7 +514,7 @@           let fields = concatMap fst fields'           cons <- makeConstructor name fields           func <- makeFunc name fields-          funs <- makeAccessors fields+          funs <- makeAccessors srcloc fields           emitFayToJs name fields'           emitJsToFay name fields'           return (cons : func : funs)@@ -504,9 +540,10 @@               fieldParams      -- Creates getters for a RecDecl's values-    makeAccessors fields =+    makeAccessors srcloc fields =       forM fields $ \(Ident name) ->-           bindToplevel toplevel+           bindToplevel srcloc+                        toplevel                         (fromString name)                         (JsFun ["x"]                                []@@ -614,17 +651,11 @@ -- | Compile a function which pattern matches (causing a case analysis). compileFunCase :: Bool -> [Match] -> Compile [JsStmt] compileFunCase _toplevel [] = return []-compileFunCase toplevel matches@(Match _ name argslen _ _ _:_) = do-  tco <- config configTCO-  pats <- fmap optimizePatConditions $ forM matches $ \match@(Match _ _ pats _ rhs wheres) -> do-    unless (noBinds wheres) $ do _ <- throwError (UnsupportedWhereInMatch match) -- TODO: Support `where'.-                                 return ()-    exp <- compileRhs rhs-    foldM (\inner (arg,pat) ->-            compilePat (JsName arg) pat inner)-          [JsEarlyReturn exp]-          (zip args pats)-  bind <- bindToplevel toplevel+compileFunCase toplevel matches@(Match srcloc name argslen _ _ _:_) = do+  tco  <- config configTCO+  pats <- fmap optimizePatConditions (mapM compileCase matches)+  bind <- bindToplevel srcloc+                       toplevel                        (UnQual name)                        (foldr (\arg inner -> JsFun [arg] [] (Just inner))                               (stmtsThunk (let stmts = (concat pats ++ basecase)@@ -634,14 +665,32 @@                               args)   return [bind]   where args = zipWith const uniqueNames argslen++        isWildCardMatch (Match _ _ pats _ _ _) = all isWildCardPat pats++        compileCase :: Match -> Compile [JsStmt]+        compileCase match@(Match _ _ pats _ rhs _) = do+          whereDecls' <- whereDecls match+          exp  <- compileRhs rhs+          body <- if null whereDecls'+                    then return exp+                    else do+                        binds <- mapM compileLetDecl whereDecls'+                        return (JsApp (JsFun [] (concat binds) (Just exp)) [])+          foldM (\inner (arg,pat) ->+                  compilePat (JsName arg) pat inner)+                [JsEarlyReturn body]+                (zip args pats)++        whereDecls :: Match -> Compile [Decl]+        whereDecls (Match _ _ _ _ _ (BDecls decls)) = return decls+        whereDecls match = throwError (UnsupportedWhereInMatch match)++        basecase :: [JsStmt]         basecase = if any isWildCardMatch matches                       then []                       else [throw ("unhandled case in " ++ show name)                                   (JsList (map JsName args))]-        isWildCardMatch (Match _ _ pats _ _ _) = all isWildCardPat pats-        noBinds (BDecls []) = True-        noBinds (IPBinds []) = True-        noBinds _ = False  -- | Optimize functions in tail-call form. optimizeTailCalls :: [JsParam] -- ^ The function parameters.@@ -725,8 +774,8 @@     Tuple xs                      -> compileList xs     If cond conseq alt            -> compileIf cond conseq alt     Case exp alts                 -> compileCase exp alts-    Con (UnQual (Ident "True"))   -> return (JsName "true")-    Con (UnQual (Ident "False"))  -> return (JsName "false")+    Con (UnQual (Ident "True"))   -> return (JsLit (JsBool True))+    Con (UnQual (Ident "False"))  -> return (JsLit (JsBool False))     Con exp                       -> return (JsName exp)     Do stmts                      -> compileDoBlock stmts     Lambda _ pats exp             -> compileLambda pats exp@@ -737,6 +786,7 @@                                         return (JsApp (JsApp (JsName "enumFromTo") [f])                                                       [t])     RecConstr name fieldUpdates -> compileRecConstr name fieldUpdates+    RecUpdate rec  fieldUpdates -> updateRec rec fieldUpdates     ExpTypeSig _ e _ -> compileExp e      exp -> throwError (UnsupportedExpression exp)@@ -781,7 +831,8 @@       | symbol `elem` words "* + - / < > || &&" -> do           e1 <- compileExp exp1           e2 <- compileExp exp2-          return (JsInfix symbol (forceInlinable config e1) (forceInlinable config e2))+          fn <- resolveOpToVar >=> compileExp $ op+          return $ JsApp (JsApp (force fn) [(forceInlinable config e1)]) [(forceInlinable config e2)]     _ -> do       var <- resolveOpToVar op       compileExp (App (App var exp1) exp2)@@ -860,6 +911,7 @@                                                     (QVarOp (UnQual (Symbol ">>")))                                                     inner))             LetStmt (BDecls binds) -> return (Just (Let (BDecls binds) inner))+            LetStmt _ -> throwError LetUnsupported             RecStmt{} -> throwError RecursiveDoUnsupported          compileGenerator srcloc pat inner exp = do@@ -915,6 +967,17 @@            \(FieldUpdate (UnQual field) value) -> JsSetProp o (UnQual field) <$> compileExp value     return $ JsApp (JsFun [] (record:setFields) (Just (JsName o))) [] +updateRec :: Exp -> [FieldUpdate] -> Compile JsExp+updateRec rec fieldUpdates = do+    record <- force <$> compileExp rec+    let copyName = UnQual (Ident "$_record_to_update")+        copy = JsVar copyName+                     (JsRawExp ("Object.create(" ++ printJSString record ++ ")"))+    setFields <- forM fieldUpdates $+        \(FieldUpdate (UnQual field) value) ->+            JsSetProp copyName (UnQual field) <$> compileExp value+    return $ JsApp (JsFun [] (copy:setFields) (Just (JsName copyName))) []+ -- | Equality test for two expressions, with some optimizations. equalExps :: JsExp -> JsExp -> JsExp equalExps a b@@ -1004,6 +1067,7 @@   case decl of     decl@PatBind{} -> compileDecls False [decl]     decl@FunBind{} -> compileDecls False [decl]+    TypeSig{}      -> return []     _              -> throwError (UnsupportedLetBinding decl)  -- | Compile Haskell literal.@@ -1137,11 +1201,11 @@ hjIdent = Qual (ModuleName "Fay") . Ident  -- | Make a top-level binding.-bindToplevel :: Bool -> QName -> JsExp -> Compile JsStmt-bindToplevel toplevel name exp = do+bindToplevel :: SrcLoc -> Bool -> QName -> JsExp -> Compile JsStmt+bindToplevel srcloc toplevel name exp = do   exportAll <- gets stateExportAll   when (toplevel && exportAll) $ emitExport (EVar name)-  return (JsVar name exp)+  return (JsMappedVar srcloc name exp)  -- | Emit exported names. emitExport :: ExportSpec -> Compile ()
src/Language/Fay/Compiler.hs view
@@ -6,14 +6,15 @@  module Language.Fay.Compiler where -import Language.Fay                 (compileToplevelModule,compileViaStr,prettyPrintString)-import Language.Fay.Types+import           Language.Fay                 (compileToplevelModule, compileViaStr, prettyPrintString)+import           Language.Fay.Types+import           Language.Fay.Print -import Control.Monad-import Language.Haskell.Exts.Syntax-import Paths_fay-import System.FilePath-import Text.Groom+import           Control.Monad+import           Language.Haskell.Exts.Syntax+import           Paths_fay+import           System.FilePath+import           Text.Groom  -- | A result of something the compiler writes. class Writer a where@@ -34,8 +35,16 @@ -- | Compile file program to… compileFromTo :: CompileConfig -> FilePath -> FilePath -> IO () compileFromTo config filein fileout = do-  result <- compileFile config filein+  result <- compileFromToReturningStatus config filein fileout   case result of+    Right () -> return ()+    Left err -> error . groom $ err++-- | Compile file program to…+compileFromToReturningStatus :: CompileConfig -> FilePath -> FilePath -> IO (Either CompileError ())+compileFromToReturningStatus config filein fileout = do+  result <- compileFile config { configFilePath = Just filein } filein+  case result of     Right out -> do       writeFile fileout out       when (configHtmlWrapper config) $@@ -43,6 +52,7 @@             "<!doctype html>"           , "<html>"           , "  <head>"+          ,"    <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>"           , unlines . map ("    "++) . map makeScriptTagSrc $ configHtmlJSLibs config           , "    " ++ makeScriptTagSrc relativeJsPath           , "    </script>"@@ -50,11 +60,12 @@           , "  <body>"           , "  </body>"           , "</html>"]+      return (Right ())             where relativeJsPath = makeRelative (dropFileName fileout) fileout                   makeScriptTagSrc :: FilePath -> String                   makeScriptTagSrc = \s ->                     "<script type=\"text/javascript\" src=\"" ++ s ++ "\"></script>"-    Left err -> error . groom $ err+    Left err -> return (Left err)  -- | Compile readable/writable values. compileReadWrite :: (Reader r, Writer w) => CompileConfig -> r -> w -> IO ()@@ -96,7 +107,7 @@             then prettyPrintString out             else return out -  where generate jscode exports (ModuleName modulename) = unlines+  where generate jscode exports (ModuleName (clean -> modulename)) = unlines           ["/** @constructor"           ,"*/"           ,"var " ++ modulename ++ " = function(){"@@ -113,20 +124,23 @@                            ]               else ""           ,"};"-          ,if configAutorun config+          ,if not (configLibrary config)               then unlines [";"                            ,"var main = new " ++ modulename ++ "();"                            ,"main._(main.main);"                            ]               else ""           ]+        clean ('.':cs) = '$' : clean cs+        clean (c:cs)   = c : clean cs+        clean [] = []  -- | Print an this.x = x; export out. printExport :: Name -> String printExport name =-  printJS (JsSetProp ":this"-                     (UnQual name)-                     (JsName (UnQual name)))+  printJSString (JsSetProp ":this"+                           (UnQual name)+                           (JsName (UnQual name)))  -- | Convert a Haskell filename to a JS filename. toJsName :: String -> String
src/Language/Fay/Convert.hs view
@@ -15,6 +15,7 @@ import           Control.Monad import           Data.Aeson import           Data.Attoparsec.Number+ import           Data.Char import           Data.Data import           Data.Function@@ -97,7 +98,7 @@     case v of       Object obj -> do         name <- Map.lookup "instance" obj >>= getText-        readRecord name obj <|> readData name obj+        fmap parens (readRecord name obj <|> readData name obj)       Array array -> do         elems <- mapM convert (Vector.toList array)         return $ concat ["[",intercalate "," elems,"]"]@@ -133,7 +134,7 @@     fields <- forM (constrFields cons) $ \field -> do       (key,v) <- getField field       cvalue <- convert v-      return (intercalate " " [key,"=",cvalue])+      return (unwords [key,"=",cvalue])     guard $ not $ null fields     return (Text.unpack name ++             if null fields@@ -143,3 +144,4 @@   typ = dataTypeOf $ resType result   resType :: Maybe a -> a   resType = undefined+  parens x = "(" ++ x ++ ")"
src/Language/Fay/FFI.hs view
@@ -5,7 +5,7 @@ module Language.Fay.FFI where  import           Language.Fay.Types (Fay)-import           Prelude            (Bool, Char, Double, String, error)+import           Prelude            (Bool, Char, Double, String, Int, error)  -- | In case you want to distinguish values with a JsPtr. data JsPtr a@@ -18,6 +18,9 @@  -- | All numbers in JS are double. instance Foreign Double++-- | Some numbers in JS are int.+instance Foreign Int  -- | Characters are OK. instance Foreign Char
src/Language/Fay/Prelude.hs view
@@ -6,6 +6,7 @@   ,String   ,Integer   ,Double+  ,Int   ,Bool(..)   ,Show(show)   ,Read@@ -34,15 +35,15 @@   ,module Language.Fay.Stdlib)   where -import Language.Fay.Stdlib-import Language.Fay.Types  (Fay)+import           Language.Fay.Stdlib+import           Language.Fay.Types  (Fay) -import Data.Data+import           Data.Data -import GHC.Real            (Ratio)-import Prelude             (Bool(..), Eq(..), Char, Double, Integer, Maybe(..), Ord, Read(..),- Show(..), String, error, read, (&&), (*), (+), (-), (/), (/=), (<),- (<=), (==), (>), (>=), (||),Monad)+import           GHC.Real            (Ratio)+import           Prelude             (Bool(..), Char, Double, Eq(..), Int, Integer, Maybe(..), Monad,+ Ord, Read(..), Show(..), String, error, read, (&&), (*), (+), (-),+ (/), (/=), (<), (<=), (==), (>), (>=), (||))  -- | Just to satisfy GHC. fromInteger :: Integer -> Double
src/Language/Fay/Print.hs view
@@ -1,4 +1,5 @@ {-# OPTIONS -fno-warn-orphans #-}+{-# OPTIONS -fno-warn-unused-do-bind #-} {-# LANGUAGE FlexibleInstances    #-} {-# LANGUAGE OverloadedStrings    #-} {-# LANGUAGE RecordWildCards      #-}@@ -15,158 +16,146 @@  module Language.Fay.Print where -import Language.Fay.Types+import           Language.Fay.Types -import Data.Aeson.Encode+import           Control.Monad+import           Control.Monad.State+import           Data.Aeson.Encode import qualified Data.ByteString.Lazy.UTF8 as UTF8-import Data.List-import Data.String-import Language.Haskell.Exts.Syntax-import Prelude                      hiding (exp)+import           Data.Default+import           Data.List+import           Data.String+import           Language.Haskell.Exts.Syntax+import           Prelude                      hiding (exp)  -------------------------------------------------------------------------------- -- Printing +printJSString :: Printable a => a -> String+printJSString x = concat $ reverse $ psOutput $ execState (runPrinter (printJS x)) def+ -- | Print literals. These need some special encoding for -- JS-format literals. Could use the Text.JSON library. instance Printable JsLit where-  printJS (JsChar char)    = UTF8.toString (encode (UTF8.fromString [char]))-  printJS (JsStr str)      = UTF8.toString (encode (UTF8.fromString str))-  printJS (JsInt int)      = show int-  printJS (JsFloating rat) = show rat-  printJS (JsBool b)       = if b then "true" else "false"+  printJS typ = write $+    let u8 = UTF8.toString . encode . UTF8.fromString+    in case typ of+      (JsChar char)    -> u8 [char]+      (JsStr str)      -> u8 str+      (JsInt int)      -> show int+      (JsFloating rat) -> show rat+      (JsBool b)       -> if b then "true" else "false"  -- | Print (and properly encode to JS) a qualified name. instance Printable QName where   printJS qname =     case qname of-      Qual moduleName name -> printJS moduleName ++ "$$" ++ printJS name+      Qual moduleName name -> do printJS moduleName+                                 "$$"+                                 printJS name       UnQual name -> printJS name       Special con -> printJS con  -- | Print special constructors (tuples, list, etc.) instance Printable SpecialCon where   printJS specialCon =-    case specialCon of-      UnitCon          -> printJS (Qual "Fay" (Ident "unit"))-      ListCon          -> printJS (Qual "Fay" (Ident "emptyList"))-      FunCon           -> printJS (Qual "Fay" (Ident "funCon"))-      TupleCon boxed n -> printJS (Qual "Fay"-                                         (Ident (if boxed == Boxed-                                                    then "boxed"-                                                    else "unboxed" ++-                                                    "TupleOf" ++ show n)))-      Cons             -> printJS (Qual "Fay" (Ident "cons"))-      UnboxedSingleCon -> printJS (Qual "Fay" (Ident "unboxedSingleCon"))+    printJS $ (Qual "Fay" . Ident) $+      case specialCon of+        UnitCon          -> "unit"+        ListCon          -> "emptyList"+        FunCon           -> "funCon"+        TupleCon boxed n -> (if boxed == Boxed+                                then "boxed"+                                else "unboxed" +++                                "TupleOf" ++ show n)+        Cons             -> "cons"+        UnboxedSingleCon -> "unboxedSingleCon"  -- | Print module name. instance Printable ModuleName where   printJS (ModuleName moduleName) =-    jsEncodeName moduleName+    write $ jsEncodeName moduleName  -- | Print (and properly encode) a name. instance Printable Name where-  printJS name =+  printJS name = write $     case name of       Ident ident -> jsEncodeName ident       Symbol sym -> jsEncodeName sym  -- | Print a list of statements. instance Printable [JsStmt] where-  printJS = concatMap printJS+  printJS = mapM_ printJS  -- | Print a single statement. instance Printable JsStmt where-  printJS (JsBlock stmts) =-    "{ " ++ unwords (map printJS stmts) ++ "}"-  printJS (JsVar name expr) =-    unwords ["var",printJS name,"=",printJS expr ++ ";"]-  printJS (JsUpdate name expr) =-    unwords [printJS name,"=",printJS expr ++ ";"]-  printJS (JsSetProp name prop expr) =-    concat [printJS name,".",printJS prop," = ",printJS expr ++ ";"]-  printJS (JsIf exp thens elses) =-    concat-      [("if (" ++ printJS exp ++ ") {")-      ,printJS thens] ++-      if length elses > 0-         then concat ["} else {"-                     ,printJS elses ++ "}"]-         else "}"-  printJS (JsEarlyReturn exp) =-    "return " ++ printJS exp ++ ";"-  printJS (JsThrow exp) =-    "throw " ++ printJS exp ++ ";"-  printJS (JsWhile cond stmts) =-    unwords ["while (" ++ printJS cond ++ ") {"-            ,printJS stmts-            ,"}"]+  printJS (JsBlock stmts) = do+    "{ "; mapM printJS stmts; "}"+  printJS (JsVar name expr) = do "var "; printJS name; " = "; printJS expr; ";"+  printJS (JsUpdate name expr) = do printJS name; " = "; printJS expr; ";"+  printJS (JsSetProp name prop expr) = do+    printJS name; "."; printJS prop; " = "; printJS expr; ";"+  printJS (JsIf exp thens elses) = do+    "if ("; printJS exp; ") {"+    printJS thens+    "}"+    when (length elses > 0) $ do+      " else {"+      printJS elses+      "}"+  printJS (JsEarlyReturn exp) = do+    "return "; printJS exp; ";"+  printJS (JsThrow exp) = do+    "throw "; printJS exp; ";"+  printJS (JsWhile cond stmts) = do+    "while ("; printJS cond; ") {"+    printJS stmts+    "}"   printJS JsContinue = "continue;"+  printJS (JsMappedVar _ name expr) = do "var "; printJS name; " = "; printJS expr; ";"  -- | Print an expression. instance Printable JsExp where-  printJS (JsRawExp name) = name-  printJS (JsThrowExp exp) =-    "(function(){ throw (" ++ printJS exp ++ "); })()"-  printJS (JsFun params stmts ret) =-    concat ["function("-           ,intercalate "," (map (printJS) params)-           ,"){"-           ,printJS stmts-           ] ++-    case ret of-      Just ret' ->-        concat ["return "-               ,printJS ret'-               ,";"-               ,"}"]-      Nothing -> "}"+  printJS (JsRawExp name) = write name+  printJS (JsThrowExp exp) = do "(function(){ throw ("; printJS exp; "); })()"   printJS JsNull = "null"-  printJS (JsSequence exprs) =-    intercalate "," (map printJS exprs)   printJS (JsName name) = printJS name-  printJS (JsApp op args) =-    printJS (if isFunc op then JsParen op else op) ++-    "(" ++-    intercalate "," (map (printJS) args) +++  printJS (JsLit lit) = printJS lit+  printJS (JsParen exp) = do "("; printJS exp; ")"+  printJS (JsList exps) = do "["; intercalateM "," (map printJS exps); "]"+  printJS (JsNew name args) = do "new "; printJS (JsApp (JsName name) args)+  printJS (JsIndex i exp) = do "("; printJS exp; ")["; write (show i); "]"+  printJS (JsEq exp1 exp2) = do printJS exp1; " === "; printJS exp2+  printJS (JsGetProp exp prop) = do printJS exp; "."; printJS prop+  printJS (JsLookup exp1 exp2) = do printJS exp1; "["; printJS exp2; "]"+  printJS (JsUpdateProp name prop expr) = do+    "("; printJS name; "."; printJS prop; " = "; printJS expr; ")"+  printJS (JsInfix op x y) = do printJS x; " "; write op; " "; printJS y+  printJS (JsGetPropExtern exp prop) = do+    printJS exp; "["; printJS (JsLit (JsStr prop)); "]"+  printJS (JsUpdatePropExtern name prop expr) = do+    "("; printJS name; "['"; printJS prop; "'] = "; printJS expr; ")"+  printJS (JsTernaryIf cond conseq alt) = do+    printJS cond; " ? "; printJS conseq; " : "; printJS alt+  printJS (JsInstanceOf exp classname) = do+    printJS exp; " instanceof "; printJS classname+  printJS (JsObj assoc) = do "{"; intercalateM "," (map cons assoc); "}"+     where cons (key,value) = do "\""; write key; "\": "; printJS value+  printJS (JsFun params stmts ret) = do+    "function("+    intercalateM "," (map printJS params)+    "){"+    printJS stmts+    case ret of+      Just ret' -> do "return "; printJS ret'; ";"+      Nothing   -> return ()+    "}"+  printJS (JsApp op args) = do+    printJS (if isFunc op then JsParen op else op)+    "("+    intercalateM "," (map (printJS) args)     ")"      where isFunc JsFun{..} = True; isFunc _ = False-  printJS (JsLit lit) = printJS lit-  printJS (JsParen exp) = "(" ++ printJS exp ++ ")"-  printJS (JsTernaryIf cond conseq alt) =-    concat [printJS cond ++ " ? "-           , 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 exp ++ ")[" ++ show i ++ "]"-  printJS (JsEq exp1 exp2) =-    printJS exp1 ++ " === " ++ printJS exp2-  printJS (JsGetProp exp prop) =-    printJS exp ++ "." ++ printJS prop-  printJS (JsLookup exp1 exp2) =-    printJS exp1 ++ "[" ++ printJS exp2 ++ "]"-  printJS (JsUpdateProp name prop expr) =-    concat ["(",printJS name,".",printJS prop," = ",printJS expr,")"]-  printJS (JsInfix op x y) =-    printJS x ++ " " ++ op ++ " " ++ printJS y-  -- Externs: Careful, here be dragons! Or at least warm lizards.-  printJS (JsGetPropExtern exp prop) =-    printJS exp ++ "[" ++ printJS (JsLit (JsStr prop)) ++ "]"-  printJS (JsUpdatePropExtern name prop expr) =-    concat ["(",printJS name,"['",printJS prop,"'] = ",printJS expr,")"]-  printJS (JsObj assoc) =-    concat ["{"-           ,intercalate "," (map cons assoc)-           ,"}"]-     where cons (key,value) = "\"" ++ key ++ "\": " ++ printJS value  -------------------------------------------------------------------------------- -- Utilities@@ -179,9 +168,10 @@   "extends", "finally", "for", "function", "global", "implements", "instanceof",   "interface", "new", "null", "package", "private", "protected", "public", "return",   "static", "super", "switch", "this", "throw", "try", "typeof", "undefined",-  "var", "void", "while", "window", "with", "yield"]+  "var", "void", "while", "window", "with", "yield","true","false"]  -- | Encode a Haskell name to JavaScript.+-- TODO: Fix this hack. jsEncodeName :: String -> String -- Special symbols: jsEncodeName ":tmp" = "$tmp"@@ -190,10 +180,14 @@ -- jsEncodeName ":return" = "return" -- Used keywords: jsEncodeName name-  | "$_" `isPrefixOf` name = name-  | name `elem` reservedWords = "$_" ++ name+  | "$_" `isPrefixOf` name = normalize name+  | name `elem` reservedWords = "$_" ++ normalize name -- Anything else.-jsEncodeName name =+jsEncodeName name = normalize name++-- | Normalize the given name to JavaScript-valid names.+normalize :: [Char] -> [Char]+normalize name =   concatMap encodeChar name    where@@ -203,6 +197,21 @@     escapeChar c = "$" ++ charId c ++ "$"     charId c = show (fromEnum c) +-- |+write :: String -> Printer a+write x = do+  modify $ \s -> s { psOutput = x : psOutput s }+  return (error "Nothing to return for writer string.")++intercalateM :: String -> [Printer a] -> Printer ()+intercalateM _ [] = return ()+intercalateM _ [x] = x >> return ()+intercalateM str (x:xs) = do+  x+  write str+  intercalateM str xs++ -- | Helpful for writing qualified symbols (Fay.*). instance IsString ModuleName where   fromString = ModuleName@@ -210,3 +219,7 @@ -- | Helpful for writing variable names. instance IsString JsName where   fromString = UnQual . Ident++-- | For the pretty printer convenience.+instance IsString (Printer a) where+  fromString = write
src/Language/Fay/Stdlib.hs view
@@ -10,6 +10,7 @@   ,elem   ,enumFrom   ,enumFromTo+  ,fromIntegral   ,filter   ,find   ,flip@@ -29,7 +30,9 @@   ,not   ,nub   ,null+  ,otherwise   ,prependToAll+  ,reverse   ,snd   ,sort   ,sortBy@@ -40,8 +43,9 @@   ,min)   where -import Language.Fay.FFI-import Prelude (Double,Bool(..),Maybe(..),Ord((>),(<)),Eq(..),Monad(..),Num(..),(||))+import           Language.Fay.FFI+import           Prelude          (Bool(..), Double, Eq(..), Int, Maybe(..), Monad(..), Num(..),+ Ord((>), (<)), (||))  -- START @@ -191,7 +195,6 @@ forM_ (x:xs) m = m x >> forM_ xs m forM_ []     _ = return () - mapM_ :: Monad m => (a -> m b) -> [a] -> m () mapM_ m (x:xs) = m x >> mapM_ m xs mapM_ _ []     = return ()@@ -199,7 +202,8 @@ const :: a -> b -> a const a _ = a -length (x:xs) = 1 + length xs+length :: [a] -> Int+length (_:xs) = 1 + length xs length [] = 0  mod :: Double -> Double -> Double@@ -210,3 +214,13 @@  max :: Double -> Double -> Double max = ffi "Math.max(%1,%2)"++fromIntegral :: Int -> Double+fromIntegral = ffi "%1"++otherwise :: Bool+otherwise = True++reverse :: [a] -> [a]+reverse (x:xs) = reverse xs ++ [x]+reverse [] = []
src/Language/Fay/Types.hs view
@@ -19,15 +19,17 @@   ,CompileConfig(..)   ,CompileState(..)   ,defaultCompileState-  ,FundamentalType(..))+  ,FundamentalType(..)+  ,PrintState(..)+  ,Printer(..))   where  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 @@ -44,12 +46,16 @@   , configPrettyPrint       :: Bool   , configHtmlWrapper       :: Bool   , configHtmlJSLibs        :: [FilePath]-  , configAutorun           :: Bool-  } deriving (Show)+  , configLibrary           :: Bool+  , configWarn              :: Bool+  , configFilePath          :: Maybe FilePath+  , configTypecheck         :: Bool+  , configWall              :: Bool+  }  -- | Default configuration. instance Default CompileConfig where-  def = CompileConfig False False False True [] False False [] False+  def = CompileConfig False False False True [] False False [] False True Nothing True False  -- | State of the compiler. data CompileState = CompileState@@ -60,7 +66,8 @@   , stateRecords     :: [(Name,[Name])] -- records with field names   , stateFayToJs     :: [JsStmt]   , stateJsToFay     :: [JsStmt]-} deriving (Show)+  , stateImported    :: [String] -- ^ Names of imported modules so far.+}  defaultCompileState :: CompileConfig -> CompileState defaultCompileState config = CompileState {@@ -71,6 +78,7 @@   , stateRecords = [(Ident "Nothing",[]),(Ident "Just",[Ident "slot1"])]   , stateFayToJs = []   , stateJsToFay = []+  , stateImported = ["Language.Fay.Prelude","Language.Fay.FFI","Language.Fay.Types","Prelude"]   }  -- | Compile monad.@@ -93,9 +101,23 @@ class (Parseable from,Printable to) => CompilesTo from to | from -> to where   compileTo :: from -> Compile to +data PrintState = PrintState+  { psLine         :: Int+  , psColumn       :: Int+  , psMapping      :: [(SrcLoc,SrcLoc)]+  , psIndentLevel  :: Int+  , psOutput       :: [String]+  }++instance Default PrintState where+  def = PrintState 0 0 [] 0 []++newtype Printer a = Printer { runPrinter :: State PrintState a }+  deriving (Monad,Functor,MonadState PrintState)+ -- | Print some value. class Printable a where-  printJS :: a -> String+  printJS :: a -> Printer ()  -- | Error type. data CompileError@@ -121,9 +143,8 @@   | FfiFormatNoSuchArg Int   | FfiFormatIncompleteArg   | FfiFormatInvalidJavaScript String String-  deriving (Show,Eq,Data,Typeable)+  deriving (Show) instance Error CompileError-instance Exception CompileError  -- | The JavaScript FFI interfacing monad. newtype Fay a = Fay (Identity a)@@ -135,6 +156,7 @@ -- | Statement type. data JsStmt   = JsVar JsName JsExp+  | JsMappedVar SrcLoc JsName JsExp   | JsIf JsExp [JsStmt] [JsStmt]   | JsEarlyReturn JsExp   | JsThrow JsExp@@ -154,7 +176,6 @@   | JsApp JsExp [JsExp]   | JsTernaryIf JsExp JsExp JsExp   | JsNull-  | JsSequence [JsExp]   | JsParen JsExp   | JsGetProp JsExp JsName   | JsLookup JsExp JsExp@@ -195,7 +216,8 @@  | DateType  | StringType  | DoubleType+ | IntType  | BoolType  -- | Unknown.  | UnknownType-   deriving (Show,Eq)+   deriving (Show)
src/Main.hs view
@@ -1,7 +1,6 @@ {-# OPTIONS -fno-warn-orphans #-} {-# OPTIONS -fno-warn-orphans #-} {-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE TemplateHaskell  #-} -- | Main compiler executable.  module Main where@@ -15,75 +14,71 @@ import           Control.Monad import           Control.Monad.Error import           Data.Default+import           Data.List.Split          (wordsBy) import           Data.Maybe import           Data.Version             (showVersion)-import           Options+import           Options.Applicative import           System.Console.Haskeline-import           System.Environment-import           System.Exit import           System.IO  -- | Options and help.-defineOptions "FayCompilerOptions" $ do+data FayCompilerOptions = FayCompilerOptions+    { optLibrary     :: Bool+    , optInlineForce :: Bool+    , optFlattenApps :: Bool+    , optHTMLWrapper :: Bool+    , optHTMLJSLibs  :: [String]+    , optInclude     :: [String]+    , optWall        :: Bool+    , optNoGHC       :: Bool+    , optStdout      :: Bool+    , optVersion     :: Bool+    , optOutput      :: Maybe String+    , optPretty      :: Bool+    , optFiles       :: [String]+    } -  -- boolOption "optExportBuiltins" "export-builtins" True ""-  -- boolOption "optTCO" "tco" False ""+options :: Parser FayCompilerOptions+options = FayCompilerOptions+  <$> switch (long "library" & help "Don't automatically call main in generated JavaScript")+  <*> switch (long "inline-force" & help "inline forcing, adds some speed for numbers, blows up code a bit")+  <*> switch (long "flatten-apps" & help "flatten function applicaton") -  boolOption     "optAutoRun"     "autorun"      False "automatically call main in generated JavaScript"-  boolOption     "optInlineForce" "inline-force" False "inline forcing, adds some speed for numbers, blows up code a bit"-  boolOption     "optFlattenApps" "flatten-apps" False "flatten function applicaton"+  <*> switch (long "html-wrapper" & help "Create an html file that loads the javascript")+  <*> strsOption (long "html-js-lib" & metavar "file1[, ..]" & help "javascript files to add to <head> if using option html-wrapper") -  boolOption     "optHTMLWrapper" "html-wrapper" False "Create an html file that loads the javascript"-  stringsOption  "optHTMLJSLibs"  "html-js-lib"  []    "file1[, ..] javascript files to add to <head> if using option html-wrapper"+  <*> strsOption (long "include" & metavar "dir1[, ..]" & help "additional directories for include") -  stringsOption  "optInclude"     "include"      []    "dir1[, ..] additional directories for include"+  <*> switch (long "Wall" & help "Typecheck with -Wall")+  <*> switch (long "no-ghc" & help "Don't typecheck, specify when not working with files") -  option         "optStdout" (\o -> o-                              { optionLongFlags = ["stdout"]-                              , optionShortFlags = ['s']-                              , optionDefault = "false"-                              , optionType = optionTypeBool-                              , optionDescription = "Output to stdout"-                                                  })-  option         "optVersion" (\o -> o-                              { optionLongFlags = ["version"]-                              , optionShortFlags = ['v']-                              , optionDefault = "false"-                              , optionType = optionTypeBool-                              , optionDescription = "Output version number"-                                                  })-  option         "optOutput" (\o -> o-                              { optionLongFlags = ["output"]-                              , optionShortFlags = ['o']-                              , optionDefault = ""-                              , optionType = optionTypeMaybe optionTypeString-                              , optionDescription = "Output to specified file"-                                                  })-  option         "optPretty" (\o -> o-                             { optionLongFlags = ["pretty"]-                             , optionShortFlags = ['p']-                             , optionDefault = "false"-                             , optionType = optionTypeBool-                             , optionDescription = "Run javascript through js-beautify"-                                                 })+  <*> switch (long "stdout" & short 's' & help "Output to stdout")+  <*> switch (long "version" & help "Output version number")+  <*> nullOption (long "output" & short 'o' & reader (Just . Just) & value Nothing & help "Output to specified file")+  <*> switch (long "pretty" & short 'p' & help "Pretty print the output") +  <*> arguments Just (metavar "- | <hs-file>...")++  where+    strsOption m = nullOption (m & reader (Just . wordsBy (== ',')) & value [])+ -- | The basic help text.-helpTxt :: [String]-helpTxt =-  ["fay -- The fay compiler from (a proper subset of) Haskell to Javascript"-  ,"USAGE"-  ,"  fay [OPTIONS] [- | <hs-file>...]"-  ,"  fay - takes input on stdin and prints to stdout. Runs through js-beautify if available"+helpTxt :: String+helpTxt = concat+  ["fay -- The fay compiler from (a proper subset of) Haskell to Javascript\n\n"+  ,"SYNOPSIS\n"+  ,"  fay [OPTIONS] [- | <hs-file>...]\n"+  ,"  fay - takes input on stdin and prints to stdout. Pretty prints\n"   ,"  fay <hs-file>... processes each .hs file"   ]  -- | Main entry point. main :: IO ()-main =-  runCommandHelp (unlines helpTxt) $ \opts files ->-    if optVersion opts-      then runCommandVersion-      else (do+main = do+  opts <- execParser parser+  if optVersion opts+    then runCommandVersion+    else (do   let config = def { configTCO = False -- optTCO opts                    , configInlineForce = optInlineForce opts                    , configFlattenApps = optFlattenApps opts@@ -91,18 +86,19 @@                     , configDirectoryIncludes = "." : optInclude opts                    , configPrettyPrint = optPretty opts-                   , configAutorun = optAutoRun opts+                   , configLibrary = optLibrary opts                    , configHtmlWrapper =  optHTMLWrapper opts                    , configHtmlJSLibs = optHTMLJSLibs opts+                   , configTypecheck = not $ optNoGHC opts+                   , configWall = optWall opts                    }-  void $ E.catch (incompatible htmlAndStdout opts "Html wrapping and stdout are incompatible")-                 errorUsage+  void $ incompatible htmlAndStdout opts "Html wrapping and stdout are incompatible" -  case files of+  case optFiles opts of        ["-"] -> do                hGetContents stdin >>= printCompile config compileModule        [] -> runInteractive-       _  -> forM_ files $ \file -> do+       files  -> forM_ files $ \file -> do                if optStdout opts                  then compileReadWrite config file stdout                  else@@ -110,15 +106,11 @@     where+    parser = info (helper <*> options) (fullDesc & header helpTxt)+     outPutFile :: FayCompilerOptions -> String -> FilePath     outPutFile opts file = fromMaybe (toJsName file) $ optOutput opts -    errorUsage :: IOError -> IO a-    errorUsage e = do-        putStrLn $ "ERROR: \n  " ++ (show e)-        args <- getArgs-        usageMsg args $ unlines $ drop 1 helpTxt- runInteractive :: IO () runInteractive =     runInputT defaultSettings loop@@ -135,31 +127,10 @@                     Right (ok,_) -> liftIO (prettyPrintString ok) >>= outputStr                 loop -runCommandHelp :: (MonadIO m, Options opts) => String -> (opts -> [String] -> m a) -> m a-runCommandHelp help io = do-	argv <- liftIO getArgs-	let parsed = parseOptions argv-	case parsedOptions parsed of-		Just opts -> io opts (parsedArguments parsed)-		Nothing -> liftIO $ usageMsg argv help- runCommandVersion :: IO () runCommandVersion = putStrLn $ "fay " ++ showVersion version  --usageMsg :: [String] -> String -> IO a-usageMsg argv help = do-    putStrLn help-    let parsed = parseOptions argv :: ParsedOptions FayCompilerOptions-    case parsedError parsed of-        Just err -> do-            hPutStrLn stderr (parsedHelp parsed)-            hPutStrLn stderr err-            exitFailure-	Nothing -> do-	    hPutStr stdout (parsedHelp parsed)-	    exitSuccess  htmlAndStdout :: FayCompilerOptions -> Bool htmlAndStdout opts = optHTMLWrapper opts && optStdout opts
src/System/Process/Extra.hs view
@@ -16,9 +16,9 @@     ExitSuccess -> fmap Right (hGetContents out)     ExitFailure _ -> fmap Left (hGetContents err) -readAllFromProcess' :: FilePath -> [String] -> String -> IO (Either String String)+readAllFromProcess' :: FilePath -> [String] -> String -> IO (Either String (String,String)) readAllFromProcess' program flags input = do   (code,out,err) <- readProcessWithExitCode program flags input-  case code of-    ExitSuccess -> return $ Right out-    ExitFailure _ -> return $ Left err+  return $ case code of+    ExitFailure _ -> Left err+    ExitSuccess   -> Right (err, out)
src/Test/Api.hs view
@@ -5,16 +5,16 @@ import           Data.Default import           Language.Fay.Compiler import           Language.Fay.Types-import           Test.HUnit (Assertion, assertBool)-import           Test.Util import           Test.Framework import           Test.Framework.Providers.HUnit import           Test.Framework.TH+import           Test.HUnit                     (Assertion, assertBool)+import           Test.Util  tests :: Test tests = $testGroupGenerator  case_imports :: Assertion case_imports = do-  res <- compileFile def { configDirectoryIncludes = ["tests"] } "tests/RecordImport_Import.hs"+  res <- compileFile def { configTypecheck = False, configDirectoryIncludes = ["tests"] } "tests/RecordImport_Import.hs"   assertBool "Could not compile file with imports" (isRight res)
src/Test/CommandLine.hs view
@@ -5,11 +5,11 @@ import           Control.Applicative import           Data.Maybe import           System.Process.Extra-import           Test.HUnit (Assertion, assertBool)-import           Test.Util import           Test.Framework import           Test.Framework.Providers.HUnit import           Test.Framework.TH+import           Test.HUnit                     (Assertion, assertBool)+import           Test.Util  tests :: Test tests = $testGroupGenerator@@ -17,7 +17,10 @@ compileFile :: [String] -> IO (Either String String) compileFile flags = do   fay <- fromJust <$> fayPath-  readAllFromProcess' fay flags ""+  r <- readAllFromProcess' fay flags ""+  return $ case r of+    Left l -> Left l+    Right t -> Right $ snd t  case_executable :: Assertion case_executable = do@@ -26,5 +29,5 @@  case_compile :: Assertion case_compile = do-  res <- compileFile ["--autorun", "--include=tests", "tests/RecordImport_Import.hs"]+  res <- compileFile ["--include=tests", "tests/RecordImport_Import.hs","--no-ghc"]   assertBool (fromLeft res) (isRight res)
src/Test/Convert.hs view
@@ -3,20 +3,20 @@  module Test.Convert (tests) where -import qualified Data.Aeson.Parser    as Aeson+import qualified Data.Aeson.Parser              as Aeson import           Data.Attoparsec.ByteString-import qualified Data.ByteString      as Bytes-import qualified Data.ByteString.UTF8 as UTF8+import qualified Data.ByteString                as Bytes+import qualified Data.ByteString.UTF8           as UTF8 import           Data.Data import           Data.Ratio import           Language.Fay.Convert-import           Test.HUnit (assertEqual) import           Test.Framework import           Test.Framework.Providers.HUnit+import           Test.HUnit                     (assertEqual)  tests :: Test tests = testGroup "Test.Convert" [reading, showing]-  where reading = testGroup "reading" $ +  where reading = testGroup "reading" $           flip map readTests $ \(ReadTest value) ->             let label = show value             in testCase label $@@ -50,6 +50,7 @@   ,ReadTest $ LabelledRecord { barInt = 123, barDouble = 66.6 }   ,ReadTest $ LabelledRecord2 { bar = 123, bob = 66.6 }   ,ReadTest $ FooBar "Tinkie Winkie" "Humanzee" Zot+  ,ReadTest $ Bar $ Foo "one" "two"   ]  -- | Test cases.@@ -69,6 +70,7 @@   ,NAryConstructor 123 4.5 → "{\"slot1\":123,\"slot2\":4.5,\"instance\":\"NAryConstructor\"}"   ,LabelledRecord { barInt = 123, barDouble = 4.5 }      → "{\"barDouble\":4.5,\"barInt\":123,\"instance\":\"LabelledRecord\"}"+  ,Bar (Foo "one" "two") → "{\"slot1\":{\"slot1\":\"one\",\"slot2\":\"two\",\"instance\":\"Foo\"},\"instance\":\"Bar\"}"   -- Unicode   ,"¡ ¢ £ ¤ ¥ " → "\"¡ ¢ £ ¤ ¥ \""   ,"Ā ā Ă ă Ą " → "\"Ā ā Ă ă Ą \""@@ -91,6 +93,11 @@   ]    where x → y = Testcase x (UTF8.fromString y)++data Foo = Foo String String+  deriving (Show,Data,Typeable,Read,Eq)+data Bar = Bar Foo+  deriving (Show,Data,Typeable,Read,Eq)  -- | Nullary constructor. data NullaryConstructor = NullaryConstructor
src/Test/Util.hs view
@@ -14,7 +14,7 @@       dist <- doesFileExist distPath       if dist         then return (Just distPath)-        else either (const Nothing) (Just . concat . lines) <$> readAllFromProcess' "which" ["fay"] ""+        else either (const Nothing) (Just . concat . lines . snd) <$> readAllFromProcess' "which" ["fay"] ""   where     cabalDevPath = "./cabal-dev/bin/fay"     distPath = "./dist/build/fay/fay"
src/Tests.hs view
@@ -12,12 +12,12 @@ import           System.Directory import           System.FilePath import           System.Process.Extra-import qualified Test.Api              as Api-import qualified Test.CommandLine      as Cmd-import qualified Test.Convert          as C-import           Test.HUnit (assertEqual)+import qualified Test.Api                       as Api+import qualified Test.CommandLine               as Cmd+import qualified Test.Convert                   as C import           Test.Framework import           Test.Framework.Providers.HUnit+import           Test.HUnit                     (assertEqual)  -- | Main test runner. main :: IO ()@@ -34,7 +34,7 @@       let root = (reverse . drop 1 . dropWhile (/='.') . reverse) file           out = toJsName file       outExists <- doesFileExist root-      compileFromTo def { configAutorun = True, configDirectoryIncludes = ["tests/"] } file out+      compileFromTo def { configTypecheck = False, configDirectoryIncludes = ["tests/"] } file out       result <- runJavaScriptFile out       if outExists          then do output <- readFile root
tests/Bool.hs view
@@ -1,6 +1,12 @@ {-# LANGUAGE NoImplicitPrelude #-} +module Bool where++import           Language.Fay.FFI+import           Language.Fay.Prelude++main :: Fay () main = print True -print :: Double -> Fay ()+print :: Bool -> Fay () print = ffi "console.log(%1)"
tests/Bool.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var Bool = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var main = new $(function(){return _(print)(true);});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["double"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(print)(true);});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["bool"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new Bool(); main._(main.main); 
tests/Double.hs view
@@ -1,4 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-}++module Double where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ main = print (2 * 4 / 2)  print :: Double -> Fay ()
tests/Double.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var Double = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var main = new $(function(){return _(print)(_(2 * 4) / 2);});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["double"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(print)(_(Fay$$div)(_(_(Fay$$mult)(2)(4)))(2));});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["double"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new Double(); main._(main.main); 
tests/Double2.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module Double2 where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ main = print (10 + (2 * (4 / 2)))  print :: Double -> Fay ()
tests/Double2.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var Double2 = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var main = new $(function(){return _(print)(10 + _(2 * _(4 / 2)));});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["double"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(print)(_(Fay$$add)(10)(_(_(Fay$$mult)(2)(_(_(Fay$$div)(4)(2))))));});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["double"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new Double2(); main._(main.main); 
tests/Double3.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module Double3 where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ main = print (5 * 3 / 2)  print :: Double -> Fay ()
tests/Double3.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var Double3 = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var main = new $(function(){return _(print)(_(5 * 3) / 2);});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["double"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(print)(_(Fay$$div)(_(_(Fay$$mult)(5)(3)))(2));});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["double"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new Double3(); main._(main.main); 
tests/Double4.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module Double4 where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ main = print 1  print :: Double -> Fay ()
tests/Double4.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var Double4 = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var main = new $(function(){return _(print)(1);});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["double"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(print)(1);});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["double"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new Double4(); main._(main.main); 
tests/Hierarchical/Export.hs view
@@ -2,5 +2,8 @@  module Hierarchical.Export where +import           Language.Fay.FFI+import           Language.Fay.Prelude+ exported :: String exported = "exported"
tests/Hierarchical/RecordDefined.hs view
@@ -1,7 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} -module RecordDefined where+module Hierarchical.RecordDefined where -data Callback a = Callback Integer+import           Language.Fay.FFI+import           Language.Fay.Prelude++data Callback a = Callback Double  g (Callback a) = a
tests/HierarchicalImport.hs view
@@ -1,6 +1,9 @@ {-# LANGUAGE NoImplicitPrelude #-} -module Main where+module HierarchicalImport where++import           Language.Fay.FFI+import           Language.Fay.Prelude  import           Hierarchical.Export 
tests/HierarchicalImport.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var HierarchicalImport = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,11 @@  * Application code.  */ -var exported = new $(function(){return Fay$$list("exported");});var main = new $(function(){return _(printS)(exported);});var printS = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var exported = new $(function(){return Fay$$list("exported");});var main = new $(function(){return _(printS)(exported);});var printS = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral; this.max = max; this.min = min; this.mod = mod;@@ -473,6 +527,6 @@  }; ;-var main = new Main();+var main = new HierarchicalImport(); main._(main.main); 
tests/List.hs view
@@ -1,12 +1,17 @@ {-# LANGUAGE NoImplicitPrelude #-} -main = print (showList (take 5 (let ns = 1 : map (\x -> x + 1) ns in ns)))+module List where +import           Language.Fay.FFI+import           Language.Fay.Prelude++main = print (showList (take 5 (let ns = 1 : map' (\x -> x + 1) ns in ns)))+ take 0 _      = [] take n (x:xs) = x : take (n - 1) xs -map f []     = []-map f (x:xs) = f x : map f xs+map' f []     = []+map' f (x:xs) = f x : map' f xs  print :: String -> Fay () print = ffi "console.log(%1)"
tests/List.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var List = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,58 @@  * Application code.  */ -var main = new $(function(){return _(print)(_(showList)(_(_(take)(5))((function(){var ns = new $(function(){return _(_(Fay$$cons)(1))(_(_(map)(function($_a){var x = $_a;return _(x) + 1;}))(ns));});return ns;})())));});var take = function($_a){return function($_b){return new $(function(){if (_($_a) === 0) {return null;}var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var x = $_$_b.car;var xs = $_$_b.cdr;var n = $_a;return _(_(Fay$$cons)(x))(_(_(take)(_(n) - 1))(xs));}throw ["unhandled case in Ident \"take\"",[$_a,$_b]];});};};var map = function($_a){return function($_b){return new $(function(){if (_($_b) === null) {var f = $_a;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 print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var showList = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["list",[["double"]]],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(print)(_(showList)(_(_(take)(5))((function(){var ns = new $(function(){return _(_(Fay$$cons)(1))(_(_(map$39$)(function($36$_a){var x = $36$_a;return _(Fay$$add)(_(x))(1);}))(ns));});return ns;})())));});var take = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === 0) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var n = $36$_a;return _(_(Fay$$cons)(x))(_(_(take)(_(Fay$$sub)(_(n))(1)))(xs));}throw ["unhandled case in Ident \"take\"",[$36$_a,$36$_b]];});};};var map$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var f = $36$_a;return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map$39$)(f))(xs));}throw ["unhandled case in Ident \"map'\"",[$36$_a,$36$_b]];});};};var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var showList = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["list",[["double"]]],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.showList = showList;+this.print = print;+this.map$39$ = map$39$;+this.take = take; this.main = main;  // Built-ins@@ -429,6 +530,6 @@  }; ;-var main = new Main();+var main = new List(); main._(main.main); 
tests/List2.hs view
@@ -1,14 +1,19 @@ {-# LANGUAGE NoImplicitPrelude #-} -main = print (showList (take 5 (let ns = 1 : map (foo 123) ns in ns)))+module List2 where +import           Language.Fay.FFI+import           Language.Fay.Prelude++main = print (showList (take 5 (let ns = 1 : map' (foo 123) ns in ns)))+ foo x y = x * y / 2  take 0 _      = [] take n (x:xs) = x : take (n - 1) xs -map f []     = []-map f (x:xs) = f x : map f xs+map' f []     = []+map' f (x:xs) = f x : map' f xs  print :: String -> Fay () print = ffi "console.log(%1)"
tests/List2.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var List2 = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,59 @@  * Application code.  */ -var main = new $(function(){return _(print)(_(showList)(_(_(take)(5))((function(){var ns = new $(function(){return _(_(Fay$$cons)(1))(_(_(map)(_(foo)(123)))(ns));});return ns;})())));});var foo = function($_a){return function($_b){return new $(function(){var y = $_b;var x = $_a;return _(_(x) * _(y)) / 2;});};};var take = function($_a){return function($_b){return new $(function(){if (_($_a) === 0) {return null;}var $_$_b = _($_b);if ($_$_b instanceof Fay$$Cons) {var x = $_$_b.car;var xs = $_$_b.cdr;var n = $_a;return _(_(Fay$$cons)(x))(_(_(take)(_(n) - 1))(xs));}throw ["unhandled case in Ident \"take\"",[$_a,$_b]];});};};var map = function($_a){return function($_b){return new $(function(){if (_($_b) === null) {var f = $_a;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 print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var showList = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["list",[["double"]]],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(print)(_(showList)(_(_(take)(5))((function(){var ns = new $(function(){return _(_(Fay$$cons)(1))(_(_(map$39$)(_(foo)(123)))(ns));});return ns;})())));});var foo = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(Fay$$div)(_(_(Fay$$mult)(_(x))(_(y))))(2);});};};var take = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === 0) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var n = $36$_a;return _(_(Fay$$cons)(x))(_(_(take)(_(Fay$$sub)(_(n))(1)))(xs));}throw ["unhandled case in Ident \"take\"",[$36$_a,$36$_b]];});};};var map$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var f = $36$_a;return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map$39$)(f))(xs));}throw ["unhandled case in Ident \"map'\"",[$36$_a,$36$_b]];});};};var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var showList = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["list",[["double"]]],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.showList = showList;+this.print = print;+this.map$39$ = map$39$;+this.take = take;+this.foo = foo; this.main = main;  // Built-ins@@ -429,6 +531,6 @@  }; ;-var main = new Main();+var main = new List2(); main._(main.main); 
tests/Monad.hs view
@@ -3,7 +3,7 @@  -- | Monads test. -module Monads where+module Monad where  import           Language.Fay.FFI import           Language.Fay.Prelude
tests/Monad.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Monads = function(){+var Monad = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,11 @@  * Application code.  */ -var main = new $(function(){return _(_($62$$62$$61$)(_($_return)(123)))(function($_a){if (_($_a) === 123) {return _(_($62$$62$$61$)(_($_return)(456)))(function($_a){var x = $_a;return _(_($62$$62$)(_(_($62$$62$)(_(print)(x)))(_($_return)(Fay$$unit))))(_(_($62$$62$$61$)(_(_($62$$62$$61$)(_($_return)(666)))(function($_a){return _($_return)(789);})))(function($_a){var x = $_a;return _(_($62$$62$$61$)(_($_return)(101112)))(function($_a){var y = $_a;return _(_($62$$62$)(_(print)(x)))(_(print)(y));});}));});}throw ["unhandled case",$_a];});});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["double"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(_($62$$62$$61$)(_($_return)(123)))(function($36$_a){if (_($36$_a) === 123) {return _(_($62$$62$$61$)(_($_return)(456)))(function($36$_a){var x = $36$_a;return _(_($62$$62$)(_(_($62$$62$)(_(print)(x)))(_($_return)(Fay$$unit))))(_(_($62$$62$$61$)(_(_($62$$62$$61$)(_($_return)(666)))(function($36$_a){return _($_return)(789);})))(function($36$_a){var x = $36$_a;return _(_($62$$62$$61$)(_($_return)(101112)))(function($36$_a){var y = $36$_a;return _(_($62$$62$)(_(print)(x)))(_(print)(y));});}));});}throw ["unhandled case",$36$_a];});});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["double"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral; this.max = max; this.min = min; this.mod = mod;@@ -473,6 +527,6 @@  }; ;-var main = new Monads();+var main = new Monad(); main._(main.main); 
tests/Monad2.hs view
@@ -4,7 +4,7 @@  -- | Monads test. -module Monads where+module Monad2 where  import           Language.Fay.FFI import           Language.Fay.Prelude
tests/Monad2.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Monads = function(){+var Monad2 = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,11 @@  * Application code.  */ -var main = new $(function(){return _(_($62$$62$$61$)(_($_return)((function(){var result = new $(function(){return _(_(runState)(demo))(60);});return _(_($43$$43$)(_(fst)(result)))(_(_($43$$43$)(Fay$$list(": ")))(_(show)(_(snd)(result))));})())))(print);});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Monad = function(slot1,slot2,slot3){this.slot1 = slot1;this.slot2 = slot2;this.slot3 = slot3;};var Monad = function(slot1){return function(slot2){return function(slot3){return new $(function(){return new $_Monad(slot1,slot2,slot3);});};};};var demo = new $(function(){return (function($_stateMonad){if (_($_stateMonad) instanceof $_Monad) {var $_return = _($_stateMonad).slot1;var $62$$62$$61$ = _($_stateMonad).slot2;var $62$$62$ = _($_stateMonad).slot3;return _(_($62$$62$$61$)(get))(function($_a){var n = $_a;return _(_($62$$62$)(_(put)(_(n) * 2)))(_(_($62$$62$$61$)(get))(function($_a){var n = $_a;return _(_($62$$62$)(_(put)(_(n) + 3)))(_($_return)(Fay$$list("abc")));}));});}return (function(){ throw (["unhandled case",$_stateMonad]); })();})(stateMonad);});var $_State = function(runState){this.runState = runState;};var State = function(runState){return new $(function(){return new $_State(runState);});};var runState = function(x){return new $(function(){return _(x).runState;});};var stateMonad = new $(function(){var $_return = new $(function(){return function($_a){var x = $_a;return _(State)(function($_a){var st = $_a;return Fay$$list([x,st]);});};});var $62$$62$$61$ = new $(function(){return function($_a){var processor = $_a;return function($_b){var processorGenerator = $_b;return _(_($36$)(State))(function($_a){var st = $_a;return (function($tmp){var x = Fay$$index(0)(_($tmp));var st$39$ = Fay$$index(1)(_($tmp));return _(_(runState)(_(processorGenerator)(x)))(st$39$);return (function(){ throw (["unhandled case",$tmp]); })();})(_(_(runState)(processor))(st));});};};});var $62$$62$ = new $(function(){return function($_a){var a = $_a;return function($_b){var b = $_b;return _(_($62$$62$$61$)(a))(function($_a){return b;});};};});return _(_(_(Monad)($_return))($62$$62$$61$))($62$$62$);});var put = function($_a){return new $(function(){var newState = $_a;return _(_($36$)(State))(function($_a){return Fay$$list([Fay$$unit,newState]);});});};var get = new $(function(){return _(_($36$)(State))(function($_a){var st = $_a;return Fay$$list([st,st]);});});var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $_State) {return {"instance": "State","runState": Fay$$fayToJs(["function",[["unknown"],["unknown"]]],_(_obj.runState))};}if (_obj instanceof $_Monad) {return {"instance": "Monad","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1)),"slot2": Fay$$fayToJs(["unknown"],_(_obj.slot2)),"slot3": Fay$$fayToJs(["unknown"],_(_obj.slot3))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "State") {return new $_State(Fay$$jsToFay(["function",[["unknown"],["unknown"]]],obj["runState"]));}if (obj["instance"] === "Monad") {return new $_Monad(Fay$$jsToFay(["unknown"],obj["slot1"]),Fay$$jsToFay(["unknown"],obj["slot2"]),Fay$$jsToFay(["unknown"],obj["slot3"]));}return obj;};+var main = new $(function(){return _(_($62$$62$$61$)(_($_return)((function(){var result = new $(function(){return _(_(runState)(demo))(60);});return _(_($43$$43$)(_(fst)(result)))(_(_($43$$43$)(Fay$$list(": ")))(_(show)(_(snd)(result))));})())))(print);});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Monad = function(slot1,slot2,slot3){this.slot1 = slot1;this.slot2 = slot2;this.slot3 = slot3;};var Monad = function(slot1){return function(slot2){return function(slot3){return new $(function(){return new $36$_Monad(slot1,slot2,slot3);});};};};var demo = new $(function(){return (function($36$_stateMonad){if (_($36$_stateMonad) instanceof $36$_Monad) {var $_return = _($36$_stateMonad).slot1;var $62$$62$$61$ = _($36$_stateMonad).slot2;var $62$$62$ = _($36$_stateMonad).slot3;return _(_($62$$62$$61$)(get))(function($36$_a){var n = $36$_a;return _(_($62$$62$)(_(put)(_(Fay$$mult)(_(n))(2))))(_(_($62$$62$$61$)(get))(function($36$_a){var n = $36$_a;return _(_($62$$62$)(_(put)(_(Fay$$add)(_(n))(3))))(_($_return)(Fay$$list("abc")));}));});}return (function(){ throw (["unhandled case",$36$_stateMonad]); })();})(stateMonad);});var $36$_State = function(runState){this.runState = runState;};var State = function(runState){return new $(function(){return new $36$_State(runState);});};var runState = function(x){return new $(function(){return _(x).runState;});};var stateMonad = new $(function(){var $_return = new $(function(){return function($36$_a){var x = $36$_a;return _(State)(function($36$_a){var st = $36$_a;return Fay$$list([x,st]);});};});var $62$$62$$61$ = new $(function(){return function($36$_a){var processor = $36$_a;return function($36$_b){var processorGenerator = $36$_b;return _(_($36$)(State))(function($36$_a){var st = $36$_a;return (function($tmp){var x = Fay$$index(0)(_($tmp));var st$39$ = Fay$$index(1)(_($tmp));return _(_(runState)(_(processorGenerator)(x)))(st$39$);return (function(){ throw (["unhandled case",$tmp]); })();})(_(_(runState)(processor))(st));});};};});var $62$$62$ = new $(function(){return function($36$_a){var a = $36$_a;return function($36$_b){var b = $36$_b;return _(_($62$$62$$61$)(a))(function($36$_a){return b;});};};});return _(_(_(Monad)($_return))($62$$62$$61$))($62$$62$);});var put = function($36$_a){return new $(function(){var newState = $36$_a;return _(_($36$)(State))(function($36$_a){return Fay$$list([Fay$$unit,newState]);});});};var get = new $(function(){return _(_($36$)(State))(function($36$_a){var st = $36$_a;return Fay$$list([st,st]);});});var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $36$_State) {return {"instance": "State","runState": Fay$$fayToJs(["function",[["unknown"],["unknown"]]],_(_obj.runState))};}if (_obj instanceof $36$_Monad) {return {"instance": "Monad","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1)),"slot2": Fay$$fayToJs(["unknown"],_(_obj.slot2)),"slot3": Fay$$fayToJs(["unknown"],_(_obj.slot3))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "State") {return new $36$_State(Fay$$jsToFay(["function",[["unknown"],["unknown"]]],obj["runState"]));}if (obj["instance"] === "Monad") {return new $36$_Monad(Fay$$jsToFay(["unknown"],obj["slot1"]),Fay$$jsToFay(["unknown"],obj["slot2"]),Fay$$jsToFay(["unknown"],obj["slot3"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral; this.max = max; this.min = min; this.mod = mod;@@ -478,6 +532,6 @@  }; ;-var main = new Monads();+var main = new Monad2(); main._(main.main); 
tests/RecCon.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module RecCon where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ data Bool = True | False  main = print (head (fix (\xs -> 123 : xs)))
tests/RecCon.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var RecCon = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,57 @@  * Application code.  */ -var $_True = function(){};var True = new $(function(){return new $_True();});var $_False = function(){};var False = new $(function(){return new $_False();});var main = new $(function(){return _(print)(_(head)(_(fix)(function($_a){var xs = $_a;return _(_(Fay$$cons)(123))(xs);})));});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["double"],$_a)));});};var head = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return x;}throw ["unhandled case in Ident \"head\"",[$_a]];});};var fix = function($_a){return new $(function(){var f = $_a;return (function(){var x = new $(function(){return _(f)(x);});return x;})();});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $_False) {return {"instance": "False"};}if (_obj instanceof $_True) {return {"instance": "True"};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "False") {return new $_False();}if (obj["instance"] === "True") {return new $_True();}return obj;};+var $36$_True = function(){};var True = new $(function(){return new $36$_True();});var $36$_False = function(){};var False = new $(function(){return new $36$_False();});var main = new $(function(){return _(print)(_(head)(_(fix)(function($36$_a){var xs = $36$_a;return _(_(Fay$$cons)(123))(xs);})));});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["double"],$36$_a)));});};var head = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return x;}throw ["unhandled case in Ident \"head\"",[$36$_a]];});};var fix = function($36$_a){return new $(function(){var f = $36$_a;return (function(){var x = new $(function(){return _(f)(x);});return x;})();});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $36$_False) {return {"instance": "False"};}if (_obj instanceof $36$_True) {return {"instance": "True"};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "False") {return new $36$_False();}if (obj["instance"] === "True") {return new $36$_True();}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.fix = fix;+this.head = head;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +529,6 @@  }; ;-var main = new Main();+var main = new RecCon(); main._(main.main); 
tests/RecDecl view
@@ -1,3 +1,6 @@+{ instance: 'R', i: 10, c: 'a' }+{ instance: 'R', i: 20, c: 'a' }+{ instance: 'R', i: 123, c: 'b' } { instance: 'R', i: 1, c: 'a' } 1 "a"
tests/RecDecl.hs view
@@ -1,7 +1,14 @@ {-# LANGUAGE NoImplicitPrelude #-} +module RecDecl where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ data R = R { i :: Double, c :: Char }+instance Foreign R data S = S Double Char+instance Foreign S  -- RecDecl r1 :: R@@ -25,10 +32,22 @@  -- Multiple fields with the same type data X = X { _x1, _x2 :: Int }+instance Foreign X+ x1 = X 1 2 x2 = X { _x1 = 1, _x2 = 2 } +-- Record updates+r1' = r1{ i = 10 }+r2' = r2{ c = 'a', i = 20 }+r'' = r'{ i = 123 }+ main = do+  -- print updated records first to show that old records are preserved+  print r1'+  print r2'+  print r''+   print r1   printS (show (i r1))   printS (show (c r1))@@ -42,5 +61,5 @@ printS :: String -> Fay () printS = ffi "console.log(%1)" -print :: a -> Fay ()+print :: Foreign f => f -> Fay () print = ffi "console.log(%1)"
tests/RecDecl.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var RecDecl = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,9 +468,71 @@  * Application code.  */ -var $_R = function(i,c){this.i = i;this.c = c;};var R = function(i){return function(c){return new $(function(){return new $_R(i,c);});};};var i = function(x){return new $(function(){return _(x).i;});};var c = function(x){return new $(function(){return _(x).c;});};var $_S = function(slot1,slot2){this.slot1 = slot1;this.slot2 = slot2;};var S = function(slot1){return function(slot2){return new $(function(){return new $_S(slot1,slot2);});};};var r1 = new $(function(){var r = new $_R();r.i = 1;r.c = "a";return r;});var r2 = new $(function(){var r = new $_R();r.c = "b";r.i = 2;return r;});var r$39$ = new $(function(){var r = new $_R();r.c = "b";return r;});var r3 = new $(function(){return _(_(R)(3))("c");});var s1 = new $(function(){return _(_(S)(1))("a");});var $_X = function(_x1,_x2){this._x1 = _x1;this._x2 = _x2;};var X = function(_x1){return function(_x2){return new $(function(){return new $_X(_x1,_x2);});};};var _x1 = function(x){return new $(function(){return _(x)._x1;});};var _x2 = function(x){return new $(function(){return _(x)._x2;});};var x1 = new $(function(){return _(_(X)(1))(2);});var x2 = new $(function(){var x = new $_X();x._x1 = 1;x._x2 = 2;return x;});var main = new $(function(){return _(_($62$$62$)(_(print)(r1)))(_(_($62$$62$)(_(printS)(_(show)(_(i)(r1)))))(_(_($62$$62$)(_(printS)(_(show)(_(c)(r1)))))(_(_($62$$62$)(_(print)(r2)))(_(_($62$$62$)(_(print)(r$39$)))(_(_($62$$62$)(_(print)(r3)))(_(_($62$$62$)(_(print)(s1)))(_(_($62$$62$)(_(print)(x1)))(_(print)(x2)))))))));});var printS = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["unknown"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $_X) {return {"instance": "X","_x1": Fay$$fayToJs(["user","Int",[]],_(_obj._x1)),"_x2": Fay$$fayToJs(["user","Int",[]],_(_obj._x2))};}if (_obj instanceof $_S) {return {"instance": "S","slot1": Fay$$fayToJs(["double"],_(_obj.slot1)),"slot2": Fay$$fayToJs(["user","Char",[]],_(_obj.slot2))};}if (_obj instanceof $_R) {return {"instance": "R","i": Fay$$fayToJs(["double"],_(_obj.i)),"c": Fay$$fayToJs(["user","Char",[]],_(_obj.c))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "X") {return new $_X(Fay$$jsToFay(["user","Int",[]],obj["_x1"]),Fay$$jsToFay(["user","Int",[]],obj["_x2"]));}if (obj["instance"] === "S") {return new $_S(Fay$$jsToFay(["double"],obj["slot1"]),Fay$$jsToFay(["user","Char",[]],obj["slot2"]));}if (obj["instance"] === "R") {return new $_R(Fay$$jsToFay(["double"],obj["i"]),Fay$$jsToFay(["user","Char",[]],obj["c"]));}return obj;};+var $36$_R = function(i,c){this.i = i;this.c = c;};var R = function(i){return function(c){return new $(function(){return new $36$_R(i,c);});};};var i = function(x){return new $(function(){return _(x).i;});};var c = function(x){return new $(function(){return _(x).c;});};var $36$_S = function(slot1,slot2){this.slot1 = slot1;this.slot2 = slot2;};var S = function(slot1){return function(slot2){return new $(function(){return new $36$_S(slot1,slot2);});};};var r1 = new $(function(){var r = new $36$_R();r.i = 1;r.c = "a";return r;});var r2 = new $(function(){var r = new $36$_R();r.c = "b";r.i = 2;return r;});var r$39$ = new $(function(){var r = new $36$_R();r.c = "b";return r;});var r3 = new $(function(){return _(_(R)(3))("c");});var s1 = new $(function(){return _(_(S)(1))("a");});var $36$_X = function(_x1,_x2){this._x1 = _x1;this._x2 = _x2;};var X = function(_x1){return function(_x2){return new $(function(){return new $36$_X(_x1,_x2);});};};var _x1 = function(x){return new $(function(){return _(x)._x1;});};var _x2 = function(x){return new $(function(){return _(x)._x2;});};var x1 = new $(function(){return _(_(X)(1))(2);});var x2 = new $(function(){var x = new $36$_X();x._x1 = 1;x._x2 = 2;return x;});var r1$39$ = new $(function(){var $36$_record_to_update = Object.create(_(r1));$36$_record_to_update.i = 10;return $36$_record_to_update;});var r2$39$ = new $(function(){var $36$_record_to_update = Object.create(_(r2));$36$_record_to_update.c = "a";$36$_record_to_update.i = 20;return $36$_record_to_update;});var r$39$$39$ = new $(function(){var $36$_record_to_update = Object.create(_(r$39$));$36$_record_to_update.i = 123;return $36$_record_to_update;});var main = new $(function(){return _(_($62$$62$)(_(print)(r1$39$)))(_(_($62$$62$)(_(print)(r2$39$)))(_(_($62$$62$)(_(print)(r$39$$39$)))(_(_($62$$62$)(_(print)(r1)))(_(_($62$$62$)(_(printS)(_(show)(_(i)(r1)))))(_(_($62$$62$)(_(printS)(_(show)(_(c)(r1)))))(_(_($62$$62$)(_(print)(r2)))(_(_($62$$62$)(_(print)(r$39$)))(_(_($62$$62$)(_(print)(r3)))(_(_($62$$62$)(_(print)(s1)))(_(_($62$$62$)(_(print)(x1)))(_(print)(x2))))))))))));});var printS = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["unknown"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $36$_X) {return {"instance": "X","_x1": Fay$$fayToJs(["int"],_(_obj._x1)),"_x2": Fay$$fayToJs(["int"],_(_obj._x2))};}if (_obj instanceof $36$_S) {return {"instance": "S","slot1": Fay$$fayToJs(["double"],_(_obj.slot1)),"slot2": Fay$$fayToJs(["user","Char",[]],_(_obj.slot2))};}if (_obj instanceof $36$_R) {return {"instance": "R","i": Fay$$fayToJs(["double"],_(_obj.i)),"c": Fay$$fayToJs(["user","Char",[]],_(_obj.c))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "X") {return new $36$_X(Fay$$jsToFay(["int"],obj["_x1"]),Fay$$jsToFay(["int"],obj["_x2"]));}if (obj["instance"] === "S") {return new $36$_S(Fay$$jsToFay(["double"],obj["slot1"]),Fay$$jsToFay(["user","Char",[]],obj["slot2"]));}if (obj["instance"] === "R") {return new $36$_R(Fay$$jsToFay(["double"],obj["i"]),Fay$$jsToFay(["user","Char",[]],obj["c"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print;+this.printS = printS; this.main = main;+this.r$39$$39$ = r$39$$39$;+this.r2$39$ = r2$39$;+this.r1$39$ = r1$39$;+this.x2 = x2;+this.x1 = x1;+this._x2 = _x2;+this._x1 = _x1;+this.s1 = s1;+this.r3 = r3;+this.r$39$ = r$39$;+this.r2 = r2;+this.r1 = r1;+this.c = c;+this.i = i;  // Built-ins this._ = _;@@ -429,6 +542,6 @@  }; ;-var main = new Main();+var main = new RecDecl(); main._(main.main); 
tests/RecordImport_Export.hs view
@@ -2,4 +2,6 @@  module RecordImport_Export where +import           Language.Fay.Prelude+ data R = R Integer
tests/RecordImport_Export.js view
@@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,11 @@  * Application code.  */ -var $_R = function(slot1){this.slot1 = slot1;};var R = function(slot1){return new $(function(){return new $_R(slot1);});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $_R) {return {"instance": "R","slot1": Fay$$fayToJs(["user","Integer",[]],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "R") {return new $_R(Fay$$jsToFay(["user","Integer",[]],obj["slot1"]));}return obj;};+var $36$_R = function(slot1){this.slot1 = slot1;};var R = function(slot1){return new $(function(){return new $36$_R(slot1);});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $36$_R) {return {"instance": "R","slot1": Fay$$fayToJs(["user","Integer",[]],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "R") {return new $36$_R(Fay$$jsToFay(["user","Integer",[]],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral; this.max = max; this.min = min; this.mod = mod;
tests/RecordImport_Import.js view
@@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,11 @@  * Application code.  */ -var $_R = function(slot1){this.slot1 = slot1;};var R = function(slot1){return new $(function(){return new $_R(slot1);});};var f = function($_a){return new $(function(){if (_($_a) instanceof $_R) {var i = _($_a).slot1;return _(R)(i);}throw ["unhandled case in Ident \"f\"",[$_a]];});};var showR = function($_a){return new $(function(){if (_($_a) instanceof $_R) {var i = _($_a).slot1;return _(_($43$$43$)(Fay$$list("R ")))(_(show)(i));}throw ["unhandled case in Ident \"showR\"",[$_a]];});};var printS = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var main = new $(function(){return _(_($36$)(printS))(_(_($36$)(showR))(_(R)(1)));});var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $_R) {return {"instance": "R","slot1": Fay$$fayToJs(["user","Integer",[]],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "R") {return new $_R(Fay$$jsToFay(["user","Integer",[]],obj["slot1"]));}return obj;};+var $36$_R = function(slot1){this.slot1 = slot1;};var R = function(slot1){return new $(function(){return new $36$_R(slot1);});};var f = function($36$_a){return new $(function(){if (_($36$_a) instanceof $36$_R) {var i = _($36$_a).slot1;return _(R)(i);}throw ["unhandled case in Ident \"f\"",[$36$_a]];});};var showR = function($36$_a){return new $(function(){if (_($36$_a) instanceof $36$_R) {var i = _($36$_a).slot1;return _(_($43$$43$)(Fay$$list("R ")))(_(show)(i));}throw ["unhandled case in Ident \"showR\"",[$36$_a]];});};var printS = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var main = new $(function(){return _(_($36$)(printS))(_(_($36$)(showR))(_(R)(1)));});var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $36$_R) {return {"instance": "R","slot1": Fay$$fayToJs(["user","Integer",[]],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "R") {return new $36$_R(Fay$$jsToFay(["user","Integer",[]],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral; this.max = max; this.min = min; this.mod = mod;
tests/String.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module String where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ main = print "Hello, World!"  print :: String -> Fay ()
tests/String.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var String = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var main = new $(function(){return _(print)(Fay$$list("Hello, World!"));});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(print)(Fay$$list("Hello, World!"));});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new String(); main._(main.main); 
tests/asPatternMatch.hs view
@@ -1,8 +1,6 @@ {-# LANGUAGE NoImplicitPrelude #-} -module Test where---- | As pattern matches+module AsPatternMatch where  import           Language.Fay.FFI import           Language.Fay.Prelude
tests/asPatternMatch.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Test = function(){+var AsPatternMatch = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,11 @@  * Application code.  */ -var matchSame = function($_a){return new $(function(){var x = $_a;var y = $_a;return Fay$$list([x,y]);return Fay$$list([x,y]);throw ["unhandled case in Ident \"matchSame\"",[$_a]];});};var matchSplit = function($_a){return new $(function(){var x = $_a;var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var y = $_$_a.car;var z = $_$_a.cdr;return Fay$$list([x,y,z]);}return Fay$$list([x,y,z]);throw ["unhandled case in Ident \"matchSplit\"",[$_a]];});};var matchNested = function($_a){return new $(function(){var a = Fay$$index(0)(_($_a));var b = Fay$$index(1)(_($_a));var $tmp = _(Fay$$index(1)(_($_a)));if ($tmp instanceof Fay$$Cons) {var x = $tmp.car;var xs = $tmp.cdr;return Fay$$list([b,x,xs]);}return Fay$$list([b,x,xs]);throw ["unhandled case in Ident \"matchNested\"",[$_a]];});};var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var main = new $(function(){return _(_($62$$62$)(_(_($36$)(print))(_(_($36$)(show))(_(matchSame)(Fay$$list([1,2,3]))))))(_(_($62$$62$)(_(_($36$)(print))(_(_($36$)(show))(_(matchSplit)(Fay$$list([1,2,3]))))))(_(_($36$)(print))(_(_($36$)(show))(_(matchNested)(Fay$$list([1,Fay$$list([1,2,3])]))))));});var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var matchSame = function($36$_a){return new $(function(){var x = $36$_a;var y = $36$_a;return Fay$$list([x,y]);return Fay$$list([x,y]);throw ["unhandled case in Ident \"matchSame\"",[$36$_a]];});};var matchSplit = function($36$_a){return new $(function(){var x = $36$_a;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var y = $36$_$36$_a.car;var z = $36$_$36$_a.cdr;return Fay$$list([x,y,z]);}return Fay$$list([x,y,z]);throw ["unhandled case in Ident \"matchSplit\"",[$36$_a]];});};var matchNested = function($36$_a){return new $(function(){var a = Fay$$index(0)(_($36$_a));var b = Fay$$index(1)(_($36$_a));var $tmp = _(Fay$$index(1)(_($36$_a)));if ($tmp instanceof Fay$$Cons) {var x = $tmp.car;var xs = $tmp.cdr;return Fay$$list([b,x,xs]);}return Fay$$list([b,x,xs]);throw ["unhandled case in Ident \"matchNested\"",[$36$_a]];});};var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var main = new $(function(){return _(_($62$$62$)(_(_($36$)(print))(_(_($36$)(show))(_(matchSame)(Fay$$list([1,2,3]))))))(_(_($62$$62$)(_(_($36$)(print))(_(_($36$)(show))(_(matchSplit)(Fay$$list([1,2,3]))))))(_(_($36$)(print))(_(_($36$)(show))(_(matchNested)(Fay$$list([1,Fay$$list([1,2,3])]))))));});var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral; this.max = max; this.min = min; this.mod = mod;@@ -476,6 +530,6 @@  }; ;-var main = new Test();+var main = new AsPatternMatch(); main._(main.main); 
tests/basicFunctions.hs view
@@ -1,11 +1,16 @@ {-# LANGUAGE NoImplicitPrelude #-} -main = print (concat ["Hello, ","World!"])+module BasicFunctions where -concat = foldr append []+import           Language.Fay.FFI+import           Language.Fay.Prelude -foldr f z []     = z-foldr f z (x:xs) = f x (foldr f z xs)+main = print (concat' ["Hello, ","World!"])++concat' = foldr' append []++foldr' f z []     = z+foldr' f z (x:xs) = f x (foldr f z xs)  append (x:xs) ys = x : append xs ys append []     ys = ys
tests/basicFunctions.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var BasicFunctions = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,58 @@  * Application code.  */ -var main = new $(function(){return _(print)(_(concat)(Fay$$list([Fay$$list("Hello, "),Fay$$list("World!")])));});var concat = new $(function(){return _(_(foldr)(append))(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 append = 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))(_(_(append)(xs))(ys));}var ys = $_b;if (_($_a) === null) {return ys;}throw ["unhandled case in Ident \"append\"",[$_a,$_b]];});};};var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(print)(_(concat$39$)(Fay$$list([Fay$$list("Hello, "),Fay$$list("World!")])));});var concat$39$ = new $(function(){return _(_(foldr$39$)(append))(null);});var foldr$39$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;var f = $36$_a;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr'\"",[$36$_a,$36$_b,$36$_c]];});};};};var append = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(append)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"append\"",[$36$_a,$36$_b]];});};};var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print;+this.append = append;+this.foldr$39$ = foldr$39$;+this.concat$39$ = concat$39$; this.main = main;  // Built-ins@@ -429,6 +530,6 @@  }; ;-var main = new Main();+var main = new BasicFunctions(); main._(main.main); 
tests/case.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module Case where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ main = print (case True of                True -> "Hello!"                False -> "Ney!")
tests/case.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var Case = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var main = new $(function(){return _(print)((function($_true){if (_($_true) === true) {return Fay$$list("Hello!");}if (_($_true) === false) {return Fay$$list("Ney!");}return (function(){ throw (["unhandled case",$_true]); })();})(true));});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(print)((function($tmp){if (_($tmp) === true) {return Fay$$list("Hello!");}if (_($tmp) === false) {return Fay$$list("Ney!");}return (function(){ throw (["unhandled case",$tmp]); })();})(true));});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new Case(); main._(main.main); 
tests/case2.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module Case2 where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ main = print (case False of                True -> "Hello!"                False -> "Ney!")
tests/case2.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var Case2 = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var main = new $(function(){return _(print)((function($_false){if (_($_false) === true) {return Fay$$list("Hello!");}if (_($_false) === false) {return Fay$$list("Ney!");}return (function(){ throw (["unhandled case",$_false]); })();})(false));});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(print)((function($tmp){if (_($tmp) === true) {return Fay$$list("Hello!");}if (_($tmp) === false) {return Fay$$list("Ney!");}return (function(){ throw (["unhandled case",$tmp]); })();})(false));});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new Case2(); main._(main.main); 
tests/caseList.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module CaseList where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ main = print (case [1,2,3,4,5] of   [1,2,3,4,6] -> "6!"   [1,2,4,2,4] -> "a!"
tests/caseList.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var CaseList = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var main = new $(function(){return _(print)((function($tmp){if (_(Fay$$index(0)(_($tmp))) === 1) {if (_(Fay$$index(1)(_($tmp))) === 2) {if (_(Fay$$index(2)(_($tmp))) === 3) {if (_(Fay$$index(3)(_($tmp))) === 4) {if (_(Fay$$index(4)(_($tmp))) === 6) {return Fay$$list("6!");}}}if (_(Fay$$index(2)(_($tmp))) === 4) {if (_(Fay$$index(3)(_($tmp))) === 2) {if (_(Fay$$index(4)(_($tmp))) === 4) {return Fay$$list("a!");}}}if (_(Fay$$index(2)(_($tmp))) === 3) {if (_(Fay$$index(3)(_($tmp))) === 4) {if (_(Fay$$index(4)(_($tmp))) === 5) {return Fay$$list("OK.");}}}}}return Fay$$list("Broken.");})(Fay$$list([1,2,3,4,5])));});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(print)((function($tmp){if (_(Fay$$index(0)(_($tmp))) === 1) {if (_(Fay$$index(1)(_($tmp))) === 2) {if (_(Fay$$index(2)(_($tmp))) === 3) {if (_(Fay$$index(3)(_($tmp))) === 4) {if (_(Fay$$index(4)(_($tmp))) === 6) {return Fay$$list("6!");}}}if (_(Fay$$index(2)(_($tmp))) === 4) {if (_(Fay$$index(3)(_($tmp))) === 2) {if (_(Fay$$index(4)(_($tmp))) === 4) {return Fay$$list("a!");}}}if (_(Fay$$index(2)(_($tmp))) === 3) {if (_(Fay$$index(3)(_($tmp))) === 4) {if (_(Fay$$index(4)(_($tmp))) === 5) {return Fay$$list("OK.");}}}}}return Fay$$list("Broken.");})(Fay$$list([1,2,3,4,5])));});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new CaseList(); main._(main.main); 
tests/caseWildcard.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module CaseWildCard where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ main = print (case False of                True -> "Hello!"                _    -> "Ney!")
tests/caseWildcard.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var CaseWildCard = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var main = new $(function(){return _(print)((function($_false){if (_($_false) === true) {return Fay$$list("Hello!");}return Fay$$list("Ney!");})(false));});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(print)((function($tmp){if (_($tmp) === true) {return Fay$$list("Hello!");}return Fay$$list("Ney!");})(false));});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new CaseWildCard(); main._(main.main); 
tests/do.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module Do where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ main = do print "Hello,"; print "World!"  print :: String -> Fay ()
tests/do.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var Do = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var main = new $(function(){return _(_($62$$62$)(_(print)(Fay$$list("Hello,"))))(_(print)(Fay$$list("World!")));});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(_($62$$62$)(_(print)(Fay$$list("Hello,"))))(_(print)(Fay$$list("World!")));});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new Do(); main._(main.main); 
tests/doAssingPatternMatch.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module DoAssignPatternMatch where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ main = do   [1,2] <- return [1,2]   print "OK."
tests/doAssingPatternMatch.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var DoAssignPatternMatch = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var main = new $(function(){return _(_($62$$62$$61$)(_($_return)(Fay$$list([1,2]))))(function($_a){if (_(Fay$$index(0)(_($_a))) === 1) {if (_(Fay$$index(1)(_($_a))) === 2) {return _(print)(Fay$$list("OK."));}}throw ["unhandled case",$_a];});});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(_($62$$62$$61$)(_($_return)(Fay$$list([1,2]))))(function($36$_a){if (_(Fay$$index(0)(_($36$_a))) === 1) {if (_(Fay$$index(1)(_($36$_a))) === 2) {return _(print)(Fay$$list("OK."));}}throw ["unhandled case",$36$_a];});});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new DoAssignPatternMatch(); main._(main.main); 
tests/doBindAssign.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module DoBindAssign where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ main = do   x <- return "Hello, World!" >>= return   print x
tests/doBindAssign.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var DoBindAssign = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var main = new $(function(){return _(_($62$$62$$61$)(_(_($62$$62$$61$)(_($_return)(Fay$$list("Hello, World!"))))($_return)))(function($_a){var x = $_a;return _(print)(x);});});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(_($62$$62$$61$)(_(_($62$$62$$61$)(_($_return)(Fay$$list("Hello, World!"))))($_return)))(function($36$_a){var x = $36$_a;return _(print)(x);});});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new DoBindAssign(); main._(main.main); 
tests/emptyMain.hs view
@@ -1,3 +1,8 @@ {-# LANGUAGE NoImplicitPrelude #-} +module EmptyMain where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ main = return ()
tests/emptyMain.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var EmptyMain = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,54 @@  * Application code.  */ -var main = new $(function(){return _($_return)(Fay$$unit);});var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _($_return)(Fay$$unit);});var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show; this.main = main;  // Built-ins@@ -429,6 +526,6 @@  }; ;-var main = new Main();+var main = new EmptyMain(); main._(main.main); 
tests/fix.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module Fix where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ main = print (head (tail (fix (\xs -> 123 : xs))))  print :: Double -> Fay ()
tests/fix.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var Fix = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,58 @@  * Application code.  */ -var main = new $(function(){return _(print)(_(head)(_(tail)(_(fix)(function($_a){var xs = $_a;return _(_(Fay$$cons)(123))(xs);}))));});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["double"],$_a)));});};var head = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return x;}throw ["unhandled case in Ident \"head\"",[$_a]];});};var fix = function($_a){return new $(function(){var f = $_a;return (function(){var x = new $(function(){return _(f)(x);});return x;})();});};var tail = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var xs = $_$_a.cdr;return xs;}throw ["unhandled case in Ident \"tail\"",[$_a]];});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(print)(_(head)(_(tail)(_(fix)(function($36$_a){var xs = $36$_a;return _(_(Fay$$cons)(123))(xs);}))));});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["double"],$36$_a)));});};var head = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return x;}throw ["unhandled case in Ident \"head\"",[$36$_a]];});};var fix = function($36$_a){return new $(function(){var f = $36$_a;return (function(){var x = new $(function(){return _(f)(x);});return x;})();});};var tail = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return xs;}throw ["unhandled case in Ident \"tail\"",[$36$_a]];});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.tail = tail;+this.fix = fix;+this.head = head;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +530,6 @@  }; ;-var main = new Main();+var main = new Fix(); main._(main.main); 
tests/fromInteger.hs view
@@ -1,6 +1,6 @@ {-# LANGUAGE NoImplicitPrelude #-} -module Test where+module FromInteger where  import           Language.Fay.FFI import           Language.Fay.Prelude
tests/fromInteger.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Test = function(){+var FromInteger = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,11 @@  * Application code.  */ -var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var main = new $(function(){return _(_($36$)(print))(_(_($36$)(show))(_(fromInteger)(5)));});var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var main = new $(function(){return _(_($36$)(print))(_(_($36$)(show))(_(fromInteger)(5)));});var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral; this.max = max; this.min = min; this.mod = mod;@@ -473,6 +527,6 @@  }; ;-var main = new Test();+var main = new FromInteger(); main._(main.main); 
tests/infixDataConst view
@@ -1,1 +1,3 @@-{"instance":"$58$$61$$62$","slot1":{"instance":"InfixConst1","slot1":123,"slot2":123},"slot2":{"instance":"InfixConst2","slot1":false,"slot2":true}}+{ instance: '$58$$61$$62$',+  slot1: { instance: 'InfixConst1', slot1: 123, slot2: 123 },+  slot2: { instance: 'InfixConst2', slot1: false, slot2: true } }
tests/infixDataConst.hs view
@@ -1,21 +1,23 @@ {-# LANGUAGE NoImplicitPrelude #-} -import Language.Fay.FFI-import Language.Fay.Prelude+module Test where +import           Language.Fay.FFI+import           Language.Fay.Prelude + data Ty1 = Integer `InfixConst1` Integer-    deriving Show+instance Foreign Ty1  data Ty2 = Bool `InfixConst2` Bool-    deriving Show+instance Foreign Ty2  data Ty3 = Ty1 :=> Ty2+instance Foreign Ty3  t = (123 `InfixConst1` 123) :=> (False `InfixConst2` True) -main = do-  print (show t)+main = print t -print :: String -> Fay ()+print :: Ty3 -> Fay () print = ffi "console.log(%1)"
tests/infixDataConst.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var Test = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,9 +468,57 @@  * Application code.  */ -var $_InfixConst1 = function(slot1,slot2){this.slot1 = slot1;this.slot2 = slot2;};var InfixConst1 = function(slot1){return function(slot2){return new $(function(){return new $_InfixConst1(slot1,slot2);});};};var $_InfixConst2 = function(slot1,slot2){this.slot1 = slot1;this.slot2 = slot2;};var InfixConst2 = function(slot1){return function(slot2){return new $(function(){return new $_InfixConst2(slot1,slot2);});};};var $_$58$$61$$62$ = function(slot1,slot2){this.slot1 = slot1;this.slot2 = slot2;};var $58$$61$$62$ = function(slot1){return function(slot2){return new $(function(){return new $_$58$$61$$62$(slot1,slot2);});};};var t = new $(function(){return _(_($58$$61$$62$)(_(_(InfixConst1)(123))(123)))(_(_(InfixConst2)(false))(true));});var main = new $(function(){return _(print)(_(show)(t));});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $_$58$$61$$62$) {return {"instance": "$58$$61$$62$","slot1": Fay$$fayToJs(["user","Ty1",[]],_(_obj.slot1)),"slot2": Fay$$fayToJs(["user","Ty2",[]],_(_obj.slot2))};}if (_obj instanceof $_InfixConst2) {return {"instance": "InfixConst2","slot1": Fay$$fayToJs(["bool"],_(_obj.slot1)),"slot2": Fay$$fayToJs(["bool"],_(_obj.slot2))};}if (_obj instanceof $_InfixConst1) {return {"instance": "InfixConst1","slot1": Fay$$fayToJs(["user","Integer",[]],_(_obj.slot1)),"slot2": Fay$$fayToJs(["user","Integer",[]],_(_obj.slot2))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "$58$$61$$62$") {return new $_$58$$61$$62$(Fay$$jsToFay(["user","Ty1",[]],obj["slot1"]),Fay$$jsToFay(["user","Ty2",[]],obj["slot2"]));}if (obj["instance"] === "InfixConst2") {return new $_InfixConst2(Fay$$jsToFay(["bool"],obj["slot1"]),Fay$$jsToFay(["bool"],obj["slot2"]));}if (obj["instance"] === "InfixConst1") {return new $_InfixConst1(Fay$$jsToFay(["user","Integer",[]],obj["slot1"]),Fay$$jsToFay(["user","Integer",[]],obj["slot2"]));}return obj;};+var $36$_InfixConst1 = function(slot1,slot2){this.slot1 = slot1;this.slot2 = slot2;};var InfixConst1 = function(slot1){return function(slot2){return new $(function(){return new $36$_InfixConst1(slot1,slot2);});};};var $36$_InfixConst2 = function(slot1,slot2){this.slot1 = slot1;this.slot2 = slot2;};var InfixConst2 = function(slot1){return function(slot2){return new $(function(){return new $36$_InfixConst2(slot1,slot2);});};};var $36$_$36$58$36$$36$61$36$$36$62$36$ = function(slot1,slot2){this.slot1 = slot1;this.slot2 = slot2;};var $58$$61$$62$ = function(slot1){return function(slot2){return new $(function(){return new $36$_$36$58$36$$36$61$36$$36$62$36$(slot1,slot2);});};};var t = new $(function(){return _(_($58$$61$$62$)(_(_(InfixConst1)(123))(123)))(_(_(InfixConst2)(false))(true));});var main = new $(function(){return _(print)(t);});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["user","Ty3",[]],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $36$_$36$58$36$$36$61$36$$36$62$36$) {return {"instance": "$58$$61$$62$","slot1": Fay$$fayToJs(["user","Ty1",[]],_(_obj.slot1)),"slot2": Fay$$fayToJs(["user","Ty2",[]],_(_obj.slot2))};}if (_obj instanceof $36$_InfixConst2) {return {"instance": "InfixConst2","slot1": Fay$$fayToJs(["bool"],_(_obj.slot1)),"slot2": Fay$$fayToJs(["bool"],_(_obj.slot2))};}if (_obj instanceof $36$_InfixConst1) {return {"instance": "InfixConst1","slot1": Fay$$fayToJs(["user","Integer",[]],_(_obj.slot1)),"slot2": Fay$$fayToJs(["user","Integer",[]],_(_obj.slot2))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "$58$$61$$62$") {return new $36$_$36$58$36$$36$61$36$$36$62$36$(Fay$$jsToFay(["user","Ty1",[]],obj["slot1"]),Fay$$jsToFay(["user","Ty2",[]],obj["slot2"]));}if (obj["instance"] === "InfixConst2") {return new $36$_InfixConst2(Fay$$jsToFay(["bool"],obj["slot1"]),Fay$$jsToFay(["bool"],obj["slot2"]));}if (obj["instance"] === "InfixConst1") {return new $36$_InfixConst1(Fay$$jsToFay(["user","Integer",[]],obj["slot1"]),Fay$$jsToFay(["user","Integer",[]],obj["slot2"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;+this.t = t;  // Built-ins this._ = _;@@ -429,6 +528,6 @@  }; ;-var main = new Main();+var main = new Test(); main._(main.main); 
+ tests/ints view
@@ -0,0 +1,1 @@+123
+ tests/ints.hs view
@@ -0,0 +1,13 @@+{-# LANGUAGE NoImplicitPrelude #-}++module Ints where++import           Language.Fay.FFI+import           Language.Fay.Prelude++main = do+  print 123++-- | Print using console.log.+print :: Int -> Fay ()+print = ffi "console.log(%1)"
tests/mutableReference.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE EmptyDataDecls    #-} {-# LANGUAGE NoImplicitPrelude #-} -module Ref where+module MutableReference where  import           Language.Fay.FFI import           Language.Fay.Prelude
tests/mutableReference.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Ref = function(){+var MutableReference = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,11 @@  * Application code.  */ -var main = new $(function(){return _(_($62$$62$$61$)(_(newRef)(Fay$$list("Hello, World!"))))(function($_a){var ref = $_a;return _(_($62$$62$$61$)(_(readRef)(ref)))(function($_a){var x = $_a;return _(_($62$$62$)(_(_(writeRef)(ref))(Fay$$list("Hai!"))))(_(_($62$$62$$61$)(_(readRef)(ref)))(print));});});});var newRef = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["user","Ref",[["unknown"]]]]],new Fay$$Ref(Fay$$fayToJs(["unknown"],$_a)));});};var writeRef = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],Fay$$writeRef(Fay$$fayToJs(["user","Ref",[["unknown"]]],$_a),Fay$$fayToJs(["unknown"],$_b)));});};};var readRef = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],Fay$$readRef(Fay$$fayToJs(["user","Ref",[["unknown"]]],$_a)));});};var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(_($62$$62$$61$)(_(newRef)(Fay$$list("Hello, World!"))))(function($36$_a){var ref = $36$_a;return _(_($62$$62$$61$)(_(readRef)(ref)))(function($36$_a){var x = $36$_a;return _(_($62$$62$)(_(_(writeRef)(ref))(Fay$$list("Hai!"))))(_(_($62$$62$$61$)(_(readRef)(ref)))(print));});});});var newRef = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["user","Ref",[["unknown"]]]]],new Fay$$Ref(Fay$$fayToJs(["unknown"],$36$_a)));});};var writeRef = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],Fay$$writeRef(Fay$$fayToJs(["user","Ref",[["unknown"]]],$36$_a),Fay$$fayToJs(["unknown"],$36$_b)));});};};var readRef = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],Fay$$readRef(Fay$$fayToJs(["user","Ref",[["unknown"]]],$36$_a)));});};var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral; this.max = max; this.min = min; this.mod = mod;@@ -476,6 +530,6 @@  }; ;-var main = new Ref();+var main = new MutableReference(); main._(main.main); 
tests/patternGuards view
@@ -1,3 +1,3 @@-[true,false]-[2,1,0]-[true,false]+[ true, false ]+[ 2, 1, 0 ]+[ true, false ]
tests/patternGuards.hs view
@@ -1,6 +1,8 @@+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE NoImplicitPrelude #-}-module Test where +module PatternGuards where+ -- | As pattern matches  import           Language.Fay.FFI@@ -20,14 +22,13 @@ -- Not called, throws "non-exhaustive guard" nonExhaustive x | x > 1 = True -print :: String -> Fay ()-print = ffi "console.log(%1)"+printD :: [Double] -> Fay ()+printD = ffi "console.log(%1)"+printB :: [Bool] -> Fay ()+printB = ffi "console.log(%1)"  main :: Fay () main = do-  print $ showList $ (isPositive 1, isPositive 0)-  print $ showList $ (threeConds 3, threeConds 1, threeConds 0)-  print $ showList $ (withOtherwise 2, withOtherwise 0)--showList :: Foreign a => [a] -> String-showList = ffi "JSON.stringify(%1)"+  printB [isPositive 1, isPositive 0]+  printD [threeConds 3, threeConds 1, threeConds 0]+  printB [withOtherwise 2, withOtherwise 0]
tests/patternGuards.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Test = function(){+var PatternGuards = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,11 @@  * Application code.  */ -var isPositive = function($_a){return new $(function(){var x = $_a;return _(_(x) > 0) ? true : _(_(_(Fay$$lte)(x))(0)) ? false : (function(){ throw ("Non-exhaustive guards"); })();});};var threeConds = function($_a){return new $(function(){var x = $_a;return _(_(x) > 1) ? 2 : _(_(_(Fay$$eq)(x))(1)) ? 1 : _(_(x) < 1) ? 0 : (function(){ throw ("Non-exhaustive guards"); })();});};var withOtherwise = function($_a){return new $(function(){var x = $_a;return _(_(x) > 1) ? true : false;});};var nonExhaustive = function($_a){return new $(function(){var x = $_a;return _(_(x) > 1) ? true : (function(){ throw ("Non-exhaustive guards"); })();});};var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var main = new $(function(){return _(_($62$$62$)(_(_($36$)(print))(_(_($36$)(showList))(Fay$$list([_(isPositive)(1),_(isPositive)(0)])))))(_(_($62$$62$)(_(_($36$)(print))(_(_($36$)(showList))(Fay$$list([_(threeConds)(3),_(threeConds)(1),_(threeConds)(0)])))))(_(_($36$)(print))(_(_($36$)(showList))(Fay$$list([_(withOtherwise)(2),_(withOtherwise)(0)])))));});var showList = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["list",[["unknown"]]],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var isPositive = function($36$_a){return new $(function(){var x = $36$_a;return _(_(Fay$$gt)(_(x))(0)) ? true : _(_(_(Fay$$lte)(x))(0)) ? false : (function(){ throw ("Non-exhaustive guards"); })();});};var threeConds = function($36$_a){return new $(function(){var x = $36$_a;return _(_(Fay$$gt)(_(x))(1)) ? 2 : _(_(_(Fay$$eq)(x))(1)) ? 1 : _(_(Fay$$lt)(_(x))(1)) ? 0 : (function(){ throw ("Non-exhaustive guards"); })();});};var withOtherwise = function($36$_a){return new $(function(){var x = $36$_a;return _(_(Fay$$gt)(_(x))(1)) ? true : false;});};var nonExhaustive = function($36$_a){return new $(function(){var x = $36$_a;return _(_(Fay$$gt)(_(x))(1)) ? true : (function(){ throw ("Non-exhaustive guards"); })();});};var printD = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["list",[["double"]]],$36$_a)));});};var printB = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["list",[["bool"]]],$36$_a)));});};var main = new $(function(){return _(_($62$$62$)(_(printB)(Fay$$list([_(isPositive)(1),_(isPositive)(0)]))))(_(_($62$$62$)(_(printD)(Fay$$list([_(threeConds)(3),_(threeConds)(1),_(threeConds)(0)]))))(_(printB)(Fay$$list([_(withOtherwise)(2),_(withOtherwise)(0)]))));});var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral; this.max = max; this.min = min; this.mod = mod;@@ -462,9 +516,9 @@ this.fromRational = fromRational; this.fromInteger = fromInteger; this.show = show;-this.showList = showList; this.main = main;-this.print = print;+this.printB = printB;+this.printD = printD; this.nonExhaustive = nonExhaustive; this.withOtherwise = withOtherwise; this.threeConds = threeConds;@@ -478,6 +532,6 @@  }; ;-var main = new Test();+var main = new PatternGuards(); main._(main.main); 
tests/patternMatchFail.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module PatternMatchFail where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ main = print ((\a 'a' -> "OK.") 0 'b')  print :: String -> Fay ()
tests/patternMatchFail.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var PatternMatchFail = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var main = new $(function(){return _(print)(_(_(function($_a){var a = $_a;return function($_b){if (_($_b) === "a") {return Fay$$list("OK.");}throw ["unhandled case",$_b];};throw ["unhandled case",$_a];})(0))("b"));});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(print)(_(_(function($36$_a){var a = $36$_a;return function($36$_b){if (_($36$_b) === "a") {return Fay$$list("OK.");}throw ["unhandled case",$36$_b];};throw ["unhandled case",$36$_a];})(0))("b"));});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new PatternMatchFail(); main._(main.main); 
tests/recordFunctionPatternMatch.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module RecordFunctionPatternMatch where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ data Person = Person String String Int  main = print (foo (Person "Chris" "Done" 14))
tests/recordFunctionPatternMatch.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var RecordFunctionPatternMatch = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,56 @@  * Application code.  */ -var $_Person = function(slot1,slot2,slot3){this.slot1 = slot1;this.slot2 = slot2;this.slot3 = slot3;};var Person = function(slot1){return function(slot2){return function(slot3){return new $(function(){return new $_Person(slot1,slot2,slot3);});};};};var main = new $(function(){return _(print)(_(foo)(_(_(_(Person)(Fay$$list("Chris")))(Fay$$list("Done")))(14)));});var foo = function($_a){return new $(function(){if (_($_a) instanceof $_Person) {if (Fay$$equal(_($_a).slot1,Fay$$list("Chris"))) {if (Fay$$equal(_($_a).slot2,Fay$$list("Done"))) {if (_(_($_a).slot3) === 13) {return Fay$$list("Foo!");}}if (Fay$$equal(_($_a).slot2,Fay$$list("Barf"))) {if (_(_($_a).slot3) === 14) {return Fay$$list("Bar!");}}if (Fay$$equal(_($_a).slot2,Fay$$list("Done"))) {if (_(_($_a).slot3) === 14) {return Fay$$list("Hello!");}}}}return Fay$$list("World!");});};var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $_Person) {return {"instance": "Person","slot1": Fay$$fayToJs(["string"],_(_obj.slot1)),"slot2": Fay$$fayToJs(["string"],_(_obj.slot2)),"slot3": Fay$$fayToJs(["user","Int",[]],_(_obj.slot3))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "Person") {return new $_Person(Fay$$jsToFay(["string"],obj["slot1"]),Fay$$jsToFay(["string"],obj["slot2"]),Fay$$jsToFay(["user","Int",[]],obj["slot3"]));}return obj;};+var $36$_Person = function(slot1,slot2,slot3){this.slot1 = slot1;this.slot2 = slot2;this.slot3 = slot3;};var Person = function(slot1){return function(slot2){return function(slot3){return new $(function(){return new $36$_Person(slot1,slot2,slot3);});};};};var main = new $(function(){return _(print)(_(foo)(_(_(_(Person)(Fay$$list("Chris")))(Fay$$list("Done")))(14)));});var foo = function($36$_a){return new $(function(){if (_($36$_a) instanceof $36$_Person) {if (Fay$$equal(_($36$_a).slot1,Fay$$list("Chris"))) {if (Fay$$equal(_($36$_a).slot2,Fay$$list("Done"))) {if (_(_($36$_a).slot3) === 13) {return Fay$$list("Foo!");}}if (Fay$$equal(_($36$_a).slot2,Fay$$list("Barf"))) {if (_(_($36$_a).slot3) === 14) {return Fay$$list("Bar!");}}if (Fay$$equal(_($36$_a).slot2,Fay$$list("Done"))) {if (_(_($36$_a).slot3) === 14) {return Fay$$list("Hello!");}}}}return Fay$$list("World!");});};var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $36$_Person) {return {"instance": "Person","slot1": Fay$$fayToJs(["string"],_(_obj.slot1)),"slot2": Fay$$fayToJs(["string"],_(_obj.slot2)),"slot3": Fay$$fayToJs(["int"],_(_obj.slot3))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "Person") {return new $36$_Person(Fay$$jsToFay(["string"],obj["slot1"]),Fay$$jsToFay(["string"],obj["slot2"]),Fay$$jsToFay(["int"],obj["slot3"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print;+this.foo = foo; this.main = main;  // Built-ins@@ -429,6 +528,6 @@  }; ;-var main = new Main();+var main = new RecordFunctionPatternMatch(); main._(main.main); 
tests/recordPatternMatch.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module RecordPatternMatch where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ data Person = Person String String Int  main = print (case Person "Chris" "Done" 14 of
tests/recordPatternMatch.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var RecordPatternMatch = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var $_Person = function(slot1,slot2,slot3){this.slot1 = slot1;this.slot2 = slot2;this.slot3 = slot3;};var Person = function(slot1){return function(slot2){return function(slot3){return new $(function(){return new $_Person(slot1,slot2,slot3);});};};};var main = new $(function(){return _(print)((function($tmp){if (_($tmp) instanceof $_Person) {if (Fay$$equal(_($tmp).slot1,Fay$$list("Chris"))) {if (Fay$$equal(_($tmp).slot2,Fay$$list("Done"))) {if (_(_($tmp).slot3) === 13) {return Fay$$list("Hello!");}}}}return Fay$$list("World!");})(_(_(_(Person)(Fay$$list("Chris")))(Fay$$list("Done")))(14)));});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $_Person) {return {"instance": "Person","slot1": Fay$$fayToJs(["string"],_(_obj.slot1)),"slot2": Fay$$fayToJs(["string"],_(_obj.slot2)),"slot3": Fay$$fayToJs(["user","Int",[]],_(_obj.slot3))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "Person") {return new $_Person(Fay$$jsToFay(["string"],obj["slot1"]),Fay$$jsToFay(["string"],obj["slot2"]),Fay$$jsToFay(["user","Int",[]],obj["slot3"]));}return obj;};+var $36$_Person = function(slot1,slot2,slot3){this.slot1 = slot1;this.slot2 = slot2;this.slot3 = slot3;};var Person = function(slot1){return function(slot2){return function(slot3){return new $(function(){return new $36$_Person(slot1,slot2,slot3);});};};};var main = new $(function(){return _(print)((function($tmp){if (_($tmp) instanceof $36$_Person) {if (Fay$$equal(_($tmp).slot1,Fay$$list("Chris"))) {if (Fay$$equal(_($tmp).slot2,Fay$$list("Done"))) {if (_(_($tmp).slot3) === 13) {return Fay$$list("Hello!");}}}}return Fay$$list("World!");})(_(_(_(Person)(Fay$$list("Chris")))(Fay$$list("Done")))(14)));});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $36$_Person) {return {"instance": "Person","slot1": Fay$$fayToJs(["string"],_(_obj.slot1)),"slot2": Fay$$fayToJs(["string"],_(_obj.slot2)),"slot3": Fay$$fayToJs(["int"],_(_obj.slot3))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "Person") {return new $36$_Person(Fay$$jsToFay(["string"],obj["slot1"]),Fay$$jsToFay(["string"],obj["slot2"]),Fay$$jsToFay(["int"],obj["slot3"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new RecordPatternMatch(); main._(main.main); 
tests/recordPatternMatch2.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module RecordPatternMatch2 where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ data Person = Person String String Int  main = print (case Person "Chris" "Done" 14 of
tests/recordPatternMatch2.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var RecordPatternMatch2 = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var $_Person = function(slot1,slot2,slot3){this.slot1 = slot1;this.slot2 = slot2;this.slot3 = slot3;};var Person = function(slot1){return function(slot2){return function(slot3){return new $(function(){return new $_Person(slot1,slot2,slot3);});};};};var main = new $(function(){return _(print)((function($tmp){if (_($tmp) instanceof $_Person) {if (Fay$$equal(_($tmp).slot1,Fay$$list("Chris"))) {if (Fay$$equal(_($tmp).slot2,Fay$$list("Done"))) {if (_(_($tmp).slot3) === 13) {return Fay$$list("Foo!");}}if (Fay$$equal(_($tmp).slot2,Fay$$list("Barf"))) {if (_(_($tmp).slot3) === 14) {return Fay$$list("Bar!");}}if (Fay$$equal(_($tmp).slot2,Fay$$list("Done"))) {if (_(_($tmp).slot3) === 14) {return Fay$$list("Hello!");}}}}return Fay$$list("World!");})(_(_(_(Person)(Fay$$list("Chris")))(Fay$$list("Done")))(14)));});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $_Person) {return {"instance": "Person","slot1": Fay$$fayToJs(["string"],_(_obj.slot1)),"slot2": Fay$$fayToJs(["string"],_(_obj.slot2)),"slot3": Fay$$fayToJs(["user","Int",[]],_(_obj.slot3))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "Person") {return new $_Person(Fay$$jsToFay(["string"],obj["slot1"]),Fay$$jsToFay(["string"],obj["slot2"]),Fay$$jsToFay(["user","Int",[]],obj["slot3"]));}return obj;};+var $36$_Person = function(slot1,slot2,slot3){this.slot1 = slot1;this.slot2 = slot2;this.slot3 = slot3;};var Person = function(slot1){return function(slot2){return function(slot3){return new $(function(){return new $36$_Person(slot1,slot2,slot3);});};};};var main = new $(function(){return _(print)((function($tmp){if (_($tmp) instanceof $36$_Person) {if (Fay$$equal(_($tmp).slot1,Fay$$list("Chris"))) {if (Fay$$equal(_($tmp).slot2,Fay$$list("Done"))) {if (_(_($tmp).slot3) === 13) {return Fay$$list("Foo!");}}if (Fay$$equal(_($tmp).slot2,Fay$$list("Barf"))) {if (_(_($tmp).slot3) === 14) {return Fay$$list("Bar!");}}if (Fay$$equal(_($tmp).slot2,Fay$$list("Done"))) {if (_(_($tmp).slot3) === 14) {return Fay$$list("Hello!");}}}}return Fay$$list("World!");})(_(_(_(Person)(Fay$$list("Chris")))(Fay$$list("Done")))(14)));});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $36$_Person) {return {"instance": "Person","slot1": Fay$$fayToJs(["string"],_(_obj.slot1)),"slot2": Fay$$fayToJs(["string"],_(_obj.slot2)),"slot3": Fay$$fayToJs(["int"],_(_obj.slot3))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "Person") {return new $36$_Person(Fay$$jsToFay(["string"],obj["slot1"]),Fay$$jsToFay(["string"],obj["slot2"]),Fay$$jsToFay(["int"],obj["slot3"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new RecordPatternMatch2(); main._(main.main); 
tests/recordUseBeforeDefine.hs view
@@ -1,15 +1,20 @@ {-# LANGUAGE NoImplicitPrelude #-} +module RecordUseBeforeDefine where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ import           Hierarchical.RecordDefined -f :: R -> Integer+f :: R -> Double f (R i) = i  main = do   print $ f (R 1)   print $ g (Callback 1) -data R = R Integer+data R = R Double  print :: Double -> Fay () print = ffi "console.log(%1)"
tests/recordUseBeforeDefine.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var RecordUseBeforeDefine = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,9 +468,57 @@  * Application code.  */ -var $_Callback = function(slot1){this.slot1 = slot1;};var Callback = function(slot1){return new $(function(){return new $_Callback(slot1);});};var g = function($_a){return new $(function(){if (_($_a) instanceof $_Callback) {var a = _($_a).slot1;return a;}throw ["unhandled case in Ident \"g\"",[$_a]];});};var f = function($_a){return new $(function(){if (_($_a) instanceof $_R) {var i = _($_a).slot1;return i;}throw ["unhandled case in Ident \"f\"",[$_a]];});};var main = new $(function(){return _(_($62$$62$)(_(_($36$)(print))(_(f)(_(R)(1)))))(_(_($36$)(print))(_(g)(_(Callback)(1))));});var $_R = function(slot1){this.slot1 = slot1;};var R = function(slot1){return new $(function(){return new $_R(slot1);});};var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["double"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $_R) {return {"instance": "R","slot1": Fay$$fayToJs(["user","Integer",[]],_(_obj.slot1))};}if (_obj instanceof $_Callback) {return {"instance": "Callback","slot1": Fay$$fayToJs(["user","Integer",[]],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "R") {return new $_R(Fay$$jsToFay(["user","Integer",[]],obj["slot1"]));}if (obj["instance"] === "Callback") {return new $_Callback(Fay$$jsToFay(["user","Integer",[]],obj["slot1"]));}return obj;};+var $36$_Callback = function(slot1){this.slot1 = slot1;};var Callback = function(slot1){return new $(function(){return new $36$_Callback(slot1);});};var g = function($36$_a){return new $(function(){if (_($36$_a) instanceof $36$_Callback) {var a = _($36$_a).slot1;return a;}throw ["unhandled case in Ident \"g\"",[$36$_a]];});};var f = function($36$_a){return new $(function(){if (_($36$_a) instanceof $36$_R) {var i = _($36$_a).slot1;return i;}throw ["unhandled case in Ident \"f\"",[$36$_a]];});};var main = new $(function(){return _(_($62$$62$)(_(_($36$)(print))(_(f)(_(R)(1)))))(_(_($36$)(print))(_(g)(_(Callback)(1))));});var $36$_R = function(slot1){this.slot1 = slot1;};var R = function(slot1){return new $(function(){return new $36$_R(slot1);});};var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["double"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $36$_R) {return {"instance": "R","slot1": Fay$$fayToJs(["double"],_(_obj.slot1))};}if (_obj instanceof $36$_Callback) {return {"instance": "Callback","slot1": Fay$$fayToJs(["double"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "R") {return new $36$_R(Fay$$jsToFay(["double"],obj["slot1"]));}if (obj["instance"] === "Callback") {return new $36$_Callback(Fay$$jsToFay(["double"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;+this.f = f;  // Built-ins this._ = _;@@ -429,6 +528,6 @@  }; ;-var main = new Main();+var main = new RecordUseBeforeDefine(); main._(main.main); 
tests/records.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module Records where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ data Person1 = Person1 String String Int data Person2 = Person2 { fname :: String, sname :: String, age :: Int } data Person3 = Person3 { slot3 :: String, slot2 :: String, slot1 :: Int }
tests/records.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var Records = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,9 +468,66 @@  * Application code.  */ -var $_Person1 = function(slot1,slot2,slot3){this.slot1 = slot1;this.slot2 = slot2;this.slot3 = slot3;};var Person1 = function(slot1){return function(slot2){return function(slot3){return new $(function(){return new $_Person1(slot1,slot2,slot3);});};};};var $_Person2 = function(fname,sname,age){this.fname = fname;this.sname = sname;this.age = age;};var Person2 = function(fname){return function(sname){return function(age){return new $(function(){return new $_Person2(fname,sname,age);});};};};var fname = function(x){return new $(function(){return _(x).fname;});};var sname = function(x){return new $(function(){return _(x).sname;});};var age = function(x){return new $(function(){return _(x).age;});};var $_Person3 = function(slot3,slot2,slot1){this.slot3 = slot3;this.slot2 = slot2;this.slot1 = slot1;};var Person3 = function(slot3){return function(slot2){return function(slot1){return new $(function(){return new $_Person3(slot3,slot2,slot1);});};};};var slot3 = function(x){return new $(function(){return _(x).slot3;});};var slot2 = function(x){return new $(function(){return _(x).slot2;});};var slot1 = function(x){return new $(function(){return _(x).slot1;});};var p1 = new $(function(){return _(_(_(Person1)(Fay$$list("Chris")))(Fay$$list("Done")))(13);});var p2 = new $(function(){return _(_(_(Person2)(Fay$$list("Chris")))(Fay$$list("Done")))(13);});var p2a = new $(function(){var person2 = new $_Person2();person2.fname = Fay$$list("Chris");person2.sname = Fay$$list("Done");person2.age = 13;return person2;});var p3 = new $(function(){return _(_(_(Person3)(Fay$$list("Chris")))(Fay$$list("Done")))(13);});var main = new $(function(){return _(_($62$$62$)(_(print)((function($_p1){if (_($_p1) instanceof $_Person1) {if (Fay$$equal(_($_p1).slot1,Fay$$list("Chris"))) {if (Fay$$equal(_($_p1).slot2,Fay$$list("Done"))) {if (_(_($_p1).slot3) === 13) {return Fay$$list("Hello!");}}}}return (function(){ throw (["unhandled case",$_p1]); })();})(p1))))(_(_($62$$62$)(_(print)((function($_p2){if (_($_p2) instanceof $_Person2) {if (Fay$$equal(_($_p2).fname,Fay$$list("Chris"))) {if (Fay$$equal(_($_p2).sname,Fay$$list("Done"))) {if (_(_($_p2).age) === 13) {return Fay$$list("Hello!");}}}}return (function(){ throw (["unhandled case",$_p2]); })();})(p2))))(_(_($62$$62$)(_(print)((function($_p2a){if (_($_p2a) instanceof $_Person2) {if (Fay$$equal(_($_p2a).fname,Fay$$list("Chris"))) {if (Fay$$equal(_($_p2a).sname,Fay$$list("Done"))) {if (_(_($_p2a).age) === 13) {return Fay$$list("Hello!");}}}}return (function(){ throw (["unhandled case",$_p2a]); })();})(p2a))))(_(print)((function($_p3){if (_($_p3) instanceof $_Person3) {if (Fay$$equal(_($_p3).slot3,Fay$$list("Chris"))) {if (Fay$$equal(_($_p3).slot2,Fay$$list("Done"))) {if (_(_($_p3).slot1) === 13) {return Fay$$list("Hello!");}}}}return (function(){ throw (["unhandled case",$_p3]); })();})(p3)))));});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $_Person3) {return {"instance": "Person3","slot3": Fay$$fayToJs(["string"],_(_obj.slot3)),"slot2": Fay$$fayToJs(["string"],_(_obj.slot2)),"slot1": Fay$$fayToJs(["user","Int",[]],_(_obj.slot1))};}if (_obj instanceof $_Person2) {return {"instance": "Person2","fname": Fay$$fayToJs(["string"],_(_obj.fname)),"sname": Fay$$fayToJs(["string"],_(_obj.sname)),"age": Fay$$fayToJs(["user","Int",[]],_(_obj.age))};}if (_obj instanceof $_Person1) {return {"instance": "Person1","slot1": Fay$$fayToJs(["string"],_(_obj.slot1)),"slot2": Fay$$fayToJs(["string"],_(_obj.slot2)),"slot3": Fay$$fayToJs(["user","Int",[]],_(_obj.slot3))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "Person3") {return new $_Person3(Fay$$jsToFay(["string"],obj["slot3"]),Fay$$jsToFay(["string"],obj["slot2"]),Fay$$jsToFay(["user","Int",[]],obj["slot1"]));}if (obj["instance"] === "Person2") {return new $_Person2(Fay$$jsToFay(["string"],obj["fname"]),Fay$$jsToFay(["string"],obj["sname"]),Fay$$jsToFay(["user","Int",[]],obj["age"]));}if (obj["instance"] === "Person1") {return new $_Person1(Fay$$jsToFay(["string"],obj["slot1"]),Fay$$jsToFay(["string"],obj["slot2"]),Fay$$jsToFay(["user","Int",[]],obj["slot3"]));}return obj;};+var $36$_Person1 = function(slot1,slot2,slot3){this.slot1 = slot1;this.slot2 = slot2;this.slot3 = slot3;};var Person1 = function(slot1){return function(slot2){return function(slot3){return new $(function(){return new $36$_Person1(slot1,slot2,slot3);});};};};var $36$_Person2 = function(fname,sname,age){this.fname = fname;this.sname = sname;this.age = age;};var Person2 = function(fname){return function(sname){return function(age){return new $(function(){return new $36$_Person2(fname,sname,age);});};};};var fname = function(x){return new $(function(){return _(x).fname;});};var sname = function(x){return new $(function(){return _(x).sname;});};var age = function(x){return new $(function(){return _(x).age;});};var $36$_Person3 = function(slot3,slot2,slot1){this.slot3 = slot3;this.slot2 = slot2;this.slot1 = slot1;};var Person3 = function(slot3){return function(slot2){return function(slot1){return new $(function(){return new $36$_Person3(slot3,slot2,slot1);});};};};var slot3 = function(x){return new $(function(){return _(x).slot3;});};var slot2 = function(x){return new $(function(){return _(x).slot2;});};var slot1 = function(x){return new $(function(){return _(x).slot1;});};var p1 = new $(function(){return _(_(_(Person1)(Fay$$list("Chris")))(Fay$$list("Done")))(13);});var p2 = new $(function(){return _(_(_(Person2)(Fay$$list("Chris")))(Fay$$list("Done")))(13);});var p2a = new $(function(){var person2 = new $36$_Person2();person2.fname = Fay$$list("Chris");person2.sname = Fay$$list("Done");person2.age = 13;return person2;});var p3 = new $(function(){return _(_(_(Person3)(Fay$$list("Chris")))(Fay$$list("Done")))(13);});var main = new $(function(){return _(_($62$$62$)(_(print)((function($36$_p1){if (_($36$_p1) instanceof $36$_Person1) {if (Fay$$equal(_($36$_p1).slot1,Fay$$list("Chris"))) {if (Fay$$equal(_($36$_p1).slot2,Fay$$list("Done"))) {if (_(_($36$_p1).slot3) === 13) {return Fay$$list("Hello!");}}}}return (function(){ throw (["unhandled case",$36$_p1]); })();})(p1))))(_(_($62$$62$)(_(print)((function($36$_p2){if (_($36$_p2) instanceof $36$_Person2) {if (Fay$$equal(_($36$_p2).fname,Fay$$list("Chris"))) {if (Fay$$equal(_($36$_p2).sname,Fay$$list("Done"))) {if (_(_($36$_p2).age) === 13) {return Fay$$list("Hello!");}}}}return (function(){ throw (["unhandled case",$36$_p2]); })();})(p2))))(_(_($62$$62$)(_(print)((function($36$_p2a){if (_($36$_p2a) instanceof $36$_Person2) {if (Fay$$equal(_($36$_p2a).fname,Fay$$list("Chris"))) {if (Fay$$equal(_($36$_p2a).sname,Fay$$list("Done"))) {if (_(_($36$_p2a).age) === 13) {return Fay$$list("Hello!");}}}}return (function(){ throw (["unhandled case",$36$_p2a]); })();})(p2a))))(_(print)((function($36$_p3){if (_($36$_p3) instanceof $36$_Person3) {if (Fay$$equal(_($36$_p3).slot3,Fay$$list("Chris"))) {if (Fay$$equal(_($36$_p3).slot2,Fay$$list("Done"))) {if (_(_($36$_p3).slot1) === 13) {return Fay$$list("Hello!");}}}}return (function(){ throw (["unhandled case",$36$_p3]); })();})(p3)))));});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}if (_obj instanceof $36$_Person3) {return {"instance": "Person3","slot3": Fay$$fayToJs(["string"],_(_obj.slot3)),"slot2": Fay$$fayToJs(["string"],_(_obj.slot2)),"slot1": Fay$$fayToJs(["int"],_(_obj.slot1))};}if (_obj instanceof $36$_Person2) {return {"instance": "Person2","fname": Fay$$fayToJs(["string"],_(_obj.fname)),"sname": Fay$$fayToJs(["string"],_(_obj.sname)),"age": Fay$$fayToJs(["int"],_(_obj.age))};}if (_obj instanceof $36$_Person1) {return {"instance": "Person1","slot1": Fay$$fayToJs(["string"],_(_obj.slot1)),"slot2": Fay$$fayToJs(["string"],_(_obj.slot2)),"slot3": Fay$$fayToJs(["int"],_(_obj.slot3))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}if (obj["instance"] === "Person3") {return new $36$_Person3(Fay$$jsToFay(["string"],obj["slot3"]),Fay$$jsToFay(["string"],obj["slot2"]),Fay$$jsToFay(["int"],obj["slot1"]));}if (obj["instance"] === "Person2") {return new $36$_Person2(Fay$$jsToFay(["string"],obj["fname"]),Fay$$jsToFay(["string"],obj["sname"]),Fay$$jsToFay(["int"],obj["age"]));}if (obj["instance"] === "Person1") {return new $36$_Person1(Fay$$jsToFay(["string"],obj["slot1"]),Fay$$jsToFay(["string"],obj["slot2"]),Fay$$jsToFay(["int"],obj["slot3"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;+this.p3 = p3;+this.p2a = p2a;+this.p2 = p2;+this.p1 = p1;+this.slot1 = slot1;+this.slot2 = slot2;+this.slot3 = slot3;+this.age = age;+this.sname = sname;+this.fname = fname;  // Built-ins this._ = _;@@ -429,6 +537,6 @@  }; ;-var main = new Main();+var main = new Records(); main._(main.main); 
tests/reservedWords.hs view
@@ -1,6 +1,8 @@ {-# LANGUAGE EmptyDataDecls    #-} {-# LANGUAGE NoImplicitPrelude #-} +module ReservedWords where+ import           Language.Fay.FFI import           Language.Fay.Prelude 
tests/reservedWords.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var ReservedWords = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var main = new $(function(){return _(_($62$$62$)((function(){var $_break = new $(function(){return Fay$$list("break");});return _(printS)($_break);})()))(_(_($62$$62$)((function(){var $_catch = new $(function(){return Fay$$list("catch");});return _(printS)($_catch);})()))(_(_($62$$62$)((function(){var $_const = new $(function(){return Fay$$list("const");});return _(printS)($_const);})()))(_(_($62$$62$)((function(){var $_continue = new $(function(){return Fay$$list("continue");});return _(printS)($_continue);})()))(_(_($62$$62$)((function(){var $_debugger = new $(function(){return Fay$$list("debugger");});return _(printS)($_debugger);})()))(_(_($62$$62$)((function(){var $_delete = new $(function(){return Fay$$list("delete");});return _(printS)($_delete);})()))(_(_($62$$62$)((function(){var $_enum = new $(function(){return Fay$$list("enum");});return _(printS)($_enum);})()))(_(_($62$$62$)((function(){var $_export = new $(function(){return Fay$$list("export");});return _(printS)($_export);})()))(_(_($62$$62$)((function(){var $_extends = new $(function(){return Fay$$list("extends");});return _(printS)($_extends);})()))(_(_($62$$62$)((function(){var $_finally = new $(function(){return Fay$$list("finally");});return _(printS)($_finally);})()))(_(_($62$$62$)((function(){var $_for = new $(function(){return Fay$$list("for");});return _(printS)($_for);})()))(_(_($62$$62$)((function(){var $_function = new $(function(){return Fay$$list("function");});return _(printS)($_function);})()))(_(_($62$$62$)((function(){var $_implements = new $(function(){return Fay$$list("implements");});return _(printS)($_implements);})()))(_(_($62$$62$)((function(){var $_instanceof = new $(function(){return Fay$$list("instanceof");});return _(printS)($_instanceof);})()))(_(_($62$$62$)((function(){var $_interface = new $(function(){return Fay$$list("interface");});return _(printS)($_interface);})()))(_(_($62$$62$)((function(){var $_new = new $(function(){return Fay$$list("new");});return _(printS)($_new);})()))(_(_($62$$62$)((function(){var $_null = new $(function(){return Fay$$list("null");});return _(printS)($_null);})()))(_(_($62$$62$)((function(){var $_package = new $(function(){return Fay$$list("package");});return _(printS)($_package);})()))(_(_($62$$62$)((function(){var $_private = new $(function(){return Fay$$list("private");});return _(printS)($_private);})()))(_(_($62$$62$)((function(){var $_protected = new $(function(){return Fay$$list("protected");});return _(printS)($_protected);})()))(_(_($62$$62$)((function(){var $_public = new $(function(){return Fay$$list("public");});return _(printS)($_public);})()))(_(_($62$$62$)((function(){var $_return = new $(function(){return Fay$$list("return");});return _(printS)($_return);})()))(_(_($62$$62$)((function(){var $_static = new $(function(){return Fay$$list("static");});return _(printS)($_static);})()))(_(_($62$$62$)((function(){var $_super = new $(function(){return Fay$$list("super");});return _(printS)($_super);})()))(_(_($62$$62$)((function(){var $_switch = new $(function(){return Fay$$list("switch");});return _(printS)($_switch);})()))(_(_($62$$62$)((function(){var $_this = new $(function(){return Fay$$list("this");});return _(printS)($_this);})()))(_(_($62$$62$)((function(){var $_throw = new $(function(){return Fay$$list("throw");});return _(printS)($_throw);})()))(_(_($62$$62$)((function(){var $_try = new $(function(){return Fay$$list("try");});return _(printS)($_try);})()))(_(_($62$$62$)((function(){var $_typeof = new $(function(){return Fay$$list("typeof");});return _(printS)($_typeof);})()))(_(_($62$$62$)((function(){var $_undefined = new $(function(){return Fay$$list("undefined");});return _(printS)($_undefined);})()))(_(_($62$$62$)((function(){var $_var = new $(function(){return Fay$$list("var");});return _(printS)($_var);})()))(_(_($62$$62$)((function(){var $_void = new $(function(){return Fay$$list("void");});return _(printS)($_void);})()))(_(_($62$$62$)((function(){var $_while = new $(function(){return Fay$$list("while");});return _(printS)($_while);})()))(_(_($62$$62$)((function(){var $_with = new $(function(){return Fay$$list("with");});return _(printS)($_with);})()))(_(_($62$$62$)((function(){var $_yield = new $(function(){return Fay$$list("yield");});return _(printS)($_yield);})()))(_(_($62$$62$)(_(printS)(Fay$$list(""))))(_(_($36$)(printS))(_(_($_const)(Fay$$list("stdconst")))(2))))))))))))))))))))))))))))))))))))));});var printS = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(_($62$$62$)((function(){var $_break = new $(function(){return Fay$$list("break");});return _(printS)($_break);})()))(_(_($62$$62$)((function(){var $_catch = new $(function(){return Fay$$list("catch");});return _(printS)($_catch);})()))(_(_($62$$62$)((function(){var $_const = new $(function(){return Fay$$list("const");});return _(printS)($_const);})()))(_(_($62$$62$)((function(){var $_continue = new $(function(){return Fay$$list("continue");});return _(printS)($_continue);})()))(_(_($62$$62$)((function(){var $_debugger = new $(function(){return Fay$$list("debugger");});return _(printS)($_debugger);})()))(_(_($62$$62$)((function(){var $_delete = new $(function(){return Fay$$list("delete");});return _(printS)($_delete);})()))(_(_($62$$62$)((function(){var $_enum = new $(function(){return Fay$$list("enum");});return _(printS)($_enum);})()))(_(_($62$$62$)((function(){var $_export = new $(function(){return Fay$$list("export");});return _(printS)($_export);})()))(_(_($62$$62$)((function(){var $_extends = new $(function(){return Fay$$list("extends");});return _(printS)($_extends);})()))(_(_($62$$62$)((function(){var $_finally = new $(function(){return Fay$$list("finally");});return _(printS)($_finally);})()))(_(_($62$$62$)((function(){var $_for = new $(function(){return Fay$$list("for");});return _(printS)($_for);})()))(_(_($62$$62$)((function(){var $_function = new $(function(){return Fay$$list("function");});return _(printS)($_function);})()))(_(_($62$$62$)((function(){var $_implements = new $(function(){return Fay$$list("implements");});return _(printS)($_implements);})()))(_(_($62$$62$)((function(){var $_instanceof = new $(function(){return Fay$$list("instanceof");});return _(printS)($_instanceof);})()))(_(_($62$$62$)((function(){var $_interface = new $(function(){return Fay$$list("interface");});return _(printS)($_interface);})()))(_(_($62$$62$)((function(){var $_new = new $(function(){return Fay$$list("new");});return _(printS)($_new);})()))(_(_($62$$62$)((function(){var $_null = new $(function(){return Fay$$list("null");});return _(printS)($_null);})()))(_(_($62$$62$)((function(){var $_package = new $(function(){return Fay$$list("package");});return _(printS)($_package);})()))(_(_($62$$62$)((function(){var $_private = new $(function(){return Fay$$list("private");});return _(printS)($_private);})()))(_(_($62$$62$)((function(){var $_protected = new $(function(){return Fay$$list("protected");});return _(printS)($_protected);})()))(_(_($62$$62$)((function(){var $_public = new $(function(){return Fay$$list("public");});return _(printS)($_public);})()))(_(_($62$$62$)((function(){var $_return = new $(function(){return Fay$$list("return");});return _(printS)($_return);})()))(_(_($62$$62$)((function(){var $_static = new $(function(){return Fay$$list("static");});return _(printS)($_static);})()))(_(_($62$$62$)((function(){var $_super = new $(function(){return Fay$$list("super");});return _(printS)($_super);})()))(_(_($62$$62$)((function(){var $_switch = new $(function(){return Fay$$list("switch");});return _(printS)($_switch);})()))(_(_($62$$62$)((function(){var $_this = new $(function(){return Fay$$list("this");});return _(printS)($_this);})()))(_(_($62$$62$)((function(){var $_throw = new $(function(){return Fay$$list("throw");});return _(printS)($_throw);})()))(_(_($62$$62$)((function(){var $_try = new $(function(){return Fay$$list("try");});return _(printS)($_try);})()))(_(_($62$$62$)((function(){var $_typeof = new $(function(){return Fay$$list("typeof");});return _(printS)($_typeof);})()))(_(_($62$$62$)((function(){var $_undefined = new $(function(){return Fay$$list("undefined");});return _(printS)($_undefined);})()))(_(_($62$$62$)((function(){var $_var = new $(function(){return Fay$$list("var");});return _(printS)($_var);})()))(_(_($62$$62$)((function(){var $_void = new $(function(){return Fay$$list("void");});return _(printS)($_void);})()))(_(_($62$$62$)((function(){var $_while = new $(function(){return Fay$$list("while");});return _(printS)($_while);})()))(_(_($62$$62$)((function(){var $_with = new $(function(){return Fay$$list("with");});return _(printS)($_with);})()))(_(_($62$$62$)((function(){var $_yield = new $(function(){return Fay$$list("yield");});return _(printS)($_yield);})()))(_(_($62$$62$)(_(printS)(Fay$$list(""))))(_(_($36$)(printS))(_(_($_const)(Fay$$list("stdconst")))(2))))))))))))))))))))))))))))))))))))));});var printS = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.printS = printS; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new ReservedWords(); main._(main.main); 
tests/tailRecursion.hs view
@@ -14,7 +14,7 @@ sum n acc = sum (n - 1) (acc + n)  getSeconds :: Fay Double-getSeconds = foreignFay "new Date"+getSeconds = ffi "new Date"  print :: Double -> Fay () print = ffi "console.log(%1)"
tests/tailRecursion.js view
@@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,11 @@  * Application code.  */ -var main = new $(function(){return _(print)(_(_(sum)(100000))(0));});var sum = function($_a){return function($_b){return new $(function(){var acc = $_b;if (_($_a) === 0) {return acc;}var acc = $_b;var n = $_a;return _(_(sum)(_(n) - 1))(_(acc) + _(n));});};};var getSeconds = new $(function(){return _(foreignFay)(Fay$$list("new Date"));});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["double"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(print)(_(_(sum)(100000))(0));});var sum = function($36$_a){return function($36$_b){return new $(function(){var acc = $36$_b;if (_($36$_a) === 0) {return acc;}var acc = $36$_b;var n = $36$_a;return _(_(sum)(_(Fay$$sub)(_(n))(1)))(_(Fay$$add)(_(acc))(_(n)));});};};var getSeconds = new $(function(){return Fay$$jsToFay(["action",[["double"]]],new Date);});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["double"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral; this.max = max; this.min = min; this.mod = mod;
tests/then.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module Then where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ main = print "Hello," >> print "World!"  print :: String -> Fay ()
tests/then.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var Then = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var main = new $(function(){return _(_($62$$62$)(_(print)(Fay$$list("Hello,"))))(_(print)(Fay$$list("World!")));});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(_($62$$62$)(_(print)(Fay$$list("Hello,"))))(_(print)(Fay$$list("World!")));});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new Then(); main._(main.main); 
tests/utf8 view
@@ -1,4 +1,4 @@-¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ+¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ Ā ā Ă ă Ą ą Ć ć Ĉ ĉ Ċ ċ Č č Ď ď Đ đ Ē ē Ĕ ĕ Ė ė Ę ę Ě ě Ĝ ĝ Ğ ğ Ġ ġ Ģ ģ Ĥ ĥ Ħ ħ Ĩ ĩ Ī ī Ĭ ĭ Į į İ ı IJ ij Ĵ ĵ Ķ ķ ĸ Ĺ ĺ Ļ ļ Ľ ľ Ŀ ŀ Ł ł Ń ń Ņ ņ Ň ň ʼn Ŋ ŋ Ō ō Ŏ ŏ Ő ő Œ œ Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ŝ ŝ Ş ş Š š Ţ ţ Ť ť Ŧ ŧ Ũ ũ Ū ū Ŭ ŭ Ů ů Ű ű Ų ų Ŵ ŵ Ŷ ŷ Ÿ Ź ź Ż ż Ž ž ſ ƀ Ɓ Ƃ ƃ Ƅ ƅ Ɔ Ƈ ƈ Ɖ Ɗ Ƌ ƌ ƍ Ǝ Ə Ɛ Ƒ ƒ Ɠ Ɣ ƕ Ɩ Ɨ Ƙ ƙ ƚ ƛ Ɯ Ɲ ƞ Ɵ Ơ ơ Ƣ ƣ Ƥ ƥ Ʀ Ƨ ƨ Ʃ ƪ ƫ Ƭ ƭ Ʈ Ư ư Ʊ Ʋ Ƴ ƴ Ƶ ƶ Ʒ Ƹ ƹ ƺ ƻ Ƽ ƽ ƾ ƿ ǀ ǁ ǂ ǃ DŽ Dž dž LJ Lj lj NJ Nj nj Ǎ ǎ Ǐ ǐ Ǒ ǒ Ǔ ǔ Ǖ ǖ Ǘ ǘ Ǚ ǚ Ǜ ǜ ǝ Ǟ ǟ Ǡ ǡ Ǣ ǣ Ǥ ǥ Ǧ ǧ Ǩ ǩ Ǫ ǫ Ǭ ǭ Ǯ ǯ ǰ DZ Dz dz Ǵ ǵ Ǻ ǻ Ǽ ǽ Ǿ ǿ Ȁ ȁ Ȃ ȃ ... ɐ ɑ ɒ ɓ ɔ ɕ ɖ ɗ ɘ ə ɚ ɛ ɜ ɝ ɞ ɟ ɠ ɡ ɢ ɣ ɤ ɥ ɦ ɧ ɨ ɩ ɪ ɫ ɬ ɭ ɮ ɯ ɰ ɱ ɲ ɳ ɴ ɵ ɶ ɷ ɸ ɹ ɺ ɻ ɼ ɽ ɾ ɿ ʀ ʁ ʂ ʃ ʄ ʅ ʆ ʇ ʈ ʉ ʊ ʋ ʌ ʍ ʎ ʏ ʐ ʑ ʒ ʓ ʔ ʕ ʖ ʗ ʘ ʙ ʚ ʛ ʜ ʝ ʞ ʟ ʠ ʡ ʢ ʣ ʤ ʥ ʦ ʧ ʨ@@ -52,7 +52,6 @@ ㌀ ㌁ ㌂ ㌃ ㌄ ㌅ ㌆ ㌇ ㌈ ㌉ ㌊ ㌋ ㌌ ㌍ ㌎ ㌏ ㌐ ㌑ ㌒ ㌓ ㌔ ㌕ ㌖ ㌗ ㌘ ㌙ ㌚ ㌛ ㌜ ㌝ ㌞ ㌟ ㌠ ㌡ ㌢ ㌣ ㌤ ㌥ ㌦ ㌧ ㌨ ㌩ ㌪ ㌫ ㌬ ㌭ ㌮ ㌯ ㌰ ㌱ ㌲ ㌳ ㌴ ㌵ ㌶ ㌷ ㌸ ㌹ ㌺ ㌻ ㌼ ㌽ ㌾ ㌿ ㍀ ㍁ ㍂ ㍃ ㍄ ㍅ ㍆ ㍇ ㍈ ㍉ ㍊ ㍋ ㍌ ㍍ ㍎ ㍏ ㍐ ㍑ ㍒ ㍓ ㍔ ㍕ ㍖ ㍗ ㍘ ㍙ ㍚ ㍛ ㍜ ㍝ ㍞ ㍟ ㍠ ㍡ ㍢ ㍣ ㍤ ㍥ ㍦ ㍧ ㍨ ㍩ ㍪ ㍫ ㍬ ㍭ ㍮ ㍯ ㍰ ㍱ ㍲ ㍳ ㍴ ㍵ ㍶ ㍻ ㍼ ㍽ ㍾ ㍿ ㎀ ㎁ ㎂ ㎃ ... 一 丁 丂 七 丄 丅 丆 万 丈 三 上 下 丌 不 与 丏 丐 丑 丒 专 且 丕 世 丗 丘 丙 业 丛 东 丝 丞 丟 丠 両 丢 丣 两 严 並 丧 丨 丩 个 丫 丬 中 丮 丯 丰 丱 串 丳 临 丵 丶 丷 丸 丹 为 主 丼 丽 举 丿 乀 乁 乂 乃 乄 久 乆 乇 么 义 乊 之 乌 乍 乎 乏 乐 乑 乒 乓 乔 乕 乖 乗 乘 乙 乚 乛 乜 九 乞 也 习 乡 乢 乣 乤 乥 书 乧 乨 乩 乪 乫 乬 乭 乮 乯 买 乱 乲 乳 乴 乵 乶 乷 乸 乹 乺 乻 乼 乽 乾 乿 ... 가 각 갂 갃 간 갅 갆 갇 갈 갉 갊 갋 갌 갍 갎 갏 감 갑 값 갓 갔 강 갖 갗 갘 같 갚 갛 개 객 갞 갟 갠 갡 갢 갣 갤 갥 갦 갧 갨 갩 갪 갫 갬 갭 갮 갯 갰 갱 갲 갳 갴 갵 갶 갷 갸 갹 갺 갻 갼 갽 갾 갿 걀 걁 걂 걃 걄 걅 걆 걇 걈 걉 걊 걋 걌 걍 걎 걏 걐 걑 걒 걓 걔 걕 걖 걗 걘 걙 걚 걛 걜 걝 걞 걟 걠 걡 걢 걣 걤 걥 걦 걧 걨 걩 걪 걫 걬 걭 걮 걯 거 걱 걲 걳 건 걵 걶 걷 걸 걹 걺 걻 걼 걽 걾 걿 ...-                                                                                                                                ... 豈 更 車 賈 滑 串 句 龜 龜 契 金 喇 奈 懶 癩 羅 蘿 螺 裸 邏 樂 洛 烙 珞 落 酪 駱 亂 卵 欄 爛 蘭 鸞 嵐 濫 藍 襤 拉 臘 蠟 廊 朗 浪 狼 郎 來 冷 勞 擄 櫓 爐 盧 老 蘆 虜 路 露 魯 鷺 碌 祿 綠 菉 錄 鹿 論 壟 弄 籠 聾 牢 磊 賂 雷 壘 屢 樓 淚 漏 累 縷 陋 勒 肋 凜 凌 稜 綾 菱 陵 讀 拏 樂 諾 丹 寧 怒 率 異 北 磻 便 復 不 泌 數 索 參 塞 省 葉 說 殺 辰 沈 拾 若 掠 略 亮 兩 凉 梁 糧 良 諒 量 勵 ... ff fi fl ffi ffl ſt st ﬓ ﬔ ﬕ ﬖ ﬗ ﬞ ײַ ﬠ ﬡ ﬢ ﬣ ﬤ ﬥ ﬦ ﬧ ﬨ ﬩ שׁ שׂ שּׁ שּׂ אַ אָ אּ בּ גּ דּ הּ וּ זּ טּ יּ ךּ כּ לּ מּ נּ סּ ףּ פּ צּ קּ רּ שּ תּ וֹ בֿ כֿ פֿ ﭏ ﭐ ﭑ ﭒ ﭓ ﭔ ﭕ ﭖ ﭗ ﭘ ﭙ ﭚ ﭛ ﭜ ﭝ ﭞ ﭟ ﭠ ﭡ ﭢ ﭣ ﭤ ﭥ ﭦ ﭧ ﭨ ﭩ ﭪ ﭫ ﭬ ﭭ ﭮ ﭯ ﭰ ﭱ ﭲ ﭳ ﭴ ﭵ ﭶ ﭷ ﭸ ﭹ ﭺ ﭻ ﭼ ﭽ ﭾ ﭿ ﮀ ﮁ ﮂ ﮃ ﮄ ﮅ ﮆ ﮇ ﮈ ﮉ ﮊ ﮋ ﮌ ﮍ ﮎ ﮏ ﮐ ﮑ ﮒ ﮓ ﮔ ﮕ ﮖ ﮗ ﮘ ﮙ ﮚ ﮛ ﮜ ﮝ ﮞ ﮟ ﮠ ﮡ ﮢ ﮣ ﮤ ﮥ ﮦ ﮧ ﮨ ﮩ ﮪ ﮫ ﮬ ﮭ ﮮ ﮯ ﮰ ﮱ ﯓ ﯔ ﯕ ﯖ ﯗ ﯘ ﯙ ﯚ ﯛ ﯜ ﯝ ﯞ ﯟ ﯠ ﯡ ﯢ ﯣ ﯤ ﯥ ﯦ ﯧ ﯨ ﯩ ﯪ ﯫ ﯬ ﯭ ﯮ ﯯ ﯰ ...
tests/utf8.hs view
@@ -1,14 +1,16 @@--- | Unicode test.- {-# LANGUAGE EmptyDataDecls    #-} {-# LANGUAGE NoImplicitPrelude #-}+-- | Unicode test. +module Utf8 where+ import           Language.Fay.FFI import           Language.Fay.Prelude +main :: Fay () main = do   -- Latin-1 Supplement-  printS "¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ"+  printS "¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ"    -- Latin Extended-A   printS "Ā ā Ă ă Ą ą Ć ć Ĉ ĉ Ċ ċ Č č Ď ď Đ đ Ē ē Ĕ ĕ Ė ė Ę ę Ě ě Ĝ ĝ Ğ ğ Ġ ġ Ģ ģ Ĥ ĥ Ħ ħ Ĩ ĩ Ī ī Ĭ ĭ Į į İ ı IJ ij Ĵ ĵ Ķ ķ ĸ Ĺ ĺ Ļ ļ Ľ ľ Ŀ ŀ Ł ł Ń ń Ņ ņ Ň ň ʼn Ŋ ŋ Ō ō Ŏ ŏ Ő ő Œ œ Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ŝ ŝ Ş ş Š š Ţ ţ Ť ť Ŧ ŧ Ũ ũ Ū ū Ŭ ŭ Ů ů Ű ű Ų ų Ŵ ŵ Ŷ ŷ Ÿ Ź ź Ż ż Ž ž ſ"@@ -116,8 +118,6 @@   printS "一 丁 丂 七 丄 丅 丆 万 丈 三 上 下 丌 不 与 丏 丐 丑 丒 专 且 丕 世 丗 丘 丙 业 丛 东 丝 丞 丟 丠 両 丢 丣 两 严 並 丧 丨 丩 个 丫 丬 中 丮 丯 丰 丱 串 丳 临 丵 丶 丷 丸 丹 为 主 丼 丽 举 丿 乀 乁 乂 乃 乄 久 乆 乇 么 义 乊 之 乌 乍 乎 乏 乐 乑 乒 乓 乔 乕 乖 乗 乘 乙 乚 乛 乜 九 乞 也 习 乡 乢 乣 乤 乥 书 乧 乨 乩 乪 乫 乬 乭 乮 乯 买 乱 乲 乳 乴 乵 乶 乷 乸 乹 乺 乻 乼 乽 乾 乿 ..."   -- Hangul Syllables   printS "가 각 갂 갃 간 갅 갆 갇 갈 갉 갊 갋 갌 갍 갎 갏 감 갑 값 갓 갔 강 갖 갗 갘 같 갚 갛 개 객 갞 갟 갠 갡 갢 갣 갤 갥 갦 갧 갨 갩 갪 갫 갬 갭 갮 갯 갰 갱 갲 갳 갴 갵 갶 갷 갸 갹 갺 갻 갼 갽 갾 갿 걀 걁 걂 걃 걄 걅 걆 걇 걈 걉 걊 걋 걌 걍 걎 걏 걐 걑 걒 걓 걔 걕 걖 걗 걘 걙 걚 걛 걜 걝 걞 걟 걠 걡 걢 걣 걤 걥 걦 걧 걨 걩 걪 걫 걬 걭 걮 걯 거 걱 걲 걳 건 걵 걶 걷 걸 걹 걺 걻 걼 걽 걾 걿 ..."-  -- Private Use-  printS "                                                                                                                                ..."   -- CJK Compatibility Ideographs   printS "豈 更 車 賈 滑 串 句 龜 龜 契 金 喇 奈 懶 癩 羅 蘿 螺 裸 邏 樂 洛 烙 珞 落 酪 駱 亂 卵 欄 爛 蘭 鸞 嵐 濫 藍 襤 拉 臘 蠟 廊 朗 浪 狼 郎 來 冷 勞 擄 櫓 爐 盧 老 蘆 虜 路 露 魯 鷺 碌 祿 綠 菉 錄 鹿 論 壟 弄 籠 聾 牢 磊 賂 雷 壘 屢 樓 淚 漏 累 縷 陋 勒 肋 凜 凌 稜 綾 菱 陵 讀 拏 樂 諾 丹 寧 怒 率 異 北 磻 便 復 不 泌 數 索 參 塞 省 葉 說 殺 辰 沈 拾 若 掠 略 亮 兩 凉 梁 糧 良 諒 量 勵 ..."   -- Alphabetic Presentation Forms
tests/utf8.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var Utf8 = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var main = new $(function(){return _(_($62$$62$)(_(printS)(Fay$$list("¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ"))))(_(_($62$$62$)(_(printS)(Fay$$list("Ā ā Ă ă Ą ą Ć ć Ĉ ĉ Ċ ċ Č č Ď ď Đ đ Ē ē Ĕ ĕ Ė ė Ę ę Ě ě Ĝ ĝ Ğ ğ Ġ ġ Ģ ģ Ĥ ĥ Ħ ħ Ĩ ĩ Ī ī Ĭ ĭ Į į İ ı IJ ij Ĵ ĵ Ķ ķ ĸ Ĺ ĺ Ļ ļ Ľ ľ Ŀ ŀ Ł ł Ń ń Ņ ņ Ň ň ʼn Ŋ ŋ Ō ō Ŏ ŏ Ő ő Œ œ Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ŝ ŝ Ş ş Š š Ţ ţ Ť ť Ŧ ŧ Ũ ũ Ū ū Ŭ ŭ Ů ů Ű ű Ų ų Ŵ ŵ Ŷ ŷ Ÿ Ź ź Ż ż Ž ž ſ"))))(_(_($62$$62$)(_(printS)(Fay$$list("ƀ Ɓ Ƃ ƃ Ƅ ƅ Ɔ Ƈ ƈ Ɖ Ɗ Ƌ ƌ ƍ Ǝ Ə Ɛ Ƒ ƒ Ɠ Ɣ ƕ Ɩ Ɨ Ƙ ƙ ƚ ƛ Ɯ Ɲ ƞ Ɵ Ơ ơ Ƣ ƣ Ƥ ƥ Ʀ Ƨ ƨ Ʃ ƪ ƫ Ƭ ƭ Ʈ Ư ư Ʊ Ʋ Ƴ ƴ Ƶ ƶ Ʒ Ƹ ƹ ƺ ƻ Ƽ ƽ ƾ ƿ ǀ ǁ ǂ ǃ DŽ Dž dž LJ Lj lj NJ Nj nj Ǎ ǎ Ǐ ǐ Ǒ ǒ Ǔ ǔ Ǖ ǖ Ǘ ǘ Ǚ ǚ Ǜ ǜ ǝ Ǟ ǟ Ǡ ǡ Ǣ ǣ Ǥ ǥ Ǧ ǧ Ǩ ǩ Ǫ ǫ Ǭ ǭ Ǯ ǯ ǰ DZ Dz dz Ǵ ǵ Ǻ ǻ Ǽ ǽ Ǿ ǿ Ȁ ȁ Ȃ ȃ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("ɐ ɑ ɒ ɓ ɔ ɕ ɖ ɗ ɘ ə ɚ ɛ ɜ ɝ ɞ ɟ ɠ ɡ ɢ ɣ ɤ ɥ ɦ ɧ ɨ ɩ ɪ ɫ ɬ ɭ ɮ ɯ ɰ ɱ ɲ ɳ ɴ ɵ ɶ ɷ ɸ ɹ ɺ ɻ ɼ ɽ ɾ ɿ ʀ ʁ ʂ ʃ ʄ ʅ ʆ ʇ ʈ ʉ ʊ ʋ ʌ ʍ ʎ ʏ ʐ ʑ ʒ ʓ ʔ ʕ ʖ ʗ ʘ ʙ ʚ ʛ ʜ ʝ ʞ ʟ ʠ ʡ ʢ ʣ ʤ ʥ ʦ ʧ ʨ"))))(_(_($62$$62$)(_(printS)(Fay$$list("ʰ ʱ ʲ ʳ ʴ ʵ ʶ ʷ ʸ ʹ ʺ ʻ ʼ ʽ ʾ ʿ ˀ ˁ ˂ ˃ ˄ ˅ ˆ ˇ ˈ ˉ ˊ ˋ ˌ ˍ ˎ ˏ ː ˑ ˒ ˓ ˔ ˕ ˖ ˗ ˘ ˙ ˚ ˛ ˜ ˝ ˞ ˠ ˡ ˢ ˣ ˤ ˥ ˦ ˧ ˨ ˩"))))(_(_($62$$62$)(_(printS)(Fay$$list("̀ ́ ̂ ̃ ̄ ̅ ̆ ̇ ̈ ̉ ̊ ̋ ̌ ̍ ̎ ̏ ̐ ̑ ̒ ̓ ̔ ̕ ̖ ̗ ̘ ̙ ̚ ̛ ̜ ̝ ̞ ̟ ̠ ̡ ̢ ̣ ̤ ̥ ̦ ̧ ̨ ̩ ̪ ̫ ̬ ̭ ̮ ̯ ̰ ̱ ̲ ̳ ̴ ̵ ̶ ̷ ̸ ̹ ̺ ̻ ̼ ̽ ̾ ̿ ̀ ́ ͂ ̓ ̈́ ͅ ͠ ͡"))))(_(_($62$$62$)(_(printS)(Fay$$list("ʹ ͵ ͺ ; ΄ ΅ Ά · Έ Ή Ί Ό Ύ Ώ ΐ Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω Ϊ Ϋ ά έ ή ί ΰ α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ ς σ τ υ φ χ ψ ω ϊ ϋ ό ύ ώ ϐ ϑ ϒ ϓ ϔ ϕ ϖ Ϛ Ϝ Ϟ Ϡ Ϣ ϣ Ϥ ϥ Ϧ ϧ Ϩ ϩ Ϫ ϫ Ϭ ϭ Ϯ ϯ ϰ ϱ ϲ ϳ"))))(_(_($62$$62$)(_(printS)(Fay$$list("Ё Ђ Ѓ Є Ѕ І Ї Ј Љ Њ Ћ Ќ Ў Џ А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я ё ђ ѓ є ѕ і ї ј љ њ ћ ќ ў џ Ѡ ѡ Ѣ ѣ Ѥ ѥ Ѧ ѧ Ѩ ѩ Ѫ ѫ Ѭ ѭ Ѯ ѯ Ѱ ѱ Ѳ ѳ Ѵ ѵ Ѷ ѷ Ѹ ѹ Ѻ ѻ Ѽ ѽ Ѿ ѿ Ҁ ҁ ҂ ҃ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("Ա Բ Գ Դ Ե Զ Է Ը Թ Ժ Ի Լ Խ Ծ Կ Հ Ձ Ղ Ճ Մ Յ Ն Շ Ո Չ Պ Ջ Ռ Ս Վ Տ Ր Ց Ւ Փ Ք Օ Ֆ ՙ ՚ ՛ ՜ ՝ ՞ ՟ ա բ գ դ ե զ է ը թ ժ ի լ խ ծ կ հ ձ ղ ճ մ յ ն շ ո չ պ ջ ռ ս վ տ ր ց ւ փ ք օ ֆ և ։"))))(_(_($62$$62$)(_(printS)(Fay$$list("֑ ֒ ֓ ֔ ֕ ֖ ֗ ֘ ֙ ֚ ֛ ֜ ֝ ֞ ֟ ֠ ֡ ֣ ֤ ֥ ֦ ֧ ֨ ֩ ֪ ֫ ֬ ֭ ֮ ֯ ְ ֱ ֲ ֳ ִ ֵ ֶ ַ ָ ֹ ֻ ּ ֽ ־ ֿ ׀ ׁ ׂ ׃ ׄ א ב ג ד ה ו ז ח ט י ך כ ל ם מ ן נ ס ע ף פ ץ צ ק ר ש ת װ ױ ײ ׳ ״"))))(_(_($62$$62$)(_(printS)(Fay$$list("، ؛ ؟ ء آ أ ؤ إ ئ ا ب ة ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ـ ف ق ك ل م ن ه و ى ي ً ٌ ٍ َ ُ ِ ّ ْ ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ ٪ ٫ ٬ ٭ ٰ ٱ ٲ ٳ ٴ ٵ ٶ ٷ ٸ ٹ ٺ ٻ ټ ٽ پ ٿ ڀ ځ ڂ ڃ ڄ څ چ ڇ ڈ ډ ڊ ڋ ڌ ڍ ڎ ڏ ڐ ڑ ڒ ړ ڔ ڕ ږ ڗ ژ ڙ ښ ڛ ڜ ڝ ڞ ڟ ڠ ڡ ڢ ڣ ڤ ڥ ڦ ڧ ڨ ک ڪ ګ ڬ ڭ ڮ گ ڰ ڱ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("ँ ं ः अ आ इ ई उ ऊ ऋ ऌ ऍ ऎ ए ऐ ऑ ऒ ओ औ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न ऩ प फ ब भ म य र ऱ ल ळ ऴ व श ष स ह ़ ऽ ा ि ी ु ू ृ ॄ ॅ ॆ े ै ॉ ॊ ो ौ ् ॐ ॑ ॒ ॓ ॔ क़ ख़ ग़ ज़ ड़ ढ़ फ़ य़ ॠ ॡ ॢ ॣ । ॥ ० १ २ ३ ४ ५ ६ ७ ८ ९ ॰"))))(_(_($62$$62$)(_(printS)(Fay$$list("ঁ ং ঃ অ আ ই ঈ উ ঊ ঋ ঌ এ ঐ ও ঔ ক খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড ঢ ণ ত থ দ ধ ন প ফ ব ভ ম য র ল শ ষ স হ ় া ি ী ু ূ ৃ ৄ ে ৈ ো ৌ ্ ৗ ড় ঢ় য় ৠ ৡ ৢ ৣ ০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯ ৰ ৱ ৲ ৳ ৴ ৵ ৶ ৷ ৸ ৹ ৺"))))(_(_($62$$62$)(_(printS)(Fay$$list("ਂ ਅ ਆ ਇ ਈ ਉ ਊ ਏ ਐ ਓ ਔ ਕ ਖ ਗ ਘ ਙ ਚ ਛ ਜ ਝ ਞ ਟ ਠ ਡ ਢ ਣ ਤ ਥ ਦ ਧ ਨ ਪ ਫ ਬ ਭ ਮ ਯ ਰ ਲ ਲ਼ ਵ ਸ਼ ਸ ਹ ਼ ਾ ਿ ੀ ੁ ੂ ੇ ੈ ੋ ੌ ੍ ਖ਼ ਗ਼ ਜ਼ ੜ ਫ਼ ੦ ੧ ੨ ੩ ੪ ੫ ੬ ੭ ੮ ੯ ੰ ੱ ੲ ੳ ੴ"))))(_(_($62$$62$)(_(printS)(Fay$$list("ઁ ં ઃ અ આ ઇ ઈ ઉ ઊ ઋ ઍ એ ઐ ઑ ઓ ઔ ક ખ ગ ઘ ઙ ચ છ જ ઝ ઞ ટ ઠ ડ ઢ ણ ત થ દ ધ ન પ ફ બ ભ મ ય ર લ ળ વ શ ષ સ હ ઼ ઽ ા િ ી ુ ૂ ૃ ૄ ૅ ે ૈ ૉ ો ૌ ્ ૐ ૠ ૦ ૧ ૨ ૩ ૪ ૫ ૬ ૭ ૮ ૯"))))(_(_($62$$62$)(_(printS)(Fay$$list("ଁ ଂ ଃ ଅ ଆ ଇ ଈ ଉ ଊ ଋ ଌ ଏ ଐ ଓ ଔ କ ଖ ଗ ଘ ଙ ଚ ଛ ଜ ଝ ଞ ଟ ଠ ଡ ଢ ଣ ତ ଥ ଦ ଧ ନ ପ ଫ ବ ଭ ମ ଯ ର ଲ ଳ ଶ ଷ ସ ହ ଼ ଽ ା ି ୀ ୁ ୂ ୃ େ ୈ ୋ ୌ ୍ ୖ ୗ ଡ଼ ଢ଼ ୟ ୠ ୡ ୦ ୧ ୨ ୩ ୪ ୫ ୬ ୭ ୮ ୯ ୰"))))(_(_($62$$62$)(_(printS)(Fay$$list("ஂ ஃ அ ஆ இ ஈ உ ஊ எ ஏ ஐ ஒ ஓ ஔ க ங ச ஜ ஞ ட ண த ந ன ப ம ய ர ற ல ள ழ வ ஷ ஸ ஹ ா ி ீ ு ூ ெ ே ை ொ ோ ௌ ் ௗ ௧ ௨ ௩ ௪ ௫ ௬ ௭ ௮ ௯ ௰ ௱ ௲"))))(_(_($62$$62$)(_(printS)(Fay$$list("ఁ ం ః అ ఆ ఇ ఈ ఉ ఊ ఋ ఌ ఎ ఏ ఐ ఒ ఓ ఔ క ఖ గ ఘ ఙ చ ఛ జ ఝ ఞ ట ఠ డ ఢ ణ త థ ద ధ న ప ఫ బ భ మ య ర ఱ ల ళ వ శ ష స హ ా ి ీ ు ూ ృ ౄ ె ే ై ొ ో ౌ ్ ౕ ౖ ౠ ౡ ౦ ౧ ౨ ౩ ౪ ౫ ౬ ౭ ౮ ౯"))))(_(_($62$$62$)(_(printS)(Fay$$list("ಂ ಃ ಅ ಆ ಇ ಈ ಉ ಊ ಋ ಌ ಎ ಏ ಐ ಒ ಓ ಔ ಕ ಖ ಗ ಘ ಙ ಚ ಛ ಜ ಝ ಞ ಟ ಠ ಡ ಢ ಣ ತ ಥ ದ ಧ ನ ಪ ಫ ಬ ಭ ಮ ಯ ರ ಱ ಲ ಳ ವ ಶ ಷ ಸ ಹ ಾ ಿ ೀ ು ೂ ೃ ೄ ೆ ೇ ೈ ೊ ೋ ೌ ್ ೕ ೖ ೞ ೠ ೡ ೦ ೧ ೨ ೩ ೪ ೫ ೬ ೭ ೮ ೯"))))(_(_($62$$62$)(_(printS)(Fay$$list("ം ഃ അ ആ ഇ ഈ ഉ ഊ ഋ ഌ എ ഏ ഐ ഒ ഓ ഔ ക ഖ ഗ ഘ ങ ച ഛ ജ ഝ ഞ ട ഠ ഡ ഢ ണ ത ഥ ദ ധ ന പ ഫ ബ ഭ മ യ ര റ ല ള ഴ വ ശ ഷ സ ഹ ാ ി ീ ു ൂ ൃ െ േ ൈ ൊ ോ ൌ ് ൗ ൠ ൡ ൦ ൧ ൨ ൩ ൪ ൫ ൬ ൭ ൮ ൯"))))(_(_($62$$62$)(_(printS)(Fay$$list("ก ข ฃ ค ฅ ฆ ง จ ฉ ช ซ ฌ ญ ฎ ฏ ฐ ฑ ฒ ณ ด ต ถ ท ธ น บ ป ผ ฝ พ ฟ ภ ม ย ร ฤ ล ฦ ว ศ ษ ส ห ฬ อ ฮ ฯ ะ ั า ำ ิ ี ึ ื ุ ู ฺ ฿ เ แ โ ใ ไ ๅ ๆ ็ ่ ้ ๊ ๋ ์ ํ ๎ ๏ ๐ ๑ ๒ ๓ ๔ ๕ ๖ ๗ ๘ ๙ ๚ ๛"))))(_(_($62$$62$)(_(printS)(Fay$$list("ກ ຂ ຄ ງ ຈ ຊ ຍ ດ ຕ ຖ ທ ນ ບ ປ ຜ ຝ ພ ຟ ມ ຢ ຣ ລ ວ ສ ຫ ອ ຮ ຯ ະ ັ າ ຳ ິ ີ ຶ ື ຸ ູ ົ ຼ ຽ ເ ແ ໂ ໃ ໄ ໆ ່ ້ ໊ ໋ ໌ ໍ ໐ ໑ ໒ ໓ ໔ ໕ ໖ ໗ ໘ ໙ ໜ ໝ"))))(_(_($62$$62$)(_(printS)(Fay$$list("ༀ ༁ ༂ ༃ ༄ ༅ ༆ ༇ ༈ ༉ ༊ ་ ༌ ། ༎ ༏ ༐ ༑ ༒ ༓ ༔ ༕ ༖ ༗ ༘ ༙ ༚ ༛ ༜ ༝ ༞ ༟ ༠ ༡ ༢ ༣ ༤ ༥ ༦ ༧ ༨ ༩ ༪ ༫ ༬ ༭ ༮ ༯ ༰ ༱ ༲ ༳ ༴ ༵ ༶ ༷ ༸ ༹ ༺ ༻ ༼ ༽ ༾ ༿ ཀ ཁ ག གྷ ང ཅ ཆ ཇ ཉ ཊ ཋ ཌ ཌྷ ཎ ཏ ཐ ད དྷ ན པ ཕ བ བྷ མ ཙ ཚ ཛ ཛྷ ཝ ཞ ཟ འ ཡ ར ལ ཤ ཥ ས ཧ ཨ ཀྵ ཱ ི ཱི ུ ཱུ ྲྀ ཷ ླྀ ཹ ེ ཻ ོ ཽ ཾ ཿ ྀ ཱྀ ྂ ྃ ྄ ྅ ྆ ྇ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("Ⴀ Ⴁ Ⴂ Ⴃ Ⴄ Ⴅ Ⴆ Ⴇ Ⴈ Ⴉ Ⴊ Ⴋ Ⴌ Ⴍ Ⴎ Ⴏ Ⴐ Ⴑ Ⴒ Ⴓ Ⴔ Ⴕ Ⴖ Ⴗ Ⴘ Ⴙ Ⴚ Ⴛ Ⴜ Ⴝ Ⴞ Ⴟ Ⴠ Ⴡ Ⴢ Ⴣ Ⴤ Ⴥ ა ბ გ დ ე ვ ზ თ ი კ ლ მ ნ ო პ ჟ რ ს ტ უ ფ ქ ღ ყ შ ჩ ც ძ წ ჭ ხ ჯ ჰ ჱ ჲ ჳ ჴ ჵ ჶ ჻"))))(_(_($62$$62$)(_(printS)(Fay$$list("ᄀ ᄁ ᄂ ᄃ ᄄ ᄅ ᄆ ᄇ ᄈ ᄉ ᄊ ᄋ ᄌ ᄍ ᄎ ᄏ ᄐ ᄑ ᄒ ᄓ ᄔ ᄕ ᄖ ᄗ ᄘ ᄙ ᄚ ᄛ ᄜ ᄝ ᄞ ᄟ ᄠ ᄡ ᄢ ᄣ ᄤ ᄥ ᄦ ᄧ ᄨ ᄩ ᄪ ᄫ ᄬ ᄭ ᄮ ᄯ ᄰ ᄱ ᄲ ᄳ ᄴ ᄵ ᄶ ᄷ ᄸ ᄹ ᄺ ᄻ ᄼ ᄽ ᄾ ᄿ ᅀ ᅁ ᅂ ᅃ ᅄ ᅅ ᅆ ᅇ ᅈ ᅉ ᅊ ᅋ ᅌ ᅍ ᅎ ᅏ ᅐ ᅑ ᅒ ᅓ ᅔ ᅕ ᅖ ᅗ ᅘ ᅙ ᅟ ᅠ ᅡ ᅢ ᅣ ᅤ ᅥ ᅦ ᅧ ᅨ ᅩ ᅪ ᅫ ᅬ ᅭ ᅮ ᅯ ᅰ ᅱ ᅲ ᅳ ᅴ ᅵ ᅶ ᅷ ᅸ ᅹ ᅺ ᅻ ᅼ ᅽ ᅾ ᅿ ᆀ ᆁ ᆂ ᆃ ᆄ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("Ḁ ḁ Ḃ ḃ Ḅ ḅ Ḇ ḇ Ḉ ḉ Ḋ ḋ Ḍ ḍ Ḏ ḏ Ḑ ḑ Ḓ ḓ Ḕ ḕ Ḗ ḗ Ḙ ḙ Ḛ ḛ Ḝ ḝ Ḟ ḟ Ḡ ḡ Ḣ ḣ Ḥ ḥ Ḧ ḧ Ḩ ḩ Ḫ ḫ Ḭ ḭ Ḯ ḯ Ḱ ḱ Ḳ ḳ Ḵ ḵ Ḷ ḷ Ḹ ḹ Ḻ ḻ Ḽ ḽ Ḿ ḿ Ṁ ṁ Ṃ ṃ Ṅ ṅ Ṇ ṇ Ṉ ṉ Ṋ ṋ Ṍ ṍ Ṏ ṏ Ṑ ṑ Ṓ ṓ Ṕ ṕ Ṗ ṗ Ṙ ṙ Ṛ ṛ Ṝ ṝ Ṟ ṟ Ṡ ṡ Ṣ ṣ Ṥ ṥ Ṧ ṧ Ṩ ṩ Ṫ ṫ Ṭ ṭ Ṯ ṯ Ṱ ṱ Ṳ ṳ Ṵ ṵ Ṷ ṷ Ṹ ṹ Ṻ ṻ Ṽ ṽ Ṿ ṿ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("ἀ ἁ ἂ ἃ ἄ ἅ ἆ ἇ Ἀ Ἁ Ἂ Ἃ Ἄ Ἅ Ἆ Ἇ ἐ ἑ ἒ ἓ ἔ ἕ Ἐ Ἑ Ἒ Ἓ Ἔ Ἕ ἠ ἡ ἢ ἣ ἤ ἥ ἦ ἧ Ἠ Ἡ Ἢ Ἣ Ἤ Ἥ Ἦ Ἧ ἰ ἱ ἲ ἳ ἴ ἵ ἶ ἷ Ἰ Ἱ Ἲ Ἳ Ἴ Ἵ Ἶ Ἷ ὀ ὁ ὂ ὃ ὄ ὅ Ὀ Ὁ Ὂ Ὃ Ὄ Ὅ ὐ ὑ ὒ ὓ ὔ ὕ ὖ ὗ Ὑ Ὓ Ὕ Ὗ ὠ ὡ ὢ ὣ ὤ ὥ ὦ ὧ Ὠ Ὡ Ὢ Ὣ Ὤ Ὥ Ὦ Ὧ ὰ ά ὲ έ ὴ ή ὶ ί ὸ ό ὺ ύ ὼ ώ ᾀ ᾁ ᾂ ᾃ ᾄ ᾅ ᾆ ᾇ ᾈ ᾉ ᾊ ᾋ ᾌ ᾍ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("‐ ‑ ‒ – — ― ‖ ‗ ‘ ’ ‚ ‛ “ ” „ ‟"))))(_(_($62$$62$)(_(printS)(Fay$$list("⁰ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ⁺ ⁻ ⁼ ⁽ ⁾ ⁿ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₊ ₋ ₌ ₍ ₎"))))(_(_($62$$62$)(_(printS)(Fay$$list("₠ ₡ ₢ ₣ ₤ ₥ ₦ ₧ ₨ ₩ ₪ ₫"))))(_(_($62$$62$)(_(printS)(Fay$$list("⃐ ⃑ ⃒ ⃓ ⃔ ⃕ ⃖ ⃗ ⃘ ⃙ ⃚ ⃛ ⃜ ⃝ ⃞ ⃟ ⃠ ⃡"))))(_(_($62$$62$)(_(printS)(Fay$$list("℀ ℁ ℂ ℃ ℄ ℅ ℆ ℇ ℈ ℉ ℊ ℋ ℌ ℍ ℎ ℏ ℐ ℑ ℒ ℓ ℔ ℕ № ℗ ℘ ℙ ℚ ℛ ℜ ℝ ℞ ℟ ℠ ℡ ™ ℣ ℤ ℥ Ω ℧ ℨ ℩ K Å ℬ ℭ ℮ ℯ ℰ ℱ Ⅎ ℳ ℴ ℵ ℶ ℷ ℸ"))))(_(_($62$$62$)(_(printS)(Fay$$list("⅓ ⅔ ⅕ ⅖ ⅗ ⅘ ⅙ ⅚ ⅛ ⅜ ⅝ ⅞ ⅟ Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ Ⅼ Ⅽ Ⅾ Ⅿ ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ ⅺ ⅻ ⅼ ⅽ ⅾ ⅿ ↀ ↁ ↂ"))))(_(_($62$$62$)(_(printS)(Fay$$list("← ↑ → ↓ ↔ ↕ ↖ ↗ ↘ ↙ ↚ ↛ ↜ ↝ ↞ ↟ ↠ ↡ ↢ ↣ ↤ ↥ ↦ ↧ ↨ ↩ ↪ ↫ ↬ ↭ ↮ ↯ ↰ ↱ ↲ ↳ ↴ ↵ ↶ ↷ ↸ ↹ ↺ ↻ ↼ ↽ ↾ ↿ ⇀ ⇁ ⇂ ⇃ ⇄ ⇅ ⇆ ⇇ ⇈ ⇉ ⇊ ⇋ ⇌ ⇍ ⇎ ⇏ ⇐ ⇑ ⇒ ⇓ ⇔ ⇕ ⇖ ⇗ ⇘ ⇙ ⇚ ⇛ ⇜ ⇝ ⇞ ⇟ ⇠ ⇡ ⇢ ⇣ ⇤ ⇥ ⇦ ⇧ ⇨ ⇩ ⇪"))))(_(_($62$$62$)(_(printS)(Fay$$list("∀ ∁ ∂ ∃ ∄ ∅ ∆ ∇ ∈ ∉ ∊ ∋ ∌ ∍ ∎ ∏ ∐ ∑ − ∓ ∔ ∕ ∖ ∗ ∘ ∙ √ ∛ ∜ ∝ ∞ ∟ ∠ ∡ ∢ ∣ ∤ ∥ ∦ ∧ ∨ ∩ ∪ ∫ ∬ ∭ ∮ ∯ ∰ ∱ ∲ ∳ ∴ ∵ ∶ ∷ ∸ ∹ ∺ ∻ ∼ ∽ ∾ ∿ ≀ ≁ ≂ ≃ ≄ ≅ ≆ ≇ ≈ ≉ ≊ ≋ ≌ ≍ ≎ ≏ ≐ ≑ ≒ ≓ ≔ ≕ ≖ ≗ ≘ ≙ ≚ ≛ ≜ ≝ ≞ ≟ ≠ ≡ ≢ ≣ ≤ ≥ ≦ ≧ ≨ ≩ ≪ ≫ ≬ ≭ ≮ ≯ ≰ ≱ ≲ ≳ ≴ ≵ ≶ ≷ ≸ ≹ ≺ ≻ ≼ ≽ ≾ ≿ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("⌀ ⌂ ⌃ ⌄ ⌅ ⌆ ⌇ ⌈ ⌉ ⌊ ⌋ ⌌ ⌍ ⌎ ⌏ ⌐ ⌑ ⌒ ⌓ ⌔ ⌕ ⌖ ⌗ ⌘ ⌙ ⌚ ⌛ ⌜ ⌝ ⌞ ⌟ ⌠ ⌡ ⌢ ⌣ ⌤ ⌥ ⌦ ⌧ ⌨ 〈 〉 ⌫ ⌬ ⌭ ⌮ ⌯ ⌰ ⌱ ⌲ ⌳ ⌴ ⌵ ⌶ ⌷ ⌸ ⌹ ⌺ ⌻ ⌼ ⌽ ⌾ ⌿ ⍀ ⍁ ⍂ ⍃ ⍄ ⍅ ⍆ ⍇ ⍈ ⍉ ⍊ ⍋ ⍌ ⍍ ⍎ ⍏ ⍐ ⍑ ⍒ ⍓ ⍔ ⍕ ⍖ ⍗ ⍘ ⍙ ⍚ ⍛ ⍜ ⍝ ⍞ ⍟ ⍠ ⍡ ⍢ ⍣ ⍤ ⍥ ⍦ ⍧ ⍨ ⍩ ⍪ ⍫ ⍬ ⍭ ⍮ ⍯ ⍰ ⍱ ⍲ ⍳ ⍴ ⍵ ⍶ ⍷ ⍸ ⍹ ⍺"))))(_(_($62$$62$)(_(printS)(Fay$$list("␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏ ␐ ␑ ␒ ␓ ␔ ␕ ␖ ␗ ␘ ␙ ␚ ␛ ␜ ␝ ␞ ␟ ␠ ␡ ␢ ␣ ␤"))))(_(_($62$$62$)(_(printS)(Fay$$list("⑀ ⑁ ⑂ ⑃ ⑄ ⑅ ⑆ ⑇ ⑈ ⑉ ⑊"))))(_(_($62$$62$)(_(printS)(Fay$$list("① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏ ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟ ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯ ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿ ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╌ ╍ ╎ ╏ ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟ ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯ ╰ ╱ ╲ ╳ ╴ ╵ ╶ ╷ ╸ ╹ ╺ ╻ ╼ ╽ ╾ ╿"))))(_(_($62$$62$)(_(printS)(Fay$$list("▀ ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊ ▋ ▌ ▍ ▎ ▏ ▐ ░ ▒ ▓ ▔ ▕"))))(_(_($62$$62$)(_(printS)(Fay$$list("■ □ ▢ ▣ ▤ ▥ ▦ ▧ ▨ ▩ ▪ ▫ ▬ ▭ ▮ ▯ ▰ ▱ ▲ △ ▴ ▵ ▶ ▷ ▸ ▹ ► ▻ ▼ ▽ ▾ ▿ ◀ ◁ ◂ ◃ ◄ ◅ ◆ ◇ ◈ ◉ ◊ ○ ◌ ◍ ◎ ● ◐ ◑ ◒ ◓ ◔ ◕ ◖ ◗ ◘ ◙ ◚ ◛ ◜ ◝ ◞ ◟ ◠ ◡ ◢ ◣ ◤ ◥ ◦ ◧ ◨ ◩ ◪ ◫ ◬ ◭ ◮ ◯"))))(_(_($62$$62$)(_(printS)(Fay$$list("☀ ☁ ☂ ☃ ☄ ★ ☆ ☇ ☈ ☉ ☊ ☋ ☌ ☍ ☎ ☏ ☐ ☑ ☒ ☓ ☚ ☛ ☜ ☝ ☞ ☟ ☠ ☡ ☢ ☣ ☤ ☥ ☦ ☧ ☨ ☩ ☪ ☫ ☬ ☭ ☮ ☯ ☰ ☱ ☲ ☳ ☴ ☵ ☶ ☷ ☸ ☹ ☺ ☻ ☼ ☽ ☾ ☿ ♀ ♁ ♂ ♃ ♄ ♅ ♆ ♇ ♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓ ♔ ♕ ♖ ♗ ♘ ♙ ♚ ♛ ♜ ♝ ♞ ♟ ♠ ♡ ♢ ♣ ♤ ♥ ♦ ♧ ♨ ♩ ♪ ♫ ♬ ♭ ♮ ♯"))))(_(_($62$$62$)(_(printS)(Fay$$list("✁ ✂ ✃ ✄ ✆ ✇ ✈ ✉ ✌ ✍ ✎ ✏ ✐ ✑ ✒ ✓ ✔ ✕ ✖ ✗ ✘ ✙ ✚ ✛ ✜ ✝ ✞ ✟ ✠ ✡ ✢ ✣ ✤ ✥ ✦ ✧ ✩ ✪ ✫ ✬ ✭ ✮ ✯ ✰ ✱ ✲ ✳ ✴ ✵ ✶ ✷ ✸ ✹ ✺ ✻ ✼ ✽ ✾ ✿ ❀ ❁ ❂ ❃ ❄ ❅ ❆ ❇ ❈ ❉ ❊ ❋ ❍ ❏ ❐ ❑ ❒ ❖ ❘ ❙ ❚ ❛ ❜ ❝ ❞ ❡ ❢ ❣ ❤ ❥ ❦ ❧ ❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿ ➀ ➁ ➂ ➃ ➄ ➅ ➆ ➇ ➈ ➉ ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓ ➔ ➘ ➙ ➚ ➛ ➜ ➝ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("  、 。 〃 〄 々 〆 〇 〈 〉 《 》 「 」 『 』 【 】 〒 〓 〔 〕 〖 〗 〘 〙 〚 〛 〜 〝 〞 〟 〠 〡 〢 〣 〤 〥 〦 〧 〨 〩 〪 〫 〬 〭 〮 〯 〰 〱 〲 〳 〴 〵 〶 〷 〿"))))(_(_($62$$62$)(_(printS)(Fay$$list("ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た だ ち ぢ っ つ づ て で と ど な に ぬ ね の は ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み む め も ゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ ゐ ゑ を ん ゔ ゙ ゚ ゛ ゜ ゝ ゞ"))))(_(_($62$$62$)(_(printS)(Fay$$list("ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク グ ケ ゲ コ ゴ サ ザ シ ジ ス ズ セ ゼ ソ ゾ タ ダ チ ヂ ッ ツ ヅ テ デ ト ド ナ ニ ヌ ネ ノ ハ バ パ ヒ ビ ピ フ ブ プ ヘ ベ ペ ホ ボ ポ マ ミ ム メ モ ャ ヤ ュ ユ ョ ヨ ラ リ ル レ ロ ヮ ワ ヰ ヱ ヲ ン ヴ ヵ ヶ ヷ ヸ ヹ ヺ ・ ー ヽ ヾ"))))(_(_($62$$62$)(_(printS)(Fay$$list("ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ ㄢ ㄣ ㄤ ㄥ ㄦ ㄧ ㄨ ㄩ ㄪ ㄫ ㄬ"))))(_(_($62$$62$)(_(printS)(Fay$$list("ㄱ ㄲ ㄳ ㄴ ㄵ ㄶ ㄷ ㄸ ㄹ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ ㅂ ㅃ ㅄ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ ㅤ ㅥ ㅦ ㅧ ㅨ ㅩ ㅪ ㅫ ㅬ ㅭ ㅮ ㅯ ㅰ ㅱ ㅲ ㅳ ㅴ ㅵ ㅶ ㅷ ㅸ ㅹ ㅺ ㅻ ㅼ ㅽ ㅾ ㅿ ㆀ ㆁ ㆂ ㆃ ㆄ ㆅ ㆆ ㆇ ㆈ ㆉ ㆊ ㆋ ㆌ ㆍ ㆎ"))))(_(_($62$$62$)(_(printS)(Fay$$list("㆐ ㆑ ㆒ ㆓ ㆔ ㆕ ㆖ ㆗ ㆘ ㆙ ㆚ ㆛ ㆜ ㆝ ㆞ ㆟"))))(_(_($62$$62$)(_(printS)(Fay$$list("㈀ ㈁ ㈂ ㈃ ㈄ ㈅ ㈆ ㈇ ㈈ ㈉ ㈊ ㈋ ㈌ ㈍ ㈎ ㈏ ㈐ ㈑ ㈒ ㈓ ㈔ ㈕ ㈖ ㈗ ㈘ ㈙ ㈚ ㈛ ㈜ ㈠ ㈡ ㈢ ㈣ ㈤ ㈥ ㈦ ㈧ ㈨ ㈩ ㈪ ㈫ ㈬ ㈭ ㈮ ㈯ ㈰ ㈱ ㈲ ㈳ ㈴ ㈵ ㈶ ㈷ ㈸ ㈹ ㈺ ㈻ ㈼ ㈽ ㈾ ㈿ ㉀ ㉁ ㉂ ㉃ ㉠ ㉡ ㉢ ㉣ ㉤ ㉥ ㉦ ㉧ ㉨ ㉩ ㉪ ㉫ ㉬ ㉭ ㉮ ㉯ ㉰ ㉱ ㉲ ㉳ ㉴ ㉵ ㉶ ㉷ ㉸ ㉹ ㉺ ㉻ ㉿ ㊀ ㊁ ㊂ ㊃ ㊄ ㊅ ㊆ ㊇ ㊈ ㊉ ㊊ ㊋ ㊌ ㊍ ㊎ ㊏ ㊐ ㊑ ㊒ ㊓ ㊔ ㊕ ㊖ ㊗ ㊘ ㊙ ㊚ ㊛ ㊜ ㊝ ㊞ ㊟ ㊠ ㊡ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("㌀ ㌁ ㌂ ㌃ ㌄ ㌅ ㌆ ㌇ ㌈ ㌉ ㌊ ㌋ ㌌ ㌍ ㌎ ㌏ ㌐ ㌑ ㌒ ㌓ ㌔ ㌕ ㌖ ㌗ ㌘ ㌙ ㌚ ㌛ ㌜ ㌝ ㌞ ㌟ ㌠ ㌡ ㌢ ㌣ ㌤ ㌥ ㌦ ㌧ ㌨ ㌩ ㌪ ㌫ ㌬ ㌭ ㌮ ㌯ ㌰ ㌱ ㌲ ㌳ ㌴ ㌵ ㌶ ㌷ ㌸ ㌹ ㌺ ㌻ ㌼ ㌽ ㌾ ㌿ ㍀ ㍁ ㍂ ㍃ ㍄ ㍅ ㍆ ㍇ ㍈ ㍉ ㍊ ㍋ ㍌ ㍍ ㍎ ㍏ ㍐ ㍑ ㍒ ㍓ ㍔ ㍕ ㍖ ㍗ ㍘ ㍙ ㍚ ㍛ ㍜ ㍝ ㍞ ㍟ ㍠ ㍡ ㍢ ㍣ ㍤ ㍥ ㍦ ㍧ ㍨ ㍩ ㍪ ㍫ ㍬ ㍭ ㍮ ㍯ ㍰ ㍱ ㍲ ㍳ ㍴ ㍵ ㍶ ㍻ ㍼ ㍽ ㍾ ㍿ ㎀ ㎁ ㎂ ㎃ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("一 丁 丂 七 丄 丅 丆 万 丈 三 上 下 丌 不 与 丏 丐 丑 丒 专 且 丕 世 丗 丘 丙 业 丛 东 丝 丞 丟 丠 両 丢 丣 两 严 並 丧 丨 丩 个 丫 丬 中 丮 丯 丰 丱 串 丳 临 丵 丶 丷 丸 丹 为 主 丼 丽 举 丿 乀 乁 乂 乃 乄 久 乆 乇 么 义 乊 之 乌 乍 乎 乏 乐 乑 乒 乓 乔 乕 乖 乗 乘 乙 乚 乛 乜 九 乞 也 习 乡 乢 乣 乤 乥 书 乧 乨 乩 乪 乫 乬 乭 乮 乯 买 乱 乲 乳 乴 乵 乶 乷 乸 乹 乺 乻 乼 乽 乾 乿 ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("가 각 갂 갃 간 갅 갆 갇 갈 갉 갊 갋 갌 갍 갎 갏 감 갑 값 갓 갔 강 갖 갗 갘 같 갚 갛 개 객 갞 갟 갠 갡 갢 갣 갤 갥 갦 갧 갨 갩 갪 갫 갬 갭 갮 갯 갰 갱 갲 갳 갴 갵 갶 갷 갸 갹 갺 갻 갼 갽 갾 갿 걀 걁 걂 걃 걄 걅 걆 걇 걈 걉 걊 걋 걌 걍 걎 걏 걐 걑 걒 걓 걔 걕 걖 걗 걘 걙 걚 걛 걜 걝 걞 걟 걠 걡 걢 걣 걤 걥 걦 걧 걨 걩 걪 걫 걬 걭 걮 걯 거 걱 걲 걳 건 걵 걶 걷 걸 걹 걺 걻 걼 걽 걾 걿 ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("                                                                                                                                ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("豈 更 車 賈 滑 串 句 龜 龜 契 金 喇 奈 懶 癩 羅 蘿 螺 裸 邏 樂 洛 烙 珞 落 酪 駱 亂 卵 欄 爛 蘭 鸞 嵐 濫 藍 襤 拉 臘 蠟 廊 朗 浪 狼 郎 來 冷 勞 擄 櫓 爐 盧 老 蘆 虜 路 露 魯 鷺 碌 祿 綠 菉 錄 鹿 論 壟 弄 籠 聾 牢 磊 賂 雷 壘 屢 樓 淚 漏 累 縷 陋 勒 肋 凜 凌 稜 綾 菱 陵 讀 拏 樂 諾 丹 寧 怒 率 異 北 磻 便 復 不 泌 數 索 參 塞 省 葉 說 殺 辰 沈 拾 若 掠 略 亮 兩 凉 梁 糧 良 諒 量 勵 ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("ff fi fl ffi ffl ſt st ﬓ ﬔ ﬕ ﬖ ﬗ ﬞ ײַ ﬠ ﬡ ﬢ ﬣ ﬤ ﬥ ﬦ ﬧ ﬨ ﬩ שׁ שׂ שּׁ שּׂ אַ אָ אּ בּ גּ דּ הּ וּ זּ טּ יּ ךּ כּ לּ מּ נּ סּ ףּ פּ צּ קּ רּ שּ תּ וֹ בֿ כֿ פֿ ﭏ"))))(_(_($62$$62$)(_(printS)(Fay$$list("ﭐ ﭑ ﭒ ﭓ ﭔ ﭕ ﭖ ﭗ ﭘ ﭙ ﭚ ﭛ ﭜ ﭝ ﭞ ﭟ ﭠ ﭡ ﭢ ﭣ ﭤ ﭥ ﭦ ﭧ ﭨ ﭩ ﭪ ﭫ ﭬ ﭭ ﭮ ﭯ ﭰ ﭱ ﭲ ﭳ ﭴ ﭵ ﭶ ﭷ ﭸ ﭹ ﭺ ﭻ ﭼ ﭽ ﭾ ﭿ ﮀ ﮁ ﮂ ﮃ ﮄ ﮅ ﮆ ﮇ ﮈ ﮉ ﮊ ﮋ ﮌ ﮍ ﮎ ﮏ ﮐ ﮑ ﮒ ﮓ ﮔ ﮕ ﮖ ﮗ ﮘ ﮙ ﮚ ﮛ ﮜ ﮝ ﮞ ﮟ ﮠ ﮡ ﮢ ﮣ ﮤ ﮥ ﮦ ﮧ ﮨ ﮩ ﮪ ﮫ ﮬ ﮭ ﮮ ﮯ ﮰ ﮱ ﯓ ﯔ ﯕ ﯖ ﯗ ﯘ ﯙ ﯚ ﯛ ﯜ ﯝ ﯞ ﯟ ﯠ ﯡ ﯢ ﯣ ﯤ ﯥ ﯦ ﯧ ﯨ ﯩ ﯪ ﯫ ﯬ ﯭ ﯮ ﯯ ﯰ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("︠ ︡ ︢ ︣"))))(_(_($62$$62$)(_(printS)(Fay$$list("︰ ︱ ︲ ︳ ︴ ︵ ︶ ︷ ︸ ︹ ︺ ︻ ︼ ︽ ︾ ︿ ﹀ ﹁ ﹂ ﹃ ﹄ ﹉ ﹊ ﹋ ﹌ ﹍ ﹎ ﹏"))))(_(_($62$$62$)(_(printS)(Fay$$list("﹐ ﹑ ﹒ ﹔ ﹕ ﹖ ﹗ ﹘ ﹙ ﹚ ﹛ ﹜ ﹝ ﹞ ﹟ ﹠ ﹡ ﹢ ﹣ ﹤ ﹥ ﹦ ﹨ ﹩ ﹪ ﹫"))))(_(_($62$$62$)(_(printS)(Fay$$list("ﹰ ﹱ ﹲ ﹴ ﹶ ﹷ ﹸ ﹹ ﹺ ﹻ ﹼ ﹽ ﹾ ﹿ ﺀ ﺁ ﺂ ﺃ ﺄ ﺅ ﺆ ﺇ ﺈ ﺉ ﺊ ﺋ ﺌ ﺍ ﺎ ﺏ ﺐ ﺑ ﺒ ﺓ ﺔ ﺕ ﺖ ﺗ ﺘ ﺙ ﺚ ﺛ ﺜ ﺝ ﺞ ﺟ ﺠ ﺡ ﺢ ﺣ ﺤ ﺥ ﺦ ﺧ ﺨ ﺩ ﺪ ﺫ ﺬ ﺭ ﺮ ﺯ ﺰ ﺱ ﺲ ﺳ ﺴ ﺵ ﺶ ﺷ ﺸ ﺹ ﺺ ﺻ ﺼ ﺽ ﺾ ﺿ ﻀ ﻁ ﻂ ﻃ ﻄ ﻅ ﻆ ﻇ ﻈ ﻉ ﻊ ﻋ ﻌ ﻍ ﻎ ﻏ ﻐ ﻑ ﻒ ﻓ ﻔ ﻕ ﻖ ﻗ ﻘ ﻙ ﻚ ﻛ ﻜ ﻝ ﻞ ﻟ ﻠ ﻡ ﻢ ﻣ ﻤ ﻥ ﻦ ﻧ ﻨ ﻩ ﻪ ﻫ ﻬ ﻭ ﻮ ﻯ ﻰ ﻱ ..."))))(_(printS)(Fay$$list("! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ 。 「 」 、 ・ ヲ ァ ィ ゥ ェ ォ ャ ュ ョ ッ ー ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ ..."))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))));});var printS = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){return _(_($62$$62$)(_(printS)(Fay$$list("¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ"))))(_(_($62$$62$)(_(printS)(Fay$$list("Ā ā Ă ă Ą ą Ć ć Ĉ ĉ Ċ ċ Č č Ď ď Đ đ Ē ē Ĕ ĕ Ė ė Ę ę Ě ě Ĝ ĝ Ğ ğ Ġ ġ Ģ ģ Ĥ ĥ Ħ ħ Ĩ ĩ Ī ī Ĭ ĭ Į į İ ı IJ ij Ĵ ĵ Ķ ķ ĸ Ĺ ĺ Ļ ļ Ľ ľ Ŀ ŀ Ł ł Ń ń Ņ ņ Ň ň ʼn Ŋ ŋ Ō ō Ŏ ŏ Ő ő Œ œ Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ŝ ŝ Ş ş Š š Ţ ţ Ť ť Ŧ ŧ Ũ ũ Ū ū Ŭ ŭ Ů ů Ű ű Ų ų Ŵ ŵ Ŷ ŷ Ÿ Ź ź Ż ż Ž ž ſ"))))(_(_($62$$62$)(_(printS)(Fay$$list("ƀ Ɓ Ƃ ƃ Ƅ ƅ Ɔ Ƈ ƈ Ɖ Ɗ Ƌ ƌ ƍ Ǝ Ə Ɛ Ƒ ƒ Ɠ Ɣ ƕ Ɩ Ɨ Ƙ ƙ ƚ ƛ Ɯ Ɲ ƞ Ɵ Ơ ơ Ƣ ƣ Ƥ ƥ Ʀ Ƨ ƨ Ʃ ƪ ƫ Ƭ ƭ Ʈ Ư ư Ʊ Ʋ Ƴ ƴ Ƶ ƶ Ʒ Ƹ ƹ ƺ ƻ Ƽ ƽ ƾ ƿ ǀ ǁ ǂ ǃ DŽ Dž dž LJ Lj lj NJ Nj nj Ǎ ǎ Ǐ ǐ Ǒ ǒ Ǔ ǔ Ǖ ǖ Ǘ ǘ Ǚ ǚ Ǜ ǜ ǝ Ǟ ǟ Ǡ ǡ Ǣ ǣ Ǥ ǥ Ǧ ǧ Ǩ ǩ Ǫ ǫ Ǭ ǭ Ǯ ǯ ǰ DZ Dz dz Ǵ ǵ Ǻ ǻ Ǽ ǽ Ǿ ǿ Ȁ ȁ Ȃ ȃ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("ɐ ɑ ɒ ɓ ɔ ɕ ɖ ɗ ɘ ə ɚ ɛ ɜ ɝ ɞ ɟ ɠ ɡ ɢ ɣ ɤ ɥ ɦ ɧ ɨ ɩ ɪ ɫ ɬ ɭ ɮ ɯ ɰ ɱ ɲ ɳ ɴ ɵ ɶ ɷ ɸ ɹ ɺ ɻ ɼ ɽ ɾ ɿ ʀ ʁ ʂ ʃ ʄ ʅ ʆ ʇ ʈ ʉ ʊ ʋ ʌ ʍ ʎ ʏ ʐ ʑ ʒ ʓ ʔ ʕ ʖ ʗ ʘ ʙ ʚ ʛ ʜ ʝ ʞ ʟ ʠ ʡ ʢ ʣ ʤ ʥ ʦ ʧ ʨ"))))(_(_($62$$62$)(_(printS)(Fay$$list("ʰ ʱ ʲ ʳ ʴ ʵ ʶ ʷ ʸ ʹ ʺ ʻ ʼ ʽ ʾ ʿ ˀ ˁ ˂ ˃ ˄ ˅ ˆ ˇ ˈ ˉ ˊ ˋ ˌ ˍ ˎ ˏ ː ˑ ˒ ˓ ˔ ˕ ˖ ˗ ˘ ˙ ˚ ˛ ˜ ˝ ˞ ˠ ˡ ˢ ˣ ˤ ˥ ˦ ˧ ˨ ˩"))))(_(_($62$$62$)(_(printS)(Fay$$list("̀ ́ ̂ ̃ ̄ ̅ ̆ ̇ ̈ ̉ ̊ ̋ ̌ ̍ ̎ ̏ ̐ ̑ ̒ ̓ ̔ ̕ ̖ ̗ ̘ ̙ ̚ ̛ ̜ ̝ ̞ ̟ ̠ ̡ ̢ ̣ ̤ ̥ ̦ ̧ ̨ ̩ ̪ ̫ ̬ ̭ ̮ ̯ ̰ ̱ ̲ ̳ ̴ ̵ ̶ ̷ ̸ ̹ ̺ ̻ ̼ ̽ ̾ ̿ ̀ ́ ͂ ̓ ̈́ ͅ ͠ ͡"))))(_(_($62$$62$)(_(printS)(Fay$$list("ʹ ͵ ͺ ; ΄ ΅ Ά · Έ Ή Ί Ό Ύ Ώ ΐ Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω Ϊ Ϋ ά έ ή ί ΰ α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ ς σ τ υ φ χ ψ ω ϊ ϋ ό ύ ώ ϐ ϑ ϒ ϓ ϔ ϕ ϖ Ϛ Ϝ Ϟ Ϡ Ϣ ϣ Ϥ ϥ Ϧ ϧ Ϩ ϩ Ϫ ϫ Ϭ ϭ Ϯ ϯ ϰ ϱ ϲ ϳ"))))(_(_($62$$62$)(_(printS)(Fay$$list("Ё Ђ Ѓ Є Ѕ І Ї Ј Љ Њ Ћ Ќ Ў Џ А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я ё ђ ѓ є ѕ і ї ј љ њ ћ ќ ў џ Ѡ ѡ Ѣ ѣ Ѥ ѥ Ѧ ѧ Ѩ ѩ Ѫ ѫ Ѭ ѭ Ѯ ѯ Ѱ ѱ Ѳ ѳ Ѵ ѵ Ѷ ѷ Ѹ ѹ Ѻ ѻ Ѽ ѽ Ѿ ѿ Ҁ ҁ ҂ ҃ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("Ա Բ Գ Դ Ե Զ Է Ը Թ Ժ Ի Լ Խ Ծ Կ Հ Ձ Ղ Ճ Մ Յ Ն Շ Ո Չ Պ Ջ Ռ Ս Վ Տ Ր Ց Ւ Փ Ք Օ Ֆ ՙ ՚ ՛ ՜ ՝ ՞ ՟ ա բ գ դ ե զ է ը թ ժ ի լ խ ծ կ հ ձ ղ ճ մ յ ն շ ո չ պ ջ ռ ս վ տ ր ց ւ փ ք օ ֆ և ։"))))(_(_($62$$62$)(_(printS)(Fay$$list("֑ ֒ ֓ ֔ ֕ ֖ ֗ ֘ ֙ ֚ ֛ ֜ ֝ ֞ ֟ ֠ ֡ ֣ ֤ ֥ ֦ ֧ ֨ ֩ ֪ ֫ ֬ ֭ ֮ ֯ ְ ֱ ֲ ֳ ִ ֵ ֶ ַ ָ ֹ ֻ ּ ֽ ־ ֿ ׀ ׁ ׂ ׃ ׄ א ב ג ד ה ו ז ח ט י ך כ ל ם מ ן נ ס ע ף פ ץ צ ק ר ש ת װ ױ ײ ׳ ״"))))(_(_($62$$62$)(_(printS)(Fay$$list("، ؛ ؟ ء آ أ ؤ إ ئ ا ب ة ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ـ ف ق ك ل م ن ه و ى ي ً ٌ ٍ َ ُ ِ ّ ْ ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ ٪ ٫ ٬ ٭ ٰ ٱ ٲ ٳ ٴ ٵ ٶ ٷ ٸ ٹ ٺ ٻ ټ ٽ پ ٿ ڀ ځ ڂ ڃ ڄ څ چ ڇ ڈ ډ ڊ ڋ ڌ ڍ ڎ ڏ ڐ ڑ ڒ ړ ڔ ڕ ږ ڗ ژ ڙ ښ ڛ ڜ ڝ ڞ ڟ ڠ ڡ ڢ ڣ ڤ ڥ ڦ ڧ ڨ ک ڪ ګ ڬ ڭ ڮ گ ڰ ڱ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("ँ ं ः अ आ इ ई उ ऊ ऋ ऌ ऍ ऎ ए ऐ ऑ ऒ ओ औ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न ऩ प फ ब भ म य र ऱ ल ळ ऴ व श ष स ह ़ ऽ ा ि ी ु ू ृ ॄ ॅ ॆ े ै ॉ ॊ ो ौ ् ॐ ॑ ॒ ॓ ॔ क़ ख़ ग़ ज़ ड़ ढ़ फ़ य़ ॠ ॡ ॢ ॣ । ॥ ० १ २ ३ ४ ५ ६ ७ ८ ९ ॰"))))(_(_($62$$62$)(_(printS)(Fay$$list("ঁ ং ঃ অ আ ই ঈ উ ঊ ঋ ঌ এ ঐ ও ঔ ক খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড ঢ ণ ত থ দ ধ ন প ফ ব ভ ম য র ল শ ষ স হ ় া ি ী ু ূ ৃ ৄ ে ৈ ো ৌ ্ ৗ ড় ঢ় য় ৠ ৡ ৢ ৣ ০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯ ৰ ৱ ৲ ৳ ৴ ৵ ৶ ৷ ৸ ৹ ৺"))))(_(_($62$$62$)(_(printS)(Fay$$list("ਂ ਅ ਆ ਇ ਈ ਉ ਊ ਏ ਐ ਓ ਔ ਕ ਖ ਗ ਘ ਙ ਚ ਛ ਜ ਝ ਞ ਟ ਠ ਡ ਢ ਣ ਤ ਥ ਦ ਧ ਨ ਪ ਫ ਬ ਭ ਮ ਯ ਰ ਲ ਲ਼ ਵ ਸ਼ ਸ ਹ ਼ ਾ ਿ ੀ ੁ ੂ ੇ ੈ ੋ ੌ ੍ ਖ਼ ਗ਼ ਜ਼ ੜ ਫ਼ ੦ ੧ ੨ ੩ ੪ ੫ ੬ ੭ ੮ ੯ ੰ ੱ ੲ ੳ ੴ"))))(_(_($62$$62$)(_(printS)(Fay$$list("ઁ ં ઃ અ આ ઇ ઈ ઉ ઊ ઋ ઍ એ ઐ ઑ ઓ ઔ ક ખ ગ ઘ ઙ ચ છ જ ઝ ઞ ટ ઠ ડ ઢ ણ ત થ દ ધ ન પ ફ બ ભ મ ય ર લ ળ વ શ ષ સ હ ઼ ઽ ા િ ી ુ ૂ ૃ ૄ ૅ ે ૈ ૉ ો ૌ ્ ૐ ૠ ૦ ૧ ૨ ૩ ૪ ૫ ૬ ૭ ૮ ૯"))))(_(_($62$$62$)(_(printS)(Fay$$list("ଁ ଂ ଃ ଅ ଆ ଇ ଈ ଉ ଊ ଋ ଌ ଏ ଐ ଓ ଔ କ ଖ ଗ ଘ ଙ ଚ ଛ ଜ ଝ ଞ ଟ ଠ ଡ ଢ ଣ ତ ଥ ଦ ଧ ନ ପ ଫ ବ ଭ ମ ଯ ର ଲ ଳ ଶ ଷ ସ ହ ଼ ଽ ା ି ୀ ୁ ୂ ୃ େ ୈ ୋ ୌ ୍ ୖ ୗ ଡ଼ ଢ଼ ୟ ୠ ୡ ୦ ୧ ୨ ୩ ୪ ୫ ୬ ୭ ୮ ୯ ୰"))))(_(_($62$$62$)(_(printS)(Fay$$list("ஂ ஃ அ ஆ இ ஈ உ ஊ எ ஏ ஐ ஒ ஓ ஔ க ங ச ஜ ஞ ட ண த ந ன ப ம ய ர ற ல ள ழ வ ஷ ஸ ஹ ா ி ீ ு ூ ெ ே ை ொ ோ ௌ ் ௗ ௧ ௨ ௩ ௪ ௫ ௬ ௭ ௮ ௯ ௰ ௱ ௲"))))(_(_($62$$62$)(_(printS)(Fay$$list("ఁ ం ః అ ఆ ఇ ఈ ఉ ఊ ఋ ఌ ఎ ఏ ఐ ఒ ఓ ఔ క ఖ గ ఘ ఙ చ ఛ జ ఝ ఞ ట ఠ డ ఢ ణ త థ ద ధ న ప ఫ బ భ మ య ర ఱ ల ళ వ శ ష స హ ా ి ీ ు ూ ృ ౄ ె ే ై ొ ో ౌ ్ ౕ ౖ ౠ ౡ ౦ ౧ ౨ ౩ ౪ ౫ ౬ ౭ ౮ ౯"))))(_(_($62$$62$)(_(printS)(Fay$$list("ಂ ಃ ಅ ಆ ಇ ಈ ಉ ಊ ಋ ಌ ಎ ಏ ಐ ಒ ಓ ಔ ಕ ಖ ಗ ಘ ಙ ಚ ಛ ಜ ಝ ಞ ಟ ಠ ಡ ಢ ಣ ತ ಥ ದ ಧ ನ ಪ ಫ ಬ ಭ ಮ ಯ ರ ಱ ಲ ಳ ವ ಶ ಷ ಸ ಹ ಾ ಿ ೀ ು ೂ ೃ ೄ ೆ ೇ ೈ ೊ ೋ ೌ ್ ೕ ೖ ೞ ೠ ೡ ೦ ೧ ೨ ೩ ೪ ೫ ೬ ೭ ೮ ೯"))))(_(_($62$$62$)(_(printS)(Fay$$list("ം ഃ അ ആ ഇ ഈ ഉ ഊ ഋ ഌ എ ഏ ഐ ഒ ഓ ഔ ക ഖ ഗ ഘ ങ ച ഛ ജ ഝ ഞ ട ഠ ഡ ഢ ണ ത ഥ ദ ധ ന പ ഫ ബ ഭ മ യ ര റ ല ള ഴ വ ശ ഷ സ ഹ ാ ി ീ ു ൂ ൃ െ േ ൈ ൊ ോ ൌ ് ൗ ൠ ൡ ൦ ൧ ൨ ൩ ൪ ൫ ൬ ൭ ൮ ൯"))))(_(_($62$$62$)(_(printS)(Fay$$list("ก ข ฃ ค ฅ ฆ ง จ ฉ ช ซ ฌ ญ ฎ ฏ ฐ ฑ ฒ ณ ด ต ถ ท ธ น บ ป ผ ฝ พ ฟ ภ ม ย ร ฤ ล ฦ ว ศ ษ ส ห ฬ อ ฮ ฯ ะ ั า ำ ิ ี ึ ื ุ ู ฺ ฿ เ แ โ ใ ไ ๅ ๆ ็ ่ ้ ๊ ๋ ์ ํ ๎ ๏ ๐ ๑ ๒ ๓ ๔ ๕ ๖ ๗ ๘ ๙ ๚ ๛"))))(_(_($62$$62$)(_(printS)(Fay$$list("ກ ຂ ຄ ງ ຈ ຊ ຍ ດ ຕ ຖ ທ ນ ບ ປ ຜ ຝ ພ ຟ ມ ຢ ຣ ລ ວ ສ ຫ ອ ຮ ຯ ະ ັ າ ຳ ິ ີ ຶ ື ຸ ູ ົ ຼ ຽ ເ ແ ໂ ໃ ໄ ໆ ່ ້ ໊ ໋ ໌ ໍ ໐ ໑ ໒ ໓ ໔ ໕ ໖ ໗ ໘ ໙ ໜ ໝ"))))(_(_($62$$62$)(_(printS)(Fay$$list("ༀ ༁ ༂ ༃ ༄ ༅ ༆ ༇ ༈ ༉ ༊ ་ ༌ ། ༎ ༏ ༐ ༑ ༒ ༓ ༔ ༕ ༖ ༗ ༘ ༙ ༚ ༛ ༜ ༝ ༞ ༟ ༠ ༡ ༢ ༣ ༤ ༥ ༦ ༧ ༨ ༩ ༪ ༫ ༬ ༭ ༮ ༯ ༰ ༱ ༲ ༳ ༴ ༵ ༶ ༷ ༸ ༹ ༺ ༻ ༼ ༽ ༾ ༿ ཀ ཁ ག གྷ ང ཅ ཆ ཇ ཉ ཊ ཋ ཌ ཌྷ ཎ ཏ ཐ ད དྷ ན པ ཕ བ བྷ མ ཙ ཚ ཛ ཛྷ ཝ ཞ ཟ འ ཡ ར ལ ཤ ཥ ས ཧ ཨ ཀྵ ཱ ི ཱི ུ ཱུ ྲྀ ཷ ླྀ ཹ ེ ཻ ོ ཽ ཾ ཿ ྀ ཱྀ ྂ ྃ ྄ ྅ ྆ ྇ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("Ⴀ Ⴁ Ⴂ Ⴃ Ⴄ Ⴅ Ⴆ Ⴇ Ⴈ Ⴉ Ⴊ Ⴋ Ⴌ Ⴍ Ⴎ Ⴏ Ⴐ Ⴑ Ⴒ Ⴓ Ⴔ Ⴕ Ⴖ Ⴗ Ⴘ Ⴙ Ⴚ Ⴛ Ⴜ Ⴝ Ⴞ Ⴟ Ⴠ Ⴡ Ⴢ Ⴣ Ⴤ Ⴥ ა ბ გ დ ე ვ ზ თ ი კ ლ მ ნ ო პ ჟ რ ს ტ უ ფ ქ ღ ყ შ ჩ ც ძ წ ჭ ხ ჯ ჰ ჱ ჲ ჳ ჴ ჵ ჶ ჻"))))(_(_($62$$62$)(_(printS)(Fay$$list("ᄀ ᄁ ᄂ ᄃ ᄄ ᄅ ᄆ ᄇ ᄈ ᄉ ᄊ ᄋ ᄌ ᄍ ᄎ ᄏ ᄐ ᄑ ᄒ ᄓ ᄔ ᄕ ᄖ ᄗ ᄘ ᄙ ᄚ ᄛ ᄜ ᄝ ᄞ ᄟ ᄠ ᄡ ᄢ ᄣ ᄤ ᄥ ᄦ ᄧ ᄨ ᄩ ᄪ ᄫ ᄬ ᄭ ᄮ ᄯ ᄰ ᄱ ᄲ ᄳ ᄴ ᄵ ᄶ ᄷ ᄸ ᄹ ᄺ ᄻ ᄼ ᄽ ᄾ ᄿ ᅀ ᅁ ᅂ ᅃ ᅄ ᅅ ᅆ ᅇ ᅈ ᅉ ᅊ ᅋ ᅌ ᅍ ᅎ ᅏ ᅐ ᅑ ᅒ ᅓ ᅔ ᅕ ᅖ ᅗ ᅘ ᅙ ᅟ ᅠ ᅡ ᅢ ᅣ ᅤ ᅥ ᅦ ᅧ ᅨ ᅩ ᅪ ᅫ ᅬ ᅭ ᅮ ᅯ ᅰ ᅱ ᅲ ᅳ ᅴ ᅵ ᅶ ᅷ ᅸ ᅹ ᅺ ᅻ ᅼ ᅽ ᅾ ᅿ ᆀ ᆁ ᆂ ᆃ ᆄ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("Ḁ ḁ Ḃ ḃ Ḅ ḅ Ḇ ḇ Ḉ ḉ Ḋ ḋ Ḍ ḍ Ḏ ḏ Ḑ ḑ Ḓ ḓ Ḕ ḕ Ḗ ḗ Ḙ ḙ Ḛ ḛ Ḝ ḝ Ḟ ḟ Ḡ ḡ Ḣ ḣ Ḥ ḥ Ḧ ḧ Ḩ ḩ Ḫ ḫ Ḭ ḭ Ḯ ḯ Ḱ ḱ Ḳ ḳ Ḵ ḵ Ḷ ḷ Ḹ ḹ Ḻ ḻ Ḽ ḽ Ḿ ḿ Ṁ ṁ Ṃ ṃ Ṅ ṅ Ṇ ṇ Ṉ ṉ Ṋ ṋ Ṍ ṍ Ṏ ṏ Ṑ ṑ Ṓ ṓ Ṕ ṕ Ṗ ṗ Ṙ ṙ Ṛ ṛ Ṝ ṝ Ṟ ṟ Ṡ ṡ Ṣ ṣ Ṥ ṥ Ṧ ṧ Ṩ ṩ Ṫ ṫ Ṭ ṭ Ṯ ṯ Ṱ ṱ Ṳ ṳ Ṵ ṵ Ṷ ṷ Ṹ ṹ Ṻ ṻ Ṽ ṽ Ṿ ṿ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("ἀ ἁ ἂ ἃ ἄ ἅ ἆ ἇ Ἀ Ἁ Ἂ Ἃ Ἄ Ἅ Ἆ Ἇ ἐ ἑ ἒ ἓ ἔ ἕ Ἐ Ἑ Ἒ Ἓ Ἔ Ἕ ἠ ἡ ἢ ἣ ἤ ἥ ἦ ἧ Ἠ Ἡ Ἢ Ἣ Ἤ Ἥ Ἦ Ἧ ἰ ἱ ἲ ἳ ἴ ἵ ἶ ἷ Ἰ Ἱ Ἲ Ἳ Ἴ Ἵ Ἶ Ἷ ὀ ὁ ὂ ὃ ὄ ὅ Ὀ Ὁ Ὂ Ὃ Ὄ Ὅ ὐ ὑ ὒ ὓ ὔ ὕ ὖ ὗ Ὑ Ὓ Ὕ Ὗ ὠ ὡ ὢ ὣ ὤ ὥ ὦ ὧ Ὠ Ὡ Ὢ Ὣ Ὤ Ὥ Ὦ Ὧ ὰ ά ὲ έ ὴ ή ὶ ί ὸ ό ὺ ύ ὼ ώ ᾀ ᾁ ᾂ ᾃ ᾄ ᾅ ᾆ ᾇ ᾈ ᾉ ᾊ ᾋ ᾌ ᾍ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("‐ ‑ ‒ – — ― ‖ ‗ ‘ ’ ‚ ‛ “ ” „ ‟"))))(_(_($62$$62$)(_(printS)(Fay$$list("⁰ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ⁺ ⁻ ⁼ ⁽ ⁾ ⁿ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₊ ₋ ₌ ₍ ₎"))))(_(_($62$$62$)(_(printS)(Fay$$list("₠ ₡ ₢ ₣ ₤ ₥ ₦ ₧ ₨ ₩ ₪ ₫"))))(_(_($62$$62$)(_(printS)(Fay$$list("⃐ ⃑ ⃒ ⃓ ⃔ ⃕ ⃖ ⃗ ⃘ ⃙ ⃚ ⃛ ⃜ ⃝ ⃞ ⃟ ⃠ ⃡"))))(_(_($62$$62$)(_(printS)(Fay$$list("℀ ℁ ℂ ℃ ℄ ℅ ℆ ℇ ℈ ℉ ℊ ℋ ℌ ℍ ℎ ℏ ℐ ℑ ℒ ℓ ℔ ℕ № ℗ ℘ ℙ ℚ ℛ ℜ ℝ ℞ ℟ ℠ ℡ ™ ℣ ℤ ℥ Ω ℧ ℨ ℩ K Å ℬ ℭ ℮ ℯ ℰ ℱ Ⅎ ℳ ℴ ℵ ℶ ℷ ℸ"))))(_(_($62$$62$)(_(printS)(Fay$$list("⅓ ⅔ ⅕ ⅖ ⅗ ⅘ ⅙ ⅚ ⅛ ⅜ ⅝ ⅞ ⅟ Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ Ⅼ Ⅽ Ⅾ Ⅿ ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ ⅺ ⅻ ⅼ ⅽ ⅾ ⅿ ↀ ↁ ↂ"))))(_(_($62$$62$)(_(printS)(Fay$$list("← ↑ → ↓ ↔ ↕ ↖ ↗ ↘ ↙ ↚ ↛ ↜ ↝ ↞ ↟ ↠ ↡ ↢ ↣ ↤ ↥ ↦ ↧ ↨ ↩ ↪ ↫ ↬ ↭ ↮ ↯ ↰ ↱ ↲ ↳ ↴ ↵ ↶ ↷ ↸ ↹ ↺ ↻ ↼ ↽ ↾ ↿ ⇀ ⇁ ⇂ ⇃ ⇄ ⇅ ⇆ ⇇ ⇈ ⇉ ⇊ ⇋ ⇌ ⇍ ⇎ ⇏ ⇐ ⇑ ⇒ ⇓ ⇔ ⇕ ⇖ ⇗ ⇘ ⇙ ⇚ ⇛ ⇜ ⇝ ⇞ ⇟ ⇠ ⇡ ⇢ ⇣ ⇤ ⇥ ⇦ ⇧ ⇨ ⇩ ⇪"))))(_(_($62$$62$)(_(printS)(Fay$$list("∀ ∁ ∂ ∃ ∄ ∅ ∆ ∇ ∈ ∉ ∊ ∋ ∌ ∍ ∎ ∏ ∐ ∑ − ∓ ∔ ∕ ∖ ∗ ∘ ∙ √ ∛ ∜ ∝ ∞ ∟ ∠ ∡ ∢ ∣ ∤ ∥ ∦ ∧ ∨ ∩ ∪ ∫ ∬ ∭ ∮ ∯ ∰ ∱ ∲ ∳ ∴ ∵ ∶ ∷ ∸ ∹ ∺ ∻ ∼ ∽ ∾ ∿ ≀ ≁ ≂ ≃ ≄ ≅ ≆ ≇ ≈ ≉ ≊ ≋ ≌ ≍ ≎ ≏ ≐ ≑ ≒ ≓ ≔ ≕ ≖ ≗ ≘ ≙ ≚ ≛ ≜ ≝ ≞ ≟ ≠ ≡ ≢ ≣ ≤ ≥ ≦ ≧ ≨ ≩ ≪ ≫ ≬ ≭ ≮ ≯ ≰ ≱ ≲ ≳ ≴ ≵ ≶ ≷ ≸ ≹ ≺ ≻ ≼ ≽ ≾ ≿ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("⌀ ⌂ ⌃ ⌄ ⌅ ⌆ ⌇ ⌈ ⌉ ⌊ ⌋ ⌌ ⌍ ⌎ ⌏ ⌐ ⌑ ⌒ ⌓ ⌔ ⌕ ⌖ ⌗ ⌘ ⌙ ⌚ ⌛ ⌜ ⌝ ⌞ ⌟ ⌠ ⌡ ⌢ ⌣ ⌤ ⌥ ⌦ ⌧ ⌨ 〈 〉 ⌫ ⌬ ⌭ ⌮ ⌯ ⌰ ⌱ ⌲ ⌳ ⌴ ⌵ ⌶ ⌷ ⌸ ⌹ ⌺ ⌻ ⌼ ⌽ ⌾ ⌿ ⍀ ⍁ ⍂ ⍃ ⍄ ⍅ ⍆ ⍇ ⍈ ⍉ ⍊ ⍋ ⍌ ⍍ ⍎ ⍏ ⍐ ⍑ ⍒ ⍓ ⍔ ⍕ ⍖ ⍗ ⍘ ⍙ ⍚ ⍛ ⍜ ⍝ ⍞ ⍟ ⍠ ⍡ ⍢ ⍣ ⍤ ⍥ ⍦ ⍧ ⍨ ⍩ ⍪ ⍫ ⍬ ⍭ ⍮ ⍯ ⍰ ⍱ ⍲ ⍳ ⍴ ⍵ ⍶ ⍷ ⍸ ⍹ ⍺"))))(_(_($62$$62$)(_(printS)(Fay$$list("␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏ ␐ ␑ ␒ ␓ ␔ ␕ ␖ ␗ ␘ ␙ ␚ ␛ ␜ ␝ ␞ ␟ ␠ ␡ ␢ ␣ ␤"))))(_(_($62$$62$)(_(printS)(Fay$$list("⑀ ⑁ ⑂ ⑃ ⑄ ⑅ ⑆ ⑇ ⑈ ⑉ ⑊"))))(_(_($62$$62$)(_(printS)(Fay$$list("① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏ ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟ ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯ ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿ ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╌ ╍ ╎ ╏ ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟ ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯ ╰ ╱ ╲ ╳ ╴ ╵ ╶ ╷ ╸ ╹ ╺ ╻ ╼ ╽ ╾ ╿"))))(_(_($62$$62$)(_(printS)(Fay$$list("▀ ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊ ▋ ▌ ▍ ▎ ▏ ▐ ░ ▒ ▓ ▔ ▕"))))(_(_($62$$62$)(_(printS)(Fay$$list("■ □ ▢ ▣ ▤ ▥ ▦ ▧ ▨ ▩ ▪ ▫ ▬ ▭ ▮ ▯ ▰ ▱ ▲ △ ▴ ▵ ▶ ▷ ▸ ▹ ► ▻ ▼ ▽ ▾ ▿ ◀ ◁ ◂ ◃ ◄ ◅ ◆ ◇ ◈ ◉ ◊ ○ ◌ ◍ ◎ ● ◐ ◑ ◒ ◓ ◔ ◕ ◖ ◗ ◘ ◙ ◚ ◛ ◜ ◝ ◞ ◟ ◠ ◡ ◢ ◣ ◤ ◥ ◦ ◧ ◨ ◩ ◪ ◫ ◬ ◭ ◮ ◯"))))(_(_($62$$62$)(_(printS)(Fay$$list("☀ ☁ ☂ ☃ ☄ ★ ☆ ☇ ☈ ☉ ☊ ☋ ☌ ☍ ☎ ☏ ☐ ☑ ☒ ☓ ☚ ☛ ☜ ☝ ☞ ☟ ☠ ☡ ☢ ☣ ☤ ☥ ☦ ☧ ☨ ☩ ☪ ☫ ☬ ☭ ☮ ☯ ☰ ☱ ☲ ☳ ☴ ☵ ☶ ☷ ☸ ☹ ☺ ☻ ☼ ☽ ☾ ☿ ♀ ♁ ♂ ♃ ♄ ♅ ♆ ♇ ♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓ ♔ ♕ ♖ ♗ ♘ ♙ ♚ ♛ ♜ ♝ ♞ ♟ ♠ ♡ ♢ ♣ ♤ ♥ ♦ ♧ ♨ ♩ ♪ ♫ ♬ ♭ ♮ ♯"))))(_(_($62$$62$)(_(printS)(Fay$$list("✁ ✂ ✃ ✄ ✆ ✇ ✈ ✉ ✌ ✍ ✎ ✏ ✐ ✑ ✒ ✓ ✔ ✕ ✖ ✗ ✘ ✙ ✚ ✛ ✜ ✝ ✞ ✟ ✠ ✡ ✢ ✣ ✤ ✥ ✦ ✧ ✩ ✪ ✫ ✬ ✭ ✮ ✯ ✰ ✱ ✲ ✳ ✴ ✵ ✶ ✷ ✸ ✹ ✺ ✻ ✼ ✽ ✾ ✿ ❀ ❁ ❂ ❃ ❄ ❅ ❆ ❇ ❈ ❉ ❊ ❋ ❍ ❏ ❐ ❑ ❒ ❖ ❘ ❙ ❚ ❛ ❜ ❝ ❞ ❡ ❢ ❣ ❤ ❥ ❦ ❧ ❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿ ➀ ➁ ➂ ➃ ➄ ➅ ➆ ➇ ➈ ➉ ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓ ➔ ➘ ➙ ➚ ➛ ➜ ➝ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("  、 。 〃 〄 々 〆 〇 〈 〉 《 》 「 」 『 』 【 】 〒 〓 〔 〕 〖 〗 〘 〙 〚 〛 〜 〝 〞 〟 〠 〡 〢 〣 〤 〥 〦 〧 〨 〩 〪 〫 〬 〭 〮 〯 〰 〱 〲 〳 〴 〵 〶 〷 〿"))))(_(_($62$$62$)(_(printS)(Fay$$list("ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た だ ち ぢ っ つ づ て で と ど な に ぬ ね の は ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み む め も ゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ ゐ ゑ を ん ゔ ゙ ゚ ゛ ゜ ゝ ゞ"))))(_(_($62$$62$)(_(printS)(Fay$$list("ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク グ ケ ゲ コ ゴ サ ザ シ ジ ス ズ セ ゼ ソ ゾ タ ダ チ ヂ ッ ツ ヅ テ デ ト ド ナ ニ ヌ ネ ノ ハ バ パ ヒ ビ ピ フ ブ プ ヘ ベ ペ ホ ボ ポ マ ミ ム メ モ ャ ヤ ュ ユ ョ ヨ ラ リ ル レ ロ ヮ ワ ヰ ヱ ヲ ン ヴ ヵ ヶ ヷ ヸ ヹ ヺ ・ ー ヽ ヾ"))))(_(_($62$$62$)(_(printS)(Fay$$list("ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ ㄢ ㄣ ㄤ ㄥ ㄦ ㄧ ㄨ ㄩ ㄪ ㄫ ㄬ"))))(_(_($62$$62$)(_(printS)(Fay$$list("ㄱ ㄲ ㄳ ㄴ ㄵ ㄶ ㄷ ㄸ ㄹ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ ㅂ ㅃ ㅄ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ ㅤ ㅥ ㅦ ㅧ ㅨ ㅩ ㅪ ㅫ ㅬ ㅭ ㅮ ㅯ ㅰ ㅱ ㅲ ㅳ ㅴ ㅵ ㅶ ㅷ ㅸ ㅹ ㅺ ㅻ ㅼ ㅽ ㅾ ㅿ ㆀ ㆁ ㆂ ㆃ ㆄ ㆅ ㆆ ㆇ ㆈ ㆉ ㆊ ㆋ ㆌ ㆍ ㆎ"))))(_(_($62$$62$)(_(printS)(Fay$$list("㆐ ㆑ ㆒ ㆓ ㆔ ㆕ ㆖ ㆗ ㆘ ㆙ ㆚ ㆛ ㆜ ㆝ ㆞ ㆟"))))(_(_($62$$62$)(_(printS)(Fay$$list("㈀ ㈁ ㈂ ㈃ ㈄ ㈅ ㈆ ㈇ ㈈ ㈉ ㈊ ㈋ ㈌ ㈍ ㈎ ㈏ ㈐ ㈑ ㈒ ㈓ ㈔ ㈕ ㈖ ㈗ ㈘ ㈙ ㈚ ㈛ ㈜ ㈠ ㈡ ㈢ ㈣ ㈤ ㈥ ㈦ ㈧ ㈨ ㈩ ㈪ ㈫ ㈬ ㈭ ㈮ ㈯ ㈰ ㈱ ㈲ ㈳ ㈴ ㈵ ㈶ ㈷ ㈸ ㈹ ㈺ ㈻ ㈼ ㈽ ㈾ ㈿ ㉀ ㉁ ㉂ ㉃ ㉠ ㉡ ㉢ ㉣ ㉤ ㉥ ㉦ ㉧ ㉨ ㉩ ㉪ ㉫ ㉬ ㉭ ㉮ ㉯ ㉰ ㉱ ㉲ ㉳ ㉴ ㉵ ㉶ ㉷ ㉸ ㉹ ㉺ ㉻ ㉿ ㊀ ㊁ ㊂ ㊃ ㊄ ㊅ ㊆ ㊇ ㊈ ㊉ ㊊ ㊋ ㊌ ㊍ ㊎ ㊏ ㊐ ㊑ ㊒ ㊓ ㊔ ㊕ ㊖ ㊗ ㊘ ㊙ ㊚ ㊛ ㊜ ㊝ ㊞ ㊟ ㊠ ㊡ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("㌀ ㌁ ㌂ ㌃ ㌄ ㌅ ㌆ ㌇ ㌈ ㌉ ㌊ ㌋ ㌌ ㌍ ㌎ ㌏ ㌐ ㌑ ㌒ ㌓ ㌔ ㌕ ㌖ ㌗ ㌘ ㌙ ㌚ ㌛ ㌜ ㌝ ㌞ ㌟ ㌠ ㌡ ㌢ ㌣ ㌤ ㌥ ㌦ ㌧ ㌨ ㌩ ㌪ ㌫ ㌬ ㌭ ㌮ ㌯ ㌰ ㌱ ㌲ ㌳ ㌴ ㌵ ㌶ ㌷ ㌸ ㌹ ㌺ ㌻ ㌼ ㌽ ㌾ ㌿ ㍀ ㍁ ㍂ ㍃ ㍄ ㍅ ㍆ ㍇ ㍈ ㍉ ㍊ ㍋ ㍌ ㍍ ㍎ ㍏ ㍐ ㍑ ㍒ ㍓ ㍔ ㍕ ㍖ ㍗ ㍘ ㍙ ㍚ ㍛ ㍜ ㍝ ㍞ ㍟ ㍠ ㍡ ㍢ ㍣ ㍤ ㍥ ㍦ ㍧ ㍨ ㍩ ㍪ ㍫ ㍬ ㍭ ㍮ ㍯ ㍰ ㍱ ㍲ ㍳ ㍴ ㍵ ㍶ ㍻ ㍼ ㍽ ㍾ ㍿ ㎀ ㎁ ㎂ ㎃ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("一 丁 丂 七 丄 丅 丆 万 丈 三 上 下 丌 不 与 丏 丐 丑 丒 专 且 丕 世 丗 丘 丙 业 丛 东 丝 丞 丟 丠 両 丢 丣 两 严 並 丧 丨 丩 个 丫 丬 中 丮 丯 丰 丱 串 丳 临 丵 丶 丷 丸 丹 为 主 丼 丽 举 丿 乀 乁 乂 乃 乄 久 乆 乇 么 义 乊 之 乌 乍 乎 乏 乐 乑 乒 乓 乔 乕 乖 乗 乘 乙 乚 乛 乜 九 乞 也 习 乡 乢 乣 乤 乥 书 乧 乨 乩 乪 乫 乬 乭 乮 乯 买 乱 乲 乳 乴 乵 乶 乷 乸 乹 乺 乻 乼 乽 乾 乿 ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("가 각 갂 갃 간 갅 갆 갇 갈 갉 갊 갋 갌 갍 갎 갏 감 갑 값 갓 갔 강 갖 갗 갘 같 갚 갛 개 객 갞 갟 갠 갡 갢 갣 갤 갥 갦 갧 갨 갩 갪 갫 갬 갭 갮 갯 갰 갱 갲 갳 갴 갵 갶 갷 갸 갹 갺 갻 갼 갽 갾 갿 걀 걁 걂 걃 걄 걅 걆 걇 걈 걉 걊 걋 걌 걍 걎 걏 걐 걑 걒 걓 걔 걕 걖 걗 걘 걙 걚 걛 걜 걝 걞 걟 걠 걡 걢 걣 걤 걥 걦 걧 걨 걩 걪 걫 걬 걭 걮 걯 거 걱 걲 걳 건 걵 걶 걷 걸 걹 걺 걻 걼 걽 걾 걿 ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("豈 更 車 賈 滑 串 句 龜 龜 契 金 喇 奈 懶 癩 羅 蘿 螺 裸 邏 樂 洛 烙 珞 落 酪 駱 亂 卵 欄 爛 蘭 鸞 嵐 濫 藍 襤 拉 臘 蠟 廊 朗 浪 狼 郎 來 冷 勞 擄 櫓 爐 盧 老 蘆 虜 路 露 魯 鷺 碌 祿 綠 菉 錄 鹿 論 壟 弄 籠 聾 牢 磊 賂 雷 壘 屢 樓 淚 漏 累 縷 陋 勒 肋 凜 凌 稜 綾 菱 陵 讀 拏 樂 諾 丹 寧 怒 率 異 北 磻 便 復 不 泌 數 索 參 塞 省 葉 說 殺 辰 沈 拾 若 掠 略 亮 兩 凉 梁 糧 良 諒 量 勵 ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("ff fi fl ffi ffl ſt st ﬓ ﬔ ﬕ ﬖ ﬗ ﬞ ײַ ﬠ ﬡ ﬢ ﬣ ﬤ ﬥ ﬦ ﬧ ﬨ ﬩ שׁ שׂ שּׁ שּׂ אַ אָ אּ בּ גּ דּ הּ וּ זּ טּ יּ ךּ כּ לּ מּ נּ סּ ףּ פּ צּ קּ רּ שּ תּ וֹ בֿ כֿ פֿ ﭏ"))))(_(_($62$$62$)(_(printS)(Fay$$list("ﭐ ﭑ ﭒ ﭓ ﭔ ﭕ ﭖ ﭗ ﭘ ﭙ ﭚ ﭛ ﭜ ﭝ ﭞ ﭟ ﭠ ﭡ ﭢ ﭣ ﭤ ﭥ ﭦ ﭧ ﭨ ﭩ ﭪ ﭫ ﭬ ﭭ ﭮ ﭯ ﭰ ﭱ ﭲ ﭳ ﭴ ﭵ ﭶ ﭷ ﭸ ﭹ ﭺ ﭻ ﭼ ﭽ ﭾ ﭿ ﮀ ﮁ ﮂ ﮃ ﮄ ﮅ ﮆ ﮇ ﮈ ﮉ ﮊ ﮋ ﮌ ﮍ ﮎ ﮏ ﮐ ﮑ ﮒ ﮓ ﮔ ﮕ ﮖ ﮗ ﮘ ﮙ ﮚ ﮛ ﮜ ﮝ ﮞ ﮟ ﮠ ﮡ ﮢ ﮣ ﮤ ﮥ ﮦ ﮧ ﮨ ﮩ ﮪ ﮫ ﮬ ﮭ ﮮ ﮯ ﮰ ﮱ ﯓ ﯔ ﯕ ﯖ ﯗ ﯘ ﯙ ﯚ ﯛ ﯜ ﯝ ﯞ ﯟ ﯠ ﯡ ﯢ ﯣ ﯤ ﯥ ﯦ ﯧ ﯨ ﯩ ﯪ ﯫ ﯬ ﯭ ﯮ ﯯ ﯰ ..."))))(_(_($62$$62$)(_(printS)(Fay$$list("︠ ︡ ︢ ︣"))))(_(_($62$$62$)(_(printS)(Fay$$list("︰ ︱ ︲ ︳ ︴ ︵ ︶ ︷ ︸ ︹ ︺ ︻ ︼ ︽ ︾ ︿ ﹀ ﹁ ﹂ ﹃ ﹄ ﹉ ﹊ ﹋ ﹌ ﹍ ﹎ ﹏"))))(_(_($62$$62$)(_(printS)(Fay$$list("﹐ ﹑ ﹒ ﹔ ﹕ ﹖ ﹗ ﹘ ﹙ ﹚ ﹛ ﹜ ﹝ ﹞ ﹟ ﹠ ﹡ ﹢ ﹣ ﹤ ﹥ ﹦ ﹨ ﹩ ﹪ ﹫"))))(_(_($62$$62$)(_(printS)(Fay$$list("ﹰ ﹱ ﹲ ﹴ ﹶ ﹷ ﹸ ﹹ ﹺ ﹻ ﹼ ﹽ ﹾ ﹿ ﺀ ﺁ ﺂ ﺃ ﺄ ﺅ ﺆ ﺇ ﺈ ﺉ ﺊ ﺋ ﺌ ﺍ ﺎ ﺏ ﺐ ﺑ ﺒ ﺓ ﺔ ﺕ ﺖ ﺗ ﺘ ﺙ ﺚ ﺛ ﺜ ﺝ ﺞ ﺟ ﺠ ﺡ ﺢ ﺣ ﺤ ﺥ ﺦ ﺧ ﺨ ﺩ ﺪ ﺫ ﺬ ﺭ ﺮ ﺯ ﺰ ﺱ ﺲ ﺳ ﺴ ﺵ ﺶ ﺷ ﺸ ﺹ ﺺ ﺻ ﺼ ﺽ ﺾ ﺿ ﻀ ﻁ ﻂ ﻃ ﻄ ﻅ ﻆ ﻇ ﻈ ﻉ ﻊ ﻋ ﻌ ﻍ ﻎ ﻏ ﻐ ﻑ ﻒ ﻓ ﻔ ﻕ ﻖ ﻗ ﻘ ﻙ ﻚ ﻛ ﻜ ﻝ ﻞ ﻟ ﻠ ﻡ ﻢ ﻣ ﻤ ﻥ ﻦ ﻧ ﻨ ﻩ ﻪ ﻫ ﻬ ﻭ ﻮ ﻯ ﻰ ﻱ ..."))))(_(printS)(Fay$$list("! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ 。 「 」 、 ・ ヲ ァ ィ ゥ ェ ォ ャ ュ ョ ッ ー ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ ...")))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))));});var printS = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.printS = printS; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new Utf8(); main._(main.main); 
tests/where.hs view
@@ -1,5 +1,10 @@ {-# LANGUAGE NoImplicitPrelude #-} +module Where where++import           Language.Fay.FFI+import           Language.Fay.Prelude+ main = print $ "Hello " ++ friends ++ family   where friends = "my friends"         family = " and family"
tests/where.js view
@@ -1,6 +1,6 @@ /** @constructor */-var Main = function(){+var Where = function(){ var True = true; var False = false; @@ -32,20 +32,14 @@ }  // Force the thunk.-$.prototype.force = function(nocache){-    return nocache-        ? this.value()-        : this.forced-        ? this.value-        : (this.forced = true, this.value = this.value());+$.prototype.force = function(nocache) {+  return nocache ?+    this.value() :+    (this.forced ?+     this.value :+     (this.value = this.value(), this.forced = true, this.value)); }; --// Eval in the context of the Haskell bindings.-function Fay$$eval(str){-    return eval(str);-}- /*******************************************************************************  * Monad.  */@@ -164,6 +158,11 @@         jsObj = _(fayObj);         break;     }+    case "int": {+        // Serialize int, just force the argument. Ints are unboxed.+        jsObj = _(fayObj);+        break;+    }     case "bool": {         // Bools are unboxed.         jsObj = _(fayObj);@@ -213,6 +212,14 @@         fayObj = jsObj;         break;     }+    case "int": {+        // Int are unboxed, so there's no forcing to do.+        // But we can do validation that the int has no decimal places.+        // E.g. Math.round(x)!=x? throw "NOT AN INTEGER, GET OUT!"+        fayObj = Math.round(jsObj);+        if(fayObj!==jsObj) throw "Argument " + jsObj + " is not an integer!";+        break;+    }     case "bool": {         // Bools are unboxed.         fayObj = jsObj;@@ -274,30 +281,42 @@ // Built-in *. function Fay$$mult(x){     return function(y){-        return _(x) * _(y);+        return new $(function(){+            return _(x) * _(y);+        });     }; }+var $42$ = Fay$$mult;  // Built-in +. function Fay$$add(x){     return function(y){-        return _(x) + _(y);+        return new $(function(){+            return _(x) + _(y);+        });     }; }+var $43$ = Fay$$add;  // Built-in -. function Fay$$sub(x){     return function(y){-        return _(x) - _(y);+        return new $(function(){+            return _(x) - _(y);+        });     }; }+var $45$ = Fay$$sub;  // Built-in /. function Fay$$div(x){     return function(y){-        return _(x) / _(y);+        return new $(function(){+            return _(x) / _(y);+        });     }; }+var $47$ = Fay$$div;  /*******************************************************************************  * Booleans.@@ -326,66 +345,98 @@             if (lit1 === null || lit2 === null)                 return lit1 === lit2;         } while (true);+    } else if (typeof lit1 == 'object' && typeof lit2 == 'object' && lit1 && lit2 &&+              lit1.constructor === lit2.constructor) {+      for(var x in lit1) {+        if(!(lit1.hasOwnProperty(x) && lit2.hasOwnProperty(x) &&+            Fay$$equal(lit1[x],lit2[x])))+          return false;+      }+      return true;     } else {-        return false;+      return false;     } }  // Built-in ==. function Fay$$eq(x){     return function(y){-        return Fay$$equal(x,y);+        return new $(function(){+            return Fay$$equal(x,y);+        });     }; }+var $61$$61$ = Fay$$eq;  // Built-in /=. function Fay$$neq(x){     return function(y){-        return !(Fay$$equal(x,y));+        return new $(function(){+            return !(Fay$$equal(x,y));+        });     }; }+var $47$$61$ = Fay$$neq;  // Built-in >. function Fay$$gt(x){     return function(y){-        return _(x) > _(y);+        return new $(function(){+            return _(x) > _(y);+        });     }; }+var $62$ = Fay$$gt;  // Built-in <. function Fay$$lt(x){     return function(y){-        return _(x) < _(y);+        return new $(function(){+            return _(x) < _(y);+        });     }; }+var $60$ = Fay$$lt;  // Built-in >=. function Fay$$gte(x){     return function(y){-        return _(x) >= _(y);+        return new $(function(){+            return _(x) >= _(y);+        });     }; }+var $62$$61$ = Fay$$gte;  // Built-in <=. function Fay$$lte(x){     return function(y){-        return _(x) <= _(y);+        return new $(function(){+            return _(x) <= _(y);+        });     }; }+var $60$$61$ = Fay$$lte;  // Built-in &&. function Fay$$and(x){     return function(y){-        return _(x) && _(y);+        return new $(function(){+            return _(x) && _(y);+        });     }; }+var $38$$38$ = Fay$$and;  // Built-in ||. function Fay$$or(x){     return function(y){-        return _(x) || _(y);+        return new $(function(){+            return _(x) || _(y);+        });     }; }+var $124$$124$ = Fay$$or;  /*******************************************************************************  * Mutable references.@@ -417,8 +468,55 @@  * Application code.  */ -var main = new $(function(){var friends = new $(function(){return Fay$$list("my friends");});var family = new $(function(){return Fay$$list(" and family");});return _(_($36$)(print))(_(_($43$$43$)(Fay$$list("Hello ")))(_(_($43$$43$)(friends))(family)));});var print = function($_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$_a)));});};var $_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $_Just(slot1);});};var $_Nothing = function(){};var Nothing = new $(function(){return new $_Nothing();});var show = function($_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["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) {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) {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 = function(){};var GT = new $(function(){return new $_GT();});var $_LT = function(){};var LT = new $(function(){return new $_LT();});var $_EQ = function(){};var EQ = new $(function(){return new $_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){if (_($_ys) === null) {return Fay$$list([x]);}var $_$_ys = _($_ys);if ($_$_ys instanceof Fay$$Cons) {var y = $_$_ys.car;var ys$39$ = $_$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $_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) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_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) {var m = $_a;return m;}if (_($_c) instanceof $_Just) {var x = _($_c).slot1;var f = $_b;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;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;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 _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($_a) === null) {return _($_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 _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$_a,$_b]];});};};var $_const = function($_a){return function($_b){return new $(function(){var a = $_a;return a;});};};var length = function($_a){return new $(function(){var $_$_a = _($_a);if ($_$_a instanceof Fay$$Cons) {var x = $_$_a.car;var xs = $_$_a.cdr;return 1 + _(_(length)(xs));}if (_($_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$_a]];});};var mod = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$_a) % Fay$$fayToJs(["double"],$_b));});};};var min = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var max = function($_a){return function($_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$_a),Fay$$fayToJs(["double"],$_b)));});};};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $_EQ) {return {"instance": "EQ"};}if (_obj instanceof $_LT) {return {"instance": "LT"};}if (_obj instanceof $_GT) {return {"instance": "GT"};}if (_obj instanceof $_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $_EQ();}if (obj["instance"] === "LT") {return new $_LT();}if (obj["instance"] === "GT") {return new $_GT();}if (obj["instance"] === "Nothing") {return new $_Nothing();}if (obj["instance"] === "Just") {return new $_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;};+var main = new $(function(){var friends = new $(function(){return Fay$$list("my friends");});var family = new $(function(){return Fay$$list(" and family");});return _(_($36$)(print))(_(_($43$$43$)(Fay$$list("Hello ")))(_(_($43$$43$)(friends))(family)));});var print = function($36$_a){return new $(function(){return Fay$$jsToFay(["action",[["unknown"]]],console.log(Fay$$fayToJs(["string"],$36$_a)));});};var $36$_Just = function(slot1){this.slot1 = slot1;};var Just = function(slot1){return new $(function(){return new $36$_Just(slot1);});};var $36$_Nothing = function(){};var Nothing = new $(function(){return new $36$_Nothing();});var show = function($36$_a){return new $(function(){return Fay$$jsToFay(["string"],JSON.stringify(Fay$$fayToJs(["unknown"],$36$_a)));});};var fromInteger = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var fromRational = function($36$_a){return new $(function(){var x = $36$_a;return x;});};var snd = function($36$_a){return new $(function(){var x = Fay$$index(1)(_($36$_a));return x;throw ["unhandled case in Ident \"snd\"",[$36$_a]];});};var fst = function($36$_a){return new $(function(){var x = Fay$$index(0)(_($36$_a));return x;throw ["unhandled case in Ident \"fst\"",[$36$_a]];});};var find = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(Just)(x) : _(_(find)(p))(xs);}if (_($36$_b) === null) {return Nothing;}throw ["unhandled case in Ident \"find\"",[$36$_a,$36$_b]];});};};var any = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? true : _(_(any)(p))(xs);}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"any\"",[$36$_a,$36$_b]];});};};var filter = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var p = $36$_a;return _(_(p)(x)) ? _(_(Fay$$cons)(x))(_(_(filter)(p))(xs)) : _(_(filter)(p))(xs);}if (_($36$_b) === null) {return null;}throw ["unhandled case in Ident \"filter\"",[$36$_a,$36$_b]];});};};var not = function($36$_a){return new $(function(){var p = $36$_a;return _(p) ? false : true;});};var $_null = function($36$_a){return new $(function(){if (_($36$_a) === null) {return true;}return false;});};var map = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(f)(x)))(_(_(map)(f))(xs));}throw ["unhandled case in Ident \"map\"",[$36$_a,$36$_b]];});};};var nub = function($36$_a){return new $(function(){var ls = $36$_a;return _(_(nub$39$)(ls))(null);});};var nub$39$ = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_a) === null) {return null;}var ls = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_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'\"",[$36$_a,$36$_b]];});};};var elem = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var y = $36$_$36$_b.car;var ys = $36$_$36$_b.cdr;var x = $36$_a;return _(Fay$$or)(_(_(_(Fay$$eq)(x))(y)))(_(_(_(elem)(x))(ys)));}if (_($36$_b) === null) {return false;}throw ["unhandled case in Ident \"elem\"",[$36$_a,$36$_b]];});};};var $36$_GT = function(){};var GT = new $(function(){return new $36$_GT();});var $36$_LT = function(){};var LT = new $(function(){return new $36$_LT();});var $36$_EQ = function(){};var EQ = new $(function(){return new $36$_EQ();});var sort = new $(function(){return _(sortBy)(compare);});var compare = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(Fay$$gt)(_(x))(_(y))) ? GT : _(_(Fay$$lt)(_(x))(_(y))) ? LT : EQ;});};};var sortBy = function($36$_a){return new $(function(){var cmp = $36$_a;return _(_(foldr)(_(insertBy)(cmp)))(null);});};var insertBy = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var x = $36$_b;return Fay$$list([x]);}var ys = $36$_c;var x = $36$_b;var cmp = $36$_a;return (function($36$_ys){if (_($36$_ys) === null) {return Fay$$list([x]);}var $36$_$36$_ys = _($36$_ys);if ($36$_$36$_ys instanceof Fay$$Cons) {var y = $36$_$36$_ys.car;var ys$39$ = $36$_$36$_ys.cdr;return (function($tmp){if (_($tmp) instanceof $36$_GT) {return _(_(Fay$$cons)(y))(_(_(_(insertBy)(cmp))(x))(ys$39$));}return _(_(Fay$$cons)(x))(ys);})(_(_(cmp)(x))(y));}return (function(){ throw (["unhandled case",$36$_ys]); })();})(ys);});};};};var when = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var p = $36$_a;return _(p) ? _(_($62$$62$)(m))(_($_return)(Fay$$unit)) : _($_return)(Fay$$unit);});};};var enumFrom = function($36$_a){return new $(function(){var i = $36$_a;return _(_(Fay$$cons)(i))(_(enumFrom)(_(Fay$$add)(_(i))(1)));});};var enumFromTo = function($36$_a){return function($36$_b){return new $(function(){var n = $36$_b;var i = $36$_a;return _(_(_(Fay$$eq)(i))(n)) ? Fay$$list([i]) : _(_(Fay$$cons)(i))(_(_(enumFromTo)(_(Fay$$add)(_(i))(1)))(n));});};};var zipWith = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var b = $36$_$36$_c.car;var bs = $36$_$36$_c.cdr;var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var a = $36$_$36$_b.car;var as = $36$_$36$_b.cdr;var f = $36$_a;return _(_(Fay$$cons)(_(_(f)(a))(b)))(_(_(_(zipWith)(f))(as))(bs));}}return null;});};};};var zip = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var b = $36$_$36$_b.car;var bs = $36$_$36$_b.cdr;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var a = $36$_$36$_a.car;var as = $36$_$36$_a.cdr;return _(_(Fay$$cons)(Fay$$list([a,b])))(_(_(zip)(as))(bs));}}return null;});};};var flip = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var y = $36$_c;var x = $36$_b;var f = $36$_a;return _(_(f)(y))(x);});};};};var maybe = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) instanceof $36$_Nothing) {var m = $36$_a;return m;}if (_($36$_c) instanceof $36$_Just) {var x = _($36$_c).slot1;var f = $36$_b;return _(f)(x);}throw ["unhandled case in Ident \"maybe\"",[$36$_a,$36$_b,$36$_c]];});};};};var $46$ = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){var x = $36$_c;var g = $36$_b;var f = $36$_a;return _(f)(_(g)(x));});};};};var $43$$43$ = function($36$_a){return function($36$_b){return new $(function(){var y = $36$_b;var x = $36$_a;return _(_(conc)(x))(y);});};};var $36$ = function($36$_a){return function($36$_b){return new $(function(){var x = $36$_b;var f = $36$_a;return _(f)(x);});};};var conc = function($36$_a){return function($36$_b){return new $(function(){var ys = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_(Fay$$cons)(x))(_(_(conc)(xs))(ys));}var ys = $36$_b;if (_($36$_a) === null) {return ys;}throw ["unhandled case in Ident \"conc\"",[$36$_a,$36$_b]];});};};var concat = new $(function(){return _(_(foldr)(conc))(null);});var foldr = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(f)(x))(_(_(_(foldr)(f))(z))(xs));}throw ["unhandled case in Ident \"foldr\"",[$36$_a,$36$_b,$36$_c]];});};};};var foldl = function($36$_a){return function($36$_b){return function($36$_c){return new $(function(){if (_($36$_c) === null) {var z = $36$_b;return z;}var $36$_$36$_c = _($36$_c);if ($36$_$36$_c instanceof Fay$$Cons) {var x = $36$_$36$_c.car;var xs = $36$_$36$_c.cdr;var z = $36$_b;var f = $36$_a;return _(_(_(foldl)(f))(_(_(f)(z))(x)))(xs);}throw ["unhandled case in Ident \"foldl\"",[$36$_a,$36$_b,$36$_c]];});};};};var lookup = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {var _key = $36$_a;return Nothing;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = Fay$$index(0)(_($36$_$36$_b.car));var y = Fay$$index(1)(_($36$_$36$_b.car));var xys = $36$_$36$_b.cdr;var key = $36$_a;return _(_(_(Fay$$eq)(key))(x)) ? _(Just)(y) : _(_(lookup)(key))(xys);}throw ["unhandled case in Ident \"lookup\"",[$36$_a,$36$_b]];});};};var intersperse = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs));}throw ["unhandled case in Ident \"intersperse\"",[$36$_a,$36$_b]];});};};var prependToAll = function($36$_a){return function($36$_b){return new $(function(){if (_($36$_b) === null) {return null;}var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var sep = $36$_a;return _(_(Fay$$cons)(sep))(_(_(Fay$$cons)(x))(_(_(prependToAll)(sep))(xs)));}throw ["unhandled case in Ident \"prependToAll\"",[$36$_a,$36$_b]];});};};var intercalate = function($36$_a){return function($36$_b){return new $(function(){var xss = $36$_b;var xs = $36$_a;return _(concat)(_(_(intersperse)(xs))(xss));});};};var forM_ = function($36$_a){return function($36$_b){return new $(function(){var m = $36$_b;var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($62$$62$)(_(m)(x)))(_(_(forM_)(xs))(m));}if (_($36$_a) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"forM_\"",[$36$_a,$36$_b]];});};};var mapM_ = function($36$_a){return function($36$_b){return new $(function(){var $36$_$36$_b = _($36$_b);if ($36$_$36$_b instanceof Fay$$Cons) {var x = $36$_$36$_b.car;var xs = $36$_$36$_b.cdr;var m = $36$_a;return _(_($62$$62$)(_(m)(x)))(_(_(mapM_)(m))(xs));}if (_($36$_b) === null) {return _($_return)(Fay$$unit);}throw ["unhandled case in Ident \"mapM_\"",[$36$_a,$36$_b]];});};};var $_const = function($36$_a){return function($36$_b){return new $(function(){var a = $36$_a;return a;});};};var length = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var xs = $36$_$36$_a.cdr;return _(Fay$$add)(1)(_(_(length)(xs)));}if (_($36$_a) === null) {return 0;}throw ["unhandled case in Ident \"length\"",[$36$_a]];});};var mod = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["double"],$36$_a) % Fay$$fayToJs(["double"],$36$_b));});};};var min = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.min(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var max = function($36$_a){return function($36$_b){return new $(function(){return Fay$$jsToFay(["double"],Math.max(Fay$$fayToJs(["double"],$36$_a),Fay$$fayToJs(["double"],$36$_b)));});};};var fromIntegral = function($36$_a){return new $(function(){return Fay$$jsToFay(["double"],Fay$$fayToJs(["int"],$36$_a));});};var otherwise = true;var reverse = function($36$_a){return new $(function(){var $36$_$36$_a = _($36$_a);if ($36$_$36$_a instanceof Fay$$Cons) {var x = $36$_$36$_a.car;var xs = $36$_$36$_a.cdr;return _(_($43$$43$)(_(reverse)(xs)))(Fay$$list([x]));}if (_($36$_a) === null) {return null;}throw ["unhandled case in Ident \"reverse\"",[$36$_a]];});};var Fay$$fayToJsUserDefined = function(type,obj){var _obj = _(obj);var argTypes = type[2];if (_obj instanceof $36$_EQ) {return {"instance": "EQ"};}if (_obj instanceof $36$_LT) {return {"instance": "LT"};}if (_obj instanceof $36$_GT) {return {"instance": "GT"};}if (_obj instanceof $36$_Nothing) {return {"instance": "Nothing"};}if (_obj instanceof $36$_Just) {return {"instance": "Just","slot1": Fay$$fayToJs(["unknown"],_(_obj.slot1))};}return obj;};var Fay$$jsToFayUserDefined = function(type,obj){if (obj["instance"] === "EQ") {return new $36$_EQ();}if (obj["instance"] === "LT") {return new $36$_LT();}if (obj["instance"] === "GT") {return new $36$_GT();}if (obj["instance"] === "Nothing") {return new $36$_Nothing();}if (obj["instance"] === "Just") {return new $36$_Just(Fay$$jsToFay(["unknown"],obj["slot1"]));}return obj;}; // Exports+this.reverse = reverse;+this.otherwise = otherwise;+this.fromIntegral = fromIntegral;+this.max = max;+this.min = min;+this.mod = mod;+this.length = length;+this.$_const = $_const;+this.mapM_ = mapM_;+this.forM_ = forM_;+this.intercalate = intercalate;+this.prependToAll = prependToAll;+this.intersperse = intersperse;+this.lookup = lookup;+this.foldl = foldl;+this.foldr = foldr;+this.concat = concat;+this.conc = conc;+this.$36$ = $36$;+this.$43$$43$ = $43$$43$;+this.$46$ = $46$;+this.maybe = maybe;+this.flip = flip;+this.zip = zip;+this.zipWith = zipWith;+this.enumFromTo = enumFromTo;+this.enumFrom = enumFrom;+this.when = when;+this.insertBy = insertBy;+this.sortBy = sortBy;+this.compare = compare;+this.sort = sort;+this.elem = elem;+this.nub$39$ = nub$39$;+this.nub = nub;+this.map = map;+this.$_null = $_null;+this.not = not;+this.filter = filter;+this.any = any;+this.find = find;+this.fst = fst;+this.snd = snd;+this.fromRational = fromRational;+this.fromInteger = fromInteger;+this.show = show;+this.print = print; this.main = main;  // Built-ins@@ -429,6 +527,6 @@  }; ;-var main = new Main();+var main = new Where(); main._(main.main);