Elm 0.10.0.2 → 0.10.1
raw patch · 57 files changed
+9293/−8079 lines, 57 filesdep +unordered-containersdep −uniplatedep ~binarydep ~blaze-markupdep ~language-ecmascript
Dependencies added: unordered-containers
Dependencies removed: uniplate
Dependency ranges changed: binary, blaze-markup, language-ecmascript
Files
- Elm.cabal +39/−17
- changelog.txt +32/−16
- compiler/Build/Dependencies.hs +131/−0
- compiler/Build/File.hs +106/−0
- compiler/Build/Flags.hs +44/−0
- compiler/Build/Print.hs +32/−0
- compiler/Build/Source.hs +65/−0
- compiler/Build/Utils.hs +20/−0
- compiler/Compiler.hs +43/−189
- compiler/Docs.hs +2/−1
- compiler/Elm/Internal/Dependencies.hs +117/−0
- compiler/Elm/Internal/Documentation.hs +41/−0
- compiler/Elm/Internal/Name.hs +51/−0
- compiler/Elm/Internal/Paths.hs +23/−0
- compiler/Elm/Internal/Utils.hs +28/−0
- compiler/Elm/Internal/Version.hs +73/−0
- compiler/Generate/Cases.hs +7/−3
- compiler/Generate/Html.hs +3/−10
- compiler/Generate/JavaScript.hs +60/−57
- compiler/Generate/Markdown.hs +39/−0
- compiler/Generate/Noscript.hs +7/−3
- compiler/Initialize.hs +0/−124
- compiler/InterfaceSerialization.hs +52/−0
- compiler/Language/Elm.hs +0/−40
- compiler/Metadata/Prelude.hs +26/−15
- compiler/Parse/Declaration.hs +9/−11
- compiler/Parse/Expression.hs +24/−28
- compiler/Parse/Helpers.hs +56/−6
- compiler/Parse/Literal.hs +1/−24
- compiler/Parse/Pattern.hs +2/−2
- compiler/SourceSyntax/Declaration.hs +4/−5
- compiler/SourceSyntax/Everything.hs +0/−17
- compiler/SourceSyntax/Expression.hs +7/−7
- compiler/SourceSyntax/Literal.hs +1/−3
- compiler/SourceSyntax/Location.hs +4/−6
- compiler/SourceSyntax/Module.hs +42/−6
- compiler/SourceSyntax/Pattern.hs +1/−3
- compiler/SourceSyntax/PrettyPrint.hs +11/−0
- compiler/SourceSyntax/Type.hs +2/−3
- compiler/Transform/Canonicalize.hs +4/−4
- compiler/Transform/Check.hs +84/−17
- compiler/Transform/Optimize.hs +5/−1
- compiler/Transform/SafeNames.hs +78/−0
- compiler/Transform/SortDefinitions.hs +14/−7
- compiler/Transform/Substitute.hs +1/−1
- compiler/Type/Alias.hs +13/−9
- compiler/Type/Constrain/Declaration.hs +13/−11
- compiler/Type/Constrain/Expression.hs +1/−1
- compiler/Type/ExtraChecks.hs +41/−41
- compiler/Type/Inference.hs +1/−1
- compiler/Type/Solve.hs +11/−6
- compiler/Type/State.hs +7/−12
- compiler/Type/Type.hs +1/−3
- compiler/Type/Unify.hs +17/−14
- data/docs.json +637/−329
- data/elm-runtime.js +7160/−7026
- data/interfaces.data binary
Elm.cabal view
@@ -1,5 +1,5 @@ Name: Elm-Version: 0.10.0.2+Version: 0.10.1 Synopsis: The Elm language module. Description: Elm aims to make client-side web-development more pleasant. It is a statically/strongly typed, functional reactive@@ -30,11 +30,15 @@ location: git://github.com/evancz/Elm.git Library- exposed-modules: Language.Elm+ exposed-modules: Elm.Internal.Dependencies,+ Elm.Internal.Documentation,+ Elm.Internal.Name,+ Elm.Internal.Paths,+ Elm.Internal.Utils,+ Elm.Internal.Version Hs-Source-Dirs: compiler other-modules: SourceSyntax.Declaration, SourceSyntax.Expression,- SourceSyntax.Everything, SourceSyntax.Helpers, SourceSyntax.Literal, SourceSyntax.Location,@@ -44,15 +48,17 @@ SourceSyntax.Type, Generate.JavaScript, Generate.Noscript,+ Generate.Markdown, Generate.Html, Generate.Cases, Transform.Canonicalize, Transform.Check,+ Transform.SafeNames, Transform.SortDefinitions, Transform.Substitute, Transform.Optimize, Metadata.Prelude,- Initialize,+ InterfaceSerialization, Parse.Binop, Parse.Declaration, Parse.Expression,@@ -76,26 +82,34 @@ Type.State, Type.Type, Type.Unify,+ Build.Dependencies,+ Build.File,+ Build.Flags,+ Build.Print,+ Build.Source,+ Build.Utils, Paths_Elm - Build-depends: base >=4.2 && <5,- binary,+ Build-depends: aeson,+ base >=4.2 && <5,+ binary >= 0.6.4.0, blaze-html == 0.5.* || == 0.6.*,- blaze-markup == 0.5.1.*,+ blaze-markup, bytestring, cmdargs, containers >= 0.3, directory, filepath, indents,- language-ecmascript < 1,+ language-ecmascript >=0.15 && < 1.0, mtl >= 2, pandoc >= 1.10, parsec >= 3.1.1, pretty,+ text, transformers >= 0.2, union-find,- uniplate+ unordered-containers Executable elm Main-is: Compiler.hs@@ -103,7 +117,6 @@ Hs-Source-Dirs: compiler other-modules: SourceSyntax.Declaration, SourceSyntax.Expression,- SourceSyntax.Everything, SourceSyntax.Helpers, SourceSyntax.Literal, SourceSyntax.Location,@@ -113,15 +126,17 @@ SourceSyntax.Type, Generate.JavaScript, Generate.Noscript,+ Generate.Markdown, Generate.Html, Generate.Cases, Transform.Canonicalize, Transform.Check,+ Transform.SafeNames, Transform.SortDefinitions, Transform.Substitute, Transform.Optimize, Metadata.Prelude,- Initialize,+ InterfaceSerialization, Parse.Binop, Parse.Declaration, Parse.Expression,@@ -145,10 +160,17 @@ Type.State, Type.Type, Type.Unify,+ Build.Dependencies,+ Build.File,+ Build.Flags,+ Build.Print,+ Build.Source,+ Build.Utils, Paths_Elm - Build-depends: base >=4.2 && <5,- binary,+ Build-depends: aeson,+ base >=4.2 && <5,+ binary >= 0.6.4.0, blaze-html == 0.5.* || == 0.6.*, blaze-markup == 0.5.1.*, bytestring,@@ -157,20 +179,20 @@ directory, filepath, indents,- language-ecmascript < 1,+ language-ecmascript >=0.15 && < 1.0, mtl >= 2, pandoc >= 1.10, parsec >= 3.1.1, pretty,+ text, transformers >= 0.2, union-find,- uniplate+ unordered-containers Executable elm-doc Main-is: Docs.hs Hs-Source-Dirs: compiler other-modules: SourceSyntax.Declaration,- SourceSyntax.Everything, SourceSyntax.Expression, SourceSyntax.Helpers, SourceSyntax.Literal,@@ -191,7 +213,7 @@ Build-depends: aeson, aeson-pretty, base >=4.2 && <5,- binary,+ binary >= 0.6.4.0, bytestring, cmdargs, containers >= 0.3,
changelog.txt view
@@ -1,7 +1,30 @@ -Release 0.9.1-=============+## 0.11 + * Lazy and Lazy.Stream (thanks to Max New)+ * sortBy, sortWith (thanks to Max Goldstein)+ * elm-repl+ * Markdown interpolation+ * Bitwise library+ * Regex library+ * Improve Transform2D library (thanks to Michael Søndergaard)++## 0.10++ * Native strings+ * Tango colors+ * custom precedence and associativity for infix operators+ * elm-doc released with new documentation format+ * Realiasing in type errors+ * Rename Matrix2D => Transform2D+ * Add Random.floatList (thank you Max GoldStein)+ * Fix remove function in Dict (thank you Max New)+ * Start using language-ecmascript for JS generation+ * Make compatable with cabal-1.18 (thank you Justin Leitgeb)+ * All functions with 10+ arguments (thanks to Max New)++## 0.9.1+ * Allow custom precedence and associativity for user-defined infix ops * Realias types before printing * Switch to Tango color scheme, adding a bunch of nice colors@@ -10,8 +33,7 @@ * Fix miscellaneous bugs in type checker * Switch name of Matrix2D to Transform2D -Release 0.9-===========+## 0.9 Build Improvements: * Major speed improvements to type-checker@@ -62,8 +84,7 @@ forgot to fill this in again... -Release 0.7.2-=============+## 0.7.2 * Add a WebSockets library. * Add support for the mathematical looking operator for function composition (U+2218).@@ -72,8 +93,7 @@ forgot to fill this in for a while... -Release 0.5.0-=============+## 0.5.0 * Add Dict, Set, and Automaton libraries! @@ -101,8 +121,7 @@ -Release 0.4.0-=============+## 0.4.0 This version is all about graphics: nicer API with more features and major efficiency improvements. I am really excited about this release!@@ -132,8 +151,7 @@ -Release 0.3.6-=============+## 0.3.6 * Add JSON library. @@ -165,8 +183,7 @@ -Release 0.3.5-=============+## 0.3.5 * Add JavaScript event interface. Allows Elm to import and export JS values and events. This makes it possible to import and export Elements, so users@@ -213,8 +230,7 @@ -Release 0.3.0-=============+## 0.3.0 Major Changes (Read this part!) -------------------------------
+ compiler/Build/Dependencies.hs view
@@ -0,0 +1,131 @@+module Build.Dependencies (getSortedDependencies) where++import Data.Data+import Control.Applicative+import Control.Monad.Error+import qualified Control.Monad.State as State+import qualified Data.Aeson as Json+import qualified Data.ByteString.Lazy.Char8 as BSC+import qualified Data.Char as Char+import qualified Data.Graph as Graph+import qualified Data.List as List+import qualified Data.Map as Map+import qualified Data.Maybe as Maybe+import qualified Data.Set as Set+import System.Directory+import System.Exit+import System.FilePath as FP+import System.IO+import Text.PrettyPrint (Doc)++import qualified SourceSyntax.Module as Module+import qualified SourceSyntax.Type as Type+import qualified Parse.Parse as Parse+import qualified Metadata.Prelude as Prelude+import qualified Transform.Check as Check+import qualified Transform.SortDefinitions as SD+import qualified Type.Inference as TI+import qualified Type.Constrain.Declaration as TcDecl+import qualified Transform.Canonicalize as Canonical+import qualified Elm.Internal.Paths as Path+import qualified Elm.Internal.Name as N+import qualified Elm.Internal.Version as V+import qualified Elm.Internal.Dependencies as Deps++getSortedDependencies :: [FilePath] -> Module.Interfaces -> FilePath -> IO [String]+getSortedDependencies srcDirs builtIns root =+ do extras <- extraDependencies+ let allSrcDirs = srcDirs ++ Maybe.fromMaybe [] extras+ result <- runErrorT $ readDeps allSrcDirs builtIns root+ case result of+ Right deps -> sortDeps deps+ Left err -> failure $ err ++ if Maybe.isJust extras then "" else msg+ where msg = "\nYou may need to create a " +++ Path.dependencyFile +++ " file if you\nare trying to use a 3rd party library."++failure msg = hPutStrLn stderr msg >> exitFailure++extraDependencies :: IO (Maybe [FilePath])+extraDependencies =+ do exists <- doesFileExist Path.dependencyFile+ if not exists then return Nothing else Just <$> getPaths+ where+ getPaths = do+ raw <- BSC.readFile Path.dependencyFile+ case Json.eitherDecode raw of+ Right (Deps.Mini deps) -> mapM validate deps+ Left err ->+ failure $ "Error reading the " ++ Path.dependencyFile ++ " file:\n" ++ err++ validate (name,version) = do+ let path = Path.dependencyDirectory </> toPath name version+ exists <- doesDirectoryExist path+ if exists then return path else failure (notFound name version)++ toPath name version = N.toFilePath name </> show version++ notFound name version =+ unlines+ [ "Your " ++ Path.dependencyFile ++ " file says you depend on library"+ , show name ++ " " ++ show version ++ " but it was not found."+ , "You may need to install it with:"+ , ""+ , " elm-get install " ++ show name ++ " " ++ show version ]++type Deps = (FilePath, String, [String])++sortDeps :: [Deps] -> IO [String]+sortDeps depends =+ if null mistakes+ then return (concat sccs)+ else failure $ msg ++ unlines (map show mistakes)+ where+ sccs = map Graph.flattenSCC $ Graph.stronglyConnComp depends++ mistakes = filter (\scc -> length scc > 1) sccs+ msg = "A cyclical module dependency or was detected in:\n"++readDeps :: [FilePath] -> Module.Interfaces -> FilePath -> ErrorT String IO [Deps]+readDeps srcDirs builtIns root = do+ let ifaces = (Set.fromList . Map.keys) builtIns+ State.evalStateT (go ifaces root) Set.empty+ where+ go :: Set.Set String -> FilePath -> State.StateT (Set.Set String) (ErrorT String IO) [Deps]+ go builtIns root = do+ (root', txt) <- lift $ getFile srcDirs root+ case Parse.dependencies txt of+ Left err -> throwError $ msg ++ show err+ where msg = "Error resolving dependencies in " ++ root' ++ ":\n"++ Right (name,deps) ->+ do seen <- State.get+ let realDeps = Set.difference (Set.fromList deps) builtIns+ newDeps = Set.difference (Set.filter (not . isNative) realDeps) seen+ State.put (Set.insert name (Set.union newDeps seen))+ rest <- mapM (go builtIns . toFilePath) (Set.toList newDeps)+ return ((makeRelative "." root', name, Set.toList realDeps) : concat rest)++getFile :: [FilePath] -> FilePath -> ErrorT String IO (FilePath,String)+getFile [] path =+ throwError $ unlines+ [ "Could not find file: " ++ path+ , " If it is not in the root directory of your project, use"+ , " --src-dir to declare additional locations for source files."+ , " If it is part of a 3rd party library, it needs to be declared"+ , " as a dependency in the " ++ Path.dependencyFile ++ " file." ]++getFile (dir:dirs) path = do+ let path' = dir </> path+ exists <- liftIO $ doesFileExist path'+ case exists of+ True -> (,) path' `fmap` liftIO (readFile path')+ False -> getFile dirs path++isNative name = List.isPrefixOf "Native." name++toFilePath :: String -> FilePath+toFilePath name = map swapDots name ++ ext+ where swapDots '.' = '/'+ swapDots c = c+ ext = if isNative name then ".js" else ".elm"
+ compiler/Build/File.hs view
@@ -0,0 +1,106 @@+module Build.File (build) where++import Control.Monad (when)+import qualified Data.Binary as Binary+import qualified Data.List as List+import qualified Data.Map as Map+import System.Directory+import System.Exit+import System.FilePath+import System.IO++import qualified Transform.Canonicalize as Canonical++import qualified Data.ByteString.Lazy as L++import qualified Build.Utils as Utils+import qualified Build.Flags as Flag+import qualified Build.Source as Source+import qualified Build.Print as Print+import qualified Generate.JavaScript as JS+import qualified InterfaceSerialization as IS+import qualified Parse.Module as Parser+import qualified SourceSyntax.Module as M++build :: Flag.Flags -> Int -> M.Interfaces -> String -> [FilePath]+ -> IO (String, M.Interfaces)+build _ _ interfaces moduleName [] =+ return (moduleName, interfaces)+build flags numModules interfaces _ (filePath:rest) =+ do (name,interface) <-+ build1 flags (numModules - length rest) numModules interfaces filePath+ let interfaces' = Map.insert name interface interfaces+ build flags numModules interfaces' name rest+++build1 :: Flag.Flags -> Int -> Int -> M.Interfaces -> FilePath+ -> IO (String, M.ModuleInterface)+build1 flags moduleNum numModules interfaces filePath =+ do compiled <- alreadyCompiled flags filePath+ case compiled of+ False -> compile flags number interfaces filePath+ True -> retrieve flags interfaces filePath+ where+ number = "[" ++ show moduleNum ++ " of " ++ show numModules ++ "]"+++alreadyCompiled :: Flag.Flags -> FilePath -> IO Bool+alreadyCompiled flags filePath = do+ existsi <- doesFileExist (Utils.elmi flags filePath)+ existso <- doesFileExist (Utils.elmo flags filePath)+ if not existsi || not existso+ then return False+ else do tsrc <- getModificationTime filePath+ tint <- getModificationTime (Utils.elmo flags filePath)+ return (tsrc <= tint)++retrieve :: Flag.Flags -> Map.Map String M.ModuleInterface -> FilePath+ -> IO (String, M.ModuleInterface)+retrieve flags interfaces filePath = do+ bytes <- IS.loadInterface (Utils.elmi flags filePath)+ let binary = IS.interfaceDecode (Utils.elmi flags filePath) =<< bytes+ case IS.validVersion filePath =<< binary of+ Right (name, interface) ->+ do when (Flag.print_types flags) (Print.interfaceTypes interfaces interface)+ return (name, interface)+ Left err ->+ do hPutStrLn stderr err+ exitFailure++compile :: Flag.Flags -> String -> M.Interfaces -> FilePath+ -> IO (String, M.ModuleInterface)+compile flags number interfaces filePath =+ do source <- readFile filePath+ let name = getName source+ printStatus name++ createDirectoryIfMissing True (Flag.cache_dir flags)+ createDirectoryIfMissing True (Flag.build_dir flags)++ metaModule <-+ case Source.build (Flag.no_prelude flags) interfaces source of+ Right modul -> return modul+ Left errors -> do Print.errors errors+ exitFailure++ when (Flag.print_types flags) $ Print.metaTypes interfaces metaModule++ let intermediate = (name, Canonical.interface name $ M.metaToInterface metaModule)+ generateCache intermediate metaModule+ return intermediate++ where+ getName source = case Parser.getModuleName source of+ Just n -> n+ Nothing -> "Main"++ printStatus name =+ hPutStrLn stdout $ concat [ number, " Compiling ", name+ , replicate (max 1 (20 - length name)) ' '+ , "( " ++ filePath ++ " )" ]++ generateCache intermediate metaModule = do+ createDirectoryIfMissing True . dropFileName $ Utils.elmi flags filePath+ writeFile (Utils.elmo flags filePath) (JS.generate metaModule)+ withBinaryFile (Utils.elmi flags filePath) WriteMode $ \handle ->+ L.hPut handle (Binary.encode intermediate)
+ compiler/Build/Flags.hs view
@@ -0,0 +1,44 @@+{-# LANGUAGE DeriveDataTypeable #-}+module Build.Flags where++import qualified Elm.Internal.Version as Version+import System.Console.CmdArgs++data Flags = Flags+ { make :: Bool+ , files :: [FilePath]+ , runtime :: Maybe FilePath+ , only_js :: Bool+ , print_types :: Bool+ , scripts :: [FilePath]+ , no_prelude :: Bool+ , cache_dir :: FilePath+ , build_dir :: FilePath+ , src_dir :: [FilePath]+ }+ deriving (Data,Typeable,Show,Eq)+ +flags = Flags+ { files = def &= args &= typ "FILES"+ , make = False+ &= help "automatically compile dependencies."+ , only_js = False+ &= help "Compile only to JavaScript."+ , no_prelude = False+ &= help "Do not import Prelude by default, used only when compiling standard libraries."+ , scripts = [] &= typFile+ &= help "Load JavaScript files in generated HTML. Files will be included in the given order."+ , runtime = Nothing &= typFile+ &= help "Specify a custom location for Elm's runtime system."+ , cache_dir = "cache" &= typFile+ &= help "Directory for files cached to make builds faster. Defaults to cache/ directory."+ , build_dir = "build" &= typFile+ &= help "Directory for generated HTML and JS files. Defaults to build/ directory."+ , src_dir = ["."] &= typFile+ &= help "Additional source directories besides project root. Searched when using --make"+ , print_types = False+ &= help "Print out infered types of top-level definitions."+ } &= help "Compile Elm programs to HTML, CSS, and JavaScript."+ &= helpArg [explicit, name "help", name "h"]+ &= versionArg [explicit, name "version", name "v", summary (show Version.elmVersion)]+ &= summary ("The Elm Compiler " ++ show Version.elmVersion ++ ", (c) Evan Czaplicki 2011-2013")
+ compiler/Build/Print.hs view
@@ -0,0 +1,32 @@+module Build.Print where++import qualified Data.Map as Map+import qualified Data.List as List+import qualified SourceSyntax.Module as M+import qualified SourceSyntax.PrettyPrint as Pretty+import qualified Type.Alias as Alias+import qualified Text.PrettyPrint as P++metaTypes :: Map.Map String M.ModuleInterface -> M.MetadataModule () () -> IO ()+metaTypes interfaces meta =+ types interfaces (M.types meta) (M.aliases meta) (M.imports meta)++interfaceTypes :: Map.Map String M.ModuleInterface -> M.ModuleInterface -> IO ()+interfaceTypes interfaces iface =+ types interfaces (M.iTypes iface) (M.iAliases iface) (M.iImports iface)++types interfaces types' aliases imports =+ do putStrLn ""+ mapM_ printType (Map.toList types')+ putStrLn ""+ where+ rules = Alias.rules interfaces aliases imports++ printType (n,t) = do+ print $ P.hsep [ Pretty.variable n+ , P.text ":"+ , Pretty.pretty (Alias.realias rules t) ]++errors :: [P.Doc] -> IO ()+errors errs =+ mapM_ print (List.intersperse (P.text " ") errs)
+ compiler/Build/Source.hs view
@@ -0,0 +1,65 @@+module Build.Source (build) where++import Data.Data+import Control.Monad.State+import qualified Data.Graph as Graph+import qualified Data.List as List+import qualified Data.Map as Map+import qualified Data.Set as Set+import System.Directory+import System.Exit+import System.FilePath as FP+import Text.PrettyPrint (Doc)++import SourceSyntax.Declaration+import SourceSyntax.Module+import qualified SourceSyntax.Expression as Expr+import qualified SourceSyntax.Type as Type+import qualified Parse.Parse as Parse+import qualified Metadata.Prelude as Prelude+import qualified Transform.Check as Check+import qualified Transform.SortDefinitions as SD+import qualified Type.Inference as TI+import qualified Type.Constrain.Declaration as TcDecl+import qualified Transform.Canonicalize as Canonical++build :: Bool -> Interfaces -> String -> Either [Doc] (MetadataModule () ())+build noPrelude interfaces source =+ do let add = if noPrelude then id else Prelude.add+ infixes = Map.fromList . map (\(assoc,lvl,op) -> (op,(lvl,assoc)))+ . concatMap iFixities $ Map.elems interfaces++ modul@(Module _ _ _ decls') <- add `fmap` Parse.program infixes source++ -- check for structural errors+ Module names exs ims decls <-+ case Check.mistakes decls' of+ [] -> return modul+ ms -> Left ms++ let exports'+ | null exs =+ let get = Set.toList . SD.boundVars in+ concat [ get pattern | Definition (Expr.Def pattern _) <- decls ] +++ concat [ map fst ctors | Datatype _ _ ctors <- decls ] +++ [ name | TypeAlias name _ (Type.Record _ _) <- decls ]+ | otherwise = exs++ metaModule <- Canonical.metadataModule interfaces $ MetadataModule {+ names = names,+ path = FP.joinPath names,+ exports = exports',+ imports = ims,+ -- reorder AST into strongly connected components+ program = SD.sortDefs . Expr.dummyLet $ TcDecl.toExpr decls,+ types = Map.empty,+ datatypes = [ (name,vars,ctors) | Datatype name vars ctors <- decls ],+ fixities = [ (assoc,level,op) | Fixity assoc level op <- decls ],+ aliases = [ (name,tvs,tipe) | TypeAlias name tvs tipe <- decls ],+ foreignImports = [ (evt,v,name,typ) | ImportEvent evt v name typ <- decls ],+ foreignExports = [ (evt,name,typ) | ExportEvent evt name typ <- decls ]+ }++ types <- TI.infer interfaces metaModule++ return $ metaModule { types = types }
+ compiler/Build/Utils.hs view
@@ -0,0 +1,20 @@+module Build.Utils where++import System.FilePath ((</>), replaceExtension)+import qualified Build.Flags as Flag++buildPath :: Flag.Flags -> FilePath -> String -> FilePath+buildPath flags filePath ext =+ Flag.build_dir flags </> replaceExtension filePath ext++cachePath :: Flag.Flags -> FilePath -> String -> FilePath+cachePath flags filePath ext =+ Flag.cache_dir flags </> replaceExtension filePath ext++elmo :: Flag.Flags -> FilePath -> FilePath+elmo flags filePath =+ cachePath flags filePath "elmo"++elmi :: Flag.Flags -> FilePath -> FilePath+elmi flags filePath =+ cachePath flags filePath "elmi"
compiler/Compiler.hs view
@@ -1,214 +1,68 @@-{-# LANGUAGE DeriveDataTypeable #-} module Main where -import Control.Monad+import Control.Monad (foldM) import qualified Data.Map as Map-import qualified Data.List as List-import qualified Data.Binary as Binary-import Data.Version (showVersion)-import System.Console.CmdArgs hiding (program)+import qualified Data.Maybe as Maybe+import Text.Blaze.Html.Renderer.String (renderHtml)+import qualified Data.ByteString.Lazy.Char8 as BS+import qualified System.Console.CmdArgs as CmdArgs import System.Directory-import System.Exit import System.FilePath-import System.IO import GHC.Conc -import Text.Blaze.Html.Renderer.Pretty (renderHtml)-import qualified Data.ByteString.Lazy.Char8 as BS-import qualified Data.ByteString.Lazy as L-+import Build.Dependencies (getSortedDependencies)+import qualified Generate.Html as Html import qualified Metadata.Prelude as Prelude-import qualified Transform.Canonicalize as Canonical-import SourceSyntax.Module-import Parse.Module (getModuleName)-import Initialize (buildFromSource, getSortedDependencies)-import Generate.JavaScript (jsModule)-import Generate.Html (createHtml, JSSource(..))-import Paths_Elm--import SourceSyntax.PrettyPrint (pretty, variable)-import Text.PrettyPrint as P-import qualified Type.Type as Type-import qualified Type.Alias as Alias--data Flags =- Flags { make :: Bool- , files :: [FilePath]- , runtime :: Maybe FilePath- , only_js :: Bool- , print_types :: Bool- , print_program :: Bool- , scripts :: [FilePath]- , no_prelude :: Bool- , cache_dir :: FilePath- , build_dir :: FilePath- , src_dir :: [FilePath]- }- deriving (Data,Typeable,Show,Eq)--flags = Flags- { files = def &= args &= typ "FILES"- , make = False- &= help "automatically compile dependencies."- , only_js = False- &= help "Compile only to JavaScript."- , no_prelude = False- &= help "Do not import Prelude by default, used only when compiling standard libraries."- , scripts = [] &= typFile- &= help "Load JavaScript files in generated HTML. Files will be included in the given order."- , runtime = Nothing &= typFile- &= help "Specify a custom location for Elm's runtime system."- , cache_dir = "cache" &= typFile- &= help "Directory for files cached to make builds faster. Defaults to cache/ directory."- , build_dir = "build" &= typFile- &= help "Directory for generated HTML and JS files. Defaults to build/ directory."- , src_dir = ["."] &= typFile- &= help "Additional source directories besides project root. Searched when using --make"- , print_types = False- &= help "Print out infered types of top-level definitions."- , print_program = False- &= help "Print out an internal representation of a program."- } &= help "Compile Elm programs to HTML, CSS, and JavaScript."- &= helpArg [explicit, name "help", name "h"]- &= versionArg [explicit, name "version", name "v", summary (showVersion version)]- &= summary ("The Elm Compiler " ++ showVersion version ++ ", (c) Evan Czaplicki 2011-2013")+import qualified Build.Utils as Utils+import qualified Build.Flags as Flag+import qualified Build.File as File+import qualified Elm.Internal.Paths as Path -main :: IO () +main :: IO () main = do setNumCapabilities =<< getNumProcessors- compileArgs =<< cmdArgs flags+ compileArgs =<< CmdArgs.cmdArgs Flag.flags -compileArgs :: Flags -> IO ()+compileArgs :: Flag.Flags -> IO () compileArgs flags =- case files flags of+ case Flag.files flags of [] -> putStrLn "Usage: elm [OPTIONS] [FILES]\nFor more help: elm --help" fs -> mapM_ (build flags) fs- -buildPath :: Flags -> FilePath -> String -> FilePath-buildPath flags filePath ext = build_dir flags </> replaceExtension filePath ext--cachePath :: Flags -> FilePath -> String -> FilePath-cachePath flags filePath ext = cache_dir flags </> replaceExtension filePath ext--elmo :: Flags -> FilePath -> FilePath-elmo flags filePath = cachePath flags filePath "elmo"--elmi :: Flags -> FilePath -> FilePath-elmi flags filePath = cachePath flags filePath "elmi"---buildFile :: Flags -> Int -> Int -> Interfaces -> FilePath -> IO (String,ModuleInterface)-buildFile flags moduleNum numModules interfaces filePath =- do compiled <- alreadyCompiled- case compiled of- False -> compile- True -> do- handle <- openBinaryFile (elmi flags filePath) ReadMode- bits <- L.hGetContents handle- let info :: (String, ModuleInterface)- info = Binary.decode bits- L.length bits `seq` hClose handle- return info- where- alreadyCompiled :: IO Bool- alreadyCompiled = do- existsi <- doesFileExist (elmi flags filePath)- existso <- doesFileExist (elmo flags filePath)- if not existsi || not existso- then return False- else do tsrc <- getModificationTime filePath- tint <- getModificationTime (elmo flags filePath)- return (tsrc <= tint)-- number :: String- number = "[" ++ show moduleNum ++ " of " ++ show numModules ++ "]"-- compile :: IO (String,ModuleInterface)- compile = do- source <- readFile filePath- let name = case getModuleName source of- Just n -> n- Nothing -> "Main"- putStrLn $ concat [ number, " Compiling ", name- , replicate (max 1 (20 - length name)) ' '- , "( " ++ filePath ++ " )" ]- - createDirectoryIfMissing True (cache_dir flags)- createDirectoryIfMissing True (build_dir flags)- metaModule <-- case buildFromSource (no_prelude flags) interfaces source of- Left errors -> do- mapM print (List.intersperse (P.text " ") errors)- exitFailure- Right modul -> do- case print_program flags of- False -> return ()- True -> print . pretty $ program modul- return modul- - when (print_types flags) (printTypes interfaces metaModule)- let interface = Canonical.interface name $ ModuleInterface {- iTypes = types metaModule,- iAdts = datatypes metaModule,- iAliases = aliases metaModule,- iFixities = fixities metaModule- }- createDirectoryIfMissing True . dropFileName $ elmi flags filePath- handle <- openBinaryFile (elmi flags filePath) WriteMode- L.hPut handle (Binary.encode (name,interface))- hClose handle- writeFile (elmo flags filePath) (jsModule metaModule)- return (name,interface)+build :: Flag.Flags -> FilePath -> IO ()+build flags rootFile =+ do let noPrelude = Flag.no_prelude flags+ builtIns <- if noPrelude then return Map.empty else Prelude.interfaces -printTypes interfaces metaModule = do- putStrLn ""- let rules = Alias.rules interfaces metaModule- forM_ (Map.toList $ types metaModule) $ \(n,t) -> do- print $ variable n <+> P.text ":" <+> pretty (Alias.realias rules t)- putStrLn ""+ files <- if Flag.make flags+ then getSortedDependencies (Flag.src_dir flags) builtIns rootFile+ else return [rootFile] -getRuntime :: Flags -> IO FilePath-getRuntime flags =- case runtime flags of- Just fp -> return fp- Nothing -> getDataFileName "elm-runtime.js"+ (moduleName, interfaces) <-+ File.build flags (length files) builtIns "" files -build :: Flags -> FilePath -> IO ()-build flags rootFile = do- let noPrelude = no_prelude flags- files <- if make flags then getSortedDependencies (src_dir flags) noPrelude rootFile- else return [rootFile]- let ifaces = if noPrelude then Map.empty else Prelude.interfaces- (moduleName, interfaces) <- buildFiles flags (length files) ifaces "" files- js <- foldM appendToOutput BS.empty files+ js <- foldM appendToOutput BS.empty files - (extension, code) <- case only_js flags of- True -> do- putStr "Generating JavaScript ... "- return ("js", js)- False -> do- putStr "Generating HTML ... "- rtsPath <- getRuntime flags- return ("html", BS.pack . renderHtml $- createHtml rtsPath (takeBaseName rootFile) (sources js) moduleName "")+ (extension, code) <-+ if Flag.only_js flags+ then do putStr "Generating JavaScript ... "+ return ("js", js)+ else do putStr "Generating HTML ... "+ return (makeHtml js moduleName) - let targetFile = buildPath flags rootFile extension- createDirectoryIfMissing True (takeDirectory targetFile)- BS.writeFile targetFile code- putStrLn "Done"+ let targetFile = Utils.buildPath flags rootFile extension+ createDirectoryIfMissing True (takeDirectory targetFile)+ BS.writeFile targetFile code+ putStrLn "Done" where appendToOutput :: BS.ByteString -> FilePath -> IO BS.ByteString- appendToOutput js filePath =- do src <- BS.readFile (elmo flags filePath)- return (BS.append src js)-- sources js = map Link (scripts flags) ++ [ Source js ]+ appendToOutput js filePath = do+ src <- BS.readFile (Utils.elmo flags filePath)+ return (BS.append src js) + sources js = map Html.Link (Flag.scripts flags) ++ [ Html.Source js ] -buildFiles :: Flags -> Int -> Interfaces -> String -> [FilePath] -> IO (String, Interfaces)-buildFiles _ _ interfaces moduleName [] = return (moduleName, interfaces)-buildFiles flags numModules interfaces _ (filePath:rest) = do- (name,interface) <- buildFile flags (numModules - length rest) numModules interfaces filePath- let interfaces' = Map.insert name interface interfaces- buildFiles flags numModules interfaces' name rest+ makeHtml js moduleName = ("html", BS.pack $ renderHtml html)+ where+ rtsPath = Maybe.fromMaybe Path.runtime (Flag.runtime flags)+ html = Html.generate rtsPath (takeBaseName rootFile) (sources js) moduleName ""
compiler/Docs.hs view
@@ -5,6 +5,7 @@ import System.Directory import System.FilePath import System.Exit+import System.IO import Control.Applicative ((<$>), (<*>)) import Data.Aeson@@ -52,7 +53,7 @@ createDirectoryIfMissing True (dropFileName docPath) BS.writeFile docPath (encodePretty' config json) Left err -> do- putStrLn $ "Parse error in " ++ path ++ " at " ++ show err+ hPutStrLn stderr $ "Parse error in " ++ path ++ " at " ++ show err exitFailure docs :: IParser Value
+ compiler/Elm/Internal/Dependencies.hs view
@@ -0,0 +1,117 @@+{-# LANGUAGE OverloadedStrings #-}+module Elm.Internal.Dependencies where++import Control.Applicative+import Control.Monad.Error+import qualified Control.Exception as E+import Data.Aeson+import qualified Data.List as List+import qualified Data.ByteString.Lazy as BS+import qualified Data.HashMap.Strict as Map+import qualified Elm.Internal.Name as N+import qualified Elm.Internal.Version as V+import qualified Elm.Internal.Paths as Path++data Deps = Deps+ { name :: N.Name+ , version :: V.Version+ , summary :: String+ , description :: String+ , license :: String+ , repo :: String+ , exposed :: [String]+ , elmVersion :: V.Version+ , dependencies :: [(N.Name,V.Version)]+ } deriving Show++data MiniDeps = Mini [(N.Name,V.Version)]++instance FromJSON MiniDeps where+ parseJSON (Object obj) = Mini <$> getDependencies obj+ parseJSON _ = mzero++instance FromJSON Deps where+ parseJSON (Object obj) =+ do version <- get obj "version" "your projects version number"++ summary <- get obj "summary" "a short summary of your project"+ when (length summary >= 80) $+ fail "'summary' must be less than 80 characters"++ desc <- get obj "description" "an extended description of your project \+ \and how to get started with it."+ license <- get obj "license" "license information (BSD3 is recommended)"++ repo <- get obj "repository" "a link to the project's GitHub repo"+ name <- case repoToName repo of+ Left err -> fail err+ Right nm -> return nm++ exposed <- get obj "exposed-modules" "a list of modules exposed to users"++ elmVersion <- get obj "elm-version" "the version of the Elm compiler you are using"++ deps <- getDependencies obj++ return $ Deps name version summary desc license repo exposed elmVersion deps++ parseJSON _ = mzero++getDependencies obj = + toDeps =<< get obj "dependencies" "a listing of your project's dependencies"+ where+ toDeps deps =+ forM (Map.toList deps) $ \(f,v) ->+ case (N.fromString f, V.fromString v) of+ (Just name, Just version) -> return (name,version)+ (Nothing, _) -> fail $ N.errorMsg f+ (_, Nothing) -> fail $ "invalid version number " ++ v+++get obj field desc =+ do maybe <- obj .:? field+ case maybe of+ Just value -> return value+ Nothing -> fail $ "Missing field " ++ show field ++ ", " ++ desc ++ ".\n" +++ " Check out an example " ++ Path.dependencyFile ++ " file here:" +++ " <https://github.com/evancz/automaton/blob/master/elm_dependencies.json>"++repoToName :: String -> Either String N.Name+repoToName repo+ | not (end `List.isSuffixOf` repo) = Left msg+ | otherwise =+ do path <- getPath+ let raw = take (length path - length end) path+ case N.fromString raw of+ Nothing -> Left msg+ Just name -> Right name+ where+ getPath | http `List.isPrefixOf` repo = Right $ drop (length http ) repo+ | https `List.isPrefixOf` repo = Right $ drop (length https) repo+ | otherwise = Left msg+ http = "http://github.com/"+ https = "https://github.com/"+ end = ".git"+ msg = "the 'repository' field must point to a GitHub project for now, something\n\+ \like <https://github.com/USER/PROJECT.git> where USER is your GitHub name\n\+ \and PROJECT is the repo you want to upload."++withDeps :: (Deps -> a) -> FilePath -> ErrorT String IO a+withDeps handle path =+ do json <- readPath+ case eitherDecode json of+ Left err -> throwError $ "Error reading file " ++ path ++ ":\n " ++ err+ Right ds -> return (handle ds)+ where+ readPath :: ErrorT String IO BS.ByteString+ readPath = do+ result <- liftIO $ E.catch (Right <$> BS.readFile path)+ (\err -> return $ Left (err :: IOError))+ case result of+ Right bytes -> return bytes+ Left _ -> throwError $+ "could not find file " ++ path +++ "\n You may need to create a dependency file for your project."++depsAt :: FilePath -> ErrorT String IO Deps+depsAt = withDeps id
+ compiler/Elm/Internal/Documentation.hs view
@@ -0,0 +1,41 @@+{-# LANGUAGE OverloadedStrings #-}+module Elm.Internal.Documentation where++import Control.Applicative ((<$>),(<*>))+import Control.Monad+import Data.Aeson++data Document = Doc+ { moduleName :: String+ , structure :: String+ , entries :: [Entry]+ } deriving (Show)++data Entry = Entry+ { name :: String+ , comment :: String+ , raw :: String+ , assocPrec :: Maybe (String,Int)+ } deriving (Show)++instance FromJSON Document where+ parseJSON (Object v) =+ Doc <$> v .: "name"+ <*> v .: "document"+ <*> (concat <$> sequence [ v .: "aliases", v .: "datatypes", v .: "values" ])++ parseJSON _ = fail "Conversion to Document was expecting an object"++instance FromJSON Entry where+ parseJSON (Object v) =+ Entry <$> v .: "name"+ <*> v .: "comment"+ <*> v .: "raw"+ <*> (liftM2 (,) <$> v .:? "associativity"+ <*> v .:? "precedence")++ parseJSON _ = fail "Conversion to Entry was expecting an object"++data Content = Markdown String | Value String+ deriving Show+
+ compiler/Elm/Internal/Name.hs view
@@ -0,0 +1,51 @@+{-# LANGUAGE DeriveDataTypeable #-}+module Elm.Internal.Name where++import Control.Applicative+import Control.Monad.Error+import Data.Aeson+import Data.Binary+import qualified Data.Text as T+import qualified Data.Maybe as Maybe+import Data.Typeable++data Name = Name { user :: String, project :: String }+ deriving (Typeable,Eq)++instance Binary Name where+ get = Name <$> get <*> get+ put (Name user project) =+ put user >> put project++instance Show Name where+ show name = user name ++ "/" ++ project name++toFilePath :: Name -> FilePath+toFilePath name = user name ++ "-" ++ project name++fromString :: String -> Maybe Name+fromString string =+ case break (=='/') string of+ ( user@(_:_), '/' : project@(_:_) )+ | all (/='/') project -> Just (Name user project)+ _ -> Nothing++fromString' :: String -> ErrorT String IO Name+fromString' string =+ Maybe.maybe (throwError $ errorMsg string) return (fromString string)++instance FromJSON Name where+ parseJSON (String text) =+ let string = T.unpack text in+ Maybe.maybe (fail $ errorMsg string) return (fromString string)++ parseJSON _ = fail "Project name must be a string."++instance ToJSON Name where+ toJSON name = toJSON (show name)++errorMsg string =+ unlines+ [ "Dependency file has an invalid name: " ++ string+ , "Must have format user/project and match a public github project."+ ]
+ compiler/Elm/Internal/Paths.hs view
@@ -0,0 +1,23 @@+module Elm.Internal.Paths where++import System.IO.Unsafe+import qualified Paths_Elm as This++-- |Name of directory for all of a project's dependencies.+dependencyDirectory :: FilePath+dependencyDirectory = "elm_dependencies"++-- |Name of the dependency file, specifying dependencies and+-- other metadata for building and sharing projects.+dependencyFile :: FilePath+dependencyFile = "elm_dependencies.json"++{-# NOINLINE runtime #-}+-- |The absolute path to Elm's runtime system.+runtime :: FilePath+runtime = unsafePerformIO $ This.getDataFileName "elm-runtime.js"++{-# NOINLINE docs #-}+-- |The absolute path to Elm's core library documentation.+docs :: FilePath+docs = unsafePerformIO $ This.getDataFileName "docs.json"
+ compiler/Elm/Internal/Utils.hs view
@@ -0,0 +1,28 @@+{- | This module exports functions for compiling Elm to JS. +-} +module Elm.Internal.Utils (compile, moduleName) where + +import qualified Data.List as List +import qualified Generate.JavaScript as JS +import qualified Build.Source as Source +import qualified Parse.Module as Parser +import qualified SourceSyntax.Module as M +import qualified Text.PrettyPrint as P +import qualified Metadata.Prelude as Prelude +import System.IO.Unsafe + +-- |This function compiles Elm code to JavaScript. It will return either +-- an error message or the compiled JS code. +compile :: String -> Either String String +compile source = + case Source.build False interfaces source of + Left docs -> Left . unlines . List.intersperse "" $ map P.render docs + Right modul -> Right $ JS.generate modul + +{-# NOINLINE interfaces #-} +interfaces :: M.Interfaces +interfaces = unsafePerformIO $ Prelude.interfaces + +-- |This function extracts the module name of a given source program. +moduleName :: String -> Maybe String +moduleName = Parser.getModuleName
+ compiler/Elm/Internal/Version.hs view
@@ -0,0 +1,73 @@+{-# LANGUAGE DeriveDataTypeable, TemplateHaskell #-}+module Elm.Internal.Version where++import Control.Applicative+import Data.Aeson+import Data.Binary+import Data.Char (isDigit)+import qualified Data.List as List+import Data.Typeable+import qualified Data.Text as T+import qualified Paths_Elm as This+import qualified Data.Version as Version++elmVersion :: Version+elmVersion = V ns ""+ where (Version.Version ns _) = This.version++-- Data representation++data Version = V [Int] String+ deriving (Typeable,Eq)++instance Ord Version where+ compare (V ns tag) (V ns' tag') =+ case compare ns ns' of+ EQ -> compare tag' tag -- reverse comparison to favor ""+ cmp -> cmp++instance Show Version where+ show (V ns tag) =+ List.intercalate "." (map show ns) ++ if null tag then "" else "-" ++ tag++instance Binary Version where+ get = V <$> get <*> get+ put (V ns tag) = do put ns+ put tag++tagless :: Version -> Bool+tagless (V _ tag) = null tag++fromString :: String -> Maybe Version+fromString version = V <$> splitNumbers possibleNumbers <*> tag+ where+ (possibleNumbers, possibleTag) = break (=='-') version++ tag = case possibleTag of+ "" -> Just ""+ '-':rest -> Just rest+ _ -> Nothing++ splitNumbers :: String -> Maybe [Int]+ splitNumbers ns =+ case span isDigit ns of+ ("", _) -> Nothing+ (number, []) -> Just [read number]+ (number, '.':rest) -> (read number :) <$> splitNumbers rest+ _ -> Nothing++instance FromJSON Version where+ parseJSON (String text) =+ let string = T.unpack text in+ case fromString string of+ Just v -> return v+ Nothing -> fail $ unlines+ [ "Dependency file has an invalid version number: " ++ string+ , "Must have format 0.1.2 or 0.1.2-tag"+ ]++ parseJSON _ = fail "Version number must be stored as a string."++instance ToJSON Version where+ toJSON version = toJSON (show version)+
compiler/Generate/Cases.hs view
@@ -1,4 +1,4 @@-module Generate.Cases (toMatch, Match (..), Clause (..), matchSubst) where+module Generate.Cases (toMatch, Match (..), Clause (..), matchSubst, newVar) where import Control.Applicative ((<$>),(<*>)) import Control.Arrow (first,second)@@ -21,7 +21,7 @@ newVar :: State Int String newVar = do n <- get modify (+1)- return $ "_case" ++ show n+ return $ "_v" ++ show n data Match t v = Match String [Clause t v] (Match t v)@@ -104,7 +104,11 @@ (PData name _ : _, _) -> matchClause (Left name) (v:vs) cs Break (PLiteral lit : _, _) -> matchClause (Right lit) (v:vs) cs Break ---matchClause :: Either String Literal -> [String] -> [([Pattern],LExpr t v)] -> Match t v -> State Int (Clause a)+matchClause :: Either String Literal+ -> [String]+ -> [([Pattern],LExpr t v)]+ -> Match t v+ -> State Int (Clause t v) matchClause c (v:vs) cs def = do vs' <- getVars Clause c vs' <$> match (vs' ++ vs) (map flatten cs) def
compiler/Generate/Html.hs view
@@ -1,8 +1,5 @@ {-# LANGUAGE OverloadedStrings #-}-module Generate.Html- (createHtml,- JSSource (..)- ) where+module Generate.Html (generate, JSSource(..)) where import Text.Blaze (preEscapedToMarkup) import qualified Text.Blaze.Html5 as H@@ -10,10 +7,6 @@ import qualified Text.Blaze.Html5.Attributes as A import qualified Data.ByteString.Lazy.Char8 as BS -import Initialize (buildFromSource)-import Generate.JavaScript-import Generate.Noscript- data JSSource = Link String | Source BS.ByteString makeScript :: JSSource -> H.Html@@ -24,8 +17,8 @@ H.script ! A.type_ "text/javascript" $ preEscapedToMarkup $ BS.unpack src -createHtml :: FilePath -> String -> [JSSource] -> String -> String -> H.Html-createHtml libLoc title scripts moduleName noscript =+generate :: FilePath -> String -> [JSSource] -> String -> String -> H.Html+generate libLoc title scripts moduleName noscript = H.docTypeHtml $ do H.head $ do H.meta ! A.charset "UTF-8"
compiler/Generate/JavaScript.hs view
@@ -1,4 +1,4 @@-module Generate.JavaScript where+module Generate.JavaScript (generate) where import Control.Arrow (first,(***)) import Control.Applicative ((<$>),(<*>))@@ -6,33 +6,30 @@ import qualified Data.List as List import qualified Data.Map as Map import qualified Data.Set as Set-import qualified Text.Pandoc as Pan import qualified Generate.Cases as Case-import SourceSyntax.Everything+import qualified Generate.Markdown as MD+import qualified SourceSyntax.Helpers as Help+import SourceSyntax.Literal+import SourceSyntax.Pattern import SourceSyntax.Location+import SourceSyntax.Expression+import SourceSyntax.Module import qualified Transform.SortDefinitions as SD import Language.ECMAScript3.Syntax import Language.ECMAScript3.PrettyPrint-import Parse.Helpers (jsReserveds)--makeSafe :: String -> String-makeSafe = List.intercalate "." . map dereserve . split . deprime- where- deprime = map (\c -> if c == '\'' then '$' else c)- dereserve x = case Set.member x jsReserveds of- False -> x- True -> "$" ++ x+import qualified Transform.SafeNames as MakeSafe +split :: String -> [String] split = go [] where go vars str = case break (=='.') str of- (x,'.':rest) | isOp x -> vars ++ [x ++ '.' : rest]+ (x,'.':rest) | Help.isOp x -> vars ++ [x ++ '.' : rest] | otherwise -> go (vars ++ [x]) rest (x,[]) -> vars ++ [x] -var name = Id () (makeSafe name)+var name = Id () name ref name = VarRef () (var name) prop name = PropId () (var name) f <| x = CallExpr () f [x]@@ -44,11 +41,12 @@ dotSep (x:xs) = foldl (DotRef ()) (ref x) (map var xs) obj = dotSep . split +varDecl :: String -> Expression () -> VarDecl () varDecl x expr = VarDecl () (var x) (Just expr) include alias moduleName =- varDecl alias (obj (moduleName ++ ".make") <| ref "elm")+ varDecl alias (obj (moduleName ++ ".make") <| ref "_elm") internalImports name = VarDeclStmt () @@ -60,6 +58,7 @@ , varDecl "$moduleName" (string name) ] +literal :: Literal -> Expression () literal lit = case lit of Chr c -> obj "_N.chr" <| string [c]@@ -114,18 +113,17 @@ Binop op e1 e2 -> binop span op e1 e2 Lambda p e@(L s _) ->- do body' <- expression body+ do (args, body) <- foldM depattern ([], innerBody) (reverse patterns)+ body' <- expression body return $ case length args < 2 || length args > 9 of True -> foldr (==>) body' (map (:[]) args) False -> ref ("F" ++ show (length args)) <| (args ==> body') where- (args, body) = foldr depattern ([], innerBody) (zip patterns [0..])-- depattern (pattern,n) (args, body) =+ depattern (args, body) pattern = case pattern of- PVar x -> (args ++ [x], body)- _ -> let arg = "arg" ++ show n- in (args ++ [arg], L s (Case (L s (Var arg)) [(pattern, body)]))+ PVar x -> return (args ++ [x], body)+ _ -> do arg <- Case.newVar+ return (args ++ [arg], L s (Case (L s (Var arg)) [(pattern, body)])) (patterns, innerBody) = collect [p] e @@ -156,14 +154,15 @@ return $ function [] (stmts ++ [ ReturnStmt () (Just exp) ]) `call` [] MultiIf branches ->- do branches' <- forM branches $ \(b,e) -> (,) <$> expression b <*> expression e- return $ case last branches of- (L _ (Var "Basics.otherwise"), e) -> ifs (init branches') (snd (last branches'))- _ -> ifs branches'- (obj "_E.If" `call` [ ref "$moduleName", string (show span) ])- where- ifs branches finally = foldr iff finally branches- iff (if', then') else' = CondExpr () if' then' else'+ do branches' <- forM branches $ \(b,e) -> (,) <$> expression b <*> expression e+ return $ case last branches of+ (L _ (Var "Basics.otherwise"), _) -> safeIfs branches'+ (L _ (Literal (Boolean True)), _) -> safeIfs branches'+ _ -> ifs branches' (obj "_E.If" `call` [ ref "$moduleName", string (show span) ])+ where+ safeIfs branches = ifs (init branches) (snd (last branches))+ ifs branches finally = foldr iff finally branches+ iff (if', then') else' = CondExpr () if' then' else' Case e cases -> do (tempVar,initialMatch) <- Case.toMatch cases@@ -183,12 +182,15 @@ do es' <- mapM expression es return $ ObjectLit () (ctor : fields es') where- ctor = (prop "ctor", string (makeSafe name))+ ctor = (prop "ctor", string name) fields = zipWith (\n e -> (prop ("_" ++ show n), e)) [0..] - Markdown doc _ -> return $ obj "Text.text" <| string (pad ++ md ++ pad)- where pad = "<div style=\"height:0;width:0;\"> </div>"- md = Pan.writeHtmlString Pan.def doc+ Markdown uid doc es ->+ do es' <- mapM expression es+ return $ obj "Text.markdown" `call` (string md : string uid : es')+ where+ pad = "<div style=\"height:0;width:0;\"> </div>"+ md = pad ++ MD.toHtml doc ++ pad definition :: Def () () -> State Int [Statement ()] definition def =@@ -200,7 +202,7 @@ let assign x = varDecl x expr' case pattern of PVar x- | isOp x ->+ | Help.isOp x -> let op = LBracket () (ref "_op") (string x) in return [ ExprStmt () $ AssignExpr () OpAssign op expr' ] | otherwise ->@@ -223,11 +225,11 @@ decl x n = varDecl x (dotSep ["$","_" ++ show n]) setup vars- | isTuple name = assign "$" : vars- | otherwise = safeAssign : vars+ | Help.isTuple name = assign "$" : vars+ | otherwise = assign "$raw" : safeAssign : vars - safeAssign = varDecl "$" (CondExpr () if' expr' exception)- if' = InfixExpr () OpStrictEq (obj "$.ctor") (string name)+ safeAssign = varDecl "$" (CondExpr () if' (obj "$raw") exception)+ if' = InfixExpr () OpStrictEq (obj "$raw.ctor") (string name) exception = obj "_E.Case" `call` [ref "$moduleName", string (show span)] _ ->@@ -285,14 +287,15 @@ is -> drop (last is + 1) name -jsModule :: MetadataModule () () -> String -jsModule modul =+generate :: MetadataModule () () -> String +generate unsafeModule = show . prettyPrint $ setup (Just "Elm") (names modul ++ ["make"]) ++- [ assign ("Elm" : names modul ++ ["make"]) (function ["elm"] programStmts) ]+ [ assign ("Elm" : names modul ++ ["make"]) (function ["_elm"] programStmts) ] where- thisModule = dotSep ("elm" : names modul ++ ["values"])+ modul = MakeSafe.metadataModule unsafeModule+ thisModule = dotSep ("_elm" : names modul ++ ["values"]) programStmts =- concat [ setup (Just "elm") (names modul ++ ["values"])+ concat [ setup (Just "_elm") (names modul ++ ["values"]) , [ IfSingleStmt () thisModule (ReturnStmt () (Just thisModule)) ] , [ internalImports (List.intercalate "." (names modul)) ] , concatMap jsImport (imports modul)@@ -304,9 +307,9 @@ , [ ReturnStmt () (Just thisModule) ] ] - jsExports = assign ("elm" : names modul ++ ["values"]) (ObjectLit () exs)+ jsExports = assign ("_elm" : names modul ++ ["values"]) (ObjectLit () exs) where- exs = map entry . filter (not . isOp) $ "_op" : exports modul+ exs = map entry . filter (not . Help.isOp) $ "_op" : exports modul entry x = (PropId () (var x), ref x) assign path expr =@@ -318,7 +321,7 @@ jsImport (modul,_) = setup Nothing path ++ [ include ] where path = split modul- include = assign path $ dotSep ("Elm" : path ++ ["make"]) <| ref "elm"+ include = assign path $ dotSep ("Elm" : path ++ ["make"]) <| ref "_elm" setup namespace path = map create paths where@@ -327,15 +330,15 @@ Nothing -> tail . init $ List.inits path Just nmspc -> drop 2 . init . List.inits $ nmspc : path - addId js = InfixExpr () OpAdd (string (js++"_")) (obj "elm.id")+ addId js = InfixExpr () OpAdd (string (js++"_")) (obj "_elm.id") importEvent (js,base,elm,_) = [ VarDeclStmt () [ varDecl elm $ obj "Signal.constant" <| evalState (expression base) 0 ] , ExprStmt () $ obj "document.addEventListener" `call` [ addId js- , function ["e"]- [ ExprStmt () $ obj "elm.notify" `call` [dotSep [elm,"id"], obj "e.value"] ]+ , function ["_e"]+ [ ExprStmt () $ obj "_elm.notify" `call` [dotSep [elm,"id"], obj "_e.value"] ] ] ] @@ -343,13 +346,13 @@ ExprStmt () $ ref "A2" `call` [ obj "Signal.lift"- , function ["v"]- [ VarDeclStmt () [varDecl "e" $ obj "document.createEvent" <| string "Event"]+ , function ["_v"]+ [ VarDeclStmt () [varDecl "_e" $ obj "document.createEvent" <| string "Event"] , ExprStmt () $- obj "e.initEvent" `call` [ addId js, BoolLit () True, BoolLit () True ]- , ExprStmt () $ AssignExpr () OpAssign (LDot () (ref "e") "value") (ref "v")- , ExprStmt () $ obj "document.dispatchEvent" <| ref "e"- , ReturnStmt () (Just $ ref "v")+ obj "_e.initEvent" `call` [ addId js, BoolLit () True, BoolLit () True ]+ , ExprStmt () $ AssignExpr () OpAssign (LDot () (ref "_e") "value") (ref "_v")+ , ExprStmt () $ obj "document.dispatchEvent" <| ref "_e"+ , ReturnStmt () (Just $ ref "_v") ] , ref elm ] @@ -382,7 +385,7 @@ js1 = expression e1 js2 = expression e2 - func | isOp operator = BracketRef () (dotSep (init parts ++ ["_op"])) (string operator)+ func | Help.isOp operator = BracketRef () (dotSep (init parts ++ ["_op"])) (string operator) | otherwise = dotSep parts where parts = split op
+ compiler/Generate/Markdown.hs view
@@ -0,0 +1,39 @@+module Generate.Markdown where++import Text.Pandoc+import qualified Data.Set as Set++toHtml :: String -> String+toHtml = writeHtmlString writeOptions . readMarkdown readOptions++readOptions =+ def { readerExtensions = elmExtensions+ , readerApplyMacros = False+ }++writeOptions =+ def { writerExtensions = elmExtensions+ , writerHighlight = True+ }++elmExtensions :: Set.Set Extension+elmExtensions = Set.fromList+ [ Ext_raw_html+ , Ext_fenced_code_blocks+ , Ext_fenced_code_attributes+ , Ext_backtick_code_blocks+ , Ext_inline_code_attributes+ , Ext_markdown_in_html_blocks+ , Ext_escaped_line_breaks+ , Ext_fancy_lists+ , Ext_startnum+ , Ext_definition_lists+ , Ext_example_lists+ , Ext_all_symbols_escapable+ , Ext_intraword_underscores+ , Ext_blank_before_blockquote+ , Ext_blank_before_header+ , Ext_auto_identifiers+ , Ext_header_attributes+ , Ext_implicit_header_references+ ]
compiler/Generate/Noscript.hs view
@@ -1,8 +1,12 @@ module Generate.Noscript (noscript) where import Data.List (isInfixOf)-import SourceSyntax.Everything-import qualified Text.Pandoc as Pan+import SourceSyntax.Declaration (Declaration(..))+import SourceSyntax.Expression+import SourceSyntax.Literal+import SourceSyntax.Location+import SourceSyntax.Module+import qualified Generate.Markdown as MD noscript :: Module t v -> String noscript modul = concat (extract modul)@@ -49,7 +53,7 @@ Case e cases -> concatMap (f . snd) cases Data _ es -> concatMap f es MultiIf es -> concatMap (f . snd) es- Markdown doc _ -> [ Pan.writeHtmlString Pan.def doc ]+ Markdown _ md _ -> [ MD.toHtml md ] _ -> [] extractLink src txt =
− compiler/Initialize.hs
@@ -1,124 +0,0 @@-module Initialize (buildFromSource, getSortedDependencies) where--import Data.Data-import Control.Monad.State-import qualified Data.Graph as Graph-import qualified Data.List as List-import qualified Data.Map as Map-import qualified Data.Set as Set-import System.Directory-import System.Exit-import System.FilePath as FP-import Text.PrettyPrint (Doc)--import SourceSyntax.Everything-import qualified SourceSyntax.Type as Type-import qualified Parse.Parse as Parse-import qualified Metadata.Prelude as Prelude-import qualified Transform.Check as Check-import qualified Transform.SortDefinitions as SD-import qualified Type.Inference as TI-import qualified Type.Constrain.Declaration as TcDecl-import qualified Transform.Canonicalize as Canonical--buildFromSource :: Bool -> Interfaces -> String -> Either [Doc] (MetadataModule () ())-buildFromSource noPrelude interfaces source =- do let add = if noPrelude then id else Prelude.add- infixes = Map.fromList . map (\(assoc,lvl,op) -> (op,(lvl,assoc)))- . concatMap iFixities $ Map.elems interfaces-- modul@(Module _ _ _ decls') <- add `fmap` Parse.program infixes source-- -- check for structural errors- Module names exs ims decls <-- case Check.mistakes decls' of- [] -> return modul- ms -> Left ms-- let exports'- | null exs =- let get = Set.toList . SD.boundVars in- concat [ get pattern | Definition (Def pattern _) <- decls ] ++- concat [ map fst ctors | Datatype _ _ ctors <- decls ] ++- [ name | TypeAlias name _ (Type.Record _ _) <- decls ]- | otherwise = exs-- metaModule <- Canonical.metadataModule interfaces $ MetadataModule {- names = names,- path = FP.joinPath names,- exports = exports',- imports = ims,- -- reorder AST into strongly connected components- program = SD.sortDefs . dummyLet $ TcDecl.toExpr decls,- types = Map.empty,- datatypes = [ (name,vars,ctors) | Datatype name vars ctors <- decls ],- fixities = [ (assoc,level,op) | Fixity assoc level op <- decls ],- aliases = [ (name,tvs,tipe) | TypeAlias name tvs tipe <- decls ],- foreignImports = [ (evt,v,name,typ) | ImportEvent evt v name typ <- decls ],- foreignExports = [ (evt,name,typ) | ExportEvent evt name typ <- decls ]- }-- types <- TI.infer interfaces metaModule-- return $ metaModule { types = types }---getSortedDependencies :: [FilePath] -> Bool -> FilePath -> IO [String]-getSortedDependencies srcDirs noPrelude root =- sortDeps =<< readDeps srcDirs noPrelude root--type Deps = (FilePath, String, [String])--sortDeps :: [Deps] -> IO [String]-sortDeps depends =- if null mistakes- then return (concat sccs)- else print msg >> mapM print mistakes >> exitFailure- where- sccs = map Graph.flattenSCC $ Graph.stronglyConnComp depends-- mistakes = filter (\scc -> length scc > 1) sccs- msg = "A cyclical module dependency or was detected in: "--readDeps :: [FilePath] -> Bool -> FilePath -> IO [Deps]-readDeps srcDirs noPrelude root = evalStateT (go root) Set.empty- where- builtIns = if noPrelude then Set.empty- else Set.fromList (Map.keys Prelude.interfaces)-- go :: FilePath -> StateT (Set.Set String) IO [Deps]- go root = do- (root', txt) <- liftIO $ getFile srcDirs root- case Parse.dependencies txt of- Left err -> liftIO (putStrLn msg >> print err >> exitFailure)- where msg = "Error resolving dependencies in " ++ root' ++ ":"- - Right (name,deps) ->- do seen <- get- let realDeps = Set.difference (Set.fromList deps) builtIns- newDeps = Set.difference (Set.filter (not . isNative) realDeps) seen- put (Set.insert name (Set.union newDeps seen))- rest <- mapM (go . toFilePath) (Set.toList newDeps)- return ((makeRelative "." root', name, Set.toList realDeps) : concat rest)--getFile :: [FilePath] -> FilePath -> IO (FilePath,String)-getFile [] path = do- putStrLn $ unlines [ "Could not find file: " ++ path- , " If it is not in the root directory of your project, use"- , " --src-dir to declare additional locations for source files." ]- exitFailure--getFile (dir:dirs) path = do- let path' = dir </> path- exists <- doesFileExist path'- case exists of- True -> (,) path' `fmap` readFile path'- False -> getFile dirs path--isNative name = List.isPrefixOf "Native." name--toFilePath :: String -> FilePath-toFilePath name = map swapDots name ++ ext- where swapDots '.' = '/'- swapDots c = c- ext = if isNative name then ".js" else ".elm"
+ compiler/InterfaceSerialization.hs view
@@ -0,0 +1,52 @@+module InterfaceSerialization ( loadInterface+ , interfaceDecode+ , validVersion+ ) where++import qualified Data.ByteString.Lazy as L+import qualified Data.Binary as Binary++import qualified Elm.Internal.Version as Version+import System.Directory (doesFileExist)+import System.IO (hPutStrLn, stderr)+import System.Exit (exitFailure)++import SourceSyntax.Module++loadInterface :: FilePath -> IO (Either String L.ByteString)+loadInterface filePath = do+ exists <- doesFileExist filePath+ if exists+ then do+ byteString <- L.readFile filePath+ return $ Right byteString++ else+ return $ Left $ "Unable to find file " ++ filePath +++ " for deserialization!"++interfaceDecode :: Binary.Binary a =>+ FilePath -> L.ByteString -> Either String a+interfaceDecode filePath bytes = do+ case Binary.decodeOrFail bytes of+ Right (_, _, binaryInfo) -> Right binaryInfo++ Left (_, offset, err) ->+ Left $ concat [ "Error reading build artifact: ", filePath, "\n"+ , " The exact error was '", err, "' at offset ", show offset, ".\n"+ , " The file was generated by a previous build and may be outdated or corrupt.\n"+ , " Please remove the file and try again."+ ]++validVersion :: FilePath -> (String, ModuleInterface) ->+ Either String (String, ModuleInterface)+validVersion filePath (name, interface) =+ if iVersion interface == Version.elmVersion then+ Right (name, interface)+ else+ Left $ concat+ [ "Error reading build artifact: ", filePath, "\n"+ , " It was generated by a different version of the compiler: "+ , show (iVersion interface), "\n"+ , " Please remove the file and try again.\n"+ ]
− compiler/Language/Elm.hs
@@ -1,40 +0,0 @@-{- | This module exports the functions necessary for compiling Elm to JS, - and some utilities for making it easier to find some Elm-related files. - - The documentation for the Elm language is available at - <http://elm-lang.org/Documentation.elm>, and many interactive examples are - available at <http://elm-lang.org/Examples.elm> --} -module Language.Elm (compile, moduleName, runtime, docs) where - -import qualified Data.List as List -import qualified Data.Map as Map -import Data.Version (showVersion) -import Generate.JavaScript (jsModule) -import Initialize (buildFromSource) -import Parse.Module (getModuleName) -import SourceSyntax.Module -import Text.Blaze.Html (Html) -import qualified Text.PrettyPrint as P -import qualified Metadata.Prelude as Prelude -import Paths_Elm - --- |This function compiles Elm code to JavaScript. It will return either --- an error message or the compiled JS code. -compile :: String -> Either String String -compile source = - case buildFromSource False Prelude.interfaces source of - Left docs -> Left . unlines . List.intersperse "" $ map P.render docs - Right modul -> Right $ jsModule (modul :: MetadataModule () ()) - --- |This function extracts the module name of a given source program. -moduleName :: String -> Maybe String -moduleName = getModuleName - --- |The absolute path to Elm's runtime system. -runtime :: IO FilePath -runtime = getDataFileName "elm-runtime.js" - --- |The absolute path to Elm's core library documentation. -docs :: IO FilePath -docs = getDataFileName "docs.json"
compiler/Metadata/Prelude.hs view
@@ -7,11 +7,11 @@ import System.Exit import System.FilePath import System.IO-import System.IO.Unsafe (unsafePerformIO) import SourceSyntax.Module import qualified Data.Binary as Binary import qualified Data.ByteString.Lazy as BS +import qualified InterfaceSerialization as IS add :: Module t v -> Module t v add (Module name exs ims stmts) = Module name exs (customIms ++ ims) stmts@@ -30,10 +30,8 @@ modules = [ "Basics", "Signal", "List", "Maybe", "Time", "Prelude" , "Graphics.Element", "Color", "Graphics.Collage" ] -{-# NOINLINE interfaces #-}-interfaces :: Interfaces-interfaces =- unsafePerformIO (safeReadDocs =<< Path.getDataFileName "interfaces.data")+interfaces :: IO Interfaces+interfaces = safeReadDocs =<< Path.getDataFileName "interfaces.data" safeReadDocs :: FilePath -> IO Interfaces safeReadDocs name =@@ -46,14 +44,27 @@ , " and specify your versions of Elm and your OS" ] exitFailure +firstModuleInterface :: [(String, ModuleInterface)] ->+ Either String (String, ModuleInterface)+firstModuleInterface interfaces =+ case interfaces of+ [] -> Left "No interfaces found in serialized Prelude!"+ iface:_ -> Right iface+ readDocs :: FilePath -> IO Interfaces-readDocs name = do- exists <- doesFileExist name- case exists of- False -> ioError . userError $ "File Not Found"- True -> do- handle <- openBinaryFile name ReadMode- bits <- BS.hGetContents handle- let ifaces = Map.fromList (Binary.decode bits)- BS.length bits `seq` hClose handle- return ifaces+readDocs filePath = do+ bytes <- IS.loadInterface filePath+ let interfaces = IS.interfaceDecode filePath =<< bytes++ -- Although every ModuleInterface that is deserialized in this collection+ -- contains the compiler version, we only check the first ModuleInterface+ -- since it doesn't make sense that different modules in Prelude would+ -- have been compiled by different compiler versions.+ isValid = IS.validVersion filePath =<< firstModuleInterface =<< interfaces++ case (interfaces, isValid) of+ (_, Left err) -> do+ hPutStrLn stderr err+ exitFailure++ (Right ifaces, _) -> return $ Map.fromList ifaces
compiler/Parse/Declaration.hs view
@@ -6,7 +6,6 @@ import qualified Data.Set as Set import Text.Parsec hiding (newline,spaces) import Text.Parsec.Indent-import qualified Text.Pandoc as Pan import Parse.Helpers import qualified Parse.Expression as Expr@@ -27,7 +26,7 @@ forcedWS alias <- capVar args <- spacePrefix lowVar- whitespace ; string "=" ; whitespace+ padded equals tipe <- Type.expr return (TypeAlias alias args tipe) @@ -37,7 +36,7 @@ forcedWS name <- capVar <?> "name of data-type" args <- spacePrefix lowVar- whitespace ; string "=" ; whitespace+ padded equals tcs <- pipeSep1 Type.constructor return $ Datatype name args tcs @@ -47,7 +46,7 @@ assoc <- choice [ reserved "infixl" >> return L , reserved "infix" >> return N , reserved "infixr" >> return R ]- whitespace+ forcedWS n <- digit forcedWS Fixity assoc (read [n]) <$> anyOp@@ -61,11 +60,11 @@ exportEvent :: IParser (Declaration t v) exportEvent = do- try (reserved "export") >> whitespace >> reserved "jsevent" >> whitespace+ try (reserved "export") >> padded (reserved "jsevent") eventName <- jsVar whitespace elmVar <- lowVar- whitespace ; hasType ; whitespace+ padded hasType tipe <- Type.expr case tipe of T.Data "Signal" [t] ->@@ -76,13 +75,12 @@ importEvent :: IParser (Declaration t v) importEvent = do- try (reserved "import") >> whitespace >> reserved "jsevent" >> whitespace+ try (reserved "import") >> padded (reserved "jsevent") eventName <- jsVar- whitespace- baseValue <- Expr.term <?> "Base case for imported signal (signals cannot be undefined)"- whitespace+ baseValue <- padded Expr.term+ <?> "Base case for imported signal (signals cannot be undefined)" elmVar <- lowVar <?> "Name of imported signal"- whitespace ; hasType ; whitespace+ padded hasType tipe <- Type.expr case tipe of T.Data "Signal" [t] ->
compiler/Parse/Expression.hs view
@@ -5,7 +5,6 @@ import Data.List (foldl') import Text.Parsec hiding (newline,spaces) import Text.Parsec.Indent-import qualified Text.Pandoc as Pan import Parse.Helpers import qualified Parse.Pattern as Pattern@@ -51,24 +50,23 @@ where range = do lo <- expr- whitespace >> string ".." >> whitespace+ padded (string "..") Range lo <$> expr markdown' = do- (rawText, exprs) <- markdown interpolation- let md = Pan.readMarkdown Pan.def (filter (/='\r') rawText)- return (Markdown md exprs)+ pos <- getPosition+ let uid = show (sourceLine pos) ++ ":" ++ show (sourceColumn pos)+ (rawText, exprs) <- markdown (interpolation uid)+ return (Markdown uid (filter (/='\r') rawText) exprs) - span xs = "<span id=\"md" ++ show (length xs) ++- "\" style=\"font-family:monospace;\">{{ ... }}</span>"+ span uid index =+ "<span id=\"md-" ++ uid ++ "-" ++ show index ++ "\">{{ markdown interpolation is in the pipeline, but still needs more testing }}</span>" - interpolation md exprs = do+ interpolation uid md exprs = do try (string "{{")- whitespace- e <- expr- whitespace+ e <- padded expr string "}}"- return (md ++ span exprs, exprs ++ [e])+ return (md ++ span uid (length exprs), exprs ++ [e]) parensTerm :: IParser (LExpr t v) parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)@@ -98,7 +96,7 @@ where field = do label <- rLabel patterns <- spacePrefix Pattern.term- whitespace >> string "=" >> whitespace+ padded equals body <- expr return (label, makeFunction patterns body) @@ -106,24 +104,21 @@ change = do lbl <- rLabel- whitespace >> string "<-" >> whitespace+ padded (string "<-") (,) lbl <$> expr remove r = addLocation (string "-" >> whitespace >> Remove r <$> rLabel) insert r = addLocation $ do string "|" >> whitespace- Insert r <$> rLabel <*>- (whitespace >> string "=" >> whitespace >> expr)+ Insert r <$> rLabel <*> (padded equals >> expr) modify r = addLocation (string "|" >> whitespace >> Modify r <$> commaSep1 change) misc = try $ do record <- addLocation (Var <$> rLabel)- whitespace- opt <- optionMaybe (remove record)- whitespace+ opt <- padded (optionMaybe (remove record)) case opt of Just e -> try (insert e) <|> return e Nothing -> try (insert record) <|> try (modify record)@@ -157,22 +152,22 @@ where normal = do bool <- expr- whitespace ; reserved "then" ; whitespace+ padded (reserved "then") thenBranch <- expr whitespace <?> "an 'else' branch" ; reserved "else" <?> "an 'else' branch" ; whitespace elseBranch <- expr return $ MultiIf [(bool, thenBranch),- (Location.sameAs elseBranch (Var "otherwise"), elseBranch)]+ (Location.sameAs elseBranch (Literal . Literal.Boolean $ True), elseBranch)] multiIf = MultiIf <$> spaceSep1 iff where iff = do string "|" ; whitespace- b <- expr ; whitespace ; string "->" ; whitespace+ b <- expr ; padded arrow (,) b <$> expr lambdaExpr :: IParser (LExpr t v) lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function" whitespace args <- spaceSep1 Pattern.term- whitespace ; arrow ; whitespace+ padded arrow body <- expr return (makeFunction args body) @@ -183,14 +178,15 @@ letExpr = do reserved "let" ; whitespace defs <- defSet- whitespace ; reserved "in" ; whitespace+ padded (reserved "in") Let defs <$> expr caseExpr :: IParser (Expr t v) caseExpr = do- reserved "case"; whitespace; e <- expr; whitespace; reserved "of"; whitespace+ reserved "case"; e <- padded expr; reserved "of"; whitespace Case e <$> (with <|> without)- where case_ = do p <- Pattern.expr; whitespace; arrow; whitespace+ where case_ = do p <- Pattern.expr+ padded arrow (,) p <$> expr with = brackets (semiSep1 (case_ <?> "cases { x -> ... }")) without = block (do c <- case_ ; whitespace ; return c)@@ -227,7 +223,7 @@ definition :: IParser (Def t v) definition = withPos $ do (name:args) <- defStart- whitespace >> string "=" >> whitespace+ padded equals body <- expr return . Def name $ makeFunction args body @@ -236,7 +232,7 @@ where start = do v <- lowVar <|> parens symOp- whitespace ; hasType ; whitespace+ padded hasType return v def :: IParser (Def t v)
compiler/Parse/Helpers.hs view
@@ -21,7 +21,8 @@ , "data", "type" , "module", "where" , "import", "as", "hiding", "open"- , "export", "foreign" ]+ , "export", "foreign"+ , "deriving" ] jsReserveds :: Set.Set String jsReserveds = Set.fromList@@ -35,6 +36,10 @@ , "const", "enum", "export", "extends", "import", "super", "implements" , "interface", "let", "package", "private", "protected", "public" , "static", "yield"+ -- reserved by the Elm runtime system+ , "Elm", "ElmRuntime"+ , "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9"+ , "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9" ] expecting = flip (<?>)@@ -49,9 +54,22 @@ iParseWithTable sourceName table aParser input = runIndent sourceName $ runParserT aParser table sourceName input +readMaybe :: Read a => String -> Maybe a+readMaybe s =+ case [ x | (x,t) <- reads s, ("","") <- lex t ] of+ [x] -> Just x+ _ -> Nothing+ backslashed :: IParser Char-backslashed = do { char '\\'; c <- anyChar- ; return . read $ ['\'','\\',c,'\''] }+backslashed = do+ char '\\'+ c <- anyChar+ case readMaybe ['\'','\\',c,'\''] of+ Just chr -> return chr+ Nothing ->+ fail $ "Did not recognize character '\\" ++ [c] +++ "'. If the backslash is meant to be a character of its own, " +++ "it should be escaped like this: \"\\\\" ++ [c] ++ "\"" var :: IParser String var = makeVar (letter <|> char '_' <?> "variable")@@ -93,6 +111,15 @@ "\8728" -> return "." _ -> return op +padded :: IParser a -> IParser a+padded p = do whitespace+ out <- p+ whitespace+ return out++equals :: IParser String+equals = string "="+ arrow :: IParser String arrow = string "->" <|> string "\8594" <?> "arrow (->)" @@ -106,7 +133,7 @@ spaceySepBy1 :: IParser b -> IParser a -> IParser [a] spaceySepBy1 sep p = do a <- p- (a:) <$> many (commitIf (whitespace >> sep) (whitespace >> sep >> whitespace >> p))+ (a:) <$> many (commitIf (whitespace >> sep) (padded sep >> p)) commaSep1 :: IParser a -> IParser [a]@@ -154,7 +181,7 @@ char b <?> "closing '" ++ [b] ++ "'" ; return out surround a z name p = do- char a ; whitespace ; v <- p ; whitespace+ char a ; v <- padded p char z <?> unwords ["closing", name, show z] return v @@ -252,7 +279,8 @@ ignoreUntil end = go where ignore p = const () <$> p- filler = choice [ ignore multiComment+ filler = choice [ try (ignore chr) <|> ignore str+ , ignore multiComment , ignore (markdown (\_ _ -> mzero)) , ignore anyChar ]@@ -296,3 +324,25 @@ , do c <- anyChar closeMarkdown (md ++ [c]) stuff ]++str :: IParser String+str = choice [ quote >> dewindows <$> manyTill (backslashed <|> anyChar) quote+ , liftM dewindows . expecting "string" . betwixt '"' '"' . many $+ backslashed <|> satisfy (/='"')+ ]+ where+ quote = try (string "\"\"\"")++ -- Remove \r from strings to fix generated JavaScript+ dewindows [] = []+ dewindows cs =+ let (pre, suf) = break (`elem` ['\r','\n']) cs+ in pre ++ case suf of + ('\r':'\n':rest) -> '\n' : dewindows rest+ ('\n':rest) -> '\n' : dewindows rest+ ('\r':rest) -> '\n' : dewindows rest+ _ -> []++chr :: IParser Char+chr = betwixt '\'' '\'' (backslashed <|> satisfy (/='\''))+ <?> "character"
compiler/Parse/Literal.hs view
@@ -8,7 +8,7 @@ import Parse.Helpers import SourceSyntax.Literal -literal = num <|> str <|> chr+literal = num <|> (Str <$> str) <|> (Chr <$> chr) num :: IParser Literal num = fmap toLit (preNum <?> "number")@@ -21,26 +21,3 @@ minus = try $ do string "-" lookAhead digit return "-"--chr :: IParser Literal-chr = Chr <$> betwixt '\'' '\'' (backslashed <|> satisfy (/='\''))- <?> "character"--str :: IParser Literal-str = choice [ quote >> str <$> manyTill (backslashed <|> anyChar) quote- , liftM Str . expecting "string" . betwixt '"' '"' . many $- backslashed <|> satisfy (/='"')- ]- where- quote = try (string "\"\"\"")- str = Str . dewindows-- -- Remove \r from strings to fix generated JavaScript- dewindows [] = []- dewindows cs =- let (pre, suf) = break (`elem` ['\r','\n']) cs- in pre ++ case suf of - ('\r':'\n':rest) -> '\n' : dewindows rest- ('\n':rest) -> '\n' : dewindows rest- ('\r':rest) -> '\n' : dewindows rest- _ -> []
compiler/Parse/Pattern.hs view
@@ -11,9 +11,9 @@ import Parse.Helpers import Parse.Literal+import SourceSyntax.Literal+import SourceSyntax.Pattern hiding (tuple, list) import qualified SourceSyntax.Pattern as Pattern-import SourceSyntax.Everything hiding (tuple)- basic :: IParser Pattern basic = choice
compiler/SourceSyntax/Declaration.hs view
@@ -1,7 +1,5 @@-{-# LANGUAGE DeriveDataTypeable #-} module SourceSyntax.Declaration where -import Data.Data import qualified SourceSyntax.Expression as Expr import SourceSyntax.Type import SourceSyntax.PrettyPrint@@ -43,6 +41,7 @@ let alias = P.text name <+> P.hsep (map P.text tvars) in P.hang (P.text "type" <+> alias <+> P.equals) 4 (pretty tipe) - -- TODO: actually write out the other cases. They are currently unused, but- -- this is probably going to be a bug someday.- _ -> P.text (show decl)+ -- TODO: Actually write out the contained data in these cases.+ ImportEvent _ _ _ _ -> P.text (show decl)+ ExportEvent _ _ _ -> P.text (show decl)+ Fixity _ _ _ -> P.text (show decl)
− compiler/SourceSyntax/Everything.hs
@@ -1,17 +0,0 @@-module SourceSyntax.Everything- (module SourceSyntax.Helpers,- module SourceSyntax.Location,- module SourceSyntax.Literal,- module SourceSyntax.Pattern,- module SourceSyntax.Expression,- module SourceSyntax.Declaration,- module SourceSyntax.Module- ) where--import SourceSyntax.Helpers-import SourceSyntax.Location-import SourceSyntax.Literal-import SourceSyntax.Pattern hiding (tuple, list, cons, nil, prettyParens)-import SourceSyntax.Expression-import SourceSyntax.Declaration hiding (Assoc(..))-import SourceSyntax.Module
compiler/SourceSyntax/Expression.hs view
@@ -1,9 +1,6 @@-{-# LANGUAGE DeriveDataTypeable #-} module SourceSyntax.Expression where -import Data.Data import Data.List (intercalate)-import qualified Text.Pandoc as Pandoc import SourceSyntax.PrettyPrint import Text.PrettyPrint as P import qualified SourceSyntax.Helpers as Help@@ -30,13 +27,13 @@ | Insert (LExpr t v) String (LExpr t v) | Modify (LExpr t v) [(String, LExpr t v)] | Record [(String, LExpr t v)]- | Markdown Pandoc.Pandoc [LExpr t v]- deriving (Eq, Show, Data, Typeable)+ | Markdown String String [LExpr t v]+ deriving (Eq) data Def tipe var = Def Pattern.Pattern (LExpr tipe var) | TypeAnnotation String Type.Type- deriving (Eq, Show, Data, Typeable)+ deriving (Eq, Show) tuple es = Data ("_Tuple" ++ show (length es)) es @@ -48,6 +45,9 @@ dummyLet defs = Location.none $ Let defs (Location.none $ Var saveEnvName) +instance Show (Expr t v) where+ show = render . pretty+ instance Pretty (Expr t v) where pretty expr = case expr of@@ -96,7 +96,7 @@ where field (x,e) = variable x <+> P.text "=" <+> pretty e - Markdown _ _ -> P.text "[markdown| ... |]"+ Markdown _ _ _ -> P.text "[markdown| ... |]" instance Pretty (Def t v) where pretty def =
compiler/SourceSyntax/Literal.hs view
@@ -1,7 +1,5 @@-{-# LANGUAGE DeriveDataTypeable #-} module SourceSyntax.Literal where -import Data.Data import SourceSyntax.PrettyPrint import qualified Text.PrettyPrint as PP @@ -10,7 +8,7 @@ | Chr Char | Str String | Boolean Bool- deriving (Eq, Ord, Data, Typeable, Show)+ deriving (Eq, Ord, Show) instance Pretty Literal where pretty literal =
compiler/SourceSyntax/Location.hs view
@@ -1,19 +1,17 @@-{-# LANGUAGE DeriveDataTypeable #-} module SourceSyntax.Location where -import Data.Data import Text.PrettyPrint import SourceSyntax.PrettyPrint import qualified Text.Parsec.Pos as Parsec data SrcPos = Pos { line :: Int, column :: Int }- deriving (Eq, Ord, Data, Typeable)+ deriving (Eq, Ord) data SrcSpan = Span SrcPos SrcPos String | NoSpan String- deriving (Eq, Ord, Data, Typeable)+ deriving (Eq, Ord) data Located e = L SrcSpan e- deriving (Eq, Ord, Data, Typeable)+ deriving (Eq, Ord) none e = L (NoSpan (render $ pretty e)) e noneNoDocs = L (NoSpan "")@@ -53,7 +51,7 @@ show (column start) ++ " to " ++ show (column end) instance Show e => Show (Located e) where- show (L s e) = "L (" ++ show s ++ ") (" ++ show e ++ ")"+ show (L _ e) = show e instance Pretty a => Pretty (Located a) where pretty (L _ e) = pretty e
compiler/SourceSyntax/Module.hs view
@@ -1,7 +1,5 @@-{-# LANGUAGE DeriveDataTypeable #-} module SourceSyntax.Module where -import Data.Data import Data.Binary import Data.List (intercalate) import qualified Data.Map as Map@@ -12,7 +10,10 @@ import SourceSyntax.Declaration import SourceSyntax.Type import System.FilePath (joinPath)+import Control.Monad (liftM) +import qualified Elm.Internal.Version as Version+ data Module tipe var = Module [String] Exports Imports [Declaration tipe var] deriving (Show)@@ -21,8 +22,25 @@ type Imports = [(String, ImportMethod)] data ImportMethod = As String | Importing [String] | Hiding [String]- deriving (Eq, Ord, Show, Data, Typeable)+ deriving (Eq, Ord, Show) +instance Binary ImportMethod where+ put (As s) = do put (0 :: Word8)+ put s++ put (Importing ss) = do put (1 :: Word8)+ put ss++ put (Hiding ss) = do put (2 :: Word8)+ put ss++ get = do tag <- getWord8+ case tag of+ 0 -> liftM As get+ 1 -> liftM Importing get+ 2 -> liftM Hiding get+ _ -> error "Error reading valid ImportMethod type from serialized string"+ data MetadataModule t v = MetadataModule { names :: [String], path :: FilePath,@@ -35,22 +53,36 @@ datatypes :: [ (String, [String], [(String,[Type])]) ], foreignImports :: [(String, LExpr t v, String, Type)], foreignExports :: [(String, String, Type)]-}+} deriving Show type Interfaces = Map.Map String ModuleInterface type ADT = (String, [String], [(String,[Type])]) data ModuleInterface = ModuleInterface {+ iVersion :: Version.Version, iTypes :: Map.Map String Type,+ iImports :: [(String, ImportMethod)], iAdts :: [ADT], iAliases :: [(String, [String], Type)], iFixities :: [(Assoc, Int, String)] } deriving Show +metaToInterface metaModule =+ ModuleInterface+ { iVersion = Version.elmVersion+ , iTypes = types metaModule+ , iImports = imports metaModule+ , iAdts = datatypes metaModule+ , iAliases = aliases metaModule+ , iFixities = fixities metaModule+ }+ instance Binary ModuleInterface where- get = ModuleInterface <$> get <*> get <*> get <*> get+ get = ModuleInterface <$> get <*> get <*> get <*> get <*> get <*> get put modul = do+ put (iVersion modul) put (iTypes modul)+ put (iImports modul) put (iAdts modul) put (iAliases modul) put (iFixities modul)@@ -58,6 +90,10 @@ instance Binary Assoc where get = do n <- getWord8- return $ case n of { 0 -> L ; 1 -> N ; 2 -> R }+ return $ case n of+ 0 -> L+ 1 -> N+ 2 -> R+ _ -> error "Error reading valid associativity from serialized string" put assoc = putWord8 $ case assoc of { L -> 0 ; N -> 1 ; R -> 2 }
compiler/SourceSyntax/Pattern.hs view
@@ -1,8 +1,6 @@-{-# LANGUAGE DeriveDataTypeable #-} module SourceSyntax.Pattern where import Data.List (intercalate)-import Data.Data import SourceSyntax.Helpers as Help import SourceSyntax.PrettyPrint import Text.PrettyPrint as PP@@ -14,7 +12,7 @@ | PVar String | PAnything | PLiteral Literal.Literal- deriving (Eq, Ord, Data, Typeable, Show)+ deriving (Eq, Ord, Show) cons h t = PData "::" [h,t] nil = PData "[]" []
compiler/SourceSyntax/PrettyPrint.hs view
@@ -21,3 +21,14 @@ reprime :: String -> String reprime = map (\c -> if c == '$' then '\'' else c)++eightyCharLines :: Int -> String -> String+eightyCharLines indent message = answer+ where+ (answer,_,_) = foldl step (spaces, indent-1, "") chunks++ chunks = map (\w -> (w, length w)) (words message)+ spaces = replicate indent ' '+ step (sentence, slen, space) (word, wlen)+ | slen + wlen > 79 = (sentence ++ "\n" ++ spaces ++ word, indent + wlen, " ")+ | otherwise = (sentence ++ space ++ word, slen + wlen + length space, " ")
compiler/SourceSyntax/Type.hs view
@@ -1,8 +1,6 @@-{-# LANGUAGE DeriveDataTypeable #-} module SourceSyntax.Type where import Data.Binary-import Data.Data import qualified Data.Map as Map import qualified SourceSyntax.Helpers as Help import Control.Applicative ((<$>), (<*>))@@ -14,7 +12,7 @@ | Data String [Type] | EmptyRecord | Record [(String,Type)] Type- deriving (Eq, Show, Data, Typeable)+ deriving (Eq, Show) fieldMap :: [(String,a)] -> Map.Map String [a] fieldMap fields =@@ -94,3 +92,4 @@ 2 -> Data <$> get <*> get 3 -> return EmptyRecord 4 -> Record <$> get <*> get+ _ -> error "Error reading a valid type from serialized string"
compiler/Transform/Canonicalize.hs view
@@ -15,11 +15,12 @@ import qualified Transform.SortDefinitions as SD import Text.PrettyPrint as P - interface :: String -> ModuleInterface -> ModuleInterface interface moduleName iface = ModuleInterface- { iTypes = Map.mapKeys prefix (Map.map renameType' (iTypes iface))+ { iVersion = iVersion iface+ , iTypes = Map.mapKeys prefix (Map.map renameType' (iTypes iface))+ , iImports = iImports iface , iAdts = map (both prefix renameCtors) (iAdts iface) , iAliases = map (both prefix renameType') (iAliases iface) , iFixities = iFixities iface -- cannot have canonicalized operators while parsing@@ -94,7 +95,6 @@ realImports = filter (not . List.isPrefixOf "Native." . fst) (imports modul) initialEnv = Map.fromList (concatMap canon realImports ++ localEnv ++ globalEnv) - type Env = Map.Map String String extend :: Env -> Pattern -> Env@@ -173,7 +173,7 @@ branch (pattern,e) = (,) `liftM` format (renamePattern env pattern) `ap` rename (extend env pattern) e - Markdown md es -> Markdown md `liftM` mapM rnm es+ Markdown uid md es -> Markdown uid md `liftM` mapM rnm es renamePattern :: Env -> Pattern -> Either String Pattern
compiler/Transform/Check.hs view
@@ -1,49 +1,83 @@ module Transform.Check (mistakes) where import Transform.SortDefinitions (boundVars)-import SourceSyntax.Everything+import SourceSyntax.Declaration (Declaration(..))+import SourceSyntax.Expression+import SourceSyntax.Pattern+import SourceSyntax.Location import SourceSyntax.PrettyPrint import qualified SourceSyntax.Type as T import Data.List as List import qualified Data.Map as Map import qualified Data.Maybe as Maybe import qualified Data.Set as Set-import Data.Data-import Data.Generics.Uniplate.Data import Text.PrettyPrint as P -mistakes :: (Data t, Data v) => [Declaration t v] -> [Doc]+mistakes :: [Declaration t v] -> [Doc] mistakes decls =- illFormedTypes decls ++ map P.text (concatMap findErrors (getLets decls))+ concat [ infiniteTypeAliases decls+ , illFormedTypes decls+ , map P.text (duplicateConstructors decls)+ , map P.text (concatMap findErrors (getLets decls)) ] where findErrors defs = duplicates defs ++ badOrder defs --getLets :: (Data t, Data v) => [Declaration t v] -> [[Def t v]]-getLets decls = defs : concatMap getSubLets defs+getLets :: [Declaration t v] -> [[Def t v]]+getLets decls = defs : concatMap defLets defs where- defs = concatMap (\d -> case d of Definition d -> [d] ; _ -> []) decls+ defs = [ d | Definition d <- decls ] - getSubLets def =+ defLets def = case def of- Def pattern expr -> [ defs | Let defs _ <- universeBi expr ] TypeAnnotation _ _ -> []+ Def _ expr -> exprLets expr + exprLets (L _ expr) =+ case expr of+ Var _ -> []+ Lambda p e -> exprLets e+ Binop op e1 e2 -> exprLets e1 ++ exprLets e2+ Case e cases -> exprLets e ++ concatMap (exprLets . snd) cases+ Data name es -> concatMap exprLets es+ Literal _ -> []+ Range e1 e2 -> exprLets e1 ++ exprLets e2+ ExplicitList es -> concatMap exprLets es+ App e1 e2 -> exprLets e1 ++ exprLets e2+ MultiIf branches -> concatMap (\(b,e) -> exprLets b ++ exprLets e) branches+ Access e lbl -> exprLets e+ Remove e lbl -> exprLets e+ Insert e lbl v -> exprLets e ++ exprLets v+ Modify e fields -> exprLets e ++ concatMap (exprLets . snd) fields+ Record fields -> concatMap (exprLets . snd) fields+ Markdown uid md es -> []+ Let defs body -> [defs] ++ exprLets body +dups :: Eq a => [a] -> [a]+dups = map head . filter ((>1) . length) . List.group++dupErr :: String -> String -> String+dupErr err x = + "Syntax Error: There can only be one " ++ err ++ " '" ++ x ++ "'."+ duplicates :: [Def t v] -> [String] duplicates defs = map defMsg (dups definitions) ++ map annMsg (dups annotations) where annotations = List.sort [ name | TypeAnnotation name _ <- defs ] definitions = List.sort $ concatMap Set.toList [ boundVars pattern | Def pattern _ <- defs ]-- dups = map head . filter ((>1) . length) . List.group-- msg = "Syntax Error: There can only be one "- defMsg x = msg ++ "definition of '" ++ x ++ "'."- annMsg x = msg ++ "type annotation for '" ++ x ++ "'."+ defMsg = dupErr "definition of"+ annMsg = dupErr "type annotation for" +duplicateConstructors :: [Declaration t v] -> [String]+duplicateConstructors decls = + map typeMsg (dups typeCtors) ++ map dataMsg (dups dataCtors)+ where+ typeCtors = List.sort [ name | Datatype name _ _ <- decls ]+ dataCtors = List.sort . concat $+ [ map fst patterns | Datatype _ _ patterns <- decls ]+ dataMsg = dupErr "definition of data constructor"+ typeMsg = dupErr "definition of type constructor" badOrder :: [Def t v] -> [String] badOrder defs = go defs@@ -105,3 +139,36 @@ | otherwise = zipWith (++) (replicate (length xs - 1) "" ++ ["and "]) xs quote tvar = "'" ++ tvar ++ "'"+++infiniteTypeAliases :: [Declaration t v] -> [Doc]+infiniteTypeAliases decls =+ [ report decl | decl@(TypeAlias name _ tipe) <- decls, isInfinite name tipe ]+ where+ isInfinite name tipe =+ let infinite = isInfinite name in+ case tipe of+ T.Lambda a b -> infinite a || infinite b+ T.Var _ -> False+ T.Data name' ts -> name == name' || any infinite ts+ T.EmptyRecord -> False+ T.Record fields ext -> infinite ext || any (infinite . snd) fields++ report decl@(TypeAlias name args tipe) =+ P.vcat [ P.text $ eightyCharLines 0 msg1+ , indented decl+ , P.text $ eightyCharLines 0 msg2+ , indented (Datatype name args [(name,[tipe])])+ , P.text $ eightyCharLines 0 msg3 ++ "\n"+ ]+ where+ indented decl = P.text "\n " <> pretty decl <> P.text "\n"++ msg1 = "Type alias '" ++ name ++ "' is an infinite type. " +++ "Notice that it appears in its own definition, so when \+ \you expand it, it just keeps getting bigger:"+ msg2 = "Try this instead:"+ msg3 = "It looks very similar, but an algebraic data type (ADT) \+ \actually creates a new type. Unlike with a type alias, this \+ \freshly created type is meaningful on its own, so an ADT \+ \does not need to be expanded."
compiler/Transform/Optimize.hs view
@@ -1,6 +1,10 @@ module Transform.Optimize (optimize) where -import SourceSyntax.Everything+import SourceSyntax.Declaration (Declaration(..))+import SourceSyntax.Expression+import SourceSyntax.Literal+import SourceSyntax.Location+import SourceSyntax.Module import Control.Arrow (second, (***)) import Data.Char (isAlpha)
+ compiler/Transform/SafeNames.hs view
@@ -0,0 +1,78 @@+{-# OPTIONS_GHC -Wall #-}+module Transform.SafeNames (metadataModule) where++import Control.Arrow (first, (***))+import SourceSyntax.Expression+import SourceSyntax.Location+import SourceSyntax.Module+import SourceSyntax.Pattern+import qualified Data.Set as Set+import qualified Parse.Helpers as PHelp++var :: String -> String+var = dereserve . deprime+ where+ deprime = map (\c -> if c == '\'' then '$' else c)+ dereserve x = case Set.member x PHelp.jsReserveds of+ False -> x+ True -> "$" ++ x++pattern :: Pattern -> Pattern+pattern pat =+ case pat of+ PVar x -> PVar (var x)+ PLiteral _ -> pat+ PRecord fs -> PRecord (map var fs)+ PAnything -> pat+ PAlias x p -> PAlias (var x) (pattern p)+ PData name ps -> PData name (map pattern ps)++expression :: LExpr t v -> LExpr t v+expression (L loc expr) =+ let f = expression in+ L loc $+ case expr of+ Literal _ -> expr+ Var x -> Var (var x)+ Range e1 e2 -> Range (f e1) (f e2)+ ExplicitList es -> ExplicitList (map f es)+ Binop op e1 e2 -> Binop op (f e1) (f e2)+ Lambda p e -> Lambda (pattern p) (f e)+ App e1 e2 -> App (f e1) (f e2)+ MultiIf ps -> MultiIf (map (f *** f) ps)+ Let defs body -> Let (map definition defs) (f body)+ Case e cases -> Case (f e) $ map (pattern *** f) cases+ Data name es -> Data name (map f es)+ Access e x -> Access (f e) (var x)+ Remove e x -> Remove (f e) (var x)+ Insert e x v -> Insert (f e) (var x) (f v)+ Modify r fs -> Modify (f r) (map (var *** f) fs)+ Record fs -> Record (map (var *** f) fs)+ Markdown uid md es -> Markdown uid md (map f es)++definition :: Def t v -> Def t v+definition def =+ case def of+ Def p e -> Def (pattern p) (expression e)+ TypeAnnotation name t -> TypeAnnotation (var name) t++metadataModule :: MetadataModule t v -> MetadataModule t v+metadataModule modul =+ modul+ { names = map var (names modul)+ , exports = map var (exports modul)+ , imports = map (first var) (imports modul)+ , program = expression (program modul)+ , aliases =+ let makeSafe (name, tvars, tipe) = (var name, tvars, tipe)+ in map makeSafe (aliases modul)+ , datatypes =+ let makeSafe (name,tvars,ctors) = (var name, tvars, map (first var) ctors)+ in map makeSafe (datatypes modul)+ , foreignImports =+ let makeSafe (js,expr,elm,tipe) = (js, expression expr, var elm, tipe)+ in map makeSafe (foreignImports modul)+ , foreignExports =+ let makeSafe (js,elm,tipe) = (js, var elm, tipe)+ in map makeSafe (foreignExports modul)+ }
compiler/Transform/SortDefinitions.hs view
@@ -6,7 +6,9 @@ import qualified Data.Set as Set import qualified Data.Map as Map import qualified SourceSyntax.Type as ST-import SourceSyntax.Everything+import SourceSyntax.Expression+import SourceSyntax.Location+import SourceSyntax.Pattern import qualified Data.Graph as Graph import qualified Data.Map as Map import qualified Data.Maybe as Maybe@@ -97,7 +99,7 @@ Record fields -> Record `liftM` mapM reorderField fields - Markdown md es -> Markdown md <$> mapM reorder es+ Markdown uid md es -> Markdown uid md <$> mapM reorder es -- Actually do some reordering Let defs body ->@@ -120,15 +122,20 @@ mapM free (ctors pattern) let addDefs ds bod = L s (Let (concatMap toDefs ds) bod)- where- toDefs (pattern, expr, Nothing) = [ Def pattern expr ]- toDefs (PVar name, expr, Just tipe) =- [ TypeAnnotation name tipe, Def (PVar name) expr ]- L _ let' = foldr addDefs body' defss return let' + where+ toDefs def =+ case def of+ (pattern, expr, Nothing) -> [ Def pattern expr ]+ (PVar name, expr, Just tipe) ->+ [ TypeAnnotation name tipe, Def (PVar name) expr ]+ _ -> error $ unlines + [ "The impossible occurred."+ , "Please report an issue at <https://github.com/evancz/Elm/issues>."+ , "Be very descriptive because something quite weird probably happened." ] reorderField (label, expr) = (,) label `liftM` reorder expr
compiler/Transform/Substitute.hs view
@@ -40,4 +40,4 @@ Modify r fs -> Modify (f r) (map (second f) fs) Record fs -> Record (map (second f) fs) Literal _ -> expr- Markdown md es -> Markdown md (map f es)+ Markdown uid md es -> Markdown uid md (map f es)
compiler/Type/Alias.hs view
@@ -11,20 +11,23 @@ type Rules = ([(String,[String],Type)], Type -> Type) -rules interfaces metaModule = (collect interfaces metaModule, localizer metaModule)+rules interfaces moduleAliases moduleImports =+ (collect interfaces moduleAliases, localizer moduleImports) -collect interfaces metaModule = filter (not . isPrimitive) rawAliases- where- rawAliases = aliases metaModule ++ concatMap iAliases (Map.elems interfaces)+collect interfaces moduleAliases =+ filter (not . isPrimitive) rawAliases+ where+ rawAliases =+ moduleAliases ++ concatMap iAliases (Map.elems interfaces) - isPrimitive (_,_,tipe) =- case tipe of+ isPrimitive (_,_,tipe) =+ case tipe of Data _ [] -> True _ -> False -localizer metaModule = go+localizer moduleImports = go where- go tipe = + go tipe = case tipe of Var _ -> tipe EmptyRecord -> tipe@@ -32,7 +35,8 @@ Data name ts -> Data (localize name) (map go ts) Record fs ext -> Record (map (second go) fs) (go ext) - byMethod = foldr (\(n,m) d -> Map.insertWith (++) n [m] d) Map.empty (imports metaModule)+ byMethod = foldr (\(n,m) d -> Map.insertWith (++) n [m] d)+ Map.empty moduleImports separate name = case List.elemIndices '.' name of
compiler/Type/Constrain/Declaration.hs view
@@ -9,7 +9,9 @@ import qualified Type.Environment as Env import SourceSyntax.Declaration-import qualified SourceSyntax.Everything as Src+import qualified SourceSyntax.Expression as Src+import qualified SourceSyntax.Location as L+import qualified SourceSyntax.Pattern as P import qualified SourceSyntax.Type as Type toExpr :: [Declaration t v] -> [Src.Def t v]@@ -25,34 +27,34 @@ toDefs (ctor, tipes) = let vars = take (length tipes) arguments tbody = Type.Data name $ map Type.Var tvars- body = Src.none . Src.Data ctor $ map (Src.none . Src.Var) vars+ body = L.none . Src.Data ctor $ map (L.none . Src.Var) vars in [ Src.TypeAnnotation ctor $ foldr Type.Lambda tbody tipes- , Src.Def (Src.PVar ctor) $ buildFunction body vars+ , Src.Def (P.PVar ctor) $ buildFunction body vars ] TypeAlias name tvars tipe@(Type.Record fields ext) -> [ Src.TypeAnnotation name $ foldr Type.Lambda tipe args- , Src.Def (Src.PVar name) $ buildFunction record vars ]+ , Src.Def (P.PVar name) $ buildFunction record vars ] where args = case ext of Type.EmptyRecord -> map snd fields _ -> map snd fields ++ [ext] - var = Src.none . Src.Var+ var = L.none . Src.Var vars = take (length args) arguments efields = zip (map fst fields) (map var vars) record = case ext of- Type.EmptyRecord -> Src.none $ Src.Record efields- _ -> foldl (\r (f,v) -> Src.none $ Src.Insert r f v) (var $ last vars) efields+ Type.EmptyRecord -> L.none $ Src.Record efields+ _ -> foldl (\r (f,v) -> L.none $ Src.Insert r f v) (var $ last vars) efields -- Type aliases must be added to an extended equality dictionary, -- but they do not require any basic constraints. TypeAlias _ _ _ -> [] - ImportEvent _ expr@(Src.L s _) name tipe ->+ ImportEvent _ expr@(L.L s _) name tipe -> [ Src.TypeAnnotation name tipe- , Src.Def (Src.PVar name) (Src.L s $ Src.App (Src.L s $ Src.Var "constant") expr) ]+ , Src.Def (P.PVar name) (L.L s $ Src.App (L.L s $ Src.Var "constant") expr) ] ExportEvent _ name tipe -> [ Src.TypeAnnotation name tipe ]@@ -64,5 +66,5 @@ arguments :: [String] arguments = map (:[]) ['a'..'z'] ++ map (\n -> "_" ++ show n) [1..] -buildFunction body@(Src.L s _) vars =- foldr (\p e -> Src.L s (Src.Lambda p e)) body (map Src.PVar vars)+buildFunction body@(L.L s _) vars =+ foldr (\p e -> L.L s (Src.Lambda p e)) body (map P.PVar vars)
compiler/Type/Constrain/Expression.hs view
@@ -134,7 +134,7 @@ recordType = record fields' (TermN EmptyRecord1) return . ex vars . and $ tipe === recordType : cs - Markdown _ es ->+ Markdown _ _ es -> do vars <- forM es $ \_ -> liftIO (var Flexible) let tvars = map VarN vars cs <- zipWithM (constrain env) es tvars
compiler/Type/ExtraChecks.hs view
@@ -1,27 +1,25 @@ -- This module contains checks to be run *after* type inference has -- completed successfully. At that point we still need to do occurs -- checks and ensure that `main` has an acceptable type.-module Type.ExtraChecks (extraChecks) where+module Type.ExtraChecks (extraChecks, occursCheck) where import Control.Applicative ((<$>),(<*>))+import Control.Monad.State import qualified Data.Map as Map import qualified Data.UnionFind.IO as UF import Type.Type ( Variable, structure, Term1(..), toSrcType )-import Type.State (Env)+import qualified Type.State as TS import qualified Type.Alias as Alias import Text.PrettyPrint as P import SourceSyntax.PrettyPrint (pretty) import SourceSyntax.Type (Type)+import qualified SourceSyntax.Location as Location+import qualified SourceSyntax.Expression as Expr import qualified Data.Traversable as Traverse -extraChecks :: Alias.Rules -> Env -> IO (Either [P.Doc] (Map.Map String Type))-extraChecks rules env = do- eitherEnv <- occursCheck env- case eitherEnv of- Left errs -> return $ Left errs- Right env' ->- mainCheck rules <$> Traverse.traverse toSrcType env'- +extraChecks :: Alias.Rules -> TS.Env -> IO (Either [P.Doc] (Map.Map String Type))+extraChecks rules env =+ mainCheck rules <$> Traverse.traverse toSrcType env mainCheck :: Alias.Rules -> (Map.Map String Type) -> Either [P.Doc] (Map.Map String Type) mainCheck rules env =@@ -39,35 +37,37 @@ , P.text " " ] ] -occursCheck :: Env -> IO (Either [P.Doc] Env)-occursCheck env = do- errors <- concat <$> mapM isFinite (Map.toList env)- return $ if null errors then Right env else Left errors--isFinite :: (String, Variable) -> IO [P.Doc]-isFinite (name, var) =- do varIsFinite <- go [] var- return $- case varIsFinite of- True -> []- False -> [ P.vcat [ P.text "Type Error:"- , P.text $ "Cannot construct infinite type for '" ++ name ++ "'\n"- ]- ]+occursCheck :: (String, Variable) -> StateT TS.SolverState IO ()+occursCheck (name, variable) =+ do vars <- liftIO $ infiniteVars [] variable+ case vars of+ [] -> return ()+ var:_ -> do+ desc <- liftIO $ UF.descriptor var+ case structure desc of+ Nothing ->+ modify $ \state -> state { TS.sErrors = fallback : TS.sErrors state }+ Just struct ->+ do liftIO $ UF.setDescriptor var (desc { structure = Nothing })+ var' <- liftIO $ UF.fresh desc+ TS.addError (Location.NoSpan name) (Just msg) var var' where- go :: [Variable] -> Variable -> IO Bool- go seen var =- let check = go (var:seen) in- case var `elem` seen of- True -> return False- False -> do- desc <- UF.descriptor var- case structure desc of- Nothing -> return True- Just struct ->- case struct of- App1 a b -> (&&) <$> check a <*> check b- Fun1 a b -> (&&) <$> check a <*> check b- Var1 a -> check a- EmptyRecord1 -> return True- Record1 fields ext -> and <$> mapM check (ext : concat (Map.elems fields))+ msg = "Infinite types are not allowed"+ fallback _ = return $ P.text msg++ infiniteVars :: [Variable] -> Variable -> IO [Variable]+ infiniteVars seen var =+ let go = infiniteVars (var:seen) in+ if var `elem` seen+ then return [var]+ else do+ desc <- UF.descriptor var+ case structure desc of+ Nothing -> return []+ Just struct ->+ case struct of+ App1 a b -> (++) <$> go a <*> go b+ Fun1 a b -> (++) <$> go a <*> go b+ Var1 a -> go a+ EmptyRecord1 -> return []+ Record1 fields ext -> concat <$> mapM go (ext : concat (Map.elems fields))
compiler/Type/Inference.hs view
@@ -52,7 +52,7 @@ Left err -> return $ Left err Right (header, constraint) -> do state <- execStateT (Solve.solve constraint) TS.initialState- let rules = Alias.rules interfaces modul+ let rules = Alias.rules interfaces (aliases modul) (imports modul) case TS.sErrors state of errors@(_:_) -> Left `fmap` sequence (map ($ rules) (reverse errors)) [] -> extraChecks rules (Map.difference (TS.sSavedEnv state) header)
compiler/Type/Solve.hs view
@@ -9,6 +9,7 @@ import qualified Data.List as List import Type.Type import Type.Unify+import qualified Type.ExtraChecks as EC import qualified Type.Environment as Env import qualified Type.State as TS import qualified Text.PrettyPrint as P@@ -118,9 +119,10 @@ CLet schemes constraint' -> do oldEnv <- TS.getEnv- headers <- mapM (solveScheme span) schemes- TS.modifyEnv $ \env -> Map.unions (headers ++ [env])+ headers <- Map.unions `fmap` mapM (solveScheme span) schemes+ TS.modifyEnv $ \env -> Map.union headers env solve constraint'+ mapM EC.occursCheck $ Map.toList headers TS.modifyEnv (\_ -> oldEnv) CInstance name term -> do@@ -171,11 +173,13 @@ let check var = do desc <- liftIO $ UF.descriptor var case structure desc of- Just _ ->- TS.addError span "Cannot generalize something that is not a type variable" var var+ Just _ -> TS.addError span (Just msg) var var+ where msg = "Cannot generalize something that is not a type variable."+ Nothing -> do if mark desc == seen- then TS.addError span "Duplicate variable during generalization" var var+ then let msg = "Duplicate variable during generalization."+ in TS.addError span (Just msg) var var else return () liftIO $ UF.setDescriptor var (desc { mark = seen }) mapM_ check vars@@ -186,4 +190,5 @@ desc <- liftIO $ UF.descriptor var if rank desc == noRank then return ()- else TS.addError span "Cannot generalize. Variable must have not have a rank." var var+ else let msg = "Unable to generalize a type variable. It is not unranked."+ in TS.addError span (Just msg) var var
compiler/Type/State.hs view
@@ -48,7 +48,7 @@ modifyEnv f = modify $ \state -> state { sEnv = f (sEnv state) } modifyPool f = modify $ \state -> state { sPool = f (sPool state) } -addError span message t1 t2 =+addError span hint t1 t2 = modify $ \state -> state { sErrors = makeError : sErrors state } where makeError rules = do@@ -57,10 +57,10 @@ t2' <- prettiest <$> toSrcType t2 return . P.vcat $ [ P.text $ "Type error" ++ location ++ ":"- , P.vcat . map P.text . lines $ if null message then defaultMessage else message- , P.text src+ , maybe P.empty P.text hint+ , display $ case span of { NoSpan msg -> msg ; Span _ _ msg -> msg } , P.text " Expected Type:" <+> t1'- , P.text " Actual Type:" <+> t2' <> P.text "\n"+ , P.text " Actual Type:" <+> t2' ] location = case span of@@ -69,14 +69,9 @@ if line p1 == line p2 then " on line " ++ show (line p1) else " between lines " ++ show (line p1) ++ " and " ++ show (line p2) - display msg = if null msg then "\n"- else "\n" ++ unlines (map (" "++) $ lines msg)-- src = case span of- NoSpan msg -> display msg- Span _ _ msg -> display msg-- defaultMessage = "Something weird is happening with this value:"+ display msg =+ P.vcat [ P.text $ concatMap ("\n "++) (lines msg)+ , P.text " " ] switchToPool pool = modifyPool (\_ -> pool)
compiler/Type/Type.hs view
@@ -370,12 +370,10 @@ case name desc of Just x@(c:cs) | Char.isLower c -> return (Src.Var x) | otherwise -> return (Src.Data x [])- Nothing ->- error $ concat+ _ -> error $ concat [ "Problem converting the following type " , "from a type-checker type to a source-syntax type:" , P.render (pretty Never variable) ]- data AppStructure = List Variable | Tuple [Variable] | Other
compiler/Type/Unify.hs view
@@ -3,6 +3,7 @@ import Type.Type import qualified Data.UnionFind.IO as UF import qualified Data.Map as Map+import qualified Data.Maybe as Maybe import qualified Type.State as TS import Control.Arrow (first,second) import Control.Monad.State@@ -78,25 +79,26 @@ unifyNumber svar name | name `elem` ["Int","Float","number"] = flexAndUnify svar- | otherwise = TS.addError span "Expecting a number (Int or Float)" variable1 variable2+ | otherwise = TS.addError span (Just hint) variable1 variable2+ where hint = "A number must be an Int or Float." - comparableError str = TS.addError span (str ++ msg) variable1 variable2- where msg = "Expecting something comparable such as an\n" ++- "Int, Float, Char, String, or a list or tuple of comparables."+ comparableError maybe =+ TS.addError span (Just $ Maybe.fromMaybe msg maybe) variable1 variable2+ where msg = "A comparable must be an Int, Float, Char, String, list, or tuple." unifyComparable var name | name `elem` ["Int","Float","Char","String","comparable"] = flexAndUnify var- | otherwise = comparableError ""+ | otherwise = comparableError Nothing unifyComparableStructure varSuper varFlex = do struct <- liftIO $ collectApps varFlex case struct of- Other -> comparableError ""+ Other -> comparableError Nothing List v -> do flexAndUnify varSuper unify' v =<< liftIO (var $ Is Comparable) Tuple vs | length vs > 6 ->- comparableError "Cannot compare a tuple with more than 6 elements.\n"+ comparableError $ Just "Cannot compare a tuple with more than 6 elements." | otherwise -> do flexAndUnify varSuper cmpVars <- liftIO $ forM [1..length vs] $ \_ -> var (Is Comparable)@@ -106,13 +108,14 @@ do struct <- liftIO $ collectApps varFlex case struct of List _ -> flexAndUnify varSuper- _ -> comparableError ""+ _ -> comparableError Nothing - rigidError variable = TS.addError span msg variable1 variable2+ rigidError variable = TS.addError span (Just hint) variable1 variable2 where- msg = concat- [ "Cannot unify rigid type variable '", render (pretty Never variable), "'.\n"- , "It is likely that a type annotation is not general enough." ]+ var = "'" ++ render (pretty Never variable) ++ "'"+ hint = "Cannot unify rigid type variable " ++ var +++ ".\nThe problem probably relates to a type annotation. Note that rigid type\n\+ \variables are not shared between a top-level and let-bound type annotations." superUnify = case (flex desc1, flex desc2, name desc1, name desc2) of@@ -138,7 +141,7 @@ (Rigid, _, _, _) -> rigidError variable1 (_, Rigid, _, _) -> rigidError variable2- _ -> TS.addError span "" variable1 variable2+ _ -> TS.addError span Nothing variable1 variable2 case (structure desc1, structure desc2) of (Nothing, Nothing) | flex desc1 == Flexible && flex desc1 == Flexible -> merge@@ -193,5 +196,5 @@ eat (x:xs) (y:ys) = eat xs ys eat xs ys = xs - _ -> TS.addError span "" variable1 variable2+ _ -> TS.addError span Nothing variable1 variable2
data/docs.json view
@@ -1,253 +1,5 @@ [ {- "name": "Automaton",- "document": "This library is a way to package up dynamic behavior. It makes it easier to\ndynamically create dynamic components. See the [original release\nnotes](http://elm-lang.org/blog/announce/0.5.0.elm) on this library to get a feel for how\nit can be used.\n\n# Create\n@docs pure, state, hiddenState\n\n# Evaluate\n@docs run, step\n\n# Combine\n@docs (\u003e\u003e\u003e), (\u003c\u003c\u003c), combine\n\n# Common Automatons\n@docs count, average",- "aliases": [],- "datatypes": [],- "values": [- {- "name": "\u003c\u003c\u003c",- "comment": "Compose two automatons, chaining them together.",- "raw": "(\u003c\u003c\u003c) : Automaton b c -\u003e Automaton a b -\u003e Automaton a c",- "type": [- "-\u003e",- [- "Automaton",- "b",- "c"- ],- [- "-\u003e",- [- "Automaton",- "a",- "b"- ],- [- "Automaton",- "a",- "c"- ]- ]- ],- "associativity": "left",- "precedence": 9- },- {- "name": "\u003e\u003e\u003e",- "comment": "Compose two automatons, chaining them together.",- "raw": "(\u003e\u003e\u003e) : Automaton a b -\u003e Automaton b c -\u003e Automaton a c",- "type": [- "-\u003e",- [- "Automaton",- "a",- "b"- ],- [- "-\u003e",- [- "Automaton",- "b",- "c"- ],- [- "Automaton",- "a",- "c"- ]- ]- ],- "associativity": "left",- "precedence": 9- },- {- "name": "average",- "comment": "Computes the running average of the last `n` inputs.",- "raw": "average : Int -\u003e Automaton Float Float",- "type": [- "-\u003e",- [- "Int"- ],- [- "Automaton",- [- "Float"- ],- [- "Float"- ]- ]- ]- },- {- "name": "combine",- "comment": "Combine a list of automatons into a single automaton that produces a\nlist.",- "raw": "combine : [Automaton a b] -\u003e Automaton a [b]",- "type": [- "-\u003e",- [- "_List",- [- "Automaton",- "a",- "b"- ]- ],- [- "Automaton",- "a",- [- "_List",- "b"- ]- ]- ]- },- {- "name": "count",- "comment": "Count the number of steps taken.",- "raw": "count : Automaton a Int",- "type": [- "Automaton",- "a",- [- "Int"- ]- ]- },- {- "name": "hiddenState",- "comment": "Create an automaton with hidden state. Requires an initial state and a\nstep function to step the state forward and produce an output.",- "raw": "hiddenState : s -\u003e (a -\u003e s -\u003e (s,b)) -\u003e Automaton a b",- "type": [- "-\u003e",- "s",- [- "-\u003e",- [- "-\u003e",- "a",- [- "-\u003e",- "s",- [- "_Tuple2",- "s",- "b"- ]- ]- ],- [- "Automaton",- "a",- "b"- ]- ]- ]- },- {- "name": "pure",- "comment": "Create an automaton with no memory. It just applies the given function to\nevery input.",- "raw": "pure : (a -\u003e b) -\u003e Automaton a b",- "type": [- "-\u003e",- [- "-\u003e",- "a",- "b"- ],- [- "Automaton",- "a",- "b"- ]- ]- },- {- "name": "run",- "comment": "Run an automaton on a given signal. The automaton steps forward whenever the\ninput signal updates.",- "raw": "run : Automaton a b -\u003e b -\u003e Signal a -\u003e Signal b",- "type": [- "-\u003e",- [- "Automaton",- "a",- "b"- ],- [- "-\u003e",- "b",- [- "-\u003e",- [- "Signal",- "a"- ],- [- "Signal",- "b"- ]- ]- ]- ]- },- {- "name": "state",- "comment": "Create an automaton with state. Requires an initial state and a step\nfunction to step the state forward. For example, an automaton that counted\nhow many steps it has taken would look like this:\n\n count = Automaton a Int\n count = state 0 (\\\\_ c -\u003e c+1)\n\nIt is a stateful automaton. The initial state is zero, and the step function\nincrements the state on every step.",- "raw": "state : b -\u003e (a -\u003e b -\u003e b) -\u003e Automaton a b",- "type": [- "-\u003e",- "b",- [- "-\u003e",- [- "-\u003e",- "a",- [- "-\u003e",- "b",- "b"- ]- ],- [- "Automaton",- "a",- "b"- ]- ]- ]- },- {- "name": "step",- "comment": "Step an automaton forward once with a given input.",- "raw": "step : a -\u003e Automaton a b -\u003e (Automaton a b, b)",- "type": [- "-\u003e",- "a",- [- "-\u003e",- [- "Automaton",- "a",- "b"- ],- [- "_Tuple2",- [- "Automaton",- "a",- "b"- ],- "b"- ]- ]- ]- }- ]-},-{ "name": "Basics", "document": "Tons of useful functions that get imported by default.\n\nThe following libraries also get imported by default: List, Signal,\nText, Maybe, Time, Graphics.Element, Color, Graphics.Collage.\n\n# Equality\n@docs (==), (/=)\n\n# Comparison\n\nThese functions only work on `comparable` types. This includes numbers,\ncharacters, strings, lists of comparable things, and tuples of comparable\nthings. Note that tuples with 7 or more elements are not comparable; why\nare your tuples so big?\n\n@docs (\u003c), (\u003e), (\u003c=), (\u003e=), max, min, Order, compare\n\n# Booleans\n@docs not, (&&), (||), xor, otherwise\n\n# Mathematics\n@docs (+), (-), (*), (/), (^), div, rem, mod, abs, sqrt, clamp, logBase, e\n\n# Trigonometry\n@docs pi, cos, sin, tan, acos, asin, atan, atan2\n\n# Number Conversions\n@docs round, floor, ceiling, truncate, toFloat\n\n# Angle Conversions\nAll angle conversions result in “standard Elm angles”\nwhich happen to be radians.\n\n@docs degrees, radians, turns\n\n# Polar Coordinates\n@docs toPolar, fromPolar\n\n# Tuples\n@docs fst, snd\n\n# Higher-Order Helpers\n@docs id, (\u003c|), (|\u003e), (.), flip, curry, uncurry", "aliases": [],@@ -282,7 +34,7 @@ "values": [ { "name": "&&",- "comment": "The and operator. True if both inputs are True.",+ "comment": "The and operator. True if both inputs are True.\nThis operator short-circuits if the first argument is False.", "raw": "(&&) : Bool -\u003e Bool -\u003e Bool", "type": [ "-\u003e",@@ -1104,7 +856,7 @@ }, { "name": "uncurry",- "comment": "Change how arguments are passed to a function.\nThis combines two arguments into a sigle pair.",+ "comment": "Change how arguments are passed to a function.\nThis combines two arguments into a single pair.", "raw": "uncurry : (a -\u003e b -\u003e c) -\u003e (a,b) -\u003e c", "type": [ "-\u003e",@@ -1170,7 +922,7 @@ }, { "name": "||",- "comment": "The or operator. True if one or both inputs are True.",+ "comment": "The or operator. True if one or both inputs are True.\nThis operator short-circuits if the first argument is True.", "raw": "(||) : Bool -\u003e Bool -\u003e Bool", "type": [ "-\u003e",@@ -1193,6 +945,148 @@ ] }, {+ "name": "Bitwise",+ "document": "Library for [bitwise operations](http://en.wikipedia.org/wiki/Bitwise_operation).\n\n# Basic Operations\n\n@docs and, or, xor, complement\n\n# Bit Shifts\n\n@docs shiftLeft, shiftRight, shiftRightLogical",+ "aliases": [],+ "datatypes": [],+ "values": [+ {+ "name": "and",+ "comment": "Bitwise AND",+ "raw": "and : Int -\u003e Int -\u003e Int",+ "type": [+ "-\u003e",+ [+ "Int"+ ],+ [+ "-\u003e",+ [+ "Int"+ ],+ [+ "Int"+ ]+ ]+ ]+ },+ {+ "name": "complement",+ "comment": "Flip each bit individually, often called bitwise NOT",+ "raw": "complement : Int -\u003e Int",+ "type": [+ "-\u003e",+ [+ "Int"+ ],+ [+ "Int"+ ]+ ]+ },+ {+ "name": "or",+ "comment": "Bitwise OR",+ "raw": "or : Int -\u003e Int -\u003e Int",+ "type": [+ "-\u003e",+ [+ "Int"+ ],+ [+ "-\u003e",+ [+ "Int"+ ],+ [+ "Int"+ ]+ ]+ ]+ },+ {+ "name": "shiftLeft",+ "comment": "Shift bits to the left by a given offset, filling new bits with zeros.\nThis can be used to multiply numbers by powers of two.\n\n 8 `shiftLeft` 1 == 16\n 8 `shiftLeft` 2 == 32",+ "raw": "shiftLeft : Int -\u003e Int -\u003e Int",+ "type": [+ "-\u003e",+ [+ "Int"+ ],+ [+ "-\u003e",+ [+ "Int"+ ],+ [+ "Int"+ ]+ ]+ ]+ },+ {+ "name": "shiftRight",+ "comment": "Shift bits to the right by a given offset, filling new bits with\nwhatever is the topmost bit. This can be used to divide numbers by powers of two.\n\n 32 `shiftRight` 1 == 16\n 32 `shiftRight` 2 == 8\n -32 `shiftRight` 1 == -16\n\nThis is called an [arithmatic right\nshift](http://en.wikipedia.org/wiki/Bitwise_operation#Arithmetic_shift),\noften written (\u003e\u003e), and sometimes called a sign-propagating\nright shift because it fills empty spots with copies of the highest bit.",+ "raw": "shiftRight : Int -\u003e Int -\u003e Int",+ "type": [+ "-\u003e",+ [+ "Int"+ ],+ [+ "-\u003e",+ [+ "Int"+ ],+ [+ "Int"+ ]+ ]+ ]+ },+ {+ "name": "shiftRightLogical",+ "comment": "Shift bits to the right by a given offset, filling new bits with\nzeros.\n\n 32 `shiftRightLogical` 1 == 16\n 32 `shiftRightLogical` 2 == 8\n -32 `shiftRightLogical` 1 == 2147483632\n\nThis is called an [logical right\nshift](http://en.wikipedia.org/wiki/Bitwise_operation#Logical_shift), often written (\u003e\u003e\u003e),\nand sometimes called a zero-fill right shift because it fills empty spots\nwith zeros.",+ "raw": "shiftRightLogical : Int -\u003e Int -\u003e Int",+ "type": [+ "-\u003e",+ [+ "Int"+ ],+ [+ "-\u003e",+ [+ "Int"+ ],+ [+ "Int"+ ]+ ]+ ]+ },+ {+ "name": "xor",+ "comment": "Bitwise XOR",+ "raw": "xor : Int -\u003e Int -\u003e Int",+ "type": [+ "-\u003e",+ [+ "Int"+ ],+ [+ "-\u003e",+ [+ "Int"+ ],+ [+ "Int"+ ]+ ]+ ]+ }+ ]+},+{ "name": "Char", "document": "Functions for working with characters. Character literals are enclosed in\n`'a'` pair of single quotes.\n\n# Classification\n@docs isUpper, isLower, isDigit, isOctDigit, isHexDigit\n\n# Conversion\n@docs toUpper, toLower, toLocaleUpper, toLocaleLower, toCode, fromCode", "aliases": [@@ -2305,7 +2199,7 @@ }, { "name": "Dict",- "document": "A dictionary mapping unique keys to values. The keys can be any comparable\ntype. This includes `Int`, `Float`, `Time`, `Char`, `String`, and tuples or\nlists of comparable types.\n\nInsert, remove, and query operations all take *O(log n)* time.\n\n# Build\n@docs empty, singleton, insert, remove\n\n# Query\n@docs member, lookup, findWithDefault\n\n# Combine\n@docs union, intersect, diff\n\n# Lists\n@docs keys, values, toList, fromList\n\n# Transform\n@docs map, foldl, foldr",+ "document": "A dictionary mapping unique keys to values. The keys can be any comparable\ntype. This includes `Int`, `Float`, `Time`, `Char`, `String`, and tuples or\nlists of comparable types.\n\nInsert, remove, and query operations all take *O(log n)* time.\n\n# Build\n@docs empty, singleton, insert, update, remove\n\n# Query\n@docs member, lookup, findWithDefault\n\n# Combine\n@docs union, intersect, diff\n\n# Lists\n@docs keys, values, toList, fromList\n\n# Transform\n@docs map, foldl, foldr", "aliases": [], "datatypes": [], "values": [@@ -2680,6 +2574,42 @@ ] }, {+ "name": "update",+ "comment": "Update the value of a dictionary for a specific key with a given function.",+ "raw": "update : comparable -\u003e (Maybe v -\u003e Maybe v) -\u003e Dict comparable v -\u003e Dict comparable v",+ "type": [+ "-\u003e",+ "comparable",+ [+ "-\u003e",+ [+ "-\u003e",+ [+ "Maybe",+ "v"+ ],+ [+ "Maybe",+ "v"+ ]+ ],+ [+ "-\u003e",+ [+ "Dict",+ "comparable",+ "v"+ ],+ [+ "Dict",+ "comparable",+ "v"+ ]+ ]+ ]+ ]+ },+ { "name": "values", "comment": "Get all of the values in a dictionary.", "raw": "values : Dict comparable v -\u003e [v]",@@ -3090,7 +3020,7 @@ }, { "name": "JavaScript",- "document": "This library does basic conversions between Elm and JS values. This allows\nthe internal data structures of Elm to change and improve with no impact on JS\nintegration.\n\n# Javascript to Elm\n@docs toString, toInt, toFloat, toBool, toList\n\n# JavaScript from Elm\n@docs fromString, fromInt, fromFloat, fromBool, fromList",+ "document": "This library does basic conversions between Elm and JS values. This allows\nthe internal data structures of Elm to change and improve with no impact on JS\nintegration.\n\nIt is intended to be imported as `import JavaScript as JS`. That way functions\nlike `JS.toInt` convert JavaScript *to* Elm integers and functions like\n`JS.fromString` gets JavaScript *from* Elm strings.\n\n# Javascript to Elm\n@docs toString, toInt, toFloat, toBool, toList\n\n# JavaScript from Elm\n@docs fromString, fromInt, fromFloat, fromBool, fromList", "aliases": [], "datatypes": [ {@@ -3334,7 +3264,7 @@ }, { "name": "Json",- "document": "Library for working with [JSON](https://en.wikipedia.org/wiki/JSON) values.\n\n# Strings\n@docs fromString, toString\n\n# JS Strings\n@docs fromJSString, toJSString\n\n# JS Objects\n@docs fromJSObject, toJSObject",+ "document": "Library for working with [JSON](https://en.wikipedia.org/wiki/JSON) values.\n\n# Json Values\n@docs JsonValue\n\n# Strings\n@docs fromString, toString\n\n# JS Strings\n@docs fromJSString, toJSString\n\n# JS Objects\n@docs fromJSObject, toJSObject", "aliases": [], "datatypes": [ {@@ -3704,7 +3634,7 @@ }, { "name": "List",- "document": "A library for manipulating lists of values. Every value in a\nlist must have the same type.\n\n# Basics\n@docs (::), (++), isEmpty, length, reverse, map\n\n# Sub-lists\n@docs head, tail, last, filter, take, drop\n\n# Putting Lists Together\n@docs concat, concatMap, join, intersperse, zip, zipWith\n\n# Taking Lists Apart\n@docs partition, unzip\n\n# Folds\n@docs foldr, foldl, foldr1, foldl1, scanl, scanl1\n\n# Special Folds\n@docs sum, product, maximum, minimum, all, any, and, or",+ "document": "A library for manipulating lists of values. Every value in a\nlist must have the same type.\n\n# Basics\n@docs (::), (++), isEmpty, length, reverse, map\n\n# Sub-lists\n@docs head, tail, last, filter, take, drop\n\n# Putting Lists Together\n@docs concat, concatMap, join, intersperse, zip, zipWith\n\n# Taking Lists Apart\n@docs partition, unzip\n\n# Folds\n@docs foldr, foldl, foldr1, foldl1, scanl, scanl1\n\n# Special Folds\n@docs sum, product, maximum, minimum, all, any, and, or\n\n# Sorting\n@docs sort, sortBy, sortWith", "aliases": [], "datatypes": [], "values": [@@ -4305,6 +4235,76 @@ ] }, {+ "name": "sort",+ "comment": "Sort values from lowest to highest: `sort [3,1,5] == [1,3,5]`",+ "raw": "sort : [comparable] -\u003e [comparable]",+ "type": [+ "-\u003e",+ [+ "_List",+ "comparable"+ ],+ [+ "_List",+ "comparable"+ ]+ ]+ },+ {+ "name": "sortBy",+ "comment": "Sort values by a derived property.\n\n```haskell\nalice = { name=\"Alice\", height=1.62 }\nbob = { name=\"Bob\" , height=1.85 }\nchuck = { name=\"Chuck\", height=1.76 }\n\nsortBy .name [chuck,alice,bob] == [alice,bob,chuck]\nsortBy .height [chuck,alice,bob] == [alice,chuck,bob]\n\nsortBy String.length [\"mouse\",\"cat\"] == [\"cat\",\"mouse\"]\n```",+ "raw": "sortBy : (a -\u003e comparable) -\u003e [a] -\u003e [a]",+ "type": [+ "-\u003e",+ [+ "-\u003e",+ "a",+ "comparable"+ ],+ [+ "-\u003e",+ [+ "_List",+ "a"+ ],+ [+ "_List",+ "a"+ ]+ ]+ ]+ },+ {+ "name": "sortWith",+ "comment": "Sort values with a custom comparison function.\n\n```haskell\nsortWith flippedComparison [1..5] == [5,4,3,2,1]\n\nflippedComparison a b =\n case compare a b of\n LT -\u003e GT\n EQ -\u003e EQ\n GT -\u003e LT\n```\n\nThis is also the most general sort function, allowing you\nto define any other: `sort == sortWith compare`",+ "raw": "sortWith : (a -\u003e a -\u003e Order) -\u003e [a] -\u003e [a]",+ "type": [+ "-\u003e",+ [+ "-\u003e",+ "a",+ [+ "-\u003e",+ "a",+ [+ "Order"+ ]+ ]+ ],+ [+ "-\u003e",+ [+ "_List",+ "a"+ ],+ [+ "_List",+ "a"+ ]+ ]+ ]+ },+ { "name": "sum", "comment": "Get the sum of the list elements. `(sum [1..4] == 10)`", "raw": "sum : [number] -\u003e number",@@ -4644,40 +4644,6 @@ "datatypes": [], "values": [ {- "name": "readFloat",- "comment": "",- "raw": "readFloat : String -\u003e Maybe Float",- "type": [- "-\u003e",- [- "String"- ],- [- "Maybe",- [- "Float"- ]- ]- ]- },- {- "name": "readInt",- "comment": "",- "raw": "readInt : String -\u003e Maybe Int",- "type": [- "-\u003e",- [- "String"- ],- [- "Maybe",- [- "Int"- ]- ]- ]- },- { "name": "show", "comment": "", "raw": "show : a -\u003e String",@@ -4771,6 +4737,292 @@ ] }, {+ "name": "Regex",+ "document": "A library for working with regular expressions. It uses [the\nsame kind of regular expressions accepted by JavaScript](https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions).\n\n# Create\n@docs pattern, caseInsensitive, escape\n\n# Match\n@docs Match\n\n# Find and Replace\n@docs contains, find, findAll, replace, replaceAll\n\n# Split\n@docs split, splitN",+ "aliases": [+ {+ "name": "Match",+ "comment": "A `Match` represents all of the details about a particular match in a string.\nHere are details on each field:\n\n * `match` — the full string of the match.\n * `submatches` — a pattern might have [subpatterns, surrounded by\n parentheses](https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions#Using_Parenthesized_Substring_Matches).\n If there are N subpatterns, there will be N elements in the `submatches` list.\n Each submatch in this list is a `Maybe` because not all subpatterns may trigger.\n For example, `(pattern \"(a+)|(b+)\")` will either match many `a`’s or\n many `b`’s, but never both.\n * `index` — the index of the match in the original string.\n * `number` — if you find many matches, you can think of each one\n as being labeled with a `number` starting at one. So the first time you\n find a match, that is match `number` one. Second time is match `number` two.\n This is useful when paired with `replaceAll` if replacement is dependent on how\n many times a pattern has appeared before.",+ "raw": "type Match = { match : String, submatches : [Maybe String], index : Int, number : Int }",+ "typeVariables": [],+ "type": {+ "submatches": [+ "_List",+ [+ "Maybe",+ [+ "String"+ ]+ ]+ ],+ "match": [+ "String"+ ],+ "index": [+ "Int"+ ],+ "number": [+ "Int"+ ]+ }+ }+ ],+ "datatypes": [+ {+ "name": "Regex",+ "comment": "",+ "raw": "data Regex = Regex",+ "typeVariables": [],+ "constructors": [+ {+ "name": "Regex",+ "type": [+ "Regex"+ ]+ }+ ]+ }+ ],+ "values": [+ {+ "name": "caseInsensitive",+ "comment": "Make a pattern case insensitive",+ "raw": "caseInsensitive : Regex -\u003e Regex",+ "type": [+ "-\u003e",+ [+ "Regex"+ ],+ [+ "Regex"+ ]+ ]+ },+ {+ "name": "contains",+ "comment": "Check to see if a Regex is contained in a string.\n\n```haskell\n contains (pattern \"123\") \"12345\" == True\n contains (pattern \"b+\") \"aabbcc\" == True\n\n contains (pattern \"789\") \"12345\" == False\n contains (pattern \"z+\") \"aabbcc\" == False\n```",+ "raw": "contains : Regex -\u003e String -\u003e Bool",+ "type": [+ "-\u003e",+ [+ "Regex"+ ],+ [+ "-\u003e",+ [+ "String"+ ],+ [+ "Bool"+ ]+ ]+ ]+ },+ {+ "name": "escape",+ "comment": "Escape all special characters. So `pattern (escape \"$$$\")`\nwill match exactly `\"$$$\"` even though `$` is a special character.",+ "raw": "escape : String -\u003e String",+ "type": [+ "-\u003e",+ [+ "String"+ ],+ [+ "String"+ ]+ ]+ },+ {+ "name": "find",+ "comment": "Same as `findAll`, but `find` will quit searching after the *n\u003csup\u003eth\u003c/sup\u003e* match.\nThat means the resulting list has maximum length N, but *it can be shorter*\nif there are not that many matches in the given string.",+ "raw": "find : Int -\u003e Regex -\u003e String -\u003e [Match]",+ "type": [+ "-\u003e",+ [+ "Int"+ ],+ [+ "-\u003e",+ [+ "Regex"+ ],+ [+ "-\u003e",+ [+ "String"+ ],+ [+ "_List",+ [+ "Match"+ ]+ ]+ ]+ ]+ ]+ },+ {+ "name": "findAll",+ "comment": "Find all of the matches in a string:\n\n```haskell\n words = findAll (pattern \"\\\\w+\") \"hello world\"\n\n map .match words == [\"hello\",\"world\"]\n map .index words == [0,6]\n\n places = findAll (pattern \"[oi]n a (\\\\w+)\") \"I am on a boat in a lake.\"\n\n map .match places== [\"on a boat\", \"in a lake\"]\n map .submatches places == [ [Just \"boat\"], [Just \"lake\"] ]\n```",+ "raw": "findAll : Regex -\u003e String -\u003e [Match]",+ "type": [+ "-\u003e",+ [+ "Regex"+ ],+ [+ "-\u003e",+ [+ "String"+ ],+ [+ "_List",+ [+ "Match"+ ]+ ]+ ]+ ]+ },+ {+ "name": "pattern",+ "comment": "Create a Regex that matches patterns [as specified in JavaScript](https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions#Writing_a_Regular_Expression_Pattern).\nBe careful to escape backslashes properly!",+ "raw": "pattern : String -\u003e Regex",+ "type": [+ "-\u003e",+ [+ "String"+ ],+ [+ "Regex"+ ]+ ]+ },+ {+ "name": "replace",+ "comment": "Same as `replaceAll`, but `replace` will quit after the *n\u003csup\u003eth\u003c/sup\u003e* match.",+ "raw": "replace : Int -\u003e Regex -\u003e (Match -\u003e String) -\u003e String -\u003e String",+ "type": [+ "-\u003e",+ [+ "Int"+ ],+ [+ "-\u003e",+ [+ "Regex"+ ],+ [+ "-\u003e",+ [+ "-\u003e",+ [+ "Match"+ ],+ [+ "String"+ ]+ ],+ [+ "-\u003e",+ [+ "String"+ ],+ [+ "String"+ ]+ ]+ ]+ ]+ ]+ },+ {+ "name": "replaceAll",+ "comment": "Replace all matches. The function from `Match` to `String` lets\nyou use the details of a specific match when making replacements.\n\n```haskell\n devowel = replaceAll (pattern \"[aeiou]\") (\\_ -\u003e \"\")\n\n devowel \"The quick brown fox\" == \"Th qck brwn fx\"\n\n reverseWords = replaceAll (pattern \"\\\\w+\") (\\{match} -\u003e String.reverse match)\n\n reverseWords \"deliver mined parts\" == \"reviled denim strap\"\n```",+ "raw": "replaceAll : Regex -\u003e (Match -\u003e String) -\u003e String -\u003e String",+ "type": [+ "-\u003e",+ [+ "Regex"+ ],+ [+ "-\u003e",+ [+ "-\u003e",+ [+ "Match"+ ],+ [+ "String"+ ]+ ],+ [+ "-\u003e",+ [+ "String"+ ],+ [+ "String"+ ]+ ]+ ]+ ]+ },+ {+ "name": "split",+ "comment": "Split a string, using the regex as the separator.\n\n```haskell\n split (pattern \" *, *\") \"a ,b, c,d\" == [\"a\",\"b\",\"c\",\"d\"]\n```",+ "raw": "split : Regex -\u003e String -\u003e [String]",+ "type": [+ "-\u003e",+ [+ "Regex"+ ],+ [+ "-\u003e",+ [+ "String"+ ],+ [+ "_List",+ [+ "String"+ ]+ ]+ ]+ ]+ },+ {+ "name": "splitN",+ "comment": "Same as `split` but stops after the *n\u003csup\u003eth\u003c/sup\u003e* match.\n\n```haskell\n splitN 1 (pattern \": *\") \"tom: 99,90,85\" == [\"tom\",\"99,90,85\"]\n```",+ "raw": "splitN : Int -\u003e Regex -\u003e String -\u003e [String]",+ "type": [+ "-\u003e",+ [+ "Int"+ ],+ [+ "-\u003e",+ [+ "Regex"+ ],+ [+ "-\u003e",+ [+ "String"+ ],+ [+ "_List",+ [+ "String"+ ]+ ]+ ]+ ]+ ]+ }+ ]+},+{ "name": "Set", "document": "A set of unique values. The values can be any comparable type. This\nincludes `Int`, `Float`, `Time`, `Char`, `String`, and tuples or lists\nof comparable types.\n\nInsert, remove, and query operations all take *O(log n)* time.\n\n# Build\n@docs empty, singleton, insert, remove\n\n# Query\n@docs member\n\n# Combine\n@docs union, intersect, diff\n\n# Lists\n@docs toList, fromList\n\n# Transform\n@docs map, foldl, foldr", "aliases": [],@@ -5044,7 +5296,7 @@ }, { "name": "Signal",- "document": "The library for general signal manipulation. Includes lift functions up to\n`lift8` and infix lift operators `\u003c~` and `~`, combinations, filters, and\npast-dependence.\n\nSignals are time-varying values. Lifted functions are reevaluated whenver any of\ntheir input signals has an event. Signal events may be of the same value as the\nprevious value of the signal. Such signals are useful for timing and\npast-dependence.\n\nSome useful functions for working with time (e.g. setting FPS) and combining\nsignals and time (e.g. delaying updates, getting timestamps) can be found in\nthe [`Time`](/docs/Signal/Time.elm) library.\n\n# Combine\n@docs constant, lift, lift2, merge, merges, combine\n\n# Past-Dependence\n@docs foldp, count, countIf\n\n#Filters\n@docs keepIf, dropIf, keepWhen, dropWhen, dropRepeats, sampleOn\n\n# Pretty Lift\n@docs (\u003c~), (~)\n\n# Do you even lift?\n@docs lift3, lift4, lift5, lift6, lift7, lift8",+ "document": "The library for general signal manipulation. Includes lift functions up to\n`lift8` and infix lift operators `\u003c~` and `~`, combinations, filters, and\npast-dependence.\n\nSignals are time-varying values. Lifted functions are reevaluated whenever any of\ntheir input signals has an event. Signal events may be of the same value as the\nprevious value of the signal. Such signals are useful for timing and\npast-dependence.\n\nSome useful functions for working with time (e.g. setting FPS) and combining\nsignals and time (e.g. delaying updates, getting timestamps) can be found in\nthe [`Time`](/docs/Signal/Time.elm) library.\n\n# Combine\n@docs constant, lift, lift2, merge, merges, combine\n\n# Past-Dependence\n@docs foldp, count, countIf\n\n#Filters\n@docs keepIf, dropIf, keepWhen, dropWhen, dropRepeats, sampleOn\n\n# Pretty Lift\n@docs (\u003c~), (~)\n\n# Do you even lift?\n@docs lift3, lift4, lift5, lift6, lift7, lift8", "aliases": [], "datatypes": [ {@@ -5129,7 +5381,7 @@ }, { "name": "count",- "comment": "Count the number of events that have occured.",+ "comment": "Count the number of events that have occurred.", "raw": "count : Signal a -\u003e Signal Int", "type": [ "-\u003e",@@ -5147,7 +5399,7 @@ }, { "name": "countIf",- "comment": "Count the number of events that have occured that satisfy a given predicate.",+ "comment": "Count the number of events that have occurred that satisfy a given predicate.", "raw": "countIf : (a -\u003e Bool) -\u003e Signal a -\u003e Signal Int", "type": [ "-\u003e",@@ -6219,17 +6471,17 @@ { "name": "fromList", "comment": "Convert a list of characters into a String. Can be useful if you\nwant to create a string primarly by consing, perhaps for decoding\nsomething.\n\n fromList ['a','b','c'] == \"abc\"",- "raw": "fromList : String -\u003e [Char]",+ "raw": "fromList : [Char] -\u003e String", "type": [ "-\u003e", [- "String"- ],- [ "_List", [ "Char" ]+ ],+ [+ "String" ] ] },@@ -6282,9 +6534,15 @@ { "name": "isEmpty", "comment": "Check if a string is empty `(isEmpty \"\" == True)`",- "raw": "isEmpty : String",+ "raw": "isEmpty : String -\u003e Bool", "type": [- "String"+ "-\u003e",+ [+ "String"+ ],+ [+ "Bool"+ ] ] }, {@@ -6753,7 +7011,7 @@ }, { "name": "Text",- "document": "Functions for displaying text\n\n# Creating Text\n@docs toText\n\n# Creating Elements\n@docs plainText, asText, text, centered, justified, righted\n\n# Formatting\n@docs color, typeface, height, link\n\n# Simple Formatting\n@docs monospace, header, bold, italic, underline, overline, strikeThrough",+ "document": "Functions for displaying text\n\n# Creating Text\n@docs toText\n\n# Creating Elements\n@docs plainText, asText, text, centered, justified, righted\n\n# Formatting\n@docs color, typeface, height, link\n\n# Simple Formatting\n@docs monospace, bold, italic, underline, overline, strikeThrough", "aliases": [], "datatypes": [ {@@ -6833,20 +7091,6 @@ ] }, {- "name": "header",- "comment": "Make text big and noticable.",- "raw": "header : Text -\u003e Text",- "type": [- "-\u003e",- [- "Text"- ],- [- "Text"- ]- ]- },- { "name": "height", "comment": "Set the height of text in pixels.", "raw": "height : Float -\u003e Text -\u003e Text",@@ -7353,7 +7597,7 @@ }, { "name": "Transform2D",- "document": "A library for performing [2D matrix transformations](http://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations).\nIt is used primarily with the `groupTransform` function from `Graphics.Collage` and\nallows you to do things like rotation, scaling, translation, shearing, and reflection.\n\n# Basic Transforms\n@docs identity, matrix, rotation\n\n# Multiplication\n@docs multiply",+ "document": "A library for performing [2D matrix transformations][affine].\nIt is used primarily with the `groupTransform` function from `Graphics.Collage` and\nallows you to do things like rotation, scaling, translation, shearing, and reflection.\n\nNote that all the matrices in this library are 3x3 matrices of homogeneous\ncoordinates, used for [affine transformations][affine]. Since the bottom row as\nalways `0 0 1` in these matrices, it is omitted in the diagrams below.\n\n [affine]: http://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations\n\n# Transforms\n@docs identity, matrix, rotation, translation, scale, scaleX, scaleY\n\n# Multiplication\n@docs multiply", "aliases": [], "datatypes": [ {@@ -7374,7 +7618,7 @@ "values": [ { "name": "identity",- "comment": "Create an identity transform. Transforming by the identity does\nnot change anything, but it can come in handy as a default or\nbase case.\n\n / 1 0 \\\n \\ 0 1 /",+ "comment": "Create an identity transform. Transforming by the identity does\nnot change anything, but it can come in handy as a default or\nbase case.\n\n / 1 0 0 \\\n \\ 0 1 0 /", "raw": "identity : Transform2D", "type": [ "Transform2D"@@ -7382,7 +7626,7 @@ }, { "name": "matrix",- "comment": "Creates a transformation matrix. This lets you create transforms\nsuch as scales, shears, reflections, and translations.\n\n matrix a b c d dx dy\n\n / a b \\\n \\ c d /\n\nAnd `dx` and `dy` are the translation values.",+ "comment": "Creates a transformation matrix. This lets you create transforms\nsuch as scales, shears, reflections, and translations.\n\n matrix a b c d x y\n\n / a b x \\\n \\ c d y /\n\nNote that `x` and `y` are the translation values.", "raw": "matrix : Float -\u003e Float -\u003e Float -\u003e Float -\u003e Float -\u003e Float -\u003e Transform2D", "type": [ "-\u003e",@@ -7426,7 +7670,7 @@ }, { "name": "multiply",- "comment": "Multiplies two transforms together:\n\n multiply a b\n\n / a11 a12 \\ . / b11 b12 \\\n \\ a21 a22 / \\ b21 b22 /",+ "comment": "Multiplies two transforms together:\n\n multiply m n\n\n / ma mb mx \\ / na nb nx \\\n | mc md my | . | nc nd ny |\n \\ 0 0 1 / \\ 0 0 1 /", "raw": "multiply : Transform2D -\u003e Transform2D -\u003e Transform2D", "type": [ "-\u003e",@@ -7446,7 +7690,7 @@ }, { "name": "rotation",- "comment": "Creates a [rotation matrix](http://en.wikipedia.org/wiki/Rotation_matrix).\nGiven an angle t, it creates a counterclockwise rotation matrix:\n\n / cos t -sin t \\\n \\ sin t cos t /",+ "comment": "Creates a [rotation matrix](http://en.wikipedia.org/wiki/Rotation_matrix).\nGiven an angle t, it creates a counterclockwise rotation matrix:\n\n / cos t -sin t 0 \\\n \\ sin t cos t 0 /", "raw": "rotation : Float -\u003e Transform2D", "type": [ "-\u003e",@@ -7457,6 +7701,68 @@ "Transform2D" ] ]+ },+ {+ "name": "scale",+ "comment": "Creates a transformation matrix for scaling by a all directions:\n\n scale s\n\n / s 0 0 \\\n \\ 0 s 0 /",+ "raw": "scale : Float -\u003e Transform2D",+ "type": [+ "-\u003e",+ [+ "Float"+ ],+ [+ "Transform2D"+ ]+ ]+ },+ {+ "name": "scaleX",+ "comment": "Creates a transformation for horizontal scaling",+ "raw": "scaleX : Float -\u003e Transform2D",+ "type": [+ "-\u003e",+ [+ "Float"+ ],+ [+ "Transform2D"+ ]+ ]+ },+ {+ "name": "scaleY",+ "comment": "Creates a transformation for vertical scaling",+ "raw": "scaleY : Float -\u003e Transform2D",+ "type": [+ "-\u003e",+ [+ "Float"+ ],+ [+ "Transform2D"+ ]+ ]+ },+ {+ "name": "translation",+ "comment": "Creates a transformation matrix for translation:\n\n translation x y\n\n / 1 0 x \\\n \\ 0 1 y /",+ "raw": "translation : Float -\u003e Float -\u003e Transform2D",+ "type": [+ "-\u003e",+ [+ "Float"+ ],+ [+ "-\u003e",+ [+ "Float"+ ],+ [+ "Transform2D"+ ]+ ]+ ] } ] },@@ -8442,7 +8748,7 @@ }, { "name": "Graphics.Element",- "document": "Graphical elements that snap together to build complex widgets and layouts.\nEach Element is a rectangle with a known width and height, making them easy to\ncombine and position.\n\n# Images\n@docs image, fittedImage, croppedImage, tiledImage\n\n# Styling\n@docs width, height, size, color, opacity, link, tag\n\n# Inspection\n@docs widthOf, heightOf, sizeOf\n\n# Layout\n@docs flow, up, down, left, right, inward, outward\n\n## Layout Aliases\nThere are also some convenience functions for working\nwith `flow` in specific cases:\n\n@docs layers, above, below, beside\n\n# Positioning\n@docs spacer, container\n\n## Specific Positions\n\nTo create a `Position` you can use any of the built-in positions\nwhich cover nine common positions.\n@docs middle, midTop, midBottom, midLeft, midRight, topLeft, topRight,\n bottomLeft, bottomRight\n\nIf you need more precision, you can create custom positions.\n\n@docs absolute, relative, middleAt, midTopAt, midBottomAt, midLeftAt,\n midRightAt, topLeftAt, topRightAt, bottomLeftAt, bottomRightAt",+ "document": "Graphical elements that snap together to build complex widgets and layouts.\nEach Element is a rectangle with a known width and height, making them easy to\ncombine and position.\n\n# Images\n@docs image, fittedImage, croppedImage, tiledImage\n\n# Styling\n@docs width, height, size, color, opacity, link, tag\n\n# Inspection\n@docs widthOf, heightOf, sizeOf\n\n# Layout\n@docs flow, up, down, left, right, inward, outward\n\n## Layout Aliases\nThere are also some convenience functions for working\nwith `flow` in specific cases:\n\n@docs layers, above, below, beside\n\n# Positioning\n@docs empty, spacer, container\n\n## Specific Positions\n\nTo create a `Position` you can use any of the built-in positions\nwhich cover nine common positions.\n@docs middle, midTop, midBottom, midLeft, midRight, topLeft, topRight,\n bottomLeft, bottomRight\n\nIf you need more precision, you can create custom positions.\n\n@docs absolute, relative, middleAt, midTopAt, midBottomAt, midLeftAt,\n midRightAt, topLeftAt, topRightAt, bottomLeftAt, bottomRightAt", "aliases": [ { "name": "Element",@@ -8562,7 +8868,7 @@ { "name": "ElementPrim", "comment": "",- "raw": "data ElementPrim\n = Image ImageStyle Int Int JSString\n | Container Position Element\n | Flow Direction [Element]\n | Spacer\n | RawHtml JSString\n | Custom",+ "raw": "data ElementPrim\n = Image ImageStyle Int Int JSString\n | Container Position Element\n | Flow Direction [Element]\n | Spacer\n | RawHtml\n | Custom", "typeVariables": [], "constructors": [ {@@ -8643,13 +8949,7 @@ { "name": "RawHtml", "type": [- "-\u003e",- [- "JSString"- ],- [- "ElementPrim"- ]+ "ElementPrim" ] }, {@@ -8993,6 +9293,14 @@ ] }, {+ "name": "empty",+ "comment": "An Element that takes up no space. Good for things that appear conditionally:\n\n flow down [ img1, if showMore then img2 else empty ]",+ "raw": "empty : Element",+ "type": [+ "Element"+ ]+ },+ { "name": "fittedImage", "comment": "Create a fitted image given a width, height, and image source.\nThis will crop the picture to best fill the given dimensions.", "raw": "fittedImage : Int -\u003e Int -\u003e String -\u003e Element",@@ -9412,7 +9720,7 @@ }, { "name": "tag",- "comment": "Create an `Element` with a tag. This lets you link directly to it.\nThe element `(tag \"all-about-badgers\" thirdParagraph)` can be reached\nwith a link lik this: `/facts-about-animals.elm#all-about-badgers`",+ "comment": "Create an `Element` with a tag. This lets you link directly to it.\nThe element `(tag \"all-about-badgers\" thirdParagraph)` can be reached\nwith a link like this: `/facts-about-animals.elm#all-about-badgers`", "raw": "tag : String -\u003e Element -\u003e Element", "type": [ "-\u003e",@@ -9899,7 +10207,7 @@ }, { "name": "hoverable",- "comment": "Detect when the mouse is hovering over a specifici `Element`.",+ "comment": "Detect when the mouse is hovering over a specific `Element`.", "raw": "hoverable : Element -\u003e (Element, Signal Bool)", "type": [ "-\u003e",
data/elm-runtime.js view
@@ -24,7030 +24,7164 @@ function truncate(n) { return n|0; } - function curry(f,a,b) { return f(Utils.Tuple2(a,b)); }- function uncurry(f,v) { return A2(f,v._0,v._1); }- function fst(t) { return t._0; }- function snd(t) { return t._1; }-- var basics = {- div:F2(div),- rem:F2(rem),- mod:mod,-- pi:Math.PI,- e:Math.E,- cos:Math.cos,- sin:Math.sin,- tan:Math.tan,- acos:Math.acos,- asin:Math.asin,- atan:Math.atan,- atan2:F2(Math.atan2),-- sqrt:Math.sqrt,- abs:abs,- logBase:F2(logBase),- min:F2(min),- max:F2(max),- clamp:F3(clamp),- compare:Utils.compare,-- xor:F2(xor),- not:not,-- truncate:truncate,- ceiling:Math.ceil,- floor:Math.floor,- round:Math.round,- toFloat:function(x) { return x; },-- curry:F3(curry),- uncurry:F2(uncurry),- fst:fst,- snd:snd- };-- return elm.Native.Basics.values = basics;-};-Elm.Native.Char = {};-Elm.Native.Char.make = function(elm) {- elm.Native = elm.Native || {};- elm.Native.Char = elm.Native.Char || {};- if (elm.Native.Char.values) return elm.Native.Char.values;-- function isBetween(lo,hi) { return function(chr) {- var c = chr.charCodeAt(0);- return lo <= c && c <= hi;- };- }- var isDigit = isBetween('0'.charCodeAt(0),'9'.charCodeAt(0));- var chk1 = isBetween('a'.charCodeAt(0),'f'.charCodeAt(0));- var chk2 = isBetween('A'.charCodeAt(0),'F'.charCodeAt(0));-- return elm.Native.Char.values = {- fromCode : function(c) { return String.fromCharCode(c); },- toCode : function(c) { return c.toUpperCase().charCodeAt(0); },- toUpper : function(c) { return c.toUpperCase(); },- toLower : function(c) { return c.toLowerCase(); },- toLocaleUpper : function(c) { return c.toLocaleUpperCase(); },- toLocaleLower : function(c) { return c.toLocaleLowerCase(); },- isLower : isBetween('a'.charCodeAt(0),'z'.charCodeAt(0)),- isUpper : isBetween('A'.charCodeAt(0),'Z'.charCodeAt(0)),- isDigit : isDigit,- isOctDigit : isBetween('0'.charCodeAt(0),'7'.charCodeAt(0)),- isHexDigit : function(c) { return isDigit(c) || chk1(c) || chk2(c); }- };-};-Elm.Native.Color = {};-Elm.Native.Color.make = function(elm) {- elm.Native = elm.Native || {};- elm.Native.Color = elm.Native.Color || {};- if (elm.Native.Color.values) return elm.Native.Color.values;-- var Utils = Elm.Native.Utils.make(elm);-- function complement(rgb) {- var hsv = toHSV(rgb);- hsv.hue = (hsv.hue + 180) % 360;- return toRGB(hsv);- }-- function hsva(h,s,v,a) {- var degree = A2(Utils.mod, h * 180 / Math.PI, 360);- var clr = toRGB({hue:degree, saturation:s, value:v});- clr._3 = a;- return clr;- }-- function hsv(h,s,v) {- var degree = A2(Utils.mod, h * 180 / Math.PI, 360);- return toRGB({hue:degree, saturation:s, value:v});- }-- function toHSV(rgb) {- var hsv = {};- var r = rgb._0 / 255.0, g = rgb._1 / 255.0, b = rgb._2 / 255.0;- var M = Math.max(r,g,b);- var m = Math.min(r,g,b);- var c = M - m;-- var h = 0;- if (c === 0) { h = 0; }- else if (M === r) { h = ((g - b) / c) % 6; }- else if (M === g) { h = ((b - r) / c) + 2; }- else if (M === b) { h = ((r - g) / c) + 4; }- h *= 60;-- return { value : M, hue : h, saturation : (M === 0 ? 0 : c / M) };- }-- function between(lo,hi,x) { return lo <= x && x < hi; }- function norm(n) { return Math.round(n*255); }-- function toRGB(hsv) {- var c = hsv.value * hsv.saturation;- var hue = hsv.hue / 60;- var x = c * (1 - Math.abs((hue % 2) - 1));- var r = 0, g = 0, b = 0;- if (between(0,1,hue)) { r = c; g = x; b = 0; }- else if (between(1,2,hue)) { r = x; g = c; b = 0; }- else if (between(2,3,hue)) { r = 0; g = c; b = x; }- else if (between(3,4,hue)) { r = 0; g = x; b = c; }- else if (between(4,5,hue)) { r = x; g = 0; b = c; }- else if (between(5,6,hue)) { r = c; g = 0; b = x; }-- var m = hsv.value - c;- return { ctor:"Color", _0:norm(r+m), _1:norm(g+m), _2:norm(b+m), _3:1 };- }-- return elm.Native.Color.values = {- hsva:F4(hsva),- hsv:F3(hsv),- complement:complement- };--};Elm.Native.Date = {};-Elm.Native.Date.make = function(elm) {- elm.Native = elm.Native || {};- elm.Native.Date = elm.Native.Date || {};- if (elm.Native.Date.values) return elm.Native.Date.values;-- var JS = Elm.JavaScript.make(elm);- var Maybe = Elm.Maybe.make(elm);-- function dateNow() { return new window.Date; }- function readDate(str) {- var d = new window.Date(JS.fromString(str));- if (isNaN(d.getTime())) return Maybe.Nothing;- return Maybe.Just(d);- }-- var dayTable = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];- var monthTable = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; -- return elm.Native.Date.values = {- read : readDate,- year : function(d) { return d.getFullYear(); },- month : function(d) { return { ctor:monthTable[d.getMonth()] }; },- day : function(d) { return d.getDate(); },- hour : function(d) { return d.getHours(); },- minute : function(d) { return d.getMinutes(); },- second : function(d) { return d.getSeconds(); },- toTime : function(d) { return d.getTime(); },- dayOfWeek : function(d) { return { ctor:dayTable[d.getDay()] }; }- };--};-Elm.Native.Error = {};-Elm.Native.Error.make = function(elm) {- elm.Native = elm.Native || {};- elm.Native.Error = elm.Native.Error || {};- if (elm.Native.Error.values) return elm.Native.Error.values;-- var fromString = Elm.Native.JavaScript.make(elm).fromString;-- function indent(lines) {- var msg = '';- for (var i = 0; i < lines.length; ++i) {- msg += '<br/> ' + lines[i];- }- return msg;- }-- function Case(moduleName, span) { - var msg = indent(['Non-exhaustive pattern match in case-expression.',- 'Make sure your patterns cover every case!']);- throw new Error('Runtime error in module ' + moduleName + ' (' + span + '):' + msg);- }-- function If(moduleName, span) { - var msg = indent(['Non-exhaustive pattern match in multi-way-if expression.',- 'It is best to use \'otherwise\' as the last branch of multi-way-if.']);- throw new Error('Runtime error in module ' + moduleName + ' (' + span + '):' + msg);- }-- function raise(str) { throw new Error(fromString(str)); }-- return elm.Native.Error.values = { Case: Case, If: If, raise: raise };-};-function F2(fun) {- function wrapper(a) { return function(b) { return fun(a,b) } }- wrapper.arity = 2;- wrapper.func = fun;- return wrapper;-}--function F3(fun) {- function wrapper(a) {- return function(b) { return function(c) { return fun(a,b,c) }}- }- wrapper.arity = 3;- wrapper.func = fun;- return wrapper;-}--function F4(fun) {- function wrapper(a) { return function(b) { return function(c) {- return function(d) { return fun(a,b,c,d) }}}- }- wrapper.arity = 4;- wrapper.func = fun;- return wrapper;-}--function F5(fun) {- function wrapper(a) { return function(b) { return function(c) {- return function(d) { return function(e) { return fun(a,b,c,d,e) }}}}- }- wrapper.arity = 5;- wrapper.func = fun;- return wrapper;-}--function F6(fun) {- function wrapper(a) { return function(b) { return function(c) {- return function(d) { return function(e) { return function(f) {- return fun(a,b,c,d,e,f) }}}}}- }- wrapper.arity = 6;- wrapper.func = fun;- return wrapper;-}--function F7(fun) {- function wrapper(a) { return function(b) { return function(c) {- return function(d) { return function(e) { return function(f) {- return function(g) { return fun(a,b,c,d,e,f,g) }}}}}}- }- wrapper.arity = 7;- wrapper.func = fun;- return wrapper;-}--function F8(fun) {- function wrapper(a) { return function(b) { return function(c) {- return function(d) { return function(e) { return function(f) {- return function(g) { return function(h) {return fun(a,b,c,d,e,f,g,h)}}}}}}}- }- wrapper.arity = 8;- wrapper.func = fun;- return wrapper;-}--function F9(fun) {- function wrapper(a) { return function(b) { return function(c) {- return function(d) { return function(e) { return function(f) {- return function(g) { return function(h) { return function(i) {- return fun(a,b,c,d,e,f,g,h,i) }}}}}}}}- }- wrapper.arity = 9;- wrapper.func = fun;- return wrapper;-}--function A2(fun,a,b) {- return fun.arity === 2 ? fun.func(a,b) : fun(a)(b);-}-function A3(fun,a,b,c) {- return fun.arity === 3 ? fun.func(a,b,c) : fun(a)(b)(c);-}-function A4(fun,a,b,c,d) {- return fun.arity === 4 ? fun.func(a,b,c,d) : fun(a)(b)(c)(d);-}-function A5(fun,a,b,c,d,e) {- return fun.arity === 5 ? fun.func(a,b,c,d,e) : fun(a)(b)(c)(d)(e);-}-function A6(fun,a,b,c,d,e,f) {- return fun.arity === 6 ? fun.func(a,b,c,d,e,f) : fun(a)(b)(c)(d)(e)(f);-}-function A7(fun,a,b,c,d,e,f,g) {- return fun.arity === 7 ? fun.func(a,b,c,d,e,f,g) : fun(a)(b)(c)(d)(e)(f)(g);-}-function A8(fun,a,b,c,d,e,f,g,h) {- return fun.arity === 8 ? fun.func(a,b,c,d,e,f,g,h) : fun(a)(b)(c)(d)(e)(f)(g)(h);-}-function A9(fun,a,b,c,d,e,f,g,h,i) {- return fun.arity === 9 ? fun.func(a,b,c,d,e,f,g,h,i)- : fun(a)(b)(c)(d)(e)(f)(g)(h)(i);-}-Elm.Native.JavaScript = {};-Elm.Native.JavaScript.make = function(elm) {- elm.Native = elm.Native || {};- elm.Native.JavaScript = elm.Native.JavaScript || {};- if (elm.Native.JavaScript.values) return elm.Native.JavaScript.values;-- var List = Elm.Native.List.make(elm);- var Render = ElmRuntime.use(ElmRuntime.Render.Element);-- function fromJS(v) {- var type = typeof v;- if (type === 'number' ) return v;- if (type === 'boolean') return v;- if (type === 'string' ) return v;- if (v instanceof Array) {- var arr = [];- var len = v.length;- for (var i = 0; i < len; ++i) {- var x = fromJS(v[i]);- if (x !== null) arr.push(x);- }- return List.fromArray(arr);- }- if (type === 'object') {- var rec = { _:{} };- for (var f in v) {- var x = fromJS(v[f]);- if (x !== null) rec[f] = x;- }- return rec;- }- return null;- }-- function toJS(v) {- var type = typeof v;- if (type === 'number' || type === 'boolean') return v;- if (type === 'object' && '_' in v) {- var obj = {};- for (var k in v) {- var x = toJS(v[k]);- if (x !== null) obj[k] = x;- }- return obj;- }- if (type === 'object' && (v.ctor === '::' || v.ctor === '[]')) {- var array = List.toArray(v);- for (var i = array.length; i--; ) {- array[i] = toJS(array[i]);- }- return array;- }- return null;- }-- function fromRecord(r) {- if (typeof r === 'object' && '_' in r) {- return toJS(r);- }- throw new Error("'fromRecord' must be called on a record.");- }-- function id(n) { return n; }-- function toElement(w,h,domNode) {- return A3( newElement, w, h, {- ctor: 'Custom',- type: 'DomNode',- render: function(node) { return node; },- update: function(node,oldNode,newNode) {- if (node === newNode) return;- node.parentNode.replaceChild(newNode, node);- },- model: domNode- });- }-- function fromElement(element) {- return Render.render(element);- }-- return elm.Native.JavaScript.values = {- toInt : function(n) { return n|0; },- toFloat : function(n) { return +n; },- toBool : id,- toString : id,- toList : List.fromArray,- fromString : id,- fromList : List.toArray,- fromInt : id,- fromFloat : id,- fromBool : id,-- toElement : toElement,- fromElement : fromElement,- toRecord : fromJS,- fromRecord : fromRecord- };--};-Elm.Native.Json = {};-Elm.Native.Json.make = function(elm) {-- elm.Native = elm.Native || {};- elm.Native.Json = elm.Native.Json || {};- if (elm.Native.Json.values) return elm.Native.Json.values;-- var Maybe = Elm.Maybe.make(elm);- var Dict = Elm.Dict.make(elm);- var List = Elm.List.make(elm);- var JS = Elm.JavaScript.make(elm);- var Utils = Elm.Native.Utils.make(elm);-- function fromValue(v) {- switch (v.ctor) {- case 'Null' : return null;- case 'String' : return JS.fromString(v._0);- case 'Object' :- var obj = {};- var array = JS.fromList(Dict.toList(v._0));- for (var i = array.length; i--; ) {- obj[JS.fromString(array[i]._0)] = fromValue(array[i]._1);- }- return obj;- case 'Array' :- var array = JS.fromList(v._0);- for (var i = array.length; i--; ) {- array[i] = fromValue(array[i]);- }- return array;- default :- return v._0;- }- }-- function toPrettyJSString(sep, obj) {- return JSON.stringify(fromValue(obj), null, JS.fromString(sep));- }-- function toValue(v) {- switch (typeof v) {- case 'string' : return { ctor:"String", _0: JS.toString(v) };- case 'number' : return { ctor:"Number", _0: JS.toFloat(v) };- case 'boolean': return { ctor:"Bool" , _0: JS.toBool(v) };- case 'object' :- if (v === null) return { ctor:"Null" };- if (v instanceof Array) {- for (var i = v.length; i--; ) { v[i] = toValue(v[i]); }- return { ctor:"Array", _0: JS.toList(v) };- }- var array = [];- for (var k in v) array.push(Utils.Tuple2(JS.toString(k), toValue(v[k])));- return { ctor:"Object", _0: Dict.fromList(JS.toList(array)) };- }- }-- function fromJSString(str) {- try {- return Maybe.Just(toValue(JSON.parse(str)));- } catch (e) {- return Maybe.Nothing;- }- }-- return elm.Native.Json.values = {- toJSString : F2(toPrettyJSString),- fromJSString : fromJSString,- toJSObject : fromValue,- fromJSObject : toValue- };--};-Elm.Native.List = {};-Elm.Native.List.make = function(elm) {- elm.Native = elm.Native || {};- elm.Native.List = elm.Native.List || {};- if (elm.Native.List.values) return elm.Native.List.values;- if ('values' in Elm.Native.List)- return elm.Native.List.values = Elm.Native.List.values;-- var Utils = Elm.Native.Utils.make(elm);-- // TODO: Improve Nil handling- // We can change places like: if (xs.ctor === '[]') ... to if (xs === Nil) ...- // but only if we're confident Nil can only be defined once.- // Currently (27Mar2013) each module can have different instantiations, so multiple Nil objects can exist- // (and if they're used interchangeably then direct object comparison fails where ctor doesn't).- // So, this can only be fixed when modules initialisation is also fixed.- // The performance overhead of the .ctor calls is 5-10% according to jsperf (depending on fn + list size)- // (on firefox 19)-- var Nil = { ctor:'[]' };-- // using freeze for every cons would be nice but is a huge (9x on firefox 19)- // performance penalty- function Cons(hd,tl) { return { ctor:"::", _0:hd, _1:tl }; }-- function throwError(f) {- throw new Error("Function '" + f + "' expects a non-empty list!");- }-- function toArray(xs) {- var out = [];- while (xs.ctor !== '[]') {- out.push(xs._0);- xs = xs._1;- }- return out;- }-- function fromArray(arr) {- var out = Nil;- for (var i = arr.length; i--; ) {- out = Cons(arr[i], out);- }- return out;- }-- function range(lo,hi) {- var lst = Nil;- if (lo <= hi) {- do { lst = Cons(hi,lst) } while (hi-->lo);- }- return lst- }-- function append(xs,ys) {- if (xs.isText) return Utils.txt(xs.concat(ys));- if (typeof xs === "string") return xs.concat(ys);- if (xs.ctor === '[]') { return ys; }- var root = Cons(xs._0, Nil);- var curr = root;- xs = xs._1;- while (xs.ctor !== '[]') {- curr._1 = Cons(xs._0, Nil);- xs = xs._1;- curr = curr._1;- }- curr._1 = ys;- return root;- }-- function head(v) { return v.ctor === '[]' ? throwError('head') : v._0; }- function tail(v) { return v.ctor === '[]' ? throwError('tail') : v._1; }-- function last(xs) {- if (xs.ctor === '[]') { throwError('last'); }- var out = xs._0;- while (xs.ctor !== '[]') {- out = xs._0;- xs = xs._1;- }- return out;- }-- function map(f, xs) {- var arr = [];- while (xs.ctor !== '[]') {- arr.push(f(xs._0));- xs = xs._1;- }- return fromArray(arr);- }-- // f defined similarly for both foldl and foldr (NB: different from Haskell)- // ie, foldl : (a -> b -> b) -> b -> [a] -> b- function foldl(f, b, xs) {- var acc = b;- while (xs.ctor !== '[]') {- acc = A2(f, xs._0, acc);- xs = xs._1;- }- return acc;- }-- function foldr(f, b, xs) {- var arr = toArray(xs);- var acc = b;- for (var i = arr.length; i--; ) {- acc = A2(f, arr[i], acc);- }- return acc;- }-- function foldl1(f, xs) {- return xs.ctor === '[]' ? throwError('foldl1') : foldl(f, xs._0, xs._1);- }-- function foldr1(f, xs) {- if (xs.ctor === '[]') { throwError('foldr1'); }- var arr = toArray(xs);- var acc = arr.pop();- for (var i = arr.length; i--; ) {- acc = A2(f, arr[i], acc);- }- return acc;- }-- function scanl(f, b, xs) {- var arr = toArray(xs);- arr.unshift(b);- var len = arr.length;- for (var i = 1; i < len; ++i) {- arr[i] = A2(f, arr[i], arr[i-1]);- }- return fromArray(arr);- }-- function scanl1(f, xs) {- return xs.ctor === '[]' ? throwError('scanl1') : scanl(f, xs._0, xs._1);- }-- function filter(pred, xs) {- var arr = [];- while (xs.ctor !== '[]') {- if (pred(xs._0)) { arr.push(xs._0); }- xs = xs._1;- }- return fromArray(arr);- }-- function length(xs) {- var out = 0;- while (xs.ctor !== '[]') {- out += 1;- xs = xs._1;- }- return out;- }-- function member(x, xs) {- while (xs.ctor !== '[]') {- if (Utils.eq(x,xs._0)) return true;- xs = xs._1;- }- return false;- }-- function reverse(xs) { return fromArray(toArray(xs).reverse()); }-- function concat(xss) {- if (xss.ctor === '[]') return xss;- var arr = toArray(xss);- var xs = arr[arr.length-1];- for (var i = arr.length-1; i--; ) {- xs = append(arr[i], xs);- }- return xs;- }-- function all(pred, xs) {- while (xs.ctor !== '[]') {- if (!pred(xs._0)) return false;- xs = xs._1;- }- return true;- }-- function any(pred, xs) {- while (xs.ctor !== '[]') {- if (pred(xs._0)) return true;- xs = xs._1;- }- return false;- }-- function zipWith(f, xs, ys) {- var arr = [];- while (xs.ctor !== '[]' && ys.ctor !== '[]') {- arr.push(A2(f, xs._0, ys._0));- xs = xs._1;- ys = ys._1;- }- return fromArray(arr);- }-- function zip(xs, ys) {- var arr = [];- while (xs.ctor !== '[]' && ys.ctor !== '[]') {- arr.push(Utils.Tuple2(xs._0, ys._0));- xs = xs._1;- ys = ys._1;- }- return fromArray(arr);- }-- function sort(xs) {- function cmp(a,b) {- var ord = Utils.compare(a,b).ctor;- return ord=== 'EQ' ? 0 : ord === 'LT' ? -1 : 1;- }- return fromArray(toArray(xs).sort(cmp));- }-- function nth(xs, n) {- return toArray(xs)[n];- }-- function take(n, xs) {- var arr = [];- while (xs.ctor !== '[]' && n > 0) {- arr.push(xs._0);- xs = xs._1;- --n;- }- return fromArray(arr);- }-- function drop(n, xs) {- while (xs.ctor !== '[]' && n > 0) {- xs = xs._1;- --n;- }- return xs;- }-- function repeat(n, x) {- var arr = [];- var pattern = [x];- while (n > 0) {- if (n & 1) arr = arr.concat(pattern);- n >>= 1, pattern = pattern.concat(pattern);- }- return fromArray(arr);- }-- function join(sep, xss) {- if (sep.isText) return Utils.txt(toArray(xss).join(sep));- if (typeof sep === 'string') return toArray(xss).join(sep);- if (xss.ctor === '[]') return Nil;- var s = toArray(sep);- var out = toArray(xss._0);- xss = xss._1;- while (xss.ctor !== '[]') {- out = out.concat(s, toArray(xss._0));- xss = xss._1;- }- return fromArray(out);- }-- Elm.Native.List.values = {- Nil:Nil,- Cons:Cons,- cons:F2(Cons),- toArray:toArray,- fromArray:fromArray,- range:range,- append:append,-- head:head,- tail:tail,- last:last,-- map:F2(map),- foldl:F3(foldl),- foldr:F3(foldr),-- foldl1:F2(foldl1),- foldr1:F2(foldr1),- scanl:F3(scanl),- scanl1:F2(scanl1),- filter:F2(filter),- length:length,- member:F2(member),- reverse:reverse,- concat:concat,-- all:F2(all),- any:F2(any),- zipWith:F3(zipWith),- zip:F2(zip),- sort:sort,- nth:F2(nth),- take:F2(take),- drop:F2(drop),- repeat:F2(repeat),-- join:F2(join)- };- return elm.Native.List.values = Elm.Native.List.values;--};-Elm.Native.Prelude = {};-Elm.Native.Prelude.make = function(elm) {- elm.Native = elm.Native || {};- elm.Native.Prelude = elm.Native.Prelude || {};- if (elm.Native.Prelude.values) return elm.Native.Prelude.values;-- var JS = Elm.Native.JavaScript.make(elm);- var Maybe = Elm.Maybe.make(elm);- var Char = Elm.Char.make(elm);-- function readInt(str) {- var s = JS.fromString(str);- var len = s.length;- if (len === 0) { return Maybe.Nothing; }- var start = 0;- if (s[0] == '-') {- if (len === 1) { return Maybe.Nothing; }- start = 1;- }- for (var i = start; i < len; ++i) {- if (!Char.isDigit(s[i])) { return Maybe.Nothing; }- }- return Maybe.Just(parseInt(s, 10));- }-- function readFloat(str) {- var s = JS.fromString(str);- var len = s.length;- if (len === 0) { return Maybe.Nothing; }- var start = 0;- if (s[0] == '-') {- if (len === 1) { return Maybe.Nothing; }- start = 1;- }- var dotCount = 0;- for (var i = start; i < len; ++i) {- if (Char.isDigit(s[i])) { continue; }- if (s[i] === '.') {- dotCount += 1;- if (dotCount <= 1) { continue; }- }- return Maybe.Nothing;- }- return Maybe.Just(parseFloat(s));- }-- return elm.Native.Prelude.values = {- readInt:readInt,- readFloat:readFloat- };--};-Elm.Native.Show = {};-Elm.Native.Show.make = function(elm) {- elm.Native = elm.Native || {};- elm.Native.Show = elm.Native.Show || {};- if (elm.Native.Show.values) return elm.Native.Show.values;-- var NList = Elm.Native.List.make(elm);- var List = Elm.List.make(elm);- var Maybe = Elm.Maybe.make(elm);- var JS = Elm.JavaScript.make(elm);- var Dict = Elm.Dict.make(elm);- var Json = Elm.Json.make(elm);- var Tuple2 = Elm.Native.Utils.make(elm).Tuple2;-- var toString = function(v) {- var type = typeof v;- if (type === "function") {- var name = v.func ? v.func.name : v.name;- return '<function' + (name === '' ? '' : ': ') + name + '>';- } else if (type === "boolean") {- return v ? "True" : "False";- } else if (type === "number") {- return v+"";- } else if ((v instanceof String) && v.isChar) {- return "'" + addSlashes(v) + "'";- } else if (type === "string") {- return '"' + addSlashes(v) + '"';- } else if (type === "object" && '_' in v && probablyPublic(v)) {- var output = [];- for (var k in v._) {- for (var i = v._[k].length; i--; ) {- output.push(k + " = " + toString(v._[k][i]));- }- }- for (var k in v) {- if (k === '_') continue;- output.push(k + " = " + toString(v[k]));- }- if (output.length === 0) return "{}";- return "{ " + output.join(", ") + " }";- } else if (type === "object" && 'ctor' in v) {- if (v.ctor.substring(0,6) === "_Tuple") {- var output = [];- for (var k in v) {- if (k === 'ctor') continue;- output.push(toString(v[k]));- }- return "(" + output.join(",") + ")";- } else if (v.ctor === "::") {- var output = '[' + toString(v._0);- v = v._1;- while (v.ctor === "::") {- output += "," + toString(v._0);- v = v._1;- }- return output + ']';- } else if (v.ctor === "[]") {- return "[]";- } else if (v.ctor === "RBNode" || v.ctor === "RBEmpty") {- var cons = F3(function(k,v,acc){return NList.Cons(Tuple2(k,v),acc)});- var list = A3(Dict.foldr, cons, NList.Nil, v);- var name = "Dict";- if (list.ctor === "::" && list._0._1.ctor === "_Tuple0") {- name = "Set";- list = A2(List.map, function(x){return x._0}, list);- }- return name + ".fromList " + toString(list);- } else {- var output = "";- for (var i in v) {- if (i === 'ctor') continue;- var str = toString(v[i]);- var parenless = str[0] === '{' || str[0] === '<' || str.indexOf(' ') < 0;- output += ' ' + (parenless ? str : '(' + str + ')');- }- return v.ctor + output;- }- }- if (type === 'object' && 'recv' in v) return '<signal>';- return "<internal structure>";- };-- function addSlashes(str) {- return str.replace(/\\/g, '\\\\')- .replace(/\n/g, '\\n')- .replace(/\t/g, '\\t')- .replace(/\r/g, '\\r')- .replace(/\v/g, '\\v')- .replace(/\0/g, '\\0')- .replace(/\'/g, "\\'")- .replace(/\"/g, '\\"');- }-- function probablyPublic(v) {- var keys = Object.keys(v);- var len = keys.length;- if (len === 3- && 'props' in v- && 'element' in v) return false;- if (len === 5- && 'horizontal' in v- && 'vertical' in v- && 'x' in v- && 'y' in v) return false;- if (len === 7- && 'theta' in v- && 'scale' in v- && 'x' in v- && 'y' in v- && 'alpha' in v- && 'form' in v) return false;- return true;- }-- return elm.Native.Show.values = { show:toString };-};-Elm.Native.String = {};-Elm.Native.String.make = function(elm) {- elm.Native = elm.Native || {};- elm.Native.String = elm.Native.String || {};- if (elm.Native.String.values) return elm.Native.String.values;- if ('values' in Elm.Native.String)- return elm.Native.String.values = Elm.Native.String.values;-- var Char = Elm.Char.make(elm);- var Maybe = Elm.Maybe.make(elm);- var JS = Elm.JavaScript.make(elm);- var Utils = Elm.Native.Utils.make(elm);-- function isEmpty(str) {- return str.length === 0;- }- function cons(chr,str) {- return chr + str;- }- function uncons(str) {- var hd;- return (hd = str[0]) ? Maybe.Just(Utils.Tuple2(Utils.chr(hd), str.slice(1)))- : Maybe.Nothing;- }- function append(a,b) {- return a + b;- }- function concat(strs) {- return JS.fromList(strs).join('');- }- function length(str) {- return str.length;- }- function map(f,str) {- var out = str.split('');- for (var i = out.length; i--; ) {- out[i] = f(Utils.chr(out[i]));- }- return out.join('');- }- function filter(pred,str) {- return str.split('').map(Utils.chr).filter(pred).join('');- }- function reverse(str) {- return str.split('').reverse().join('');- }- function foldl(f,b,str) {- var len = str.length;- for (var i = 0; i < len; ++i) {- b = A2(f, Utils.chr(str[i]), b);- }- return b;- }- function foldr(f,b,str) {- for (var i = str.length; i--; ) {- b = A2(f, Utils.chr(str[i]), b);- }- return b;- }-- function split(sep, str) {- return JS.toList(str.split(sep));- }- function join(sep, strs) {- return JS.fromList(strs).join(sep);- }- function repeat(n, str) {- var result = '';- while (n > 0) {- if (n & 1) result += str;- n >>= 1, str += str;- }- return result;- }-- function sub(start, end, str) {- return str.slice(start,end);- }- function left(n, str) {- return n < 1 ? "" : str.slice(0,n);- }- function right(n, str) {- return n < 1 ? "" : str.slice(-n);- }- function dropLeft(n, str) {- return n < 1 ? str : str.slice(n);- }- function dropRight(n, str) {- return n < 1 ? str : str.slice(0,-n);- }-- function pad(n,chr,str) {- var half = (n - str.length) / 2;- return repeat(Math.ceil(half),chr) + str + repeat(half|0,chr);- }- function padRight(n,chr,str) {- return str + repeat(n - str.length, chr);- }- function padLeft(n,chr,str) {- return repeat(n - str.length, chr) + str;- }-- function trim(str) {- return str.trim();- }- function trimLeft(str) {- return str.trimLeft();- }- function trimRight(str) {- return str.trimRight();- }-- function words(str) {- return JS.toList(str.split(/\s+/g));- }- function lines(str) {- return JS.toList(str.split(/\r\n|\r|\n/g));- }-- function toUpper(str) {- return str.toUpperCase();- }- function toLower(str) {- return str.toLowerCase();- }-- function any(pred, str) {- for (var i = str.length; i--; ) {- if (pred(Utils.chr(str[i]))) return true;- }- return false;- }- function all(pred, str) {- for (var i = str.length; i--; ) {- if (!pred(Utils.chr(str[i]))) return false;- }- return true;- }-- function contains(sub, str) {- return str.indexOf(sub) > -1;- }- function startsWith(sub, str) {- return str.indexOf(sub) === 0;- }- function endsWith(sub, str) {- return str.lastIndexOf(sub) === str.length - sub.length;- }- function indexes(sub, str) {- var subLen = sub.length;- var i = 0;- var is = [];- while ((i = str.indexOf(sub, i)) > -1) {- is.push(i);- i = i + subLen;- }- return JS.toList(is);- }-- function toInt(s) {- var len = s.length;- if (len === 0) { return Maybe.Nothing; }- var start = 0;- if (s[0] == '-') {- if (len === 1) { return Maybe.Nothing; }- start = 1;- }- for (var i = start; i < len; ++i) {- if (!Char.isDigit(s[i])) { return Maybe.Nothing; }- }- return Maybe.Just(parseInt(s, 10));- }-- function toFloat(s) {- var len = s.length;- if (len === 0) { return Maybe.Nothing; }- var start = 0;- if (s[0] == '-') {- if (len === 1) { return Maybe.Nothing; }- start = 1;- }- var dotCount = 0;- for (var i = start; i < len; ++i) {- if (Char.isDigit(s[i])) { continue; }- if (s[i] === '.') {- dotCount += 1;- if (dotCount <= 1) { continue; }- }- return Maybe.Nothing;- }- return Maybe.Just(parseFloat(s));- }-- function toList(str) {- return JS.toList(str.split('').map(Utils.chr));- }- function fromList(chars) {- return JS.fromList(chars).join('');- }-- return Elm.Native.String.values = {- isEmpty: isEmpty,- cons: F2(cons),- uncons: uncons,- append: F2(append),- concat: concat,- length: length,- map: F2(map),- filter: F2(filter),- reverse: reverse,- foldl: F3(foldl),- foldr: F3(foldr),-- split: F2(split),- join: F2(join),- repeat: F2(repeat),-- sub: F3(sub),- left: F2(left),- right: F2(right),- dropLeft: F2(dropLeft),- dropRight: F2(dropRight),-- pad: F3(pad),- padLeft: F3(padLeft),- padRight: F3(padRight),-- trim: trim,- trimLeft: trimLeft,- trimRight: trimRight,-- words: words,- lines: lines,-- toUpper: toUpper,- toLower: toLower,-- any: F2(any),- all: F2(all),-- contains: F2(contains),- startsWith: F2(startsWith),- endsWith: F2(endsWith),- indexes: F2(indexes),-- toInt: toInt,- toFloat: toFloat,- toList: toList,- fromList: fromList,- };-};Elm.Native.Text = {};-Elm.Native.Text.make = function(elm) {- elm.Native = elm.Native || {};- elm.Native.Text = elm.Native.Text || {};- if (elm.Native.Text.values) return elm.Native.Text.values;-- var JS = Elm.JavaScript.make(elm);- var Utils = Elm.Native.Utils.make(elm);- var Color = Elm.Native.Color.make(elm);- var Element = Elm.Graphics.Element.make(elm);- var show = Elm.Native.Show.make(elm).show;-- function makeSpaces(s) {- if (s.length == 0) { return s; }- var arr = s.split('');- if (arr[0] == ' ') { arr[0] = " " } - for (var i = arr.length; --i; ) {- if (arr[i][0] == ' ' && arr[i-1] == ' ') {- arr[i-1] = arr[i-1] + arr[i];- arr[i] = '';- }- }- for (var i = arr.length; i--; ) {- if (arr[i].length > 1 && arr[i][0] == ' ') {- var spaces = arr[i].split('');- for (var j = spaces.length - 2; j >= 0; j -= 2) {- spaces[j] = ' ';- }- arr[i] = spaces.join('');- }- }- arr = arr.join('');- if (arr[arr.length-1] === " ") {- return arr.slice(0,-1) + ' ';- }- return arr;- }-- function properEscape(str) {- if (str.length == 0) return str;- str = str //.replace(/&/g, "&")- .replace(/"/g, '"')- .replace(/'/g, "'")- .replace(/</g, "<")- .replace(/>/g, ">")- .replace(/\n/g, "<br/>");- var arr = str.split('<br/>');- for (var i = arr.length; i--; ) {- arr[i] = makeSpaces(arr[i]);- }- return arr.join('<br/>');- }-- function toText(str) { return Utils.txt(properEscape(JS.fromString(str))); }-- function addTag(tag) {- return function(text) {- return Utils.txt('<' + tag + '>' + text + '</' + tag + '>');- }- }- - function addStyle(style, value, text) {- return Utils.txt("<span style='" + style + ":" + value + "'>" + text + "</span>");- }-- function typeface(name, text) {- return addStyle('font-family', JS.fromString(name), text);- }- function monospace(text) {- return addStyle('font-family', 'monospace', text);- }- function size(px, text) { return addStyle('font-size', px + 'px', text) }- var header = addTag('h1');- function height(h, text) { return addStyle('font-size', h+'px', text) }- function italic(text) { return addStyle('font-style', 'italic', text) }- var bold = addTag('b');-- function extract(c) {- if (c._3 === 1) { return 'rgb(' + c._0 + ', ' + c._1 + ', ' + c._2 + ')'; }- return 'rgba(' + c._0 + ', ' + c._1 + ', ' + c._2 + ', ' + c._3 + ')';- }- function color(c, text) {- return addStyle('color', extract(c), text);- }- function underline(text) { return addStyle('text-decoration', 'underline', text) }- function overline(text) { return addStyle('text-decoration', 'overline', text) }- function strikeThrough(text) {- return addStyle('text-decoration', 'line-through', text);- }- function link(href, text) {- return Utils.txt("<a href='" + toText(href) + "'>" + text + "</a>");- }-- function position(pos) {- return function(text) {- var e = {ctor:'RawHtml',- _0: '<div style="padding:0;margin:0;text-align:' +- pos + '">' + text + '</div>'- };- var p = A2(Utils.htmlHeight, 0, text);- return A3(Element.newElement, p._0, p._1, e);- }- }-- function asText(v) {- return position('left')(monospace(toText(show(v))));- }-- function plainText(v) {- return position('left')(toText(v));- }-- return elm.Native.Text.values = {- toText: toText,-- header : header,- height : F2(height),- italic : italic,- bold : bold,- underline : underline,- overline : overline,- strikeThrough : strikeThrough,- monospace : monospace,- typeface : F2(typeface),- color : F2(color),- link : F2(link),-- justified : position('justify'),- centered : position('center'),- righted : position('right'),- text : position('left'),- plainText : plainText,-- asText : asText- };-};Elm.Native.Transform2D = {};-Elm.Native.Transform2D.make = function(elm) {-- elm.Native = elm.Native || {};- elm.Native.Transform2D = elm.Native.Transform2D || {};- if (elm.Native.Transform2D.values) return elm.Native.Transform2D.values;-- var A;- if (typeof Float32Array === 'undefined') {- A = function(arr) {- this.length = arr.length;- this[0] = arr[0];- this[1] = arr[1];- this[2] = arr[2];- this[3] = arr[3];- this[4] = arr[4];- this[5] = arr[5];- };- } else {- A = Float32Array;- }-- // layout of matrix in an array is- //- // | m11 m12 dx |- // | m21 m22 dy |- // | 0 0 1 |- //- // new A([ m11, m12, dx, m21, m22, dy ])-- var identity = new A([1,0,0,0,1,0]);- function matrix(m11, m12, m21, m22, dx, dy) {- return new A([m11, m12, dx, m21, m22, dy]);- }- function rotation(t) {- var c = Math.cos(t);- var s = Math.sin(t);- return new A([c, -s, 0, s, c, 0]);- }-- function rotate(t,m) {- var c = Math.cos(t);- var s = Math.sin(t);- var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4];- return new A([m11*c + m12*s, -m11*s + m12*c, m[2],- m21*c + m22*s, -m21*s + m22*c, m[5]]);- }- /*- function move(xy,m) {- var x = xy._0;- var y = xy._1;- var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4];- return new A([m11, m12, m11*x + m12*y + m[2],- m21, m22, m21*x + m22*y + m[5]]);- }- function scale(s,m) { return new A([m[0]*s, m[1]*s, m[2], m[3]*s, m[4]*s, m[5]]); }- function scaleX(x,m) { return new A([m[0]*x, m[1], m[2], m[3]*x, m[4], m[5]]); }- function scaleY(y,m) { return new A([m[0], m[1]*y, m[2], m[3], m[4]*y, m[5]]); }- function reflectX(m) { return new A([-m[0], m[1], m[2], -m[3], m[4], m[5]]); }- function reflectY(m) { return new A([m[0], -m[1], m[2], m[3], -m[4], m[5]]); }-- function transform(m11, m21, m12, m22, mdx, mdy, n) {- var n11 = n[0], n12 = n[1], n21 = n[3], n22 = n[4], ndx = n[2], ndy = n[5];- return new A([m11*n11 + m12*n21,- m11*n12 + m12*n22,- m11*ndx + m12*ndy + mdx,- m21*n11 + m22*n21,- m21*n12 + m22*n22,- m21*ndx + m22*ndy + mdy]);- }- */- function multiply(m, n) {- var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4], mdx = m[2], mdy = m[5];- var n11 = n[0], n12 = n[1], n21 = n[3], n22 = n[4], ndx = n[2], ndy = n[5];- return new A([m11*n11 + m12*n21,- m11*n12 + m12*n22,- m11*ndx + m12*ndy + mdx,- m21*n11 + m22*n21,- m21*n12 + m22*n22,- m21*ndx + m22*ndy + mdy]);- }-- return elm.Native.Transform2D.values = {- identity:identity,- matrix:F6(matrix),- rotation:rotation,- multiply:F2(multiply)- /*- transform:F7(transform),- rotate:F2(rotate),- move:F2(move),- scale:F2(scale),- scaleX:F2(scaleX),- scaleY:F2(scaleY),- reflectX:reflectX,- reflectY:reflectY- */- };--};-Elm.Native.Utils = {};-Elm.Native.Utils.make = function(elm) {-- elm.Native = elm.Native || {};- elm.Native.Utils = elm.Native.Utils || {};- if (elm.Native.Utils.values) return elm.Native.Utils.values;-- function eq(x,y) {- if (x === y) return true;- if (typeof x === "object") {- var c = 0;- for (var i in x) { ++c; if (!eq(x[i],y[i])) return false; }- return c === Object.keys(y).length;- }- if (typeof x === 'function') {- throw new Error('Equality error: general function equality is ' +- 'undecidable, and therefore, unsupported');- }- return x === y;- }-- // code in Generate/JavaScript.hs depends on the particular- // integer values assigned to LT, EQ, and GT- var LT = -1, EQ = 0, GT = 1, ord = ['LT','EQ','GT'];- function compare(x,y) { return { ctor: ord[cmp(x,y)+1] } }- function cmp(x,y) {- var ord;- if (typeof x !== 'object') return x === y ? EQ : x < y ? LT : GT;-- if (x.ctor === "::" || x.ctor === "[]") {- while (true) {- if (x.ctor === "[]" && y.ctor === "[]") return EQ;- if (x.ctor !== y.ctor) return x.ctor === '[]' ? LT : GT;- ord = cmp(x._0, y._0);- if (ord !== EQ) return ord;- x = x._1;- y = y._1;- }- }-- if (x.ctor.slice(0,6) === '_Tuple') {- var n = x.ctor.slice(6) - 0;- var err = 'cannot compare tuples with more than 6 elements.';- if (n === 0) return EQ;- if (n >= 1) { ord = cmp(x._0, y._0); if (ord !== EQ) return ord;- if (n >= 2) { ord = cmp(x._1, y._1); if (ord !== EQ) return ord;- if (n >= 3) { ord = cmp(x._2, y._2); if (ord !== EQ) return ord;- if (n >= 4) { ord = cmp(x._3, y._3); if (ord !== EQ) return ord;- if (n >= 5) { ord = cmp(x._4, y._4); if (ord !== EQ) return ord;- if (n >= 6) { ord = cmp(x._5, y._5); if (ord !== EQ) return ord;- if (n >= 7) throw new Error('Comparison error: ' + err); } } } } } }- return EQ;- }- throw new Error('Comparison error: comparison is only defined on ints, ' +- 'floats, times, chars, strings, lists of comparable values, ' +- 'and tuples of comparable values.')- }--- var Tuple0 = { ctor: "_Tuple0" };- function Tuple2(x,y) { return { ctor:"_Tuple2", _0:x, _1:y } }-- function chr(c) {- var x = new String(c);- x.isChar = true;- return x;- }-- function txt(str) {- var t = new String(str);- t.isText = true;- return t;- }-- var count = 0;- function guid(_) { return count++ }-- function copy(r) {- var o = {};- for (var i in r) { o[i] = r[i]; }- return o;- }-- function remove(x,r) {- var o = copy(r);- if (x in o._) {- o[x] = o._[x][0];- o._[x] = o._[x].slice(1);- if (o._[x].length === 0) { delete o._[x]; }- } else {- delete o[x];- }- return o;- }-- function replace(kvs,r) {- var o = copy(r);- for (var i = kvs.length; i--; ) {- var kvsi = kvs[i];- o[kvsi[0]] = kvsi[1];- }- return o;- }-- function insert(x,v,r) {- var o = copy(r);- if (x in o) o._[x] = [o[x]].concat(x in o._ ? o._[x].slice(0) : []);- o[x] = v;- return o;- }-- function max(a,b) { return a > b ? a : b }- function min(a,b) { return a < b ? a : b }-- function mod(a,b) {- if (b === 0) {- throw new Error("Cannot perform mod 0. Division by zero error.");- }- var r = a % b;- var m = a === 0 ? 0 : (b > 0 ? (a >= 0 ? r : r+b) : -mod(-a,-b));-- return m === b ? 0 : m;- }-- function htmlHeight(width, html) {- var t = document.createElement('div');- t.innerHTML = html;- if (width > 0) { t.style.width = width + "px"; }- t.style.visibility = "hidden";- t.style.styleFloat = "left";- t.style.cssFloat = "left";-- document.body.appendChild(t);- var style = window.getComputedStyle(t, null);- var w = Math.ceil(style.getPropertyValue("width").slice(0,-2) - 0);- var h = Math.ceil(style.getPropertyValue("height").slice(0,-2) - 0);- document.body.removeChild(t);- return Tuple2(w,h);- }-- function getXY(e) {- var posx = 0;- var posy = 0;- if (e.pageX || e.pageY) {- posx = e.pageX;- posy = e.pageY;- } else if (e.clientX || e.clientY) {- posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;- posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;- }-- if (elm.display === ElmRuntime.Display.COMPONENT) {- var rect = elm.node.getBoundingClientRect();- var relx = rect.left + document.body.scrollLeft + document.documentElement.scrollLeft;- var rely = rect.top + document.body.scrollTop + document.documentElement.scrollTop;- // TODO: figure out if there is a way to avoid rounding here- posx = posx - Math.round(relx) - elm.node.clientLeft;- posy = posy - Math.round(rely) - elm.node.clientTop;- }- return Tuple2(posx, posy);- }-- return elm.Native.Utils.values = {- eq:eq,- cmp:cmp,- compare:F2(compare),- Tuple0:Tuple0,- Tuple2:Tuple2,- chr:chr,- txt:txt,- copy: copy,- remove: remove,- replace: replace,- insert: insert,- guid: guid,- max : F2(max),- min : F2(min),- mod : F2(mod),- htmlHeight: F2(htmlHeight),- getXY: getXY,- toFloat: function(x) { return +x; }- };-};-Elm.Native.Graphics.Collage = {};-Elm.Native.Graphics.Collage.make = function(elm) {-- elm.Native = elm.Native || {};- elm.Native.Graphics = elm.Native.Graphics || {};- elm.Native.Graphics.Collage = elm.Native.Graphics.Collage || {};- if (elm.Native.Graphics.Collage.values) return elm.Native.Graphics.Collage.values;-- var newElement = Elm.Graphics.Element.make(elm).newElement;- var C = ElmRuntime.use(ElmRuntime.Render.Collage);-- function collage(w,h,forms) {- return A3(newElement, w, h, {- ctor: 'Custom',- type: 'Collage',- render: C.render,- update: C.update,- model: {w:w, h:h, forms:forms}- });- }- return elm.Native.Graphics.Collage.values = { collage:F3(collage) };--};Elm.Native.Graphics.Input = {};-Elm.Native.Graphics.Input.make = function(elm) {-- elm.Native = elm.Native || {};- elm.Native.Graphics = elm.Native.Graphics || {};- elm.Native.Graphics.Input = elm.Native.Graphics.Input || {};- if (elm.Native.Graphics.Input.values) return elm.Native.Graphics.Input.values;-- var Render = ElmRuntime.use(ElmRuntime.Render.Element);- var newNode = ElmRuntime.use(ElmRuntime.Render.Utils).newElement;-- var Signal = Elm.Signal.make(elm);- var newElement = Elm.Graphics.Element.make(elm).newElement;- var JS = Elm.Native.JavaScript.make(elm);- var Utils = Elm.Native.Utils.make(elm);- var Tuple2 = Utils.Tuple2;-- function dropDown(values) {- var entries = JS.fromList(values);- var events = Signal.constant(entries[0]._1);-- var drop = newNode('select');- drop.style.border = '0 solid';- for (var i = 0; i < entries.length; ++i) {- var option = newNode('option');- var name = JS.fromString(entries[i]._0);- option.value = name;- option.innerHTML = name;- drop.appendChild(option);- }- drop.addEventListener('change', function() {- elm.notify(events.id, entries[drop.selectedIndex]._1);- });-- var t = drop.cloneNode(true);- t.style.visibility = "hidden";-- elm.node.appendChild(t);- var style = window.getComputedStyle(t, null);- var w = Math.ceil(style.getPropertyValue("width").slice(0,-2) - 0);- var h = Math.ceil(style.getPropertyValue("height").slice(0,-2) - 0);- elm.node.removeChild(t);- - console.log(w,h);- var element = A3(newElement, w, h, {- ctor: 'Custom',- type: 'DropDown',- render: function render(model) { return drop; },- update: function update(node, oldModel, newModel) {},- model: {}- });-- return Tuple2(Signal.constant(element), events);- }-- function buttons(defaultValue) {- var events = Signal.constant(defaultValue);-- function render(model) {- var b = newNode('button');- b.style.display = 'block';- b.elmEvent = model.event;- function click() { elm.notify(events.id, b.elmEvent); }- b.addEventListener('click', click);- b.innerHTML = model.text;- return b;- }-- function update(node, oldModel, newModel) {- node.elmEvent = newModel.event;- var txt = newModel.text;- if (oldModel.text !== txt) node.innerHTML = txt;- }-- function button(evnt, txt) {- return A3(newElement, 100, 40, {- ctor: 'Custom',- type: 'Button',- render: render,- update: update,- model: { event:evnt, text:JS.fromString(txt) }- });- }-- return { _:{}, button:F2(button), events:events };- }-- function customButtons(defaultValue) {- var events = Signal.constant(defaultValue);-- function render(model) {- var btn = newNode('div');- btn.elmEvent = model.event;-- btn.elmUp = Render.render(model.up);- btn.elmHover = Render.render(model.hover);- btn.elmDown = Render.render(model.down);-- function replace(node) {- if (node !== btn.firstChild) btn.replaceChild(node, btn.firstChild);- }- var overCount = 0;- function over(e) {- if (overCount++ > 0) return;- replace(btn.elmHover);- }- function out(e) {- if (btn.contains(e.toElement || e.relatedTarget)) return;- overCount = 0;- replace(btn.elmUp);- }- function up() {- replace(btn.elmHover);- elm.notify(events.id, btn.elmEvent);- }- function down() { replace(btn.elmDown); }- btn.addEventListener('mouseover', over);- btn.addEventListener('mouseout' , out);- btn.addEventListener('mousedown', down);- btn.addEventListener('mouseup' , up);-- btn.appendChild(btn.elmUp);-- var clicker = newNode('div');- clicker.style.width = btn.elmUp.style.width;- clicker.style.height = btn.elmUp.style.height;- clicker.style.position = 'absolute';- clicker.style.top = 0;- btn.appendChild(clicker);-- return btn;- }-- function update(node, oldModel, newModel) {- node.elmEvent = newModel.event;- Render.update(node.elmUp, oldModel.up, newModel.up)- Render.update(node.elmHover, oldModel.hover, newModel.hover)- Render.update(node.elmDown, oldModel.down, newModel.down)- }-- function button(evnt, up, hover, down) {- return A3(newElement,- Math.max(up.props.width, hover.props.width, down.props.width),- Math.max(up.props.height, hover.props.height, down.props.height),- { ctor: 'Custom',- type: 'CustomButton',- render: render,- update: update,- model: { event:evnt, up:up, hover:hover, down:down }- });- }-- return { _:{}, customButton:F4(button), events:events };- }--- function hoverables(defaultValue) {- var events = Signal.constant(defaultValue);- function hoverable(handler, elem) {- function onHover(bool) {- elm.notify(events.id, handler(bool));- }- var props = Utils.replace([['hover',onHover]], elem.props);- return { props:props, element:elem.element };- }- return { _:{}, hoverable:F2(hoverable), events:events };- }--- function checkboxes(defaultValue) {- var events = Signal.constant(defaultValue);-- function render(model) {- var b = newNode('input');- b.type = 'checkbox';- b.checked = model.checked;- b.style.display = 'block';- b.elmHandler = model.handler;- function change() { elm.notify(events.id, b.elmHandler(b.checked)); }- b.addEventListener('change', change);- return b;- }-- function update(node, oldModel, newModel) {- node.elmHandler = newModel.handler;- node.checked = newModel.checked;- return true;- }-- function box(handler, checked) {- return A3(newElement, 13, 13, {- ctor: 'Custom',- type: 'CheckBox',- render: render,- update: update,- model: { checked:checked, handler:handler }- });- }-- return { _:{}, checkbox:F2(box), events:events };- }-- function setRange(node, start, end, dir) {- if (node.parentNode) {- node.setSelectionRange(start, end, dir);- } else {- setTimeout(function(){node.setSelectionRange(start, end, dir);}, 0);- }- }-- function mkTextPool(type) { return function fields(defaultValue) {- var events = Signal.constant(defaultValue);-- var state = null;-- function render(model) {- var field = newNode('input');- field.elmHandler = model.handler;-- field.id = 'test';- field.type = type;- field.placeholder = JS.fromString(model.placeHolder);- field.value = JS.fromString(model.state.string);- setRange(field, model.state.selectionStart, model.state.selectionEnd, 'forward');- field.style.border = 'none';- state = model.state;-- function update() {- var start = field.selectionStart,- end = field.selectionEnd;- if (field.selectionDirection === 'backward') {- start = end;- end = field.selectionStart;- }- state = { _:{},- string:JS.toString(field.value),- selectionStart:start,- selectionEnd:end };- elm.notify(events.id, field.elmHandler(state));- }- function mousedown() {- update();- elm.node.addEventListener('mouseup', mouseup);- }- function mouseup() {- update();- elm.node.removeEventListener('mouseup', mouseup)- }- field.addEventListener('keyup', update);- field.addEventListener('mousedown', mousedown);-- return field;- }-- function update(node, oldModel, newModel) {- node.elmHandler = newModel.handler;- if (state === newModel.state) return;- var newStr = JS.fromString(newModel.state.string);- if (node.value !== newStr) node.value = newStr;-- var start = newModel.state.selectionStart;- var end = newModel.state.selectionEnd;- var direction = 'forward';- if (end < start) {- start = end;- end = newModel.state.selectionStart;- direction = 'backward';- }- - if (node.selectionStart !== start- || node.selectionEnd !== end- || node.selectionDirection !== direction) {- setRange(node, start, end, direction);- }- }-- function field(handler, placeHolder, state) {- return A3(newElement, 200, 30,- { ctor: 'Custom',- type: type + 'Input',- render: render,- update: update,- model: { handler:handler,- placeHolder:placeHolder,- state:state }- });- }-- return { _:{}, field:F3(field), events:events };- }- }-- return elm.Native.Graphics.Input.values = {- buttons:buttons,- customButtons:customButtons,- hoverables:hoverables,- checkboxes:checkboxes,- fields:mkTextPool('text'),- emails:mkTextPool('email'),- passwords:mkTextPool('password'),- dropDown:dropDown- };--};-Elm.Native.Http = {};-Elm.Native.Http.make = function(elm) {-- elm.Native = elm.Native || {};- elm.Native.Http = elm.Native.Http || {};- if (elm.Native.Http.values) return elm.Native.Http.values;--- var JS = Elm.JavaScript.make(elm);- var List = Elm.List.make(elm);- var Signal = Elm.Signal.make(elm);--- function registerReq(queue,responses) { return function(req) {- if (req.url.ctor !== '[]') { sendReq(queue,responses,req); }- };- }-- function updateQueue(queue,responses) {- if (queue.length > 0) {- elm.notify(responses.id, queue[0].value);- if (queue[0].value.ctor !== 'Waiting') {- queue.shift();- setTimeout(function() { updateQueue(queue,responses); }, 0);- }- }- }-- function sendReq(queue,responses,req) {- var response = { value: { ctor:'Waiting' } };- queue.push(response);-- var request = null;- if (window.ActiveXObject) { request = new ActiveXObject("Microsoft.XMLHTTP"); }- if (window.XMLHttpRequest) { request = new XMLHttpRequest(); }- request.onreadystatechange = function(e) {- if (request.readyState === 4) {- response.value = (request.status >= 200 && request.status < 300 ?- { ctor:'Success', _0:JS.toString(request.responseText) } :- { ctor:'Failure', _0:request.status, _1:JS.toString(request.statusText) });- setTimeout(function() { updateQueue(queue,responses); }, 0);- }- };- request.open(JS.fromString(req.verb), JS.fromString(req.url), true);- function setHeader(pair) {- request.setRequestHeader( JS.fromString(pair._0), JS.fromString(pair._1) );- }- List.map(setHeader)(req.headers);- request.send(JS.fromString(req.body));- }-- function send(requests) {- var responses = Signal.constant(elm.Http.values.Waiting);- var sender = A2( Signal.lift, registerReq([],responses), requests );- function f(x) { return function(y) { return x; } }- return A3( Signal.lift2, f, responses, sender );- }-- return elm.Native.Http.values = {send:send};--};-Elm.Native.Keyboard = {};-Elm.Native.Keyboard.make = function(elm) {-- elm.Native = elm.Native || {};- elm.Native.Keyboard = elm.Native.Keyboard || {};- if (elm.Native.Keyboard.values) return elm.Native.Keyboard.values;-- // Duplicated from Native.Signal- function send(node, timestep, changed) {- var kids = node.kids;- for (var i = kids.length; i--; ) {- kids[i].recv(timestep, changed, node.id);- }- }-- var Signal = Elm.Signal.make(elm);- var NList = Elm.Native.List.make(elm);- var Utils = Elm.Native.Utils.make(elm);-- var downEvents = Signal.constant(0);- var upEvents = Signal.constant(0);- var blurEvents = Signal.constant(0);-- elm.addListener([downEvents.id], document, 'keydown', function down(e) {- elm.notify(downEvents.id, e.keyCode);- });-- elm.addListener([upEvents.id], document, 'keyup', function up(e) {- elm.notify(upEvents.id, e.keyCode);- });-- elm.addListener([blurEvents.id], document, 'blur', function blur(e) {- elm.notify(blurEvents.id, NList.Nil);- });-- function KeyMerge(down, up, blur) {- var args = [down,up,blur];- this.id = Utils.guid();- // Ignore starting values here- this.value = NList.Nil- this.kids = [];- - var n = args.length;- var count = 0;- var isChanged = false;-- this.recv = function(timestep, changed, parentID) {- ++count;- if (changed) { - // We know this a change must only be one of the following cases- if (parentID === down.id && !(NList.member(down.value)(this.value))) {- isChanged = true;- this.value = NList.Cons(down.value, this.value); - } - if (parentID === up.id) {- isChanged = true;- var notEq = function(kc) { return kc !== up.value };- this.value = NList.filter(notEq)(this.value);- } - if (parentID === blur.id) {- isChanged = true;- this.value = NList.Nil;- }- }- if (count == n) {- send(this, timestep, isChanged);- isChanged = false;- count = 0;- }- };-- for (var i = n; i--; ) { args[i].kids.push(this); }-- }-- var keysDown = Signal.dropRepeats(new KeyMerge(downEvents,upEvents,blurEvents));-- function keySignal(f) {- var signal = A2(Signal.lift, f, keysDown);- // must set the default number of kids to make it possible to filter- // these signals if they are not actually used.- keysDown.defaultNumberOfKids += 1;- signal.defaultNumberOfKids = 1;- var filtered = Signal.dropRepeats(signal)- filtered.defaultNumberOfKids = 0;- return filtered;- }-- function dir(up, down, left, right) {- function f(ks) {- var x = 0, y = 0;- while (ks.ctor === "::") {- switch (ks._0) {- case left : --x; break;- case right: ++x; break;- case up : ++y; break;- case down : --y; break;- }- ks = ks._1;- }- return { _:{}, x:x, y:y };- }- return keySignal(f);- }-- function is(key) { return keySignal(NList.member(key)); }-- var lastPressed = Signal.dropRepeats(downEvents);-- return elm.Native.Keyboard.values = {- isDown:is,- directions:F4(dir),- keysDown:keysDown,- lastPressed:lastPressed- };--};-Elm.Native.Mouse = {};-Elm.Native.Mouse.make = function(elm) {-- elm.Native = elm.Native || {};- elm.Native.Mouse = elm.Native.Mouse || {};- if (elm.Native.Mouse.values) return elm.Native.Mouse.values;-- var Signal = Elm.Signal.make(elm);- var Utils = Elm.Native.Utils.make(elm);-- var position = Signal.constant(Utils.Tuple2(0,0));- position.defaultNumberOfKids = 2;-- // do not move x and y into Elm. By setting their default number- // of kids, it is possible to detatch the mouse listeners if- // they are not needed.- var x = A2( Signal.lift, function(p){return p._0}, position);- x.defaultNumberOfKids = 0;- var y = A2( Signal.lift, function(p){return p._1}, position);- y.defaultNumberOfKids = 0;-- var isDown = Signal.constant(false);- var isClicked = Signal.constant(false);- var clicks = Signal.constant(Utils.Tuple0);-- var node = elm.display === ElmRuntime.Display.FULLSCREEN ? document : elm.node;-- elm.addListener([isClicked.id, clicks.id], node, 'click', function click() {- elm.notify(isClicked.id, true);- elm.notify(clicks.id, Utils.Tuple0);- elm.notify(isClicked.id, false);- });- elm.addListener([isDown.id], node, 'mousedown', function down() {- elm.notify(isDown.id, true);- });- elm.addListener([isDown.id], node, 'mouseup', function up() {- elm.notify(isDown.id, false);- });- elm.addListener([position.id], node, 'mousemove', function move(e) {- elm.notify(position.id, Utils.getXY(e));- });-- return elm.Native.Mouse.values = {- position: position,- x:x,- y:y,- isClicked: isClicked,- isDown: isDown,- clicks: clicks- };-};Elm.Native.Random = {};-Elm.Native.Random.make = function(elm) {-- elm.Native = elm.Native || {};- elm.Native.Random = elm.Native.Random || {};- if (elm.Native.Random.values) return elm.Native.Random.values;-- var Signal = Elm.Signal.make(elm);- var List = Elm.Native.List.make(elm);-- function range(min, max, signal) {- function f(x) { return Math.floor(Math.random() * (max-min+1)) + min; }- return A2( Signal.lift, f, signal );- }-- function float_(signal) {- function f(x) { return Math.random(); }- return A2( Signal.lift, f, signal );- }-- function floatList(signal) {- function f(n) {- if (n < 0) return List.Nil;- var arr = new Array(n);- for (var i = n; i--; ) {- arr[i] = Math.random();- }- return List.fromArray(arr);- }- return A2( Signal.lift, f, signal );- }-- return elm.Native.Random.values = {- range: F3(range),- float_: float_,- floatList: floatList- };--};--Elm.Native.Signal = {};-Elm.Native.Signal.make = function(elm) {-- elm.Native = elm.Native || {};- elm.Native.Signal = elm.Native.Signal || {};- if (elm.Native.Signal.values) return elm.Native.Signal.values;-- var Utils = Elm.Native.Utils.make(elm);- var foldr1 = Elm.List.make(elm).foldr1;-- function send(node, timestep, changed) {- var kids = node.kids;- for (var i = kids.length; i--; ) {- kids[i].recv(timestep, changed, node.id);- }- }-- function Input(base) {- this.id = Utils.guid();- this.value = base;- this.kids = [];- this.defaultNumberOfKids = 0;- this.recv = function(timestep, eid, v) {- var changed = eid === this.id;- if (changed) { this.value = v; }- send(this, timestep, changed);- return changed;- };- elm.inputs.push(this);- }-- function LiftN(update, args) {- this.id = Utils.guid();- this.value = update();- this.kids = [];-- var n = args.length;- var count = 0;- var isChanged = false;-- this.recv = function(timestep, changed, parentID) {- ++count;- if (changed) { isChanged = true; }- if (count == n) {- if (isChanged) { this.value = update(); }- send(this, timestep, isChanged);- isChanged = false;- count = 0;- }- };- for (var i = n; i--; ) { args[i].kids.push(this); }- }-- function lift(func, a) {- function update() { return func(a.value); }- return new LiftN(update, [a]);- }- function lift2(func, a, b) {- function update() { return A2( func, a.value, b.value ); }- return new LiftN(update, [a,b]);- }- function lift3(func, a, b, c) {- function update() { return A3( func, a.value, b.value, c.value ); }- return new LiftN(update, [a,b,c]);- }- function lift4(func, a, b, c, d) {- function update() { return A4( func, a.value, b.value, c.value, d.value ); }- return new LiftN(update, [a,b,c,d]);- }- function lift5(func, a, b, c, d, e) {- function update() { return A5( func, a.value, b.value, c.value, d.value, e.value ); }- return new LiftN(update, [a,b,c,d,e]);- }- function lift6(func, a, b, c, d, e, f) {- function update() { return A6( func, a.value, b.value, c.value, d.value, e.value, f.value ); }- return new LiftN(update, [a,b,c,d,e,f]);- }- function lift7(func, a, b, c, d, e, f, g) {- function update() { return A7( func, a.value, b.value, c.value, d.value, e.value, f.value, g.value ); }- return new LiftN(update, [a,b,c,d,e,f,g]);- }- function lift8(func, a, b, c, d, e, f, g, h) {- function update() { return A8( func, a.value, b.value, c.value, d.value, e.value, f.value, g.value, h.value ); }- return new LiftN(update, [a,b,c,d,e,f,g,h]);- }-- function Foldp(step, state, input) {- this.id = Utils.guid();- this.value = state;- this.kids = [];-- this.recv = function(timestep, changed, parentID) {- if (changed) {- this.value = A2( step, input.value, this.value );- }- send(this, timestep, changed);- };- input.kids.push(this);- }-- function foldp(step, state, input) {- return new Foldp(step, state, input);- }-- function DropIf(pred,base,input) {- this.id = Utils.guid();- this.value = pred(input.value) ? base : input.value;- this.kids = [];- this.recv = function(timestep, changed, parentID) {- var chng = changed && !pred(input.value);- if (chng) { this.value = input.value; }- send(this, timestep, chng);- };- input.kids.push(this);- }-- function DropRepeats(input) {- this.id = Utils.guid();- this.value = input.value;- this.kids = [];- this.recv = function(timestep, changed, parentID) {- var chng = changed && !Utils.eq(this.value,input.value);- if (chng) { this.value = input.value; }- send(this, timestep, chng);- };- input.kids.push(this);- }-- function dropWhen(s1,b,s2) {- var pairs = lift2( F2(function(x,y){return {x:x,y:y};}), s1, s2 );- var dropped = new DropIf(function(p){return p.x;},{x:true,y:b},pairs);- return lift(function(p){return p.y;}, dropped);- }-- function timestamp(a) {- function update() { return Utils.Tuple2(Date.now(), a.value); }- return new LiftN(update, [a]);- }-- function SampleOn(s1,s2) {- this.id = Utils.guid();- this.value = s2.value;- this.kids = [];-- var count = 0;- var isChanged = false;-- this.recv = function(timestep, changed, parentID) {- if (parentID === s1.id) isChanged = changed;- ++count;- if (count == 2) {- if (isChanged) { this.value = s2.value; }- send(this, timestep, isChanged);- count = 0;- isChanged = false;- }- };- s1.kids.push(this);- s2.kids.push(this);- }-- function sampleOn(s1,s2) { return new SampleOn(s1,s2); }-- function delay(t,s) {- var delayed = new Input(s.value);- var firstEvent = true;- function update(v) {- if (firstEvent) { firstEvent = false; return; }- setTimeout(function() { elm.notify(delayed.id, v); }, t);- }- function first(a,b) { return a; }- return new SampleOn(delayed, lift2(F2(first), delayed, lift(update,s)));- }-- function Merge(s1,s2) {- this.id = Utils.guid();- this.value = s1.value;- this.kids = [];-- var next = null;- var count = 0;- var isChanged = false;-- this.recv = function(timestep, changed, parentID) {- ++count;- if (changed) {- isChanged = true;- if (parentID == s2.id && next === null) { next = s2.value; }- if (parentID == s1.id) { next = s1.value; }- }-- if (count == 2) {- if (isChanged) { this.value = next; next = null; }- send(this, timestep, isChanged);- isChanged = false;- count = 0;- }- };- s1.kids.push(this);- s2.kids.push(this);- }-- function merge(s1,s2) { return new Merge(s1,s2); }- function merges(ss) { return A2(foldr1, F2(merge), ss); }-- return elm.Native.Signal.values = {- constant : function(v) { return new Input(v); },- lift : F2(lift ),- lift2 : F3(lift2),- lift3 : F4(lift3),- lift4 : F5(lift4),- lift5 : F6(lift5),- lift6 : F7(lift6),- lift7 : F8(lift7),- lift8 : F9(lift8),- foldp : F3(foldp),- delay : F2(delay),- merge : F2(merge),- merges : merges,- count : function(s) { return foldp(F2(function(_,c) { return c+1; }), 0, s); },- countIf : F2(function(pred,s) {- return foldp(F2(function(x,c){- return pred(x) ? c+1 : c; }), 0, s)}),- keepIf : F3(function(pred,base,sig) {- return new DropIf(function(x) {return !pred(x);},base,sig); }),- dropIf : F3(function(pred,base,sig) { return new DropIf(pred,base,sig); }),- keepWhen : F3(function(s1,b,s2) {- return dropWhen(lift(function(b){return !b;},s1), b, s2); }),- dropWhen : F3(dropWhen),- dropRepeats : function(s) { return new DropRepeats(s);},- sampleOn : F2(sampleOn),- timestamp : timestamp- };-};-Elm.Native.Time = {};-Elm.Native.Time.make = function(elm) {-- elm.Native = elm.Native || {};- elm.Native.Time = elm.Native.Time || {};- if (elm.Native.Time.values) return elm.Native.Time.values;-- var Signal = Elm.Signal.make(elm);- var NS = Elm.Native.Signal.make(elm);- var Maybe = Elm.Maybe.make(elm);- var Utils = Elm.Native.Utils.make(elm);-- function fpsWhen(desiredFPS, isOn) {- var msPerFrame = 1000 / desiredFPS;- var prev = Date.now(), curr = prev, diff = 0, wasOn = true;- var ticker = Signal.constant(diff);- function tick(zero) { return function() {- curr = Date.now();- diff = zero ? 0 : curr - prev;- prev = curr;- elm.notify(ticker.id, diff);- };- }- var timeoutID = 0;- function f(isOn, t) {- if (isOn) {- timeoutID = setTimeout(tick(!wasOn && isOn), msPerFrame);- } else if (wasOn) {- clearTimeout(timeoutID);- }- wasOn = isOn;- return t;- }- return A3( Signal.lift2, F2(f), isOn, ticker );- }-- function everyWhen(t, isOn) {- var clock = Signal.constant(Date.now());- var id = setInterval(function tellTime() {- if (!elm.notify(clock.id, Date.now())) {- clearInterval(id);- }- }, t);- return clock;- }-- function since(t, s) {- function cmp(a,b) { return !Utils.eq(a,b); }- var dcount = Signal.count(A2(NS.delay, t, s));- return A3( Signal.lift2, F2(cmp), Signal.count(s), dcount );- }- function read(s) {- var t = Date.parse(s);- return isNaN(t) ? Maybe.Nothing : Maybe.Just(t);- }- return elm.Native.Time.values = {- fpsWhen : F2(fpsWhen),- fps : function(t) { return fpsWhen(t, Signal.constant(true)); },- every : function(t) { return everyWhen(t, Signal.constant(true)) },- delay : NS.delay,- timestamp : NS.timestamp,- since : F2(since),- toDate : function(t) { return new window.Date(t); },- read : read- };--};-Elm.Native.Touch = {};-Elm.Native.Touch.make = function(elm) {-- elm.Native = elm.Native || {};- elm.Native.Touch = elm.Native.Touch || {};- if (elm.Native.Touch.values) return elm.Native.Touch.values;-- var Signal = Elm.Signal.make(elm);- var JS = Elm.JavaScript.make(elm);- var Utils = Elm.Native.Utils.make(elm);-- function Dict() {- this.keys = [];- this.values = [];-- this.insert = function(key,value) {- this.keys.push(key);- this.values.push(value);- };- this.lookup = function(key) {- var i = this.keys.indexOf(key)- return i >= 0 ? this.values[i] : {x:0,y:0,t:0};- };- this.remove = function(key) {- var i = this.keys.indexOf(key);- if (i < 0) return;- var t = this.values[i];- this.keys.splice(i,1);- this.values.splice(i,1);- return t;- };- this.clear = function() {- this.keys = [];- this.values = [];- };- }- - var root = Signal.constant([]),- tapTime = 500,- hasTap = false,- tap = {_:{},x:0,y:0},- dict = new Dict();-- function touch(t) {- var r = dict.lookup(t.identifier);- var point = Utils.getXY(t);- return {_ : {},- id: t.identifier,- x : point._0,- y : point._1,- x0: r.x,- y0: r.y,- t0: r.t- };- }-- var node = elm.display === ElmRuntime.Display.FULLSCREEN ? document : elm.node;-- function start(e) {- var point = Utils.getXY(e);- dict.insert(e.identifier,- {x: point._0,- y: point._1,- t: Date.now()});- }- function end(e) {- var t = dict.remove(e.identifier);- if (Date.now() - t.t < tapTime) {- hasTap = true;- tap = {_:{}, x:t.x, y:t.y};- }- }-- function listen(name, f) {- function update(e) {- for (var i = e.changedTouches.length; i--; ) { f(e.changedTouches[i]); }- var ts = new Array(e.touches.length);- for (var i = e.touches.length; i--; ) { ts[i] = touch(e.touches[i]); }- elm.notify(root.id, ts);- e.preventDefault();- }- elm.addListener([root.id], node, name, update);- }-- listen("touchstart", start);- listen("touchmove", function(_){});- listen("touchend", end);- listen("touchcancel", end);- listen("touchleave", end);-- var mouseID = -1;- function move(e) {- var point = Utils.getXY(e);- for (var i = root.value.length; i--; ) {- if (root.value[i].id === mouseID) {- root.value[i].x = point._0;- root.value[i].y = point._1;- elm.notify(root.id, root.value);- break;- }- }- }- elm.addListener([root.id], node, "mousedown", function down(e) {- node.addEventListener("mousemove", move);- e.identifier = mouseID;- start(e);- root.value.push(touch(e));- elm.notify(root.id, root.value);- });- elm.addListener([root.id], node, "mouseup", function up(e) {- node.removeEventListener("mousemove", move);- e.identifier = mouseID;- end(e);- for (var i = root.value.length; i--; ) {- if (root.value[i].id === mouseID) {- root.value.splice(i, 1);- --mouseID;- break;- }- }- elm.notify(root.id, root.value);- });- elm.addListener([root.id], node, "blur", function blur(e) {- node.removeEventListener("mousemove", move);- if (root.value.length > 0) {- elm.notify(root.id, []);- --mouseID;- }- dict.clear();- });-- function dependency(f) {- var sig = A2( Signal.lift, f, root );- root.defaultNumberOfKids += 1;- sig.defaultNumberOfKids = 0;- return sig;- }-- var touches = dependency(JS.toList);-- var taps = function() {- var sig = dependency(function(_) { return tap; });- sig.defaultNumberOfKids = 1;- function pred(_) { var b = hasTap; hasTap = false; return b; }- var sig2 = A3( Signal.keepIf, pred, {_:{},x:0,y:0}, sig);- sig2.defaultNumberOfKids = 0;- return sig2;- }();-- return elm.Native.Touch.values = { touches: touches, taps: taps };--};Elm.Native.WebSocket = {};-Elm.Native.WebSocket.make = function(elm) {-- elm.Native = elm.Native || {};- elm.Native.WebSocket = elm.Native.WebSocket || {};- if (elm.Native.WebSocket.values) return elm.Native.WebSocket.values;-- var Signal = Elm.Signal.make(elm);- var JS = Elm.JavaScript.make(elm);- var List = Elm.Native.List.make(elm);-- function open(url, outgoing) {- var incoming = Signal.constant(List.Nil);- var ws = new WebSocket(JS.fromString(url));-- var pending = [];- var ready = false;- - ws.onopen = function(e) {- var len = pending.length;- for (var i = 0; i < len; ++i) { ws.send(pending[i]); }- ready = true;- };- ws.onmessage = function(event) {- elm.notify(incoming.id, JS.toString(event.data));- };- - function send(msg) {- var s = JS.fromString(msg);- ready ? ws.send(s) : pending.push(s);- }- - function take1(x,y) { return x }- return A3(Signal.lift2, F2(take1), incoming, A2(Signal.lift, send, outgoing));- }-- return elm.Native.WebSocket.values = { connect: F2(open) };-};-Elm.Native.Window = {};-Elm.Native.Window.make = function(elm) {-- elm.Native = elm.Native || {};- elm.Native.Window = elm.Native.Window || {};- if (elm.Native.Window.values) return elm.Native.Window.values;-- var Signal = Elm.Signal.make(elm);- var Tuple2 = Elm.Native.Utils.make(elm).Tuple2;-- function getWidth() { return elm.node.clientWidth; }- function getHeight() {- if (elm.display === ElmRuntime.Display.FULLSCREEN) {- return window.innerHeight;- }- return elm.node.clientHeight;- }-- var dimensions = Signal.constant(Tuple2(getWidth(), getHeight()));- dimensions.defaultNumberOfKids = 2;-- // Do not move width and height into Elm. By setting the default number of kids,- // the resize listener can be detached.- var width = A2(Signal.lift, function(p){return p._0;}, dimensions);- width.defaultNumberOfKids = 0;-- var height = A2(Signal.lift, function(p){return p._1;}, dimensions);- height.defaultNumberOfKids = 0;-- function resizeIfNeeded() {- var w = getWidth();- var h = getHeight();- if (dimensions.value._0 === w && dimensions.value._1 === h) return;- elm.notify(dimensions.id, Tuple2(w,h));- }- elm.addListener([dimensions.id], window, 'resize', resizeIfNeeded);-- return elm.Native.Window.values = {- dimensions:dimensions,- width:width,- height:height,- resizeIfNeeded:resizeIfNeeded- };--};-Elm.Automaton = Elm.Automaton || {};-Elm.Automaton.make = function (elm)- {- elm.Automaton = elm.Automaton || {};- if (elm.Automaton.values)- return elm.Automaton.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Automaton";- var Basics = Elm.Basics.make(elm);- var Signal = Elm.Signal.make(elm);- var List = Elm.List.make(elm);- var Maybe = Elm.Maybe.make(elm);- var _op = {};- var enqueue = F2(function (x,arg0)- {- return function ()- {- switch (arg0.ctor)- {case- "_Tuple2" :- return {ctor: "_Tuple2", _0: {ctor: "::", _0: x, _1: arg0._0}, _1: arg0._1}}- _E.Case($moduleName,- "on line 95, column 22 to 31");- }()- });- var empty = {ctor: "_Tuple2", _0: _J.toList([]), _1: _J.toList([])};- var dequeue = function (q)- {- return function ()- {- switch (q.ctor)- {case- "_Tuple2" :- switch (q._0.ctor)- {case- "[]" :- switch (q._1.ctor)- {case- "[]" :- return Maybe.Nothing}- break;}- switch (q._1.ctor)- {case- "::" :- return Maybe.Just({ctor: "_Tuple2", _0: q._1._0, _1: {ctor: "_Tuple2", _0: q._0, _1: q._1._1}})- case- "[]" :- return dequeue({ctor: "_Tuple2", _0: _J.toList([]), _1: List.reverse(q._0)})}- break;}- _E.Case($moduleName,"between lines 96 and 101");- }()- };- var Step = function (a)- {- return {ctor: "Step", _0: a}- };- var hiddenState = F2(function (s,f)- {- return Step(function (x)- {- return function ()- {- var $ = A2(f,x,s),- s$ = $._0,- out = $._1;- return {ctor: "_Tuple2", _0: A2(hiddenState,- s$,- f), _1: out}- }()- })- });- var average = function (k)- {- return function ()- {- var stepFull = F2(function (n,arg0)- {- return function ()- {- switch (arg0.ctor)- {case- "_Tuple3" :- return function ()- {- var _case12 = dequeue(arg0._0);- switch (_case12.ctor)- {case- "Just" :- switch (_case12._0.ctor)- {case- "_Tuple2" :- return function ()- {- var sum$ = arg0._2 + n - _case12._0._0;- return {ctor: "_Tuple2", _0: {ctor: "_Tuple3", _0: A2(enqueue,- n,- _case12._0._1), _1: arg0._1, _2: sum$}, _1: sum$ / Basics.toFloat(arg0._1)}- }()}- break;- case- "Nothing" :- return {ctor: "_Tuple2", _0: {ctor: "_Tuple3", _0: arg0._0, _1: arg0._1, _2: arg0._2}, _1: 0}}- _E.Case($moduleName,- "between lines 108 and 112");- }()}- _E.Case($moduleName,- "between lines 108 and 112");- }()- });- var step = F2(function (n,arg0)- {- return function ()- {- switch (arg0.ctor)- {case- "_Tuple3" :- return _N.eq(arg0._1,- k) ? A2(stepFull,- n,- {ctor: "_Tuple3", _0: arg0._0, _1: arg0._1, _2: arg0._2}) : {ctor: "_Tuple2", _0: {ctor: "_Tuple3", _0: A2(enqueue,- n,- arg0._0), _1: arg0._1 + 1, _2: arg0._2 + n}, _1: (arg0._2 + n) / (Basics.toFloat(arg0._1) + 1)}}- _E.Case($moduleName,- "between lines 105 and 106");- }()- });- return A2(hiddenState,- {ctor: "_Tuple3", _0: empty, _1: 0, _2: 0},- step)- }()- };- var pure = function (f)- {- return Step(function (x)- {- return {ctor: "_Tuple2", _0: pure(f), _1: f(x)}- })- };- var run = F3(function (auto,base,inputs)- {- return function ()- {- var step = F2(function (a,arg0)- {- return function ()- {- switch (arg0.ctor)- {case- "_Tuple2" :- switch (arg0._0.ctor)- {case- "Step" :- return arg0._0._0(a)}- break;}- _E.Case($moduleName,- "on line 35, column 28 to 31");- }()- });- return A2(Signal.lift,- function (arg0)- {- return function ()- {- switch (arg0.ctor)- {case- "_Tuple2" :- return arg0._1}- _E.Case($moduleName,- "on line 36, column 23 to 24");- }()- },- A3(Signal.foldp,- step,- {ctor: "_Tuple2", _0: auto, _1: base},- inputs))- }()- });- var state = F2(function (s,f)- {- return Step(function (x)- {- return function ()- {- var s$ = A2(f,x,s);- return {ctor: "_Tuple2", _0: A2(state,- s$,- f), _1: s$}- }()- })- });- var count = A2(state,- 0,- F2(function (arg1,c)- {- return function ()- {- return c + 1- }()- }));- var step = F2(function (a,arg0)- {- return function ()- {- switch (arg0.ctor)- {case- "Step" :- return arg0._0(a)}- _E.Case($moduleName,"on line 40, column 19 to 22");- }()- });- var combine = function (autos)- {- return Step(function (a)- {- return function ()- {- var $ = List.unzip(A2(List.map,- step(a),- autos)),- autos$ = $._0,- bs = $._1;- return {ctor: "_Tuple2", _0: combine(autos$), _1: bs}- }()- })- };- _op[">>>"] = F2(function (f,g)- {- return Step(function (a)- {- return function ()- {- var $ = A2(step,a,f),- f$ = $._0,- b = $._1;- var $ = A2(step,b,g),- g$ = $._0,- c = $._1;- return {ctor: "_Tuple2", _0: A2(_op[">>>"],- f$,- g$), _1: c}- }()- })- });- _op["<<<"] = F2(function (g,f)- {- return A2(_op[">>>"],f,g)- });- elm.Automaton.values = {_op: _op, pure: pure, state: state, hiddenState: hiddenState, run: run, step: step, combine: combine, count: count, average: average};- return elm.Automaton.values- };Elm.Basics = Elm.Basics || {};-Elm.Basics.make = function (elm)- {- elm.Basics = elm.Basics || {};- if (elm.Basics.values)- return elm.Basics.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Basics";- var Native = Native || {};- Native.Basics = Elm.Native.Basics.make(elm);- var _op = {};- _op["||"] = Native.Basics.or;- _op["|>"] = F2(function (x,f)- {- return f(x)- });- var xor = Native.Basics.xor;- var uncurry = Native.Basics.uncurry;- var truncate = Native.Basics.truncate;- var toFloat = Native.Basics.toFloat;- var tan = Native.Basics.tan;- var sqrt = Native.Basics.sqrt;- var snd = Native.Basics.snd;- var sin = Native.Basics.sin;- var round = Native.Basics.round;- var rem = Native.Basics.rem;- var radians = function (t)- {- return t- };- var pi = Native.Basics.pi;- var otherwise = true;- var not = Native.Basics.not;- var mod = Native.Basics.mod;- var min = Native.Basics.min;- var max = Native.Basics.max;- var logBase = Native.Basics.logBase;- var id = function (x)- {- return x- };- var fst = Native.Basics.fst;- var floor = Native.Basics.floor;- var flip = F3(function (f,b,a)- {- return A2(f,a,b)- });- var e = Native.Basics.e;- var div = Native.Basics.div;- var curry = Native.Basics.curry;- var cos = Native.Basics.cos;- var compare = Native.Basics.compare;- var clamp = Native.Basics.clamp;- var ceiling = Native.Basics.ceiling;- var atan2 = Native.Basics.atan2;- var atan = Native.Basics.atan;- var asin = Native.Basics.asin;- var acos = Native.Basics.acos;- var abs = Native.Basics.abs;- _op["^"] = Native.Basics.exp;- var LT = {ctor: "LT"};- var GT = {ctor: "GT"};- var EQ = {ctor: "EQ"};- _op[">="] = Native.Basics.ge;- _op[">"] = Native.Basics.gt;- _op["=="] = Native.Basics.eq;- _op["<|"] = F2(function (f,x)- {- return f(x)- });- _op["<="] = Native.Basics.le;- _op["<"] = Native.Basics.lt;- _op["/="] = Native.Basics.neq;- _op["/"] = Native.Basics.floatDiv;- _op["."] = F3(function (f,g,x)- {- return f(g(x))- });- _op["-"] = Native.Basics.sub;- _op["+"] = Native.Basics.add;- var toPolar = function (arg0)- {- return function ()- {- switch (arg0.ctor)- {case- "_Tuple2" :- return {ctor: "_Tuple2", _0: Native.Basics.sqrt(Math.pow(arg0._0,- 2) + Math.pow(arg0._1,- 2)), _1: A2(Native.Basics.atan2,- arg0._1,- arg0._0)}}- _E.Case($moduleName,"on line 76, column 18 to 73");- }()- };- _op["*"] = Native.Basics.mul;- var degrees = function (d)- {- return d * Native.Basics.pi / 180- };- var fromPolar = function (arg0)- {- return function ()- {- switch (arg0.ctor)- {case- "_Tuple2" :- return {ctor: "_Tuple2", _0: arg0._0 * Native.Basics.cos(arg0._1), _1: arg0._0 * Native.Basics.sin(arg0._1)}}- _E.Case($moduleName,"on line 70, column 20 to 68");- }()- };- var turns = function (r)- {- return 2 * Native.Basics.pi * r- };- _op["&&"] = Native.Basics.and;- elm.Basics.values = {_op: _op, radians: radians, degrees: degrees, turns: turns, fromPolar: fromPolar, toPolar: toPolar, div: div, rem: rem, mod: mod, cos: cos, sin: sin, tan: tan, acos: acos, asin: asin, atan: atan, atan2: atan2, sqrt: sqrt, abs: abs, logBase: logBase, clamp: clamp, pi: pi, e: e, compare: compare, min: min, max: max, xor: xor, not: not, otherwise: otherwise, round: round, truncate: truncate, floor: floor, ceiling: ceiling, toFloat: toFloat, id: id, fst: fst, snd: snd, flip: flip, curry: curry, uncurry: uncurry, LT: LT, EQ: EQ, GT: GT};- return elm.Basics.values- };Elm.Char = Elm.Char || {};-Elm.Char.make = function (elm)- {- elm.Char = elm.Char || {};- if (elm.Char.values)- return elm.Char.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Char";- var Native = Native || {};- Native.Char = Elm.Native.Char.make(elm);- var _op = {};- var toUpper = Native.Char.toUpper;- var toLower = Native.Char.toLower;- var toLocaleUpper = Native.Char.toLocaleUpper;- var toLocaleLower = Native.Char.toLocaleLower;- var toCode = Native.Char.toCode;- var isUpper = Native.Char.isUpper;- var isOctDigit = Native.Char.isOctDigit;- var isLower = Native.Char.isLower;- var isHexDigit = Native.Char.isHexDigit;- var isDigit = Native.Char.isDigit;- var fromCode = Native.Char.fromCode;- elm.Char.values = {_op: _op, isUpper: isUpper, isLower: isLower, isDigit: isDigit, isOctDigit: isOctDigit, isHexDigit: isHexDigit, toUpper: toUpper, toLower: toLower, toLocaleUpper: toLocaleUpper, toLocaleLower: toLocaleLower, toCode: toCode, fromCode: fromCode};- return elm.Char.values- };Elm.Color = Elm.Color || {};-Elm.Color.make = function (elm)- {- elm.Color = elm.Color || {};- if (elm.Color.values)- return elm.Color.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Color";- var Native = Native || {};- Native.Color = Elm.Native.Color.make(elm);- var Basics = Elm.Basics.make(elm);- var _op = {};- var hsva = Native.Color.hsva;- var hsv = Native.Color.hsv;- var greyscale = function (p)- {- return A3(hsv,0,0,1 - p)- };- var grayscale = function (p)- {- return A3(hsv,0,0,1 - p)- };- var complement = Native.Color.complement;- var Radial = F5(function (a,b,c,d,e)- {- return {ctor: "Radial", _0: a, _1: b, _2: c, _3: d, _4: e}- });- var radial = Radial;- var Linear = F3(function (a,b,c)- {- return {ctor: "Linear", _0: a, _1: b, _2: c}- });- var linear = Linear;- var Color = F4(function (a,b,c,d)- {- return {ctor: "Color", _0: a, _1: b, _2: c, _3: d}- });- var black = A4(Color,0,0,0,1);- var blue = A4(Color,52,101,164,1);- var brown = A4(Color,193,125,17,1);- var charcoal = A4(Color,85,87,83,1);- var darkBlue = A4(Color,32,74,135,1);- var darkBrown = A4(Color,143,89,2,1);- var darkCharcoal = A4(Color,46,52,54,1);- var darkGray = A4(Color,186,189,182,1);- var darkGreen = A4(Color,78,154,6,1);- var darkGrey = A4(Color,186,189,182,1);- var darkOrange = A4(Color,206,92,0,1);- var darkPurple = A4(Color,92,53,102,1);- var darkRed = A4(Color,164,0,0,1);- var darkYellow = A4(Color,196,160,0,1);- var gray = A4(Color,211,215,207,1);- var green = A4(Color,115,210,22,1);- var grey = A4(Color,211,215,207,1);- var lightBlue = A4(Color,114,159,207,1);- var lightBrown = A4(Color,233,185,110,1);- var lightCharcoal = A4(Color,136,138,133,1);- var lightGray = A4(Color,238,238,236,1);- var lightGreen = A4(Color,138,226,52,1);- var lightGrey = A4(Color,238,238,236,1);- var lightOrange = A4(Color,252,175,62,1);- var lightPurple = A4(Color,173,127,168,1);- var lightRed = A4(Color,239,41,41,1);- var lightYellow = A4(Color,255,233,79,1);- var orange = A4(Color,245,121,0,1);- var purple = A4(Color,117,80,123,1);- var red = A4(Color,204,0,0,1);- var rgb = F3(function (r,g,b)- {- return A4(Color,r,g,b,1)- });- var rgba = Color;- var white = A4(Color,255,255,255,1);- var yellow = A4(Color,237,212,0,1);- elm.Color.values = {_op: _op, rgba: rgba, rgb: rgb, lightRed: lightRed, red: red, darkRed: darkRed, lightOrange: lightOrange, orange: orange, darkOrange: darkOrange, lightYellow: lightYellow, yellow: yellow, darkYellow: darkYellow, lightGreen: lightGreen, green: green, darkGreen: darkGreen, lightBlue: lightBlue, blue: blue, darkBlue: darkBlue, lightPurple: lightPurple, purple: purple, darkPurple: darkPurple, lightBrown: lightBrown, brown: brown, darkBrown: darkBrown, black: black, white: white, lightGrey: lightGrey, grey: grey, darkGrey: darkGrey, lightGray: lightGray, gray: gray, darkGray: darkGray, lightCharcoal: lightCharcoal, charcoal: charcoal, darkCharcoal: darkCharcoal, grayscale: grayscale, greyscale: greyscale, complement: complement, hsva: hsva, hsv: hsv, linear: linear, radial: radial, Color: Color, Linear: Linear, Radial: Radial};- return elm.Color.values- };Elm.Date = Elm.Date || {};-Elm.Date.make = function (elm)- {- elm.Date = elm.Date || {};- if (elm.Date.values)- return elm.Date.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Date";- var Native = Native || {};- Native.Date = Elm.Native.Date.make(elm);- var Time = Elm.Time.make(elm);- var Maybe = Elm.Maybe.make(elm);- var _op = {};- var year = Native.Date.year;- var toTime = Native.Date.toTime;- var second = Native.Date.second;- var read = Native.Date.read;- var month = Native.Date.month;- var minute = Native.Date.minute;- var hour = Native.Date.hour;- var dayOfWeek = Native.Date.dayOfWeek;- var day = Native.Date.day;- var Wed = {ctor: "Wed"};- var Tue = {ctor: "Tue"};- var Thu = {ctor: "Thu"};- var Sun = {ctor: "Sun"};- var Sep = {ctor: "Sep"};- var Sat = {ctor: "Sat"};- var Oct = {ctor: "Oct"};- var Nov = {ctor: "Nov"};- var Mon = {ctor: "Mon"};- var May = {ctor: "May"};- var Mar = {ctor: "Mar"};- var Jun = {ctor: "Jun"};- var Jul = {ctor: "Jul"};- var Jan = {ctor: "Jan"};- var Fri = {ctor: "Fri"};- var Feb = {ctor: "Feb"};- var Dec = {ctor: "Dec"};- var Date = {ctor: "Date"};- var Aug = {ctor: "Aug"};- var Apr = {ctor: "Apr"};- elm.Date.values = {_op: _op, read: read, toTime: toTime, year: year, month: month, day: day, dayOfWeek: dayOfWeek, hour: hour, minute: minute, second: second, Date: Date, Mon: Mon, Tue: Tue, Wed: Wed, Thu: Thu, Fri: Fri, Sat: Sat, Sun: Sun, Jan: Jan, Feb: Feb, Mar: Mar, Apr: Apr, May: May, Jun: Jun, Jul: Jul, Aug: Aug, Sep: Sep, Oct: Oct, Nov: Nov, Dec: Dec};- return elm.Date.values- };Elm.Dict = Elm.Dict || {};-Elm.Dict.make = function (elm)- {- elm.Dict = elm.Dict || {};- if (elm.Dict.values)- return elm.Dict.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Dict";- var Basics = Elm.Basics.make(elm);- var Maybe = Elm.Maybe.make(elm);- var Native = Native || {};- Native.Error = Elm.Native.Error.make(elm);- var List = Elm.List.make(elm);- var Native = Native || {};- Native.Utils = Elm.Native.Utils.make(elm);- var _op = {};- var Red = {ctor: "Red"};- var RBNode = F5(function (a,b,c,d,e)- {- return {ctor: "RBNode", _0: a, _1: b, _2: c, _3: d, _4: e}- });- var rotateLeft = function (t)- {- return function ()- {- switch (t.ctor)- {case- "RBNode" :- switch (t._4.ctor)- {case- "RBNode" :- return A5(RBNode,- t._0,- t._4._1,- t._4._2,- A5(RBNode,Red,t._1,t._2,t._3,t._4._3),- t._4._4)}- break;}- return Native.Error.raise("rotateLeft of a node without enough children")- }()- };- var rotateLeftIfNeeded = function (t)- {- return function ()- {- switch (t.ctor)- {case- "RBNode" :- switch (t._4.ctor)- {case- "RBNode" :- switch (t._4._0.ctor)- {case- "Red" :- return rotateLeft(t)}- break;}- break;}- return t- }()- };- var rotateRight = function (t)- {- return function ()- {- switch (t.ctor)- {case- "RBNode" :- switch (t._3.ctor)- {case- "RBNode" :- return A5(RBNode,- t._0,- t._3._1,- t._3._2,- t._3._3,- A5(RBNode,- Red,- t._1,- t._2,- t._3._4,- t._4))}- break;}- return Native.Error.raise("rotateRight of a node without enough children")- }()- };- var rotateRightIfNeeded = function (t)- {- return function ()- {- switch (t.ctor)- {case- "RBNode" :- switch (t._3.ctor)- {case- "RBNode" :- switch (t._3._0.ctor)- {case- "Red" :- switch (t._3._3.ctor)- {case- "RBNode" :- switch (t._3._3._0.ctor)- {case- "Red" :- return rotateRight(t)}- break;}- break;}- break;}- break;}- return t- }()- };- var RBEmpty = function (a)- {- return {ctor: "RBEmpty", _0: a}- };- var max = function (t)- {- return function ()- {- switch (t.ctor)- {case- "RBEmpty" :- return Native.Error.raise("(max Empty) is not defined")- case- "RBNode" :- switch (t._4.ctor)- {case- "RBEmpty" :- return {ctor: "_Tuple2", _0: t._1, _1: t._2}}- return max(t._4)}- _E.Case($moduleName,"between lines 63 and 68");- }()- };- var redden = function (t)- {- return function ()- {- switch (t.ctor)- {case- "RBEmpty" :- return Native.Error.raise("can\'t make a Leaf red")- case- "RBNode" :- return A5(RBNode,Red,t._1,t._2,t._3,t._4)}- _E.Case($moduleName,"between lines 285 and 290");- }()- };- var NBlack = {ctor: "NBlack"};- var LBlack = {ctor: "LBlack"};- var empty = RBEmpty(LBlack);- var findWithDefault = F3(function (base,k,t)- {- return function ()- {- switch (t.ctor)- {case- "RBEmpty" :- switch (t._0.ctor)- {case- "LBlack" :- return base}- break;- case- "RBNode" :- return function ()- {- var _case71 = A2(Native.Utils.compare,- k,- t._1);- switch (_case71.ctor)- {case- "EQ" :- return t._2- case- "GT" :- return A3(findWithDefault,- base,- k,- t._4)- case- "LT" :- return A3(findWithDefault,- base,- k,- t._3)}- _E.Case($moduleName,- "between lines 86 and 91");- }()}- _E.Case($moduleName,- "between lines 83 and 91");- }()- });- var foldl = F3(function (f,acc,t)- {- return function ()- {- switch (t.ctor)- {case- "RBEmpty" :- switch (t._0.ctor)- {case- "LBlack" :- return acc}- break;- case- "RBNode" :- return A3(foldl,- f,- A3(f,t._1,t._2,A3(foldl,f,acc,t._3)),- t._4)}- _E.Case($moduleName,"between lines 305 and 310");- }()- });- var foldr = F3(function (f,acc,t)- {- return function ()- {- switch (t.ctor)- {case- "RBEmpty" :- switch (t._0.ctor)- {case- "LBlack" :- return acc}- break;- case- "RBNode" :- return A3(foldr,- f,- A3(f,t._1,t._2,A3(foldr,f,acc,t._4)),- t._3)}- _E.Case($moduleName,"between lines 313 and 318");- }()- });- var keys = function (t)- {- return A3(foldr,- F3(function (k,v,acc)- {- return {ctor: "::", _0: k, _1: acc}- }),- _J.toList([]),- t)- };- var toList = function (t)- {- return A3(foldr,- F3(function (k,v,acc)- {- return {ctor: "::", _0: {ctor: "_Tuple2", _0: k, _1: v}, _1: acc}- }),- _J.toList([]),- t)- };- var values = function (t)- {- return A3(foldr,- F3(function (k,v,acc)- {- return {ctor: "::", _0: v, _1: acc}- }),- _J.toList([]),- t)- };- var lookup = F2(function (k,t)- {- return function ()- {- switch (t.ctor)- {case- "RBEmpty" :- switch (t._0.ctor)- {case- "LBlack" :- return Maybe.Nothing}- break;- case- "RBNode" :- return function ()- {- var _case93 = A2(Native.Utils.compare,- k,- t._1);- switch (_case93.ctor)- {case- "EQ" :- return Maybe.Just(t._2)- case- "GT" :- return A2(lookup,k,t._4)- case- "LT" :- return A2(lookup,k,t._3)}- _E.Case($moduleName,- "between lines 74 and 80");- }()}- _E.Case($moduleName,"between lines 71 and 80");- }()- });- var member = F2(function (k,t)- {- return Maybe.isJust(A2(lookup,k,t))- });- var map = F2(function (f,t)- {- return function ()- {- switch (t.ctor)- {case- "RBEmpty" :- switch (t._0.ctor)- {case- "LBlack" :- return RBEmpty(LBlack)}- break;- case- "RBNode" :- return A5(RBNode,- t._0,- t._1,- f(t._2),- A2(map,f,t._3),- A2(map,f,t._4))}- _E.Case($moduleName,"between lines 297 and 302");- }()- });- var min = function (t)- {- return function ()- {- switch (t.ctor)- {case- "RBEmpty" :- switch (t._0.ctor)- {case- "LBlack" :- return Native.Error.raise("(min Empty) is not defined")}- break;- case- "RBNode" :- switch (t._3.ctor)- {case- "RBEmpty" :- switch (t._3._0.ctor)- {case- "LBlack" :- return {ctor: "_Tuple2", _0: t._1, _1: t._2}}- break;}- return min(t._3)}- _E.Case($moduleName,"between lines 56 and 59");- }()- };- var LBBlack = {ctor: "LBBlack"};- var Black = {ctor: "Black"};- var blacken = function (t)- {- return function ()- {- switch (t.ctor)- {case- "RBEmpty" :- return RBEmpty(LBlack)- case- "RBNode" :- return A5(RBNode,Black,t._1,t._2,t._3,t._4)}- _E.Case($moduleName,"between lines 279 and 281");- }()- };- var ensureBlackRoot = function (t)- {- return function ()- {- switch (t.ctor)- {case- "RBEmpty" :- switch (t._0.ctor)- {case- "LBlack" :- return t}- break;- case- "RBNode" :- switch (t._0.ctor)- {case- "Black" :- return t- case- "Red" :- return A5(RBNode,- Black,- t._1,- t._2,- t._3,- t._4)}- break;}- _E.Case($moduleName,"between lines 143 and 149");- }()- };- var otherColor = function (c)- {- return function ()- {- switch (c.ctor)- {case- "Black" :- return Red- case- "Red" :- return Black}- _E.Case($moduleName,"on line 122, column 16 to 57");- }()- };- var color_flip = function (t)- {- return function ()- {- switch (t.ctor)- {case- "RBNode" :- switch (t._3.ctor)- {case- "RBNode" :- switch (t._4.ctor)- {case- "RBNode" :- return A5(RBNode,- otherColor(t._0),- t._1,- t._2,- A5(RBNode,- otherColor(t._3._0),- t._3._1,- t._3._2,- t._3._3,- t._3._4),- A5(RBNode,- otherColor(t._4._0),- t._4._1,- t._4._2,- t._4._3,- t._4._4))}- break;}- break;}- return Native.Error.raise("color_flip called on a Empty or Node with a Empty child")- }()- };- var color_flipIfNeeded = function (t)- {- return function ()- {- switch (t.ctor)- {case- "RBNode" :- switch (t._3.ctor)- {case- "RBNode" :- switch (t._3._0.ctor)- {case- "Red" :- switch (t._4.ctor)- {case- "RBNode" :- switch (t._4._0.ctor)- {case- "Red" :- return color_flip(t)}- break;}- break;}- break;}- break;}- return t- }()- };- var fixUp = function (t)- {- return color_flipIfNeeded(rotateRightIfNeeded(rotateLeftIfNeeded(t)))- };- var insert = F3(function (k,v,t)- {- return function ()- {- var ins = function (t)- {- return function ()- {- switch (t.ctor)- {case- "RBEmpty" :- switch (t._0.ctor)- {case- "LBlack" :- return A5(RBNode,- Red,- k,- v,- RBEmpty(LBlack),- RBEmpty(LBlack))}- break;- case- "RBNode" :- return function ()- {- var h = function ()- {- var _case163 = A2(Native.Utils.compare,- k,- t._1);- switch (_case163.ctor)- {case- "EQ" :- return A5(RBNode,- t._0,- t._1,- v,- t._3,- t._4)- case- "GT" :- return A5(RBNode,- t._0,- t._1,- t._2,- t._3,- ins(t._4))- case- "LT" :- return A5(RBNode,- t._0,- t._1,- t._2,- ins(t._3),- t._4)}- _E.Case($moduleName,- "between lines 156 and 160");- }();- return fixUp(h)- }()}- _E.Case($moduleName,- "between lines 153 and 161");- }()- };- return ensureBlackRoot(ins(t))- }()- });- var fromList = function (assocs)- {- return A3(List.foldl,- F2(function (arg1,d)- {- return function ()- {- switch (arg1.ctor)- {case- "_Tuple2" :- return A3(insert,arg1._0,arg1._1,d)}- _E.Case($moduleName,- "on line 348, column 43 to 55");- }()- }),- empty,- assocs)- };- var intersect = F2(function (t1,t2)- {- return function ()- {- var combine = F3(function (k,v,t)- {- return A2(member,- k,- t2) ? A3(insert,- k,- v,- t) : t- });- return A3(foldl,combine,empty,t1)- }()- });- var singleton = F2(function (k,v)- {- return A3(insert,k,v,RBEmpty(LBlack))- });- var union = F2(function (t1,t2)- {- return A3(foldl,insert,t2,t1)- });- var BBlack = {ctor: "BBlack"};- var blackish = function (arg0)- {- return function ()- {- switch (arg0.ctor)- {case- "RBNode" :- return _N.eq(arg0._0,Black) || _N.eq(arg0._0,BBlack)}- _E.Case($moduleName,"on line 243, column 31 to 56");- }()- };- var isBBlack = function (t)- {- return function ()- {- switch (t.ctor)- {case- "RBEmpty" :- switch (t._0.ctor)- {case- "LBBlack" :- return true}- break;- case- "RBNode" :- return function ()- {- switch (t._0.ctor)- {case- "BBlack" :- return true}- return false- }()}- return false- }()- };- var lessBlack = function (c)- {- return function ()- {- switch (c.ctor)- {case- "BBlack" :- return Black- case- "Black" :- return Red- case- "NBlack" :- return NBlack- case- "Red" :- return NBlack}- _E.Case($moduleName,"between lines 185 and 189");- }()- };- var balance_node = function (t)- {- return function ()- {- var assemble = function (col)- {- return function (xk)- {- return function (xv)- {- return function (yk)- {- return function (yv)- {- return function (zk)- {- return function (zv)- {- return function (a)- {- return function (b)- {- return function (c)- {- return function (d)- {- return A5(RBNode,- lessBlack(col),- yk,- yv,- A5(RBNode,- Black,- xk,- xv,- a,- b),- A5(RBNode,- Black,- zk,- zv,- c,- d))- }- }- }- }- }- }- }- }- }- }- };- return blackish(t) ? function ()- {- switch (t.ctor)- {case- "RBNode" :- switch (t._3.ctor)- {case- "RBNode" :- switch (t._3._0.ctor)- {case- "Red" :- switch (t._3._3.ctor)- {case- "RBNode" :- switch (t._3._3._0.ctor)- {case- "Red" :- return assemble(t._0)(t._3._3._1)(t._3._3._2)(t._3._1)(t._3._2)(t._1)(t._2)(t._3._3._3)(t._3._3._4)(t._3._4)(t._4)}- break;}- switch (t._3._4.ctor)- {case- "RBNode" :- switch (t._3._4._0.ctor)- {case- "Red" :- return assemble(t._0)(t._3._1)(t._3._2)(t._3._4._1)(t._3._4._2)(t._1)(t._2)(t._3._3)(t._3._4._3)(t._3._4._4)(t._4)}- break;}- break;}- break;}- switch (t._4.ctor)- {case- "RBNode" :- switch (t._4._0.ctor)- {case- "Red" :- switch (t._4._3.ctor)- {case- "RBNode" :- switch (t._4._3._0.ctor)- {case- "Red" :- return assemble(t._0)(t._1)(t._2)(t._4._3._1)(t._4._3._2)(t._4._1)(t._4._2)(t._3)(t._4._3._3)(t._4._3._4)(t._4._4)}- break;}- switch (t._4._4.ctor)- {case- "RBNode" :- switch (t._4._4._0.ctor)- {case- "Red" :- return assemble(t._0)(t._1)(t._2)(t._4._1)(t._4._2)(t._4._4._1)(t._4._4._2)(t._3)(t._4._3)(t._4._4._3)(t._4._4._4)}- break;}- break;}- break;}- switch (t._0.ctor)- {case- "BBlack" :- switch (t._4.ctor)- {case- "RBNode" :- switch (t._4._0.ctor)- {case- "NBlack" :- switch (t._4._3.ctor)- {case- "RBNode" :- switch (t._4._3._0.ctor)- {case- "Black" :- return function ()- {- switch (t._4._4.ctor)- {case- "RBNode" :- switch (t._4._4._0.ctor)- {case- "Black" :- return A5(RBNode,- Black,- t._4._3._1,- t._4._3._2,- A5(RBNode,- Black,- t._1,- t._2,- t._3,- t._4._3._3),- A5(balance,- Black,- t._4._1,- t._4._2,- t._4._3._4,- redden(t._4._4)))}- break;}- return t- }()}- break;}- break;}- break;}- switch (t._3.ctor)- {case- "RBNode" :- switch (t._3._0.ctor)- {case- "NBlack" :- switch (t._3._4.ctor)- {case- "RBNode" :- switch (t._3._4._0.ctor)- {case- "Black" :- return function ()- {- switch (t._3._3.ctor)- {case- "RBNode" :- switch (t._3._3._0.ctor)- {case- "Black" :- return A5(RBNode,- Black,- t._3._4._1,- t._3._4._2,- A5(balance,- Black,- t._3._1,- t._3._2,- redden(t._3._3),- t._3._4._3),- A5(RBNode,- Black,- t._1,- t._2,- t._3._4._4,- t._4))}- break;}- return t- }()}- break;}- break;}- break;}- break;}- break;}- return t- }() : t- }()- };- var balance = F5(function (c,k,v,l,r)- {- return balance_node(A5(RBNode,c,k,v,l,r))- });- var lessBlackTree = function (t)- {- return function ()- {- switch (t.ctor)- {case- "RBEmpty" :- return RBEmpty(LBlack)- case- "RBNode" :- return A5(RBNode,- lessBlack(t._0),- t._1,- t._2,- t._3,- t._4)}- _E.Case($moduleName,"between lines 197 and 199");- }()- };- var moreBlack = function (c)- {- return function ()- {- switch (c.ctor)- {case- "BBlack" :- return BBlack- case- "Black" :- return BBlack- case- "NBlack" :- return Red- case- "Red" :- return Black}- _E.Case($moduleName,"between lines 179 and 183");- }()- };- var bubble = F5(function (c,k,v,l,r)- {- return isBBlack(l) || isBBlack(r) ? A5(balance,- moreBlack(c),- k,- v,- lessBlackTree(l),- lessBlackTree(r)) : A5(RBNode,- c,- k,- v,- l,- r)- });- var remove_max = function (t)- {- return function ()- {- switch (t.ctor)- {case- "RBNode" :- switch (t._4.ctor)- {case- "RBEmpty" :- return rem(t)}- return A5(bubble,- t._0,- t._1,- t._2,- t._3,- remove_max(t._4))}- _E.Case($moduleName,"between lines 234 and 236");- }()- };- var rem = function (t)- {- return function ()- {- switch (t.ctor)- {case- "RBNode" :- switch (t._3.ctor)- {case- "RBEmpty" :- switch (t._4.ctor)- {case- "RBEmpty" :- return function ()- {- switch (t._0.ctor)- {case- "Black" :- return RBEmpty(LBBlack)- case- "Red" :- return RBEmpty(LBlack)}- _E.Case($moduleName,- "between lines 213 and 216");- }()}- break;}- switch (t._0.ctor)- {case- "Black" :- switch (t._3.ctor)- {case- "RBEmpty" :- switch (t._4.ctor)- {case- "RBNode" :- return A5(RBNode,- Black,- t._4._1,- t._4._2,- t._4._3,- t._4._4)}- break;- case- "RBNode" :- switch (t._4.ctor)- {case- "RBEmpty" :- return A5(RBNode,- Black,- t._3._1,- t._3._2,- t._3._3,- t._3._4)}- break;}- break;}- return function ()- {- var l$ = remove_max(t._3);- var $ = max(t._3),k = $._0,v = $._1;- return A5(bubble,t._0,k,v,l$,t._4)- }()}- _E.Case($moduleName,"between lines 212 and 224");- }()- };- var del = F2(function (k,t)- {- return function ()- {- switch (t.ctor)- {case- "RBEmpty" :- return t- case- "RBNode" :- return function ()- {- var _case293 = A2(Native.Utils.compare,- k,- t._1);- switch (_case293.ctor)- {case- "EQ" :- return rem(t)- case- "GT" :- return A5(bubble,- t._0,- t._1,- t._2,- t._3,- A2(del,k,t._4))- case- "LT" :- return A5(bubble,- t._0,- t._1,- t._2,- A2(del,k,t._3),- t._4)}- _E.Case($moduleName,- "between lines 205 and 208");- }()}- _E.Case($moduleName,"between lines 203 and 208");- }()- });- var remove = F2(function (k,t)- {- return blacken(A2(del,k,t))- });- var diff = F2(function (t1,t2)- {- return A3(foldl,- F3(function (k,v,t)- {- return A2(remove,k,t)- }),- t1,- t2)- });- var moreBlackTree = function (t)- {- return function ()- {- switch (t.ctor)- {case- "RBEmpty" :- return RBEmpty(LBBlack)- case- "RBNode" :- return A5(RBNode,- moreBlack(t._0),- t._1,- t._2,- t._3,- t._4)}- _E.Case($moduleName,"between lines 192 and 194");- }()- };- elm.Dict.values = {_op: _op, empty: empty, singleton: singleton, insert: insert, lookup: lookup, findWithDefault: findWithDefault, remove: remove, member: member, foldl: foldl, foldr: foldr, map: map, union: union, intersect: intersect, diff: diff, keys: keys, values: values, toList: toList, fromList: fromList};- return elm.Dict.values- };Elm.Either = Elm.Either || {};-Elm.Either.make = function (elm)- {- elm.Either = elm.Either || {};- if (elm.Either.values)- return elm.Either.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Either";- var List = Elm.List.make(elm);- var _op = {};- var Right = function (a)- {- return {ctor: "Right", _0: a}- };- var isRight = function (e)- {- return function ()- {- switch (e.ctor)- {case- "Right" :- return true}- return false- }()- };- var Left = function (a)- {- return {ctor: "Left", _0: a}- };- var consEither = F2(function (e,arg0)- {- return function ()- {- switch (arg0.ctor)- {case- "_Tuple2" :- return function ()- {- switch (e.ctor)- {case- "Left" :- return {ctor: "_Tuple2", _0: {ctor: "::", _0: e._0, _1: arg0._0}, _1: arg0._1}- case- "Right" :- return {ctor: "_Tuple2", _0: arg0._0, _1: {ctor: "::", _0: e._0, _1: arg0._1}}}- _E.Case($moduleName,- "between lines 66 and 68");- }()}- _E.Case($moduleName,"between lines 66 and 68");- }()- });- var partition = function (es)- {- return A3(List.foldr,- consEither,- {ctor: "_Tuple2", _0: _J.toList([]), _1: _J.toList([])},- es)- };- var consLeft = F2(function (e,vs)- {- return function ()- {- switch (e.ctor)- {case- "Left" :- return {ctor: "::", _0: e._0, _1: vs}- case- "Right" :- return vs}- _E.Case($moduleName,"between lines 56 and 58");- }()- });- var lefts = function (es)- {- return A3(List.foldr,consLeft,_J.toList([]),es)- };- var consRight = F2(function (e,vs)- {- return function ()- {- switch (e.ctor)- {case- "Left" :- return vs- case- "Right" :- return {ctor: "::", _0: e._0, _1: vs}}- _E.Case($moduleName,"between lines 61 and 63");- }()- });- var rights = function (es)- {- return A3(List.foldr,consRight,_J.toList([]),es)- };- var either = F3(function (f,g,e)- {- return function ()- {- switch (e.ctor)- {case- "Left" :- return f(e._0)- case- "Right" :- return g(e._0)}- _E.Case($moduleName,"on line 31, column 16 to 60");- }()- });- var isLeft = function (e)- {- return function ()- {- switch (e.ctor)- {case- "Left" :- return true}- return false- }()- };- elm.Either.values = {_op: _op, either: either, isLeft: isLeft, isRight: isRight, lefts: lefts, rights: rights, partition: partition, consLeft: consLeft, consRight: consRight, consEither: consEither, Left: Left, Right: Right};- return elm.Either.values- };Elm.Http = Elm.Http || {};-Elm.Http.make = function (elm)- {- elm.Http = elm.Http || {};- if (elm.Http.values)- return elm.Http.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Http";- var Signal = Elm.Signal.make(elm);- var Native = Native || {};- Native.Http = Elm.Native.Http.make(elm);- var _op = {};- var send = Native.Http.send;- var Waiting = {ctor: "Waiting"};- var Success = function (a)- {- return {ctor: "Success", _0: a}- };- var Request = F4(function (a,b,c,d)- {- return {_: {}, body: c, headers: d, url: b, verb: a}- });- var get = function (url)- {- return A4(Request,"GET",url,"",_J.toList([]))- };- var sendGet = function (reqs)- {- return send(A2(Signal.lift,get,reqs))- };- var post = F2(function (url,body)- {- return A4(Request,"POST",url,body,_J.toList([]))- });- var request = Request;- var Failure = F2(function (a,b)- {- return {ctor: "Failure", _0: a, _1: b}- });- elm.Http.values = {_op: _op, request: request, get: get, post: post, send: send, sendGet: sendGet, Success: Success, Waiting: Waiting, Failure: Failure, Request: Request};- return elm.Http.values- };Elm.JavaScript = Elm.JavaScript || {};-Elm.JavaScript.make = function (elm)- {- elm.JavaScript = elm.JavaScript || {};- if (elm.JavaScript.values)- return elm.JavaScript.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "JavaScript";- var Native = Native || {};- Native.JavaScript = Elm.Native.JavaScript.make(elm);- var _op = {};- var toString = Native.JavaScript.toString;- var toList = Native.JavaScript.toList;- var toInt = Native.JavaScript.toInt;- var toFloat = Native.JavaScript.toFloat;- var toBool = Native.JavaScript.toBool;- var fromString = Native.JavaScript.fromString;- var fromList = Native.JavaScript.fromList;- var fromInt = Native.JavaScript.fromInt;- var fromFloat = Native.JavaScript.fromFloat;- var fromBool = Native.JavaScript.fromBool;- var JSString = {ctor: "JSString"};- var JSObject = {ctor: "JSObject"};- var JSNumber = {ctor: "JSNumber"};- var JSDomNode = {ctor: "JSDomNode"};- var JSBool = {ctor: "JSBool"};- var JSArray = function (a)- {- return {ctor: "JSArray", _0: a}- };- elm.JavaScript.values = {_op: _op, toList: toList, toInt: toInt, toFloat: toFloat, toBool: toBool, toString: toString, fromList: fromList, fromInt: fromInt, fromFloat: fromFloat, fromBool: fromBool, fromString: fromString, JSNumber: JSNumber, JSBool: JSBool, JSString: JSString, JSArray: JSArray, JSDomNode: JSDomNode, JSObject: JSObject};- return elm.JavaScript.values- };Elm.Json = Elm.Json || {};-Elm.Json.make = function (elm)- {- elm.Json = elm.Json || {};- if (elm.Json.values)- return elm.Json.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Json";- var Basics = Elm.Basics.make(elm);- var Dict = Elm.Dict.make(elm);- var Maybe = Elm.Maybe.make(elm);- var JavaScript = Elm.JavaScript.make(elm);- var Native = Native || {};- Native.Json = Elm.Native.Json.make(elm);- var JavaScript = Elm.JavaScript.make(elm);- var _op = {};- var toString = F2(function (sep,v)- {- return JavaScript.toString(A2(Native.Json.toJSString,sep,v))- });- var toJSString = Native.Json.toJSString;- var toJSObject = Native.Json.toJSObject;- var fromString = function (s)- {- return Native.Json.fromJSString(JavaScript.fromString(s))- };- var fromJSString = Native.Json.fromJSString;- var fromJSObject = Native.Json.fromJSObject;- var String = function (a)- {- return {ctor: "String", _0: a}- };- var Object = function (a)- {- return {ctor: "Object", _0: a}- };- var Number = function (a)- {- return {ctor: "Number", _0: a}- };- var Null = {ctor: "Null"};- var Boolean = function (a)- {- return {ctor: "Boolean", _0: a}- };- var Array = function (a)- {- return {ctor: "Array", _0: a}- };- elm.Json.values = {_op: _op, toString: toString, toJSString: toJSString, fromString: fromString, fromJSString: fromJSString, fromJSObject: fromJSObject, toJSObject: toJSObject, String: String, Number: Number, Boolean: Boolean, Null: Null, Array: Array, Object: Object};- return elm.Json.values- };Elm.Keyboard = Elm.Keyboard || {};-Elm.Keyboard.make = function (elm)- {- elm.Keyboard = elm.Keyboard || {};- if (elm.Keyboard.values)- return elm.Keyboard.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Keyboard";- var Signal = Elm.Signal.make(elm);- var Native = Native || {};- Native.Keyboard = Elm.Native.Keyboard.make(elm);- var _op = {};- var lastPressed = Native.Keyboard.lastPressed;- var keysDown = Native.Keyboard.keysDown;- var isDown = Native.Keyboard.isDown;- var shift = isDown(16);- var space = isDown(32);- var enter = isDown(13);- var directions = Native.Keyboard.directions;- var wasd = A4(directions,87,83,65,68);- var ctrl = isDown(17);- var arrows = A4(directions,38,40,37,39);- elm.Keyboard.values = {_op: _op, directions: directions, arrows: arrows, wasd: wasd, isDown: isDown, shift: shift, ctrl: ctrl, space: space, enter: enter, keysDown: keysDown, lastPressed: lastPressed};- return elm.Keyboard.values- };Elm.List = Elm.List || {};-Elm.List.make = function (elm)- {- elm.List = elm.List || {};- if (elm.List.values)- return elm.List.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "List";- var Basics = Elm.Basics.make(elm);- var Native = Native || {};- Native.List = Elm.Native.List.make(elm);- var _op = {};- var zipWith = Native.List.zipWith;- var zip = Native.List.zip;- var take = Native.List.take;- var tail = Native.List.tail;- var scanl1 = Native.List.scanl1;- var scanl = Native.List.scanl;- var reverse = Native.List.reverse;- var repeat = Native.List.repeat;- var map = Native.List.map;- var length = Native.List.length;- var last = Native.List.last;- var join = Native.List.join;- var isEmpty = function (xs)- {- return function ()- {- switch (xs.ctor)- {case- "[]" :- return true}- return false- }()- };- var head = Native.List.head;- var foldr1 = Native.List.foldr1;- var foldr = Native.List.foldr;- var foldl1 = Native.List.foldl1;- var maximum = foldl1(Basics.max);- var minimum = foldl1(Basics.min);- var foldl = Native.List.foldl;- var or = A2(foldl,- F2(function (x,y)- {- return x || y- }),- false);- var product = A2(foldl,- F2(function (x,y)- {- return x * y- }),- 1);- var sum = A2(foldl,- F2(function (x,y)- {- return x + y- }),- 0);- var filter = Native.List.filter;- var drop = Native.List.drop;- var concat = Native.List.concat;- var concatMap = F2(function (f,list)- {- return concat(A2(map,f,list))- });- var any = Native.List.any;- var and = A2(foldl,- F2(function (x,y)- {- return x && y- }),- true);- var all = Native.List.all;- _op["::"] = Native.List.cons;- var intersperse = F2(function (sep,xs)- {- return function ()- {- switch (xs.ctor)- {case- "::" :- switch (xs._1.ctor)- {case- "::" :- return {ctor: "::", _0: xs._0, _1: {ctor: "::", _0: sep, _1: A2(intersperse,- sep,- {ctor: "::", _0: xs._1._0, _1: xs._1._1})}}- case- "[]" :- return _J.toList([xs._0])}- break;- case- "[]" :- return _J.toList([])}- _E.Case($moduleName,"between lines 209 and 214");- }()- });- var partition = F2(function (pred,lst)- {- return function ()- {- switch (lst.ctor)- {case- "::" :- return function ()- {- var $ = A2(partition,pred,lst._1),- bs = $._0,- cs = $._1;- return pred(lst._0) ? {ctor: "_Tuple2", _0: {ctor: "::", _0: lst._0, _1: bs}, _1: cs} : {ctor: "_Tuple2", _0: bs, _1: {ctor: "::", _0: lst._0, _1: cs}}- }()- case- "[]" :- return {ctor: "_Tuple2", _0: _J.toList([]), _1: _J.toList([])}}- _E.Case($moduleName,"between lines 166 and 176");- }()- });- var unzip = function (pairs)- {- return function ()- {- switch (pairs.ctor)- {case- "::" :- switch (pairs._0.ctor)- {case- "_Tuple2" :- return function ()- {- var $ = unzip(pairs._1),xs = $._0,ys = $._1;- return {ctor: "_Tuple2", _0: {ctor: "::", _0: pairs._0._0, _1: xs}, _1: {ctor: "::", _0: pairs._0._1, _1: ys}}- }()}- break;- case- "[]" :- return {ctor: "_Tuple2", _0: _J.toList([]), _1: _J.toList([])}}- _E.Case($moduleName,"between lines 191 and 199");- }()- };- _op["++"] = Native.List.append;- elm.List.values = {_op: _op, head: head, tail: tail, last: last, isEmpty: isEmpty, map: map, foldl: foldl, foldr: foldr, foldl1: foldl1, foldr1: foldr1, scanl: scanl, scanl1: scanl1, filter: filter, length: length, reverse: reverse, all: all, any: any, and: and, or: or, concat: concat, concatMap: concatMap, sum: sum, product: product, maximum: maximum, minimum: minimum, partition: partition, zip: zip, zipWith: zipWith, unzip: unzip, join: join, intersperse: intersperse, take: take, drop: drop, repeat: repeat};- return elm.List.values- };Elm.Maybe = Elm.Maybe || {};-Elm.Maybe.make = function (elm)- {- elm.Maybe = elm.Maybe || {};- if (elm.Maybe.values)- return elm.Maybe.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Maybe";- var Basics = Elm.Basics.make(elm);- var List = Elm.List.make(elm);- var _op = {};- var Nothing = {ctor: "Nothing"};- var Just = function (a)- {- return {ctor: "Just", _0: a}- };- var maybe = F3(function (b,f,m)- {- return function ()- {- switch (m.ctor)- {case- "Just" :- return f(m._0)- case- "Nothing" :- return b}- _E.Case($moduleName,"between lines 28 and 33");- }()- });- var cons = F2(function (mx,xs)- {- return A3(maybe,- xs,- function (x)- {- return {ctor: "::", _0: x, _1: xs}- },- mx)- });- var justs = A2(List.foldr,cons,_J.toList([]));- var isJust = A2(maybe,- false,- function (arg0)- {- return function ()- {- return true- }()- });- var isNothing = function ($)- {- return Basics.not(isJust($))- };- elm.Maybe.values = {_op: _op, maybe: maybe, isJust: isJust, isNothing: isNothing, cons: cons, justs: justs, Just: Just, Nothing: Nothing};- return elm.Maybe.values- };Elm.Mouse = Elm.Mouse || {};-Elm.Mouse.make = function (elm)- {- elm.Mouse = elm.Mouse || {};- if (elm.Mouse.values)- return elm.Mouse.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Mouse";- var Signal = Elm.Signal.make(elm);- var Native = Native || {};- Native.Mouse = Elm.Native.Mouse.make(elm);- var _op = {};- var y = Native.Mouse.y;- var x = Native.Mouse.x;- var position = Native.Mouse.position;- var isDown = Native.Mouse.isDown;- var isClicked = Native.Mouse.isClicked;- var clicks = Native.Mouse.clicks;- elm.Mouse.values = {_op: _op, position: position, x: x, y: y, isDown: isDown, isClicked: isClicked, clicks: clicks};- return elm.Mouse.values- };Elm.Prelude = Elm.Prelude || {};-Elm.Prelude.make = function (elm)- {- elm.Prelude = elm.Prelude || {};- if (elm.Prelude.values)- return elm.Prelude.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Prelude";- var Basics = Elm.Basics.make(elm);- var Maybe = Elm.Maybe.make(elm);- var Native = Native || {};- Native.Prelude = Elm.Native.Prelude.make(elm);- var Native = Native || {};- Native.Show = Elm.Native.Show.make(elm);- var _op = {};- var show = Native.Show.show;- var readInt = Native.Prelude.readInt;- var readFloat = Native.Prelude.readFloat;- elm.Prelude.values = {_op: _op, show: show, readInt: readInt, readFloat: readFloat};- return elm.Prelude.values- };Elm.Random = Elm.Random || {};-Elm.Random.make = function (elm)- {- elm.Random = elm.Random || {};- if (elm.Random.values)- return elm.Random.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Random";- var Signal = Elm.Signal.make(elm);- var Native = Native || {};- Native.Random = Elm.Native.Random.make(elm);- var _op = {};- var range = Native.Random.range;- var floatList = Native.Random.floatList;- var $float = Native.Random.float_;- elm.Random.values = {_op: _op, range: range, $float: $float, floatList: floatList};- return elm.Random.values- };Elm.Set = Elm.Set || {};-Elm.Set.make = function (elm)- {- elm.Set = elm.Set || {};- if (elm.Set.values)- return elm.Set.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Set";- var Maybe = Elm.Maybe.make(elm);- var Dict = Elm.Dict.make(elm);- var List = Elm.List.make(elm);- var _op = {};- var union = Dict.union;- var toList = Dict.keys;- var singleton = function (k)- {- return A2(Dict.singleton,k,{ctor: "_Tuple0"})- };- var remove = Dict.remove;- var member = Dict.member;- var intersect = Dict.intersect;- var insert = function (k)- {- return A2(Dict.insert,k,{ctor: "_Tuple0"})- };- var foldr = F3(function (f,b,s)- {- return A3(Dict.foldr,- F3(function (k,arg1,b)- {- return function ()- {- return A2(f,k,b)- }()- }),- b,- s)- });- var foldl = F3(function (f,b,s)- {- return A3(Dict.foldl,- F3(function (k,arg1,b)- {- return function ()- {- return A2(f,k,b)- }()- }),- b,- s)- });- var empty = Dict.empty;- var fromList = function (xs)- {- return A3(List.foldl,insert,empty,xs)- };- var map = F2(function (f,s)- {- return fromList(A2(List.map,f,toList(s)))- });- var diff = Dict.diff;- elm.Set.values = {_op: _op, empty: empty, singleton: singleton, insert: insert, remove: remove, member: member, foldl: foldl, foldr: foldr, map: map, union: union, intersect: intersect, diff: diff, toList: toList, fromList: fromList};- return elm.Set.values- };Elm.Signal = Elm.Signal || {};-Elm.Signal.make = function (elm)- {- elm.Signal = elm.Signal || {};- if (elm.Signal.values)- return elm.Signal.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Signal";- var Native = Native || {};- Native.Signal = Elm.Native.Signal.make(elm);- var List = Elm.List.make(elm);- var _op = {};- _op["~"] = F2(function (sf,s)- {- return A3(Native.Signal.lift2,- F2(function (f,x)- {- return f(x)- }),- sf,- s)- });- var sampleOn = Native.Signal.sampleOn;- var merges = Native.Signal.merges;- var merge = Native.Signal.merge;- var lift8 = Native.Signal.lift8;- var lift7 = Native.Signal.lift7;- var lift6 = Native.Signal.lift6;- var lift5 = Native.Signal.lift5;- var lift4 = Native.Signal.lift4;- var lift3 = Native.Signal.lift3;- var lift2 = Native.Signal.lift2;- var lift = Native.Signal.lift;- var keepWhen = Native.Signal.keepWhen;- var keepIf = Native.Signal.keepIf;- var foldp = Native.Signal.foldp;- var dropWhen = Native.Signal.dropWhen;- var dropRepeats = Native.Signal.dropRepeats;- var dropIf = Native.Signal.dropIf;- var countIf = Native.Signal.countIf;- var count = Native.Signal.count;- var constant = Native.Signal.constant;- var combine = A2(List.foldr,- Native.Signal.lift2(F2(function (x,y)- {- return {ctor: "::", _0: x, _1: y}- })),- Native.Signal.constant(_J.toList([])));- var Signal = {ctor: "Signal"};- _op["<~"] = F2(function (f,s)- {- return A2(Native.Signal.lift,f,s)- });- elm.Signal.values = {_op: _op, constant: constant, lift: lift, lift2: lift2, lift3: lift3, lift4: lift4, lift5: lift5, lift6: lift6, lift7: lift7, lift8: lift8, foldp: foldp, merge: merge, merges: merges, combine: combine, count: count, countIf: countIf, keepIf: keepIf, dropIf: dropIf, keepWhen: keepWhen, dropWhen: dropWhen, dropRepeats: dropRepeats, sampleOn: sampleOn, Signal: Signal};- return elm.Signal.values- };Elm.String = Elm.String || {};-Elm.String.make = function (elm)- {- elm.String = elm.String || {};- if (elm.String.values)- return elm.String.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "String";- var Native = Native || {};- Native.String = Elm.Native.String.make(elm);- var Maybe = Elm.Maybe.make(elm);- var _op = {};- var words = Native.String.words;- var uncons = Native.String.uncons;- var trimRight = Native.String.trimRight;- var trimLeft = Native.String.trimLeft;- var trim = Native.String.trim;- var toUpper = Native.String.toUpper;- var toLower = Native.String.toLower;- var toList = Native.String.toList;- var toInt = Native.String.toInt;- var toFloat = Native.String.toFloat;- var sub = Native.String.sub;- var startsWith = Native.String.startsWith;- var split = Native.String.split;- var right = Native.String.right;- var reverse = Native.String.reverse;- var repeat = Native.String.repeat;- var padRight = Native.String.padRight;- var padLeft = Native.String.padLeft;- var pad = Native.String.pad;- var map = Native.String.map;- var lines = Native.String.lines;- var length = Native.String.length;- var left = Native.String.left;- var join = Native.String.join;- var isEmpty = Native.String.isEmpty;- var indices = Native.String.indexes;- var indexes = Native.String.indexes;- var fromList = Native.String.fromList;- var foldr = Native.String.foldr;- var foldl = Native.String.foldl;- var filter = Native.String.filter;- var endsWith = Native.String.endsWith;- var dropRight = Native.String.dropRight;- var dropLeft = Native.String.dropLeft;- var contains = Native.String.contains;- var cons = Native.String.cons;- var concat = Native.String.concat;- var append = Native.String.append;- var any = Native.String.any;- var all = Native.String.all;- elm.String.values = {_op: _op, isEmpty: isEmpty, cons: cons, uncons: uncons, append: append, concat: concat, length: length, map: map, filter: filter, reverse: reverse, foldl: foldl, foldr: foldr, split: split, join: join, repeat: repeat, sub: sub, left: left, right: right, dropLeft: dropLeft, dropRight: dropRight, pad: pad, padLeft: padLeft, padRight: padRight, trim: trim, trimLeft: trimLeft, trimRight: trimRight, words: words, lines: lines, toUpper: toUpper, toLower: toLower, any: any, all: all, contains: contains, startsWith: startsWith, endsWith: endsWith, indexes: indexes, indices: indices, toInt: toInt, toFloat: toFloat, toList: toList, fromList: fromList};- return elm.String.values- };Elm.Text = Elm.Text || {};-Elm.Text.make = function (elm)- {- elm.Text = elm.Text || {};- if (elm.Text.values)- return elm.Text.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Text";- var Basics = Elm.Basics.make(elm);- var Color = Elm.Color.make(elm);- var Graphics = Graphics || {};- Graphics.Element = Elm.Graphics.Element.make(elm);- var Maybe = Elm.Maybe.make(elm);- var JavaScript = Elm.JavaScript.make(elm);- var Native = Native || {};- Native.Text = Elm.Native.Text.make(elm);- var _op = {};- var underline = Native.Text.underline;- var typeface = Native.Text.typeface;- var toText = Native.Text.toText;- var text = Native.Text.text;- var strikeThrough = Native.Text.strikeThrough;- var righted = Native.Text.righted;- var plainText = Native.Text.plainText;- var overline = Native.Text.overline;- var monospace = Native.Text.monospace;- var markdown = Native.Text.markdown;- var link = Native.Text.link;- var justified = Native.Text.justified;- var italic = Native.Text.italic;- var height = Native.Text.height;- var header = Native.Text.header;- var color = Native.Text.color;- var centered = Native.Text.centered;- var bold = Native.Text.bold;- var asText = Native.Text.asText;- var Text = {ctor: "Text"};- elm.Text.values = {_op: _op, toText: toText, typeface: typeface, monospace: monospace, header: header, link: link, height: height, color: color, bold: bold, italic: italic, overline: overline, underline: underline, strikeThrough: strikeThrough, justified: justified, centered: centered, righted: righted, text: text, plainText: plainText, markdown: markdown, asText: asText, Text: Text};- return elm.Text.values- };Elm.Time = Elm.Time || {};-Elm.Time.make = function (elm)- {- elm.Time = elm.Time || {};- if (elm.Time.values)- return elm.Time.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Time";- var Basics = Elm.Basics.make(elm);- var Native = Native || {};- Native.Time = Elm.Native.Time.make(elm);- var Signal = Elm.Signal.make(elm);- var _op = {};- var timestamp = Native.Time.timestamp;- var since = Native.Time.since;- var millisecond = 1;- var second = 1000 * millisecond;- var minute = 60 * second;- var inSeconds = function (t)- {- return t / second- };- var inMinutes = function (t)- {- return t / minute- };- var inMilliseconds = function (t)- {- return t- };- var hour = 60 * minute;- var inHours = function (t)- {- return t / hour- };- var fpsWhen = Native.Time.fpsWhen;- var fps = Native.Time.fps;- var every = Native.Time.every;- var delay = Native.Time.delay;- elm.Time.values = {_op: _op, millisecond: millisecond, second: second, minute: minute, hour: hour, inMilliseconds: inMilliseconds, inSeconds: inSeconds, inMinutes: inMinutes, inHours: inHours, fps: fps, fpsWhen: fpsWhen, every: every, since: since, timestamp: timestamp, delay: delay};- return elm.Time.values- };Elm.Touch = Elm.Touch || {};-Elm.Touch.make = function (elm)- {- elm.Touch = elm.Touch || {};- if (elm.Touch.values)- return elm.Touch.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Touch";- var Signal = Elm.Signal.make(elm);- var Native = Native || {};- Native.Touch = Elm.Native.Touch.make(elm);- var Time = Elm.Time.make(elm);- var _op = {};- var touches = Native.Touch.touches;- var taps = Native.Touch.taps;- var Touch = F6(function (a,b,c,d,e,f)- {- return {_: {}, id: c, t0: f, x: a, x0: d, y: b, y0: e}- });- elm.Touch.values = {_op: _op, touches: touches, taps: taps, Touch: Touch};- return elm.Touch.values- };Elm.Transform2D = Elm.Transform2D || {};-Elm.Transform2D.make = function (elm)- {- elm.Transform2D = elm.Transform2D || {};- if (elm.Transform2D.values)- return elm.Transform2D.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Transform2D";- var Native = Native || {};- Native.Transform2D = Elm.Native.Transform2D.make(elm);- var _op = {};- var rotation = Native.Transform2D.rotation;- var multiply = Native.Transform2D.multiply;- var matrix = Native.Transform2D.matrix;- var identity = Native.Transform2D.identity;- var Transform2D = {ctor: "Transform2D"};- elm.Transform2D.values = {_op: _op, identity: identity, matrix: matrix, rotation: rotation, multiply: multiply, Transform2D: Transform2D};- return elm.Transform2D.values- };Elm.WebSocket = Elm.WebSocket || {};-Elm.WebSocket.make = function (elm)- {- elm.WebSocket = elm.WebSocket || {};- if (elm.WebSocket.values)- return elm.WebSocket.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "WebSocket";- var Signal = Elm.Signal.make(elm);- var Basics = Elm.Basics.make(elm);- var Native = Native || {};- Native.WebSocket = Elm.Native.WebSocket.make(elm);- var _op = {};- var connect = Native.WebSocket.connect;- elm.WebSocket.values = {_op: _op, connect: connect};- return elm.WebSocket.values- };Elm.Window = Elm.Window || {};-Elm.Window.make = function (elm)- {- elm.Window = elm.Window || {};- if (elm.Window.values)- return elm.Window.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Window";- var Signal = Elm.Signal.make(elm);- var Native = Native || {};- Native.Window = Elm.Native.Window.make(elm);- var _op = {};- var width = Native.Window.width;- var height = Native.Window.height;- var dimensions = Native.Window.dimensions;- elm.Window.values = {_op: _op, dimensions: dimensions, width: width, height: height};- return elm.Window.values- };Elm.Graphics = Elm.Graphics || {};-Elm.Graphics.Collage = Elm.Graphics.Collage || {};-Elm.Graphics.Collage.make = function (elm)- {- elm.Graphics = elm.Graphics || {};- elm.Graphics.Collage = elm.Graphics.Collage || {};- if (elm.Graphics.Collage.values)- return elm.Graphics.Collage.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Graphics.Collage";- var Basics = Elm.Basics.make(elm);- var List = Elm.List.make(elm);- var Either = Elm.Either.make(elm);- var Transform2D = Elm.Transform2D.make(elm);- var Native = Native || {};- Native.Graphics = Native.Graphics || {};- Native.Graphics.Collage = Elm.Native.Graphics.Collage.make(elm);- var Graphics = Graphics || {};- Graphics.Element = Elm.Graphics.Element.make(elm);- var Color = Elm.Color.make(elm);- var Maybe = Elm.Maybe.make(elm);- var JavaScript = Elm.JavaScript.make(elm);- var _op = {};- var segment = F2(function (p1,p2)- {- return _J.toList([p1,p2])- });- var scale = F2(function (s,f)- {- return _N.replace([["scale",f.scale * s]],f)- });- var rotate = F2(function (t,f)- {- return _N.replace([["theta",f.theta + t]],f)- });- var rect = F2(function (w,h)- {- return function ()- {- var hw = w / 2;- var hh = h / 2;- return _J.toList([{ctor: "_Tuple2", _0: 0 - hw, _1: 0 - hh},- {ctor: "_Tuple2", _0: 0 - hw, _1: hh},- {ctor: "_Tuple2", _0: hw, _1: hh},- {ctor: "_Tuple2", _0: hw, _1: 0 - hh}])- }()- });- var square = function (n)- {- return A2(rect,n,n)- };- var polygon = function (points)- {- return points- };- var path = function (ps)- {- return ps- };- var oval = F2(function (w,h)- {- return function ()- {- var n = 50;- var t = 2 * Basics.pi / n;- var hw = w / 2;- var hh = h / 2;- var f = function (i)- {- return {ctor: "_Tuple2", _0: hw * Basics.cos(t * i), _1: hh * Basics.sin(t * i)}- };- return A2(List.map,f,_L.range(0,n - 1))- }()- });- var ngon = F2(function (n,r)- {- return function ()- {- var m = Basics.toFloat(n);- var t = 2 * Basics.pi / m;- var f = function (i)- {- return {ctor: "_Tuple2", _0: r * Basics.cos(t * i), _1: r * Basics.sin(t * i)}- };- return A2(List.map,f,_L.range(0,m - 1))- }()- });- var moveY = F2(function (y,f)- {- return _N.replace([["y",f.y + y]],f)- });- var moveX = F2(function (x,f)- {- return _N.replace([["x",f.x + x]],f)- });- var move = F2(function (arg1,f)- {- return function ()- {- switch (arg1.ctor)- {case- "_Tuple2" :- return _N.replace([["x",f.x + arg1._0],- ["y",f.y + arg1._1]],- f)}- _E.Case($moduleName,- "on line 170, column 20 to 48");- }()- });- var form = function (f)- {- return {_: {}, alpha: 1, form: f, scale: 1, theta: 0, x: 0, y: 0}- };- var collage = Native.Graphics.Collage.collage;- var circle = function (r)- {- return A2(oval,2 * r,2 * r)- };- var alpha = F2(function (a,f)- {- return _N.replace([["alpha",a]],f)- });- var Texture = function (a)- {- return {ctor: "Texture", _0: a}- };- var Solid = function (a)- {- return {ctor: "Solid", _0: a}- };- var Smooth = {ctor: "Smooth"};- var Sharp = function (a)- {- return {ctor: "Sharp", _0: a}- };- var Round = {ctor: "Round"};- var Padded = {ctor: "Padded"};- var LineStyle = F6(function (a,b,c,d,e,f)- {- return {_: {}, cap: c, color: a, dashOffset: f, dashing: e, join: d, width: b}- });- var Grad = function (a)- {- return {ctor: "Grad", _0: a}- };- var Form = F6(function (a,b,c,d,e,f)- {- return {_: {}, alpha: e, form: f, scale: b, theta: a, x: c, y: d}- });- var Flat = {ctor: "Flat"};- var defaultLine = {_: {}, cap: Flat, color: Color.black, dashOffset: 0, dashing: _J.toList([]), join: Sharp(10), width: 1};- var dashed = function (clr)- {- return _N.replace([["color",clr],- ["dashing",_J.toList([8,4])]],- defaultLine)- };- var dotted = function (clr)- {- return _N.replace([["color",clr],- ["dashing",_J.toList([3,3])]],- defaultLine)- };- var solid = function (clr)- {- return _N.replace([["color",clr]],defaultLine)- };- var FShape = F2(function (a,b)- {- return {ctor: "FShape", _0: a, _1: b}- });- var fill = F2(function (style,shape)- {- return form(A2(FShape,Either.Right(style),shape))- });- var filled = F2(function (color,shape)- {- return A2(fill,Solid(color),shape)- });- var gradient = F2(function (grad,shape)- {- return A2(fill,Grad(grad),shape)- });- var textured = F2(function (src,shape)- {- return A2(fill,Texture(src),shape)- });- var outlined = F2(function (style,shape)- {- return form(A2(FShape,Either.Left(style),shape))- });- var FPath = F2(function (a,b)- {- return {ctor: "FPath", _0: a, _1: b}- });- var traced = F2(function (style,path)- {- return form(A2(FPath,style,path))- });- var FImage = F4(function (a,b,c,d)- {- return {ctor: "FImage", _0: a, _1: b, _2: c, _3: d}- });- var sprite = F4(function (w,h,pos,src)- {- return form(A4(FImage,w,h,pos,src))- });- var FGroup = F2(function (a,b)- {- return {ctor: "FGroup", _0: a, _1: b}- });- var group = function (fs)- {- return form(A2(FGroup,Transform2D.identity,fs))- };- var groupTransform = F2(function (matrix,fs)- {- return form(A2(FGroup,matrix,fs))- });- var FElement = function (a)- {- return {ctor: "FElement", _0: a}- };- var toForm = function (e)- {- return form(FElement(e))- };- var Clipped = {ctor: "Clipped"};- elm.Graphics.Collage.values = {_op: _op, defaultLine: defaultLine, solid: solid, dashed: dashed, dotted: dotted, form: form, fill: fill, filled: filled, textured: textured, gradient: gradient, outlined: outlined, traced: traced, sprite: sprite, toForm: toForm, group: group, groupTransform: groupTransform, move: move, moveX: moveX, moveY: moveY, scale: scale, rotate: rotate, alpha: alpha, collage: collage, path: path, segment: segment, polygon: polygon, rect: rect, square: square, oval: oval, circle: circle, ngon: ngon, Solid: Solid, Texture: Texture, Grad: Grad, Flat: Flat, Round: Round, Padded: Padded, Smooth: Smooth, Sharp: Sharp, Clipped: Clipped, FPath: FPath, FShape: FShape, FImage: FImage, FElement: FElement, FGroup: FGroup, Form: Form, LineStyle: LineStyle};- return elm.Graphics.Collage.values- };Elm.Graphics = Elm.Graphics || {};-Elm.Graphics.Element = Elm.Graphics.Element || {};-Elm.Graphics.Element.make = function (elm)- {- elm.Graphics = elm.Graphics || {};- elm.Graphics.Element = elm.Graphics.Element || {};- if (elm.Graphics.Element.values)- return elm.Graphics.Element.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Graphics.Element";- var Basics = Elm.Basics.make(elm);- var Native = Native || {};- Native.Utils = Elm.Native.Utils.make(elm);- var JavaScript = Elm.JavaScript.make(elm);- var JavaScript = Elm.JavaScript.make(elm);- var List = Elm.List.make(elm);- var Color = Elm.Color.make(elm);- var Maybe = Elm.Maybe.make(elm);- var _op = {};- var widthOf = function (e)- {- return e.props.width- };- var tag = F2(function (name,e)- {- return function ()- {- var p = e.props;- return {_: {}, element: e.element, props: _N.replace([["tag",- JavaScript.fromString(name)]],- p)}- }()- });- var sizeOf = function (e)- {- return {ctor: "_Tuple2", _0: e.props.width, _1: e.props.height}- };- var opacity = F2(function (o,e)- {- return function ()- {- var p = e.props;- return {_: {}, element: e.element, props: _N.replace([["opacity",- o]],- p)}- }()- });- var link = F2(function (href,e)- {- return function ()- {- var p = e.props;- return {_: {}, element: e.element, props: _N.replace([["href",- JavaScript.fromString(href)]],- p)}- }()- });- var heightOf = function (e)- {- return e.props.height- };- var emptyStr = JavaScript.fromString("");- var color = F2(function (c,e)- {- return function ()- {- var p = e.props;- return {_: {}, element: e.element, props: _N.replace([["color",- Maybe.Just(c)]],- p)}- }()- });- var Z = {ctor: "Z"};- var middleAt = F2(function (x,y)- {- return {_: {}, horizontal: Z, vertical: Z, x: x, y: y}- });- var Tiled = {ctor: "Tiled"};- var Spacer = {ctor: "Spacer"};- var Relative = function (a)- {- return {ctor: "Relative", _0: a}- };- var middle = {_: {}, horizontal: Z, vertical: Z, x: Relative(0.5), y: Relative(0.5)};- var relative = Relative;- var RawHtml = function (a)- {- return {ctor: "RawHtml", _0: a}- };- var Properties = F8(function (a,b,c,d,e,f,g,h)- {- return {_: {}, color: e, height: c, hover: h, href: f, id: a, opacity: d, tag: g, width: b}- });- var newElement = F3(function (w,h,e)- {- return {_: {}, element: e, props: A8(Properties,- Native.Utils.guid({ctor: "_Tuple0"}),- w,- h,- 1,- Maybe.Nothing,- emptyStr,- emptyStr,- {ctor: "_Tuple0"})}- });- var spacer = F2(function (w,h)- {- return A3(newElement,w,h,Spacer)- });- var Position = F4(function (a,b,c,d)- {- return {_: {}, horizontal: a, vertical: b, x: c, y: d}- });- var Plain = {ctor: "Plain"};- var P = {ctor: "P"};- var midRightAt = F2(function (x,y)- {- return {_: {}, horizontal: P, vertical: Z, x: x, y: y}- });- var midTopAt = F2(function (x,y)- {- return {_: {}, horizontal: Z, vertical: P, x: x, y: y}- });- var topRightAt = F2(function (x,y)- {- return {_: {}, horizontal: P, vertical: P, x: x, y: y}- });- var N = {ctor: "N"};- var bottomLeftAt = F2(function (x,y)- {- return {_: {}, horizontal: N, vertical: N, x: x, y: y}- });- var bottomRightAt = F2(function (x,y)- {- return {_: {}, horizontal: P, vertical: N, x: x, y: y}- });- var midBottomAt = F2(function (x,y)- {- return {_: {}, horizontal: Z, vertical: N, x: x, y: y}- });- var midLeftAt = F2(function (x,y)- {- return {_: {}, horizontal: N, vertical: Z, x: x, y: y}- });- var topLeftAt = F2(function (x,y)- {- return {_: {}, horizontal: N, vertical: P, x: x, y: y}- });- var Image = F4(function (a,b,c,d)- {- return {ctor: "Image", _0: a, _1: b, _2: c, _3: d}- });- var height = F2(function (nh,e)- {- return function ()- {- var p = e.props;- var props = function ()- {- var _case0 = e.element;- switch (_case0.ctor)- {case- "Image" :- return _N.replace([["width",- Basics.round(Basics.toFloat(_case0._1) / Basics.toFloat(_case0._2) * Basics.toFloat(nh))]],- p)}- return p- }();- return {_: {}, element: e.element, props: _N.replace([["height",- nh]],- p)}- }()- });- var image = F3(function (w,h,src)- {- return A3(newElement,- w,- h,- A4(Image,- Plain,- w,- h,- JavaScript.fromString(src)))- });- var tiledImage = F3(function (w,h,src)- {- return A3(newElement,- w,- h,- A4(Image,- Tiled,- w,- h,- JavaScript.fromString(src)))- });- var width = F2(function (nw,e)- {- return function ()- {- var p = e.props;- var props = function ()- {- var _case5 = e.element;- switch (_case5.ctor)- {case- "Image" :- return _N.replace([["height",- Basics.round(Basics.toFloat(_case5._2) / Basics.toFloat(_case5._1) * Basics.toFloat(nw))]],- p)- case- "RawHtml" :- return _N.replace([["height",- Basics.snd(A2(Native.Utils.htmlHeight,- nw,- _case5._0))]],- p)}- return p- }();- return {_: {}, element: e.element, props: _N.replace([["width",- nw]],- props)}- }()- });- var size = F3(function (w,h,e)- {- return A2(height,h,A2(width,w,e))- });- var Flow = F2(function (a,b)- {- return {ctor: "Flow", _0: a, _1: b}- });- var Fitted = {ctor: "Fitted"};- var fittedImage = F3(function (w,h,src)- {- return A3(newElement,- w,- h,- A4(Image,- Fitted,- w,- h,- JavaScript.fromString(src)))- });- var Element = F2(function (a,b)- {- return {_: {}, element: b, props: a}- });- var DUp = {ctor: "DUp"};- var up = DUp;- var DRight = {ctor: "DRight"};- var right = DRight;- var beside = F2(function (lft,rht)- {- return A3(newElement,- widthOf(lft) + widthOf(rht),- A2(Basics.max,- heightOf(lft),- heightOf(rht)),- A2(Flow,right,_J.toList([lft,rht])))- });- var DOut = {ctor: "DOut"};- var layers = function (es)- {- return function ()- {- var ws = A2(List.map,widthOf,es);- var hs = A2(List.map,heightOf,es);- return A3(newElement,- List.maximum(ws),- List.maximum(hs),- A2(Flow,DOut,es))- }()- };- var outward = DOut;- var DLeft = {ctor: "DLeft"};- var left = DLeft;- var DIn = {ctor: "DIn"};- var inward = DIn;- var DDown = {ctor: "DDown"};- var above = F2(function (hi,lo)- {- return A3(newElement,- A2(Basics.max,widthOf(hi),widthOf(lo)),- heightOf(hi) + heightOf(lo),- A2(Flow,DDown,_J.toList([hi,lo])))- });- var below = F2(function (lo,hi)- {- return A3(newElement,- A2(Basics.max,widthOf(hi),widthOf(lo)),- heightOf(hi) + heightOf(lo),- A2(Flow,DDown,_J.toList([hi,lo])))- });- var down = DDown;- var flow = F2(function (dir,es)- {- return function ()- {- var ws = A2(List.map,widthOf,es);- var newFlow = F2(function (w,h)- {- return A3(newElement,- w,- h,- A2(Flow,dir,es))- });- var hs = A2(List.map,heightOf,es);- return _N.eq(es,_J.toList([])) ? A2(spacer,- 0,- 0) : function ()- {- switch (dir.ctor)- {case- "DDown" :- return A2(newFlow,- List.maximum(ws),- List.sum(hs))- case- "DIn" :- return A2(newFlow,- List.maximum(ws),- List.maximum(hs))- case- "DLeft" :- return A2(newFlow,- List.sum(ws),- List.maximum(hs))- case- "DOut" :- return A2(newFlow,- List.maximum(ws),- List.maximum(hs))- case- "DRight" :- return A2(newFlow,- List.sum(ws),- List.maximum(hs))- case- "DUp" :- return A2(newFlow,- List.maximum(ws),- List.sum(hs))}- _E.Case($moduleName,- "between lines 199 and 209");- }()- }()- });- var Custom = {ctor: "Custom"};- var Cropped = function (a)- {- return {ctor: "Cropped", _0: a}- };- var croppedImage = F4(function (pos,w,h,src)- {- return A3(newElement,- w,- h,- A4(Image,- Cropped(pos),- w,- h,- JavaScript.fromString(src)))- });- var Container = F2(function (a,b)- {- return {ctor: "Container", _0: a, _1: b}- });- var container = F4(function (w,h,pos,e)- {- return A3(newElement,w,h,A2(Container,pos,e))- });- var Absolute = function (a)- {- return {ctor: "Absolute", _0: a}- };- var absolute = Absolute;- var midLeft = _N.replace([["horizontal",N],["x",Absolute(0)]],- middle);- var midRight = _N.replace([["horizontal",P]],midLeft);- var midTop = _N.replace([["vertical",P],["y",Absolute(0)]],middle);- var midBottom = _N.replace([["vertical",N]],midTop);- var topLeft = {_: {}, horizontal: N, vertical: P, x: Absolute(0), y: Absolute(0)};- var bottomLeft = _N.replace([["vertical",N]],topLeft);- var bottomRight = _N.replace([["horizontal",P]],bottomLeft);- var topRight = _N.replace([["horizontal",P]],topLeft);- elm.Graphics.Element.values = {_op: _op, widthOf: widthOf, heightOf: heightOf, sizeOf: sizeOf, width: width, height: height, size: size, opacity: opacity, color: color, tag: tag, link: link, emptyStr: emptyStr, newElement: newElement, image: image, fittedImage: fittedImage, croppedImage: croppedImage, tiledImage: tiledImage, container: container, spacer: spacer, flow: flow, above: above, below: below, beside: beside, layers: layers, absolute: absolute, relative: relative, middle: middle, topLeft: topLeft, topRight: topRight, bottomLeft: bottomLeft, bottomRight: bottomRight, midLeft: midLeft, midRight: midRight, midTop: midTop, midBottom: midBottom, middleAt: middleAt, topLeftAt: topLeftAt, topRightAt: topRightAt, bottomLeftAt: bottomLeftAt, bottomRightAt: bottomRightAt, midLeftAt: midLeftAt, midRightAt: midRightAt, midTopAt: midTopAt, midBottomAt: midBottomAt, up: up, down: down, left: left, right: right, inward: inward, outward: outward, Image: Image, Container: Container, Flow: Flow, Spacer: Spacer, RawHtml: RawHtml, Custom: Custom, Plain: Plain, Fitted: Fitted, Cropped: Cropped, Tiled: Tiled, P: P, Z: Z, N: N, Absolute: Absolute, Relative: Relative, DUp: DUp, DDown: DDown, DLeft: DLeft, DRight: DRight, DIn: DIn, DOut: DOut, Properties: Properties, Element: Element, Position: Position};- return elm.Graphics.Element.values- };Elm.Graphics = Elm.Graphics || {};-Elm.Graphics.Input = Elm.Graphics.Input || {};-Elm.Graphics.Input.make = function (elm)- {- elm.Graphics = elm.Graphics || {};- elm.Graphics.Input = elm.Graphics.Input || {};- if (elm.Graphics.Input.values)- return elm.Graphics.Input.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "Graphics.Input";- var Basics = Elm.Basics.make(elm);- var Signal = Elm.Signal.make(elm);- var Native = Native || {};- Native.Graphics = Native.Graphics || {};- Native.Graphics.Input = Elm.Native.Graphics.Input.make(elm);- var List = Elm.List.make(elm);- var Graphics = Graphics || {};- Graphics.Element = Elm.Graphics.Element.make(elm);- var Maybe = Elm.Maybe.make(elm);- var JavaScript = Elm.JavaScript.make(elm);- var _op = {};- var id = function (x)- {- return x- };- var hoverables = Native.Graphics.Input.hoverables;- var hoverable = function (elem)- {- return function ()- {- var pool = hoverables(false);- return {ctor: "_Tuple2", _0: A2(pool.hoverable,- id,- elem), _1: pool.events}- }()- };- var fields = Native.Graphics.Input.fields;- var emptyFieldState = {_: {}, selectionEnd: 0, selectionStart: 0, string: ""};- var field = function (placeHolder)- {- return function ()- {- var tfs = fields(emptyFieldState);- var changes = Signal.dropRepeats(tfs.events);- return {ctor: "_Tuple2", _0: A2(Signal.lift,- A2(tfs.field,- id,- placeHolder),- changes), _1: Signal.dropRepeats(A2(Signal.lift,- function (_)- {- return _.string- },- changes))}- }()- };- var password = function (placeHolder)- {- return function ()- {- var tfs = Native.Graphics.Input.passwords(emptyFieldState);- var changes = Signal.dropRepeats(tfs.events);- return {ctor: "_Tuple2", _0: A2(Signal.lift,- A2(tfs.field,- id,- placeHolder),- changes), _1: Signal.dropRepeats(A2(Signal.lift,- function (_)- {- return _.string- },- changes))}- }()- };- var email = function (placeHolder)- {- return function ()- {- var tfs = Native.Graphics.Input.emails(emptyFieldState);- var changes = Signal.dropRepeats(tfs.events);- return {ctor: "_Tuple2", _0: A2(Signal.lift,- A2(tfs.field,- id,- placeHolder),- changes), _1: Signal.dropRepeats(A2(Signal.lift,- function (_)- {- return _.string- },- changes))}- }()- };- var dropDown = Native.Graphics.Input.dropDown;- var stringDropDown = function (strs)- {- return dropDown(A2(List.map,- function (s)- {- return {ctor: "_Tuple2", _0: s, _1: s}- },- strs))- };- var customButtons = Native.Graphics.Input.customButtons;- var customButton = F3(function (up,hover,down)- {- return function ()- {- var pool = customButtons({ctor: "_Tuple0"});- return {ctor: "_Tuple2", _0: A4(pool.customButton,- {ctor: "_Tuple0"},- up,- hover,- down), _1: pool.events}- }()- });- var checkboxes = Native.Graphics.Input.checkboxes;- var checkbox = function (b)- {- return function ()- {- var cbs = checkboxes(b);- return {ctor: "_Tuple2", _0: A2(Signal.lift,- cbs.checkbox(id),- cbs.events), _1: cbs.events}- }()- };- var buttons = Native.Graphics.Input.buttons;- var button = function (txt)- {- return function ()- {- var pool = buttons({ctor: "_Tuple0"});- return {ctor: "_Tuple2", _0: A2(pool.button,- {ctor: "_Tuple0"},- txt), _1: pool.events}- }()- };- var FieldState = F3(function (a,b,c)- {- return {_: {}, selectionEnd: c, selectionStart: b, string: a}- });- elm.Graphics.Input.values = {_op: _op, id: id, buttons: buttons, button: button, customButtons: customButtons, customButton: customButton, checkboxes: checkboxes, checkbox: checkbox, hoverables: hoverables, hoverable: hoverable, fields: fields, emptyFieldState: emptyFieldState, field: field, password: password, email: email, dropDown: dropDown, stringDropDown: stringDropDown, FieldState: FieldState};- return elm.Graphics.Input.values- };Elm.JavaScript = Elm.JavaScript || {};-Elm.JavaScript.Experimental = Elm.JavaScript.Experimental || {};-Elm.JavaScript.Experimental.make = function (elm)- {- elm.JavaScript = elm.JavaScript || {};- elm.JavaScript.Experimental = elm.JavaScript.Experimental || {};- if (elm.JavaScript.Experimental.values)- return elm.JavaScript.Experimental.values- var N = Elm.Native,- _N = N.Utils.make(elm),- _L = N.List.make(elm),- _E = N.Error.make(elm),- _J = N.JavaScript.make(elm),- $moduleName = "JavaScript.Experimental";- var JavaScript = Elm.JavaScript.make(elm);- var Native = Native || {};- Native.JavaScript = Elm.Native.JavaScript.make(elm);- var _op = {};- var toRecord = Native.JavaScript.toRecord;- var fromRecord = Native.JavaScript.fromRecord;- elm.JavaScript.Experimental.values = {_op: _op, toRecord: toRecord, fromRecord: fromRecord};- return elm.JavaScript.Experimental.values- };(function() {--// Returns boolean indicating if the swap was successful.-// Requires that the two signal graphs have exactly the same-// structure.-ElmRuntime.swap = function(from, to) {- function similar(nodeOld,nodeNew) {- idOkay = nodeOld.id === nodeNew.id;- lengthOkay = nodeOld.kids.length === nodeNew.kids.length;- return idOkay && lengthOkay;- }- function swap(nodeOld,nodeNew) {- nodeNew.value = nodeOld.value;- return true;- }- var canSwap = depthFirstTraversals(similar, from.inputs, to.inputs);- if (canSwap) { depthFirstTraversals(swap, from.inputs, to.inputs); }- from.node.parentNode.replaceChild(to.node, from.node);- return canSwap;-}--// Returns false if the node operation f ever fails.-function depthFirstTraversals(f, queueOld, queueNew) {- if (queueOld.length !== queueNew.length) return false;- queueOld = queueOld.slice(0);- queueNew = queueNew.slice(0);-- var seen = [];- while (queueOld.length > 0 && queueNew.length > 0) {- var nodeOld = queueOld.pop();- var nodeNew = queueNew.pop();- if (seen.indexOf(nodeOld.id) < 0) {- if (!f(nodeOld, nodeNew)) return false;- queueOld = queueOld.concat(nodeOld.kids);- queueNew = queueNew.concat(nodeNew.kids);- seen.push(nodeOld.id);- }- }- return true;-}--}());--(function() {-'use strict';--Elm.fullscreen = function(module) {- var style = document.createElement('style');- style.type = 'text/css';- style.innerHTML = "html,head,body { padding:0; margin:0; }" +- "body { font-family: calibri, helvetica, arial, sans-serif; }";- document.head.appendChild(style);- var container = document.createElement('div');- document.body.appendChild(container);- return init(ElmRuntime.Display.FULLSCREEN, container, module);-};--Elm.embed = function(module, container) {- var tag = container.tagName;- if (tag !== 'DIV') {- throw new Error('Elm.node must be given a DIV, not a ' + tag + '.');- } else if (container.hasChildNodes()) {- throw new Error('Elm.node must be given an empty DIV. No children allowed!');- }- return init(ElmRuntime.Display.COMPONENT, container, module);-};--Elm.worker = function(module) {- return init(ElmRuntime.Display.NONE, {}, module);-};--function init(display, container, module, moduleToReplace) {- // defining state needed for an instance of the Elm RTS- var inputs = [];-- function notify(id, v) {- var timestep = Date.now();- var changed = false;- for (var i = inputs.length; i--; ) {- // order is important here to avoid short-circuiting- changed = inputs[i].recv(timestep, id, v) || changed;- }- return changed;- }-- var listeners = [];- function addListener(relevantInputs, domNode, eventName, func) {- domNode.addEventListener(eventName, func);- var listener = {- relevantInputs: relevantInputs,- domNode: domNode,- eventName: eventName,- func: func- };- listeners.push(listener);- }-- // create the actual RTS. Any impure modules will attach themselves to this- // object. This permits many Elm programs to be embedded per document.- var elm = {- notify:notify,- node:container,- display:display,- id:ElmRuntime.guid(),- addListener:addListener,- inputs:inputs- };-- // Set up methods to communicate with Elm program from JS.- function send(name, value) {- if (typeof value === 'undefined') return function(v) { return send(name,v); };- var e = document.createEvent('Event');- e.initEvent(name + '_' + elm.id, true, true);- e.value = value;- document.dispatchEvent(e);- }- function recv(name, handler) {- document.addEventListener(name + '_' + elm.id, handler);- }-- recv('log', function(e) {console.log(e.value)});- recv('title', function(e) {document.title = e.value});- recv('redirect', function(e) {- if (e.value.length > 0) { window.location = e.value; }- });-- function swap(newModule) {- removeListeners(listeners);- var div = document.createElement('div');- var newElm = init(display, div, newModule, elm);- inputs = [];- // elm.send = newElm.send;- // elm.recv = newElm.recv;- // elm.swap = newElm.swap;- return newElm;- }-- var Module = {};- var reportAnyErrors = function() {};- try {- Module = module.make(elm);- } catch(e) {- var directions = "<br/> Open the developer console for more details."- Module.main = Elm.Text.make(elm).text('<code>' + e.message + directions + '</code>');- reportAnyErrors = function() { throw e; }- }- inputs = ElmRuntime.filterDeadInputs(inputs);- filterListeners(inputs, listeners);- if (display !== ElmRuntime.Display.NONE) {- var graphicsNode = initGraphics(elm, Module);- }- if (typeof moduleToReplace !== 'undefined') {- ElmRuntime.swap(moduleToReplace, elm);-- // rerender scene if graphics are enabled.- if (typeof graphicsNode !== 'undefined') {- graphicsNode.recv(0, true, 0);- }- }-- reportAnyErrors();- return { send:send, recv:recv, swap:swap };-};--function filterListeners(inputs, listeners) {- loop:- for (var i = listeners.length; i--; ) {- var listener = listeners[i];- for (var j = inputs.length; j--; ) {- if (listener.relevantInputs.indexOf(inputs[j].id) >= 0) {- continue loop;- }- }- listener.domNode.removeEventListener(listener.eventName, listener.func);- }-}--function removeListeners(listeners) {- for (var i = listeners.length; i--; ) {- var listener = listeners[i];- listener.domNode.removeEventListener(listener.eventName, listener.func);- }-}--function initGraphics(elm, Module) {- if (!('main' in Module))- throw new Error("'main' is missing! What do I display?!");-- var signalGraph = Module.main;-- // make sure the signal graph is actually a signal & extract the visual model- var Signal = Elm.Signal.make(elm);- if (!('recv' in signalGraph)) {- signalGraph = Signal.constant(signalGraph);- }- var currentScene = signalGraph.value;- - // Add the currentScene to the DOM- var Render = ElmRuntime.use(ElmRuntime.Render.Element);- elm.node.appendChild(Render.render(currentScene));- - // set up updates so that the DOM is adjusted as necessary.- function domUpdate(newScene, currentScene) {- ElmRuntime.draw(function(_) {- Render.update(elm.node.firstChild, currentScene, newScene);- if (elm.Native.Window) elm.Native.Window.values.resizeIfNeeded();- });- return newScene;- }- var renderer = A3(Signal.foldp, F2(domUpdate), currentScene, signalGraph);-- // must check for resize after 'renderer' is created so- // that changes show up.- if (elm.Native.Window) elm.Native.Window.values.resizeIfNeeded();-- return renderer;-}--}());-(function() {-'use strict';--ElmRuntime.Display = { FULLSCREEN: 0, COMPONENT: 1, NONE: 2 };--ElmRuntime.counter = 0;-ElmRuntime.guid = function() { return ElmRuntime.counter++; }--ElmRuntime.use = function(M) {- if (typeof M === 'function') M = M();- return M;-};--function isAlive(input) {- if (!('defaultNumberOfKids' in input)) return true;- var len = input.kids.length;- if (len === 0) return false;- if (len > input.defaultNumberOfKids) return true;- var alive = false;- for (var i = len; i--; ) {- alive = alive || isAlive(input.kids[i]);- }- return alive;-}--ElmRuntime.filterDeadInputs = function(inputs) {- var temp = [];- for (var i = inputs.length; i--; ) {- if (isAlive(inputs[i])) temp.push(inputs[i]);- }- return temp;-};--// define the draw function-var vendors = ['ms', 'moz', 'webkit', 'o'];-var window = window || {};-for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {- window.requestAnimationFrame = window[vendors[i]+'RequestAnimationFrame'];- window.cancelAnimationFrame = window[vendors[i]+'CancelAnimationFrame'] ||- window[vendors[i]+'CancelRequestAnimationFrame'];-}--if (window.requestAnimationFrame && window.cancelAnimationFrame) {- var previous = 0;- ElmRuntime.draw = function(callback) {- window.cancelAnimationFrame(previous);- previous = window.requestAnimationFrame(callback);- };-} else {- ElmRuntime.draw = function(callback) { callback(); };-}--}());--ElmRuntime.Render.Collage = function() {--var Render = ElmRuntime.use(ElmRuntime.Render.Element);-var Transform = Elm.Transform2D.make({});-var Utils = ElmRuntime.use(ElmRuntime.Render.Utils);-var newElement = Utils.newElement,- extract = Utils.extract, fromList = Utils.fromList,- fromString = Utils.fromString, addTransform = Utils.addTransform;--function trace(ctx, path) {- var points = fromList(path);- var i = points.length - 1;- if (i <= 0) return;- ctx.moveTo(points[i]._0, points[i]._1);- while (i--) { ctx.lineTo(points[i]._0, points[i]._1); }- if (path.closed) {- i = points.length - 1;- ctx.lineTo(points[i]._0, points[i]._1);- }-}--function line(ctx,style,path) {- style.dashing.ctor === 'Nil' ? trace(ctx, path) : customLineHelp(ctx, style, path);- ctx.scale(1,-1);- ctx.stroke();-}--function customLineHelp(ctx, style, path) {- var points = fromList(path);- if (path.closed) points.push(points[0]);- var pattern = fromList(style.dashing);- var i = points.length - 1;- if (i <= 0) return;- var x0 = points[i]._0, y0 = points[i]._1;- var x1=0, y1=0, dx=0, dy=0, remaining=0, nx=0, ny=0;- var pindex = 0, plen = pattern.length;- var draw = true, segmentLength = pattern[0];- ctx.moveTo(x0,y0);- while (i--) {- x1 = points[i]._0; y1 = points[i]._1;- dx = x1 - x0; dy = y1 - y0;- remaining = Math.sqrt(dx * dx + dy * dy);- while (segmentLength <= remaining) {- x0 += dx * segmentLength / remaining;- y0 += dy * segmentLength / remaining;- ctx[draw ? 'lineTo' : 'moveTo'](x0, y0);- // update starting position- dx = x1 - x0; dy = y1 - y0;- remaining = Math.sqrt(dx * dx + dy * dy);- // update pattern- draw = !draw;- pindex = (pindex + 1) % plen;- segmentLength = pattern[pindex];- }- if (remaining > 0) {- ctx[draw ? 'lineTo' : 'moveTo'](x1, y1);- segmentLength -= remaining;- }- x0 = x1; y0 = y1;- }-}--function drawLine(ctx, style, path) {- ctx.lineWidth = style.width;- var cap = style.cap.ctor;- ctx.lineCap = cap === 'Flat' ? 'butt' :- cap === 'Round' ? 'round' : 'square';- var join = style.join.ctor;- ctx.lineJoin = join === 'Smooth' ? 'round' :- join === 'Sharp' ? 'miter' : 'bevel';- ctx.miterLimit = style.join._0 || 10;- ctx.strokeStyle = extract(style.color);- return line(ctx, style, path);-}--function texture(redo, ctx, src) {- var img = new Image();- img.src = fromString(src);- img.onload = redo;- return ctx.createPattern(img, 'repeat');-}--function gradient(ctx, grad) {- var g;- var stops = [];- if (grad.ctor === 'Linear') {- var p0 = grad._0, p1 = grad._1;- g = ctx.createLinearGradient(p0._0, -p0._1, p1._0, -p1._1);- stops = fromList(grad._2);- } else {- var p0 = grad._0, p2 = grad._2;- g = ctx.createRadialGradient(p0._0, -p0._1, grad._1, p2._0, -p2._1, grad._3);- stops = fromList(grad._4);- }- var len = stops.length;- for (var i = 0; i < len; ++i) {- var stop = stops[i];- g.addColorStop(stop._0, extract(stop._1));- }- return g;-}--function drawShape(redo, ctx, style, path) {- trace(ctx, path);- var sty = style.ctor;- ctx.fillStyle =- sty === 'Solid' ? extract(style._0) :- sty === 'Texture' ? texture(redo, ctx, style._0) : gradient(ctx, style._0);- ctx.scale(1,-1);- ctx.fill();-}--function drawImage(redo, ctx, form) {- var img = new Image();- img.onload = redo;- img.src = fromString(form._3);- var w = form._0,- h = form._1,- pos = form._2,- srcX = pos._0,- srcY = pos._1,- srcW = w,- srcH = h,- destX = -w/2,- destY = -h/2,- destW = w,- destH = h;-- ctx.scale(1,-1);- ctx.drawImage(img, srcX, srcY, srcW, srcH, destX, destY, destW, destH);-}--function renderForm(redo, ctx, form) {- ctx.save();- var x = form.x, y = form.y, theta = form.theta, scale = form.scale;- if (x !== 0 || y !== 0) ctx.translate(x, y);- if (theta !== 0) ctx.rotate(theta);- if (scale !== 1) ctx.scale(scale,scale);- if (form.alpha !== 1) ctx.globalAlpha = ctx.globalAlpha * form.alpha;- ctx.beginPath();- var f = form.form;- switch(f.ctor) {- case 'FPath' : drawLine(ctx, f._0, f._1); break;- case 'FImage': drawImage(redo, ctx, f); break;- case 'FShape':- if (f._0.ctor === 'Left') {- f._1.closed = true;- drawLine(ctx, f._0._0, f._1);- } else {- drawShape(redo, ctx, f._0._0, f._1);- }- break;- }- ctx.restore();-}--function formToMatrix(form) {- var scale = form.scale;- var matrix = A6( Transform.matrix, scale, 0, 0, scale, form.x, form.y );-- var theta = form.theta- if (theta !== 0)- matrix = A2( Transform.multiply, matrix, Transform.rotation(theta) );-- return matrix;-}--function str(n) {- if (n < 0.00001 && n > -0.00001) return 0;- return n;-}--function makeTransform(w, h, form, matrices) {- var props = form.form._0.props;- var m = A6( Transform.matrix, 1, 0, 0, 1,- (w - props.width)/2,- (h - props.height)/2 );- var len = matrices.length;- for (var i = 0; i < len; ++i) { m = A2( Transform.multiply, m, matrices[i] ); }- m = A2( Transform.multiply, m, formToMatrix(form) );-- return 'matrix(' + str( m[0]) + ',' + str( m[3]) + ',' +- str(-m[1]) + ',' + str(-m[4]) + ',' +- str( m[2]) + ',' + str( m[5]) + ')';-}--function stepperHelp(list) {- var arr = fromList(list);- var i = 0;- function peekNext() {- return i < arr.length ? arr[i].form.ctor : '';- }- // assumes that there is a next element- function next() {- var out = arr[i];- ++i;- return out;- }- return { peekNext:peekNext, next:next };-}--function stepper(forms) {- var ps = [stepperHelp(forms)];- var matrices = [];- var alphas = [];- function peekNext() {- var len = ps.length;- var formType = '';- for (var i = 0; i < len; ++i ) {- if (formType = ps[i].peekNext()) return formType;- }- return '';- }- // assumes that there is a next element- function next(ctx) {- while (!ps[0].peekNext()) {- ps.shift();- matrices.pop();- alphas.shift();- if (ctx) { ctx.restore(); }- }- var out = ps[0].next();- var f = out.form;- if (f.ctor === 'FGroup') {- ps.unshift(stepperHelp(f._1));- var m = A2(Transform.multiply, f._0, formToMatrix(out));- ctx.save();- ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);- matrices.push(m);-- var alpha = (alphas[0] || 1) * out.alpha;- alphas.unshift(alpha);- ctx.globalAlpha = alpha;- }- return out;- }- function transforms() { return matrices; }- function alpha() { return alphas[0] || 1; }- return { peekNext:peekNext, next:next, transforms:transforms, alpha:alpha };-}--function makeCanvas(w,h) {- var canvas = newElement('canvas');- canvas.style.width = w + 'px';- canvas.style.height = h + 'px';- canvas.style.display = "block";- canvas.style.position = "absolute";- canvas.width = w;- canvas.height = h;- return canvas;-}--function render(model) {- var div = newElement('div');- update(div, model, model);- return div;-}--function updateTracker(w,h,div) {- var kids = div.childNodes;- var i = 0;- function transform(transforms, ctx) {- ctx.translate(w/2, h/2);- ctx.scale(1,-1);- var len = transforms.length;- for (var i = 0; i < len; ++i) {- var m = transforms[i];- ctx.save();- ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);- }- return ctx;- }- function getContext(transforms) {- while (i < kids.length) {- var node = kids[i];- if (node.getContext) {- node.width = w;- node.height = h;- node.style.width = w + 'px';- node.style.height = h + 'px';- ++i;- return transform(transforms, node.getContext('2d'));- }- div.removeChild(node);- }- var canvas = makeCanvas(w,h);- div.appendChild(canvas);- // we have added a new node, so we must step our position- ++i;- return transform(transforms, canvas.getContext('2d'));- }- function element(matrices, alpha, form) {- var container = kids[i];- if (!container || container.getContext) {- container = newElement('div');- container.style.overflow = 'hidden';- container.style.position = 'absolute';- addTransform(container.style, 'scaleY(-1)');- - var kid = kids[i];- kid ? div.insertBefore(container, kid)- : div.appendChild(container);- }- // we have added a new node, so we must step our position- ++i;-- container.style.width = w + 'px';- container.style.height = h + 'px';- container.style.opacity = alpha * form.alpha;-- var elem = form.form._0;- var node = container.firstChild;- if (node) {- Render.update(node, node.oldElement, elem);- node = container.firstChild;- } else {- node = Render.render(elem);- container.appendChild(node);- }- node.oldElement = elem;- addTransform(node.style, makeTransform(w, h, form, matrices));- }- function clearRest() {- while (i < kids.length) {- div.removeChild(kids[i]);- }- }- return { getContext:getContext, element:element, clearRest:clearRest };-}---function update(div, _, model) {- var w = model.w;- var h = model.h;- div.style.width = w + 'px';- div.style.height = h + 'px';- if (model.forms.ctor === 'Nil') {- while (div.hasChildNodes()) {- div.removeChild(div.lastChild);- }- }- var stpr = stepper(model.forms);- var tracker = updateTracker(w,h,div);- var ctx = null;- var formType = '';-- while (formType = stpr.peekNext()) {- if (ctx === null && formType !== 'FElement') {- ctx = tracker.getContext(stpr.transforms());- ctx.globalAlpha = stpr.alpha();- }- var form = stpr.next(ctx);- if (formType === 'FElement') {- tracker.element(stpr.transforms(), stpr.alpha(), form);- ctx = null;- } else if (formType !== 'FGroup') {- renderForm(function() { update(div, model, model); }, ctx, form);- }- }- tracker.clearRest();- return false;-}--return { render:render, update:update };--};--ElmRuntime.Render.Element = function() {-'use strict';--var Utils = ElmRuntime.use(ElmRuntime.Render.Utils);-var newElement = Utils.newElement, extract = Utils.extract,- addTransform = Utils.addTransform, removeTransform = Utils.removeTransform,- fromList = Utils.fromList, eq = Utils.eq;--function setProps(props, e) {- e.style.width = (props.width |0) + 'px';- e.style.height = (props.height|0) + 'px';- if (props.opacity !== 1) { e.style.opacity = props.opacity; }- if (props.color.ctor === 'Just') {- e.style.backgroundColor = extract(props.color._0);- }- if (props.tag !== '') { e.id = props.tag; }- if (props.href !== '') {- var a = newElement('a');- a.href = props.href;- a.style.width = '100%';- a.style.height = '100%';- a.style.top = 0;- a.style.left = 0;- a.style.display = 'block';- a.style.position = 'absolute';- e.style.position = 'relative';- e.appendChild(a);- }- if (props.hover.ctor !== '_Tuple0') {- var overCount = 0;- e.addEventListener('mouseover', function() {- if (overCount++ > 0) return;- props.hover(true);- });- e.addEventListener('mouseout', function(evt) {- if (e.contains(evt.toElement || evt.relatedTarget)) return;- overCount = 0;- props.hover(false);- });- }- return e;-}--function image(props, img) {- switch (img._0.ctor) {- case 'Plain': return plainImage(img._3);- case 'Fitted': return fittedImage(props.width, props.height, img._3);- case 'Cropped': return croppedImage(img,props.width,props.height,img._3);- case 'Tiled': return tiledImage(img._3);- }-}--function plainImage(src) {- var img = newElement('img');- img.src = src;- img.name = src;- img.style.display = "block";- return img;-}--function tiledImage(src) {- var div = newElement('div');- div.style.backgroundImage = 'url(' + src + ')';- return div;-}--function fittedImage(w, h, src) {- var div = newElement('div');- div.style.background = 'url(' + src + ') no-repeat center';- div.style.webkitBackgroundSize = 'cover';- div.style.MozBackgroundSize = 'cover';- div.style.OBackgroundSize = 'cover';- div.style.backgroundSize = 'cover';- return div;-}--function croppedImage(elem, w, h, src) {- var pos = elem._0._0;- var e = newElement('div');- e.style.overflow = "hidden";-- var img = newElement('img');- img.onload = function() {- var sw = w / elem._1, sh = h / elem._2;- img.style.width = ((this.width * sw)|0) + 'px';- img.style.height = ((this.height * sh)|0) + 'px';- img.style.marginLeft = ((- pos._0 * sw)|0) + 'px';- img.style.marginTop = ((- pos._1 * sh)|0) + 'px';- };- img.src = src;- img.name = src;- e.appendChild(img);- return e;-}--function goIn(e) { e.style.position = 'absolute'; return e; }-function goDown(e) { return e }-function goRight(e) { e.style.styleFloat = e.style.cssFloat = "left"; return e; }-function flowWith(f, array) {- var container = newElement('div');- for (var i = array.length; i--; ) {- container.appendChild(f(render(array[i])));- }- return container;-}--function flow(dir,elist) {- var array = fromList(elist);- switch(dir.ctor) {- case "DDown": array.reverse();- case "DUp": return flowWith(goDown,array);- case "DRight": array.reverse();- case "DLeft": return flowWith(goRight,array);- case "DOut": array.reverse();- case "DIn": return flowWith(goIn,array);- }-}--function toPos(pos) {- switch(pos.ctor) {- case "Absolute": return pos._0 + "px";- case "Relative": return (pos._0 * 100) + "%";- }-}--// must clear right, left, top, bottom, and transform-// before calling this function-function setPos(pos,w,h,e) {- e.style.position = 'absolute';- e.style.margin = 'auto';- var transform = '';- switch(pos.horizontal.ctor) {- case 'P': e.style.right = toPos(pos.x); e.style.removeProperty('left'); break;- case 'Z': transform = 'translateX(' + ((-w/2)|0) + 'px) ';- case 'N': e.style.left = toPos(pos.x); e.style.removeProperty('right'); break;- }- switch(pos.vertical.ctor) {- case 'N': e.style.bottom = toPos(pos.y); e.style.removeProperty('top'); break;- case 'Z': transform += 'translateY(' + ((-h/2)|0) + 'px)';- case 'P': e.style.top = toPos(pos.y); e.style.removeProperty('bottom'); break;- }- if (transform !== '') addTransform(e.style, transform);- return e;-}--function container(pos,elem) {- var e = render(elem);- setPos(pos, elem.props.width, elem.props.height, e);- var div = newElement('div');- div.style.position = 'relative';- div.style.overflow = 'hidden';- div.appendChild(e);- return div;-}--function rawHtml(html) {- var e = newElement('div');- e.innerHTML = html;- return e;-}--function render(elem) { return setProps(elem.props, makeElement(elem)); }-function makeElement(e) {- var elem = e.element;- switch(elem.ctor) {- case 'Image': return image(e.props, elem);- case 'Flow': return flow(elem._0, elem._1);- case 'Container': return container(elem._0, elem._1);- case 'Spacer': return newElement('div');- case 'RawHtml': return rawHtml(elem._0);- case 'Custom': return elem.render(elem.model);- }-}--function update(node, curr, next) {- if (node.tagName === 'A') { node = node.firstChild; }- if (curr.props.id === next.props.id) return updateProps(node, curr, next);- if (curr.element.ctor !== next.element.ctor) {- node.parentNode.replaceChild(render(next),node);- return true;- }- var nextE = next.element, currE = curr.element;- switch(nextE.ctor) {- case "Spacer": break;- case "RawHtml":- if (nextE._0 !== currE._0) node.innerHTML = nextE._0;- break;- case "Image":- if (nextE._0.ctor === 'Plain') {- if (nextE._3 !== currE._3) node.src = nextE._3;- } else if (!eq(nextE,currE) ||- next.props.width !== curr.props.width ||- next.props.height !== curr.props.height) {- node.parentNode.replaceChild(render(next),node);- return true;- }- break;- case "Flow":- var arr = fromList(nextE._1);- for (var i = arr.length; i--; ) { arr[i] = arr[i].element.ctor; }- if (nextE._0.ctor !== currE._0.ctor) {- node.parentNode.replaceChild(render(next),node);- return true;- }- var nexts = fromList(nextE._1);- var kids = node.childNodes;- if (nexts.length !== kids.length) {- node.parentNode.replaceChild(render(next),node);- return true;- }- var currs = fromList(currE._1);- var goDir = function(x) { return x; };- switch(nextE._0.ctor) {- case "DDown": case "DUp": goDir = goDown; break;- case "DRight": case "DLeft": goDir = goRight; break;- case "DOut": case "DIn": goDir = goIn; break;- }- for (var i = kids.length; i-- ;) {- update(kids[i],currs[i],nexts[i]);- goDir(kids[i]);- }- break;- case "Container":- update(node.firstChild, currE._1, nextE._1)- setPos(nextE._0, nextE._1.props.width, nextE._1.props.height, node.firstChild);- break;- case "Custom":- if (currE.type === nextE.type) {- var done = nextE.update(node, currE.model, nextE.model);- if (done) return;- } else {- return node.parentNode.replaceChild(render(next), node);- }- }- updateProps(node, curr, next);-}--function updateProps(node, curr, next) {- var props = next.props, currP = curr.props, e = node;- if (props.width !== currP.width) e.style.width = (props.width |0) + 'px';- if (props.height !== currP.height) e.style.height = (props.height|0) + 'px';- if (props.opacity !== 1 && props.opacity !== currP.opacity) {- e.style.opacity = props.opacity;- }- var nextColor = (props.color.ctor === 'Just' ?- extract(props.color._0) : '');- if (e.style.backgroundColor !== nextColor) {- e.style.backgroundColor = (nextColor === '' ? 'transparent' : nextColor);- }- if (props.tag !== currP.tag) { e.id = props.tag; }- if (props.href !== currP.href) {- if (currP.href === '') {- var a = newElement('a');- a.href = props.href;- a.style.width = '100%';- a.style.height = '100%';- a.style.top = 0;- a.style.left = 0;- a.style.display = 'block';- a.style.position = 'absolute';- e.style.position = 'relative';- e.appendChild(a);- } else {- node.lastNode.href = props.href;- }- }-}--return { render:render, update:update };--};-ElmRuntime.Render.Utils = function() {--function newElement(elementType) {- var e = document.createElement(elementType); - e.style.padding = "0";- e.style.margin = "0";- return e;-}--function addTo(container, elem) {- container.appendChild(elem);-}--function extract(c) {- if (c._3 === 1) { return 'rgb(' + c._0 + ', ' + c._1 + ', ' + c._2 + ')'; }- return 'rgba(' + c._0 + ', ' + c._1 + ', ' + c._2 + ', ' + c._3 + ')';-}--function addTransform(style, trans) {- style.transform = trans;- style.msTransform = trans;- style.MozTransform = trans;- style.webkitTransform = trans;- style.OTransform = trans;-}--function removeTransform(style) {- style.transform = 'none';- style.msTransform = 'none';- style.MozTransform = 'none';- style.webkitTransform = 'none';- style.OTransform = 'none';-}--var List = Elm.Native.List.make({});--return {addTo:addTo,- newElement:newElement,- extract : extract,- fromList: List.toArray,- fromString: function(s) { return s; },- toString: function(s) { return s; },- eq: Elm.Native.Utils.make({}).eq,- addTransform: addTransform,- removeTransform: removeTransform- };+ var basics = {+ div:F2(div),+ rem:F2(rem),+ mod:mod,++ pi:Math.PI,+ e:Math.E,+ cos:Math.cos,+ sin:Math.sin,+ tan:Math.tan,+ acos:Math.acos,+ asin:Math.asin,+ atan:Math.atan,+ atan2:F2(Math.atan2),++ sqrt:Math.sqrt,+ abs:abs,+ logBase:F2(logBase),+ min:F2(min),+ max:F2(max),+ clamp:F3(clamp),+ compare:Utils.compare,++ xor:F2(xor),+ not:not,++ truncate:truncate,+ ceiling:Math.ceil,+ floor:Math.floor,+ round:Math.round,+ toFloat:function(x) { return x; },+ };++ return elm.Native.Basics.values = basics;+};+Elm.Native.Bitwise = {};+Elm.Native.Bitwise.make = function(elm) {+ elm.Native = elm.Native || {};+ elm.Native.Bitwise = elm.Native.Bitwise || {};+ if (elm.Native.Bitwise.values) return elm.Native.Bitwise.values;++ function and(a,b) { return a & b; }+ function or (a,b) { return a | b; }+ function xor(a,b) { return a ^ b; }+ function not(a) { return ~a; }+ function sll(a,offset) { return a << offset; }+ function sra(a,offset) { return a >> offset; }+ function srl(a,offset) { return a >>> offset; }++ return elm.Native.Bitwise.values = {+ and: A2(and),+ or : A2(or ),+ xor: A2(xor),+ complement: not,+ shiftLeft : A2(sll),+ shiftRightArithmatic: A2(sra),+ shiftRightLogical : A2(srl),+ };+ +};+Elm.Native.Char = {};+Elm.Native.Char.make = function(elm) {+ elm.Native = elm.Native || {};+ elm.Native.Char = elm.Native.Char || {};+ if (elm.Native.Char.values) return elm.Native.Char.values;++ function isBetween(lo,hi) { return function(chr) {+ var c = chr.charCodeAt(0);+ return lo <= c && c <= hi;+ };+ }+ var isDigit = isBetween('0'.charCodeAt(0),'9'.charCodeAt(0));+ var chk1 = isBetween('a'.charCodeAt(0),'f'.charCodeAt(0));+ var chk2 = isBetween('A'.charCodeAt(0),'F'.charCodeAt(0));++ return elm.Native.Char.values = {+ fromCode : function(c) { return String.fromCharCode(c); },+ toCode : function(c) { return c.toUpperCase().charCodeAt(0); },+ toUpper : function(c) { return c.toUpperCase(); },+ toLower : function(c) { return c.toLowerCase(); },+ toLocaleUpper : function(c) { return c.toLocaleUpperCase(); },+ toLocaleLower : function(c) { return c.toLocaleLowerCase(); },+ isLower : isBetween('a'.charCodeAt(0),'z'.charCodeAt(0)),+ isUpper : isBetween('A'.charCodeAt(0),'Z'.charCodeAt(0)),+ isDigit : isDigit,+ isOctDigit : isBetween('0'.charCodeAt(0),'7'.charCodeAt(0)),+ isHexDigit : function(c) { return isDigit(c) || chk1(c) || chk2(c); }+ };+};+Elm.Native.Color = {};+Elm.Native.Color.make = function(elm) {+ elm.Native = elm.Native || {};+ elm.Native.Color = elm.Native.Color || {};+ if (elm.Native.Color.values) return elm.Native.Color.values;++ var Utils = Elm.Native.Utils.make(elm);++ function complement(rgb) {+ var hsv = toHSV(rgb);+ hsv.hue = (hsv.hue + 180) % 360;+ return toRGB(hsv);+ }++ function hsva(h,s,v,a) {+ var degree = A2(Utils.mod, h * 180 / Math.PI, 360);+ var clr = toRGB({hue:degree, saturation:s, value:v});+ clr._3 = a;+ return clr;+ }++ function hsv(h,s,v) {+ var degree = A2(Utils.mod, h * 180 / Math.PI, 360);+ return toRGB({hue:degree, saturation:s, value:v});+ }++ function toHSV(rgb) {+ var hsv = {};+ var r = rgb._0 / 255.0, g = rgb._1 / 255.0, b = rgb._2 / 255.0;+ var M = Math.max(r,g,b);+ var m = Math.min(r,g,b);+ var c = M - m;++ var h = 0;+ if (c === 0) { h = 0; }+ else if (M === r) { h = ((g - b) / c) % 6; }+ else if (M === g) { h = ((b - r) / c) + 2; }+ else if (M === b) { h = ((r - g) / c) + 4; }+ h *= 60;++ return { value : M, hue : h, saturation : (M === 0 ? 0 : c / M) };+ }++ function between(lo,hi,x) { return lo <= x && x < hi; }+ function norm(n) { return Math.round(n*255); }++ function toRGB(hsv) {+ var c = hsv.value * hsv.saturation;+ var hue = hsv.hue / 60;+ var x = c * (1 - Math.abs((hue % 2) - 1));+ var r = 0, g = 0, b = 0;+ if (between(0,1,hue)) { r = c; g = x; b = 0; }+ else if (between(1,2,hue)) { r = x; g = c; b = 0; }+ else if (between(2,3,hue)) { r = 0; g = c; b = x; }+ else if (between(3,4,hue)) { r = 0; g = x; b = c; }+ else if (between(4,5,hue)) { r = x; g = 0; b = c; }+ else if (between(5,6,hue)) { r = c; g = 0; b = x; }++ var m = hsv.value - c;+ return { ctor:"Color", _0:norm(r+m), _1:norm(g+m), _2:norm(b+m), _3:1 };+ }++ return elm.Native.Color.values = {+ hsva:F4(hsva),+ hsv:F3(hsv),+ complement:complement+ };++};Elm.Native.Date = {};+Elm.Native.Date.make = function(elm) {+ elm.Native = elm.Native || {};+ elm.Native.Date = elm.Native.Date || {};+ if (elm.Native.Date.values) return elm.Native.Date.values;++ var JS = Elm.JavaScript.make(elm);+ var Maybe = Elm.Maybe.make(elm);++ function dateNow() { return new window.Date; }+ function readDate(str) {+ var d = new window.Date(JS.fromString(str));+ if (isNaN(d.getTime())) return Maybe.Nothing;+ return Maybe.Just(d);+ }++ var dayTable = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];+ var monthTable = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; ++ return elm.Native.Date.values = {+ read : readDate,+ year : function(d) { return d.getFullYear(); },+ month : function(d) { return { ctor:monthTable[d.getMonth()] }; },+ day : function(d) { return d.getDate(); },+ hour : function(d) { return d.getHours(); },+ minute : function(d) { return d.getMinutes(); },+ second : function(d) { return d.getSeconds(); },+ toTime : function(d) { return d.getTime(); },+ dayOfWeek : function(d) { return { ctor:dayTable[d.getDay()] }; }+ };++};+Elm.Native.Error = {};+Elm.Native.Error.make = function(elm) {+ elm.Native = elm.Native || {};+ elm.Native.Error = elm.Native.Error || {};+ if (elm.Native.Error.values) return elm.Native.Error.values;++ var fromString = Elm.Native.JavaScript.make(elm).fromString;++ function indent(lines) {+ var msg = '';+ for (var i = 0; i < lines.length; ++i) {+ msg += '<br/> ' + lines[i];+ }+ return msg;+ }++ function Case(moduleName, span) { + var msg = indent(['Non-exhaustive pattern match in case-expression.',+ 'Make sure your patterns cover every case!']);+ throw new Error('Runtime error in module ' + moduleName + ' (' + span + '):' + msg);+ }++ function If(moduleName, span) { + var msg = indent(['Non-exhaustive pattern match in multi-way-if expression.',+ 'It is best to use \'otherwise\' as the last branch of multi-way-if.']);+ throw new Error('Runtime error in module ' + moduleName + ' (' + span + '):' + msg);+ }++ function raise(str) { throw new Error(fromString(str)); }++ return elm.Native.Error.values = { Case: Case, If: If, raise: raise };+};+function F2(fun) {+ function wrapper(a) { return function(b) { return fun(a,b) } }+ wrapper.arity = 2;+ wrapper.func = fun;+ return wrapper;+}++function F3(fun) {+ function wrapper(a) {+ return function(b) { return function(c) { return fun(a,b,c) }}+ }+ wrapper.arity = 3;+ wrapper.func = fun;+ return wrapper;+}++function F4(fun) {+ function wrapper(a) { return function(b) { return function(c) {+ return function(d) { return fun(a,b,c,d) }}}+ }+ wrapper.arity = 4;+ wrapper.func = fun;+ return wrapper;+}++function F5(fun) {+ function wrapper(a) { return function(b) { return function(c) {+ return function(d) { return function(e) { return fun(a,b,c,d,e) }}}}+ }+ wrapper.arity = 5;+ wrapper.func = fun;+ return wrapper;+}++function F6(fun) {+ function wrapper(a) { return function(b) { return function(c) {+ return function(d) { return function(e) { return function(f) {+ return fun(a,b,c,d,e,f) }}}}}+ }+ wrapper.arity = 6;+ wrapper.func = fun;+ return wrapper;+}++function F7(fun) {+ function wrapper(a) { return function(b) { return function(c) {+ return function(d) { return function(e) { return function(f) {+ return function(g) { return fun(a,b,c,d,e,f,g) }}}}}}+ }+ wrapper.arity = 7;+ wrapper.func = fun;+ return wrapper;+}++function F8(fun) {+ function wrapper(a) { return function(b) { return function(c) {+ return function(d) { return function(e) { return function(f) {+ return function(g) { return function(h) {return fun(a,b,c,d,e,f,g,h)}}}}}}}+ }+ wrapper.arity = 8;+ wrapper.func = fun;+ return wrapper;+}++function F9(fun) {+ function wrapper(a) { return function(b) { return function(c) {+ return function(d) { return function(e) { return function(f) {+ return function(g) { return function(h) { return function(i) {+ return fun(a,b,c,d,e,f,g,h,i) }}}}}}}}+ }+ wrapper.arity = 9;+ wrapper.func = fun;+ return wrapper;+}++function A2(fun,a,b) {+ return fun.arity === 2 ? fun.func(a,b) : fun(a)(b);+}+function A3(fun,a,b,c) {+ return fun.arity === 3 ? fun.func(a,b,c) : fun(a)(b)(c);+}+function A4(fun,a,b,c,d) {+ return fun.arity === 4 ? fun.func(a,b,c,d) : fun(a)(b)(c)(d);+}+function A5(fun,a,b,c,d,e) {+ return fun.arity === 5 ? fun.func(a,b,c,d,e) : fun(a)(b)(c)(d)(e);+}+function A6(fun,a,b,c,d,e,f) {+ return fun.arity === 6 ? fun.func(a,b,c,d,e,f) : fun(a)(b)(c)(d)(e)(f);+}+function A7(fun,a,b,c,d,e,f,g) {+ return fun.arity === 7 ? fun.func(a,b,c,d,e,f,g) : fun(a)(b)(c)(d)(e)(f)(g);+}+function A8(fun,a,b,c,d,e,f,g,h) {+ return fun.arity === 8 ? fun.func(a,b,c,d,e,f,g,h) : fun(a)(b)(c)(d)(e)(f)(g)(h);+}+function A9(fun,a,b,c,d,e,f,g,h,i) {+ return fun.arity === 9 ? fun.func(a,b,c,d,e,f,g,h,i)+ : fun(a)(b)(c)(d)(e)(f)(g)(h)(i);+}+Elm.Native.JavaScript = {};+Elm.Native.JavaScript.make = function(elm) {+ elm.Native = elm.Native || {};+ elm.Native.JavaScript = elm.Native.JavaScript || {};+ if (elm.Native.JavaScript.values) return elm.Native.JavaScript.values;++ var List = Elm.Native.List.make(elm);+ var Render = ElmRuntime.use(ElmRuntime.Render.Element);++ function fromJS(v) {+ var type = typeof v;+ if (type === 'number' ) return v;+ if (type === 'boolean') return v;+ if (type === 'string' ) return v;+ if (v instanceof Array) {+ var arr = [];+ var len = v.length;+ for (var i = 0; i < len; ++i) {+ var x = fromJS(v[i]);+ if (x !== null) arr.push(x);+ }+ return List.fromArray(arr);+ }+ if (type === 'object') {+ var rec = { _:{} };+ for (var f in v) {+ var x = fromJS(v[f]);+ if (x !== null) rec[f] = x;+ }+ return rec;+ }+ return null;+ }++ function toJS(v) {+ var type = typeof v;+ if (type === 'number' || type === 'boolean') return v;+ if (type === 'object' && '_' in v) {+ var obj = {};+ for (var k in v) {+ var x = toJS(v[k]);+ if (x !== null) obj[k] = x;+ }+ return obj;+ }+ if (type === 'object' && (v.ctor === '::' || v.ctor === '[]')) {+ var array = List.toArray(v);+ for (var i = array.length; i--; ) {+ array[i] = toJS(array[i]);+ }+ return array;+ }+ return null;+ }++ function fromRecord(r) {+ if (typeof r === 'object' && '_' in r) {+ return toJS(r);+ }+ throw new Error("'fromRecord' must be called on a record.");+ }++ function id(n) { return n; }++ function toElement(w,h,domNode) {+ return A3( newElement, w, h, {+ ctor: 'Custom',+ type: 'DomNode',+ render: function(node) { return node; },+ update: function(node,oldNode,newNode) {+ if (node === newNode) return;+ node.parentNode.replaceChild(newNode, node);+ },+ model: domNode+ });+ }++ function fromElement(element) {+ return Render.render(element);+ }++ return elm.Native.JavaScript.values = {+ toInt : function(n) { return n|0; },+ toFloat : function(n) { return +n; },+ toBool : id,+ toString : id,+ toList : List.fromArray,+ fromString : id,+ fromList : List.toArray,+ fromInt : id,+ fromFloat : id,+ fromBool : id,++ toElement : toElement,+ fromElement : fromElement,+ toRecord : fromJS,+ fromRecord : fromRecord+ };++};+Elm.Native.Json = {};+Elm.Native.Json.make = function(elm) {++ elm.Native = elm.Native || {};+ elm.Native.Json = elm.Native.Json || {};+ if (elm.Native.Json.values) return elm.Native.Json.values;++ var Maybe = Elm.Maybe.make(elm);+ var Dict = Elm.Dict.make(elm);+ var List = Elm.List.make(elm);+ var JS = Elm.JavaScript.make(elm);+ var Utils = Elm.Native.Utils.make(elm);++ function fromValue(v) {+ switch (v.ctor) {+ case 'Null' : return null;+ case 'String' : return JS.fromString(v._0);+ case 'Object' :+ var obj = {};+ var array = JS.fromList(Dict.toList(v._0));+ for (var i = array.length; i--; ) {+ obj[JS.fromString(array[i]._0)] = fromValue(array[i]._1);+ }+ return obj;+ case 'Array' :+ var array = JS.fromList(v._0);+ for (var i = array.length; i--; ) {+ array[i] = fromValue(array[i]);+ }+ return array;+ default :+ return v._0;+ }+ }++ function toPrettyJSString(sep, obj) {+ return JSON.stringify(fromValue(obj), null, JS.fromString(sep));+ }++ function toValue(v) {+ switch (typeof v) {+ case 'string' : return { ctor:"String", _0: JS.toString(v) };+ case 'number' : return { ctor:"Number", _0: JS.toFloat(v) };+ case 'boolean': return { ctor:"Boolean" , _0: JS.toBool(v) };+ case 'object' :+ if (v === null) return { ctor:"Null" };+ if (v instanceof Array) {+ for (var i = v.length; i--; ) { v[i] = toValue(v[i]); }+ return { ctor:"Array", _0: JS.toList(v) };+ }+ var array = [];+ for (var k in v) array.push(Utils.Tuple2(JS.toString(k), toValue(v[k])));+ return { ctor:"Object", _0: Dict.fromList(JS.toList(array)) };+ }+ }++ function fromJSString(str) {+ try {+ return Maybe.Just(toValue(JSON.parse(str)));+ } catch (e) {+ return Maybe.Nothing;+ }+ }++ return elm.Native.Json.values = {+ toJSString : F2(toPrettyJSString),+ fromJSString : fromJSString,+ toJSObject : fromValue,+ fromJSObject : toValue+ };++};+Elm.Native.List = {};+Elm.Native.List.make = function(elm) {+ elm.Native = elm.Native || {};+ elm.Native.List = elm.Native.List || {};+ if (elm.Native.List.values) return elm.Native.List.values;+ if ('values' in Elm.Native.List)+ return elm.Native.List.values = Elm.Native.List.values;++ var Utils = Elm.Native.Utils.make(elm);++ // TODO: Improve Nil handling+ // We can change places like: if (xs.ctor === '[]') ... to if (xs === Nil) ...+ // but only if we're confident Nil can only be defined once.+ // Currently (27Mar2013) each module can have different instantiations, so multiple Nil objects can exist+ // (and if they're used interchangeably then direct object comparison fails where ctor doesn't).+ // So, this can only be fixed when modules initialisation is also fixed.+ // The performance overhead of the .ctor calls is 5-10% according to jsperf (depending on fn + list size)+ // (on firefox 19)++ var Nil = { ctor:'[]' };++ // using freeze for every cons would be nice but is a huge (9x on firefox 19)+ // performance penalty+ function Cons(hd,tl) { return { ctor:"::", _0:hd, _1:tl }; }++ function throwError(f) {+ throw new Error("Function '" + f + "' expects a non-empty list!");+ }++ function toArray(xs) {+ var out = [];+ while (xs.ctor !== '[]') {+ out.push(xs._0);+ xs = xs._1;+ }+ return out;+ }++ function fromArray(arr) {+ var out = Nil;+ for (var i = arr.length; i--; ) {+ out = Cons(arr[i], out);+ }+ return out;+ }++ function range(lo,hi) {+ var lst = Nil;+ if (lo <= hi) {+ do { lst = Cons(hi,lst) } while (hi-->lo);+ }+ return lst+ }++ function append(xs,ys) {+ // append Text+ if (xs.text || ys.text) {+ return Utils.txt(Utils.makeText('',xs) + Utils.makeText('',ys));+ }++ // append Strings+ if (typeof xs === "string") return xs + ys;++ // append Lists+ if (xs.ctor === '[]') { return ys; }+ var root = Cons(xs._0, Nil);+ var curr = root;+ xs = xs._1;+ while (xs.ctor !== '[]') {+ curr._1 = Cons(xs._0, Nil);+ xs = xs._1;+ curr = curr._1;+ }+ curr._1 = ys;+ return root;+ }++ function head(v) { return v.ctor === '[]' ? throwError('head') : v._0; }+ function tail(v) { return v.ctor === '[]' ? throwError('tail') : v._1; }++ function last(xs) {+ if (xs.ctor === '[]') { throwError('last'); }+ var out = xs._0;+ while (xs.ctor !== '[]') {+ out = xs._0;+ xs = xs._1;+ }+ return out;+ }++ function map(f, xs) {+ var arr = [];+ while (xs.ctor !== '[]') {+ arr.push(f(xs._0));+ xs = xs._1;+ }+ return fromArray(arr);+ }++ // f defined similarly for both foldl and foldr (NB: different from Haskell)+ // ie, foldl : (a -> b -> b) -> b -> [a] -> b+ function foldl(f, b, xs) {+ var acc = b;+ while (xs.ctor !== '[]') {+ acc = A2(f, xs._0, acc);+ xs = xs._1;+ }+ return acc;+ }++ function foldr(f, b, xs) {+ var arr = toArray(xs);+ var acc = b;+ for (var i = arr.length; i--; ) {+ acc = A2(f, arr[i], acc);+ }+ return acc;+ }++ function foldl1(f, xs) {+ return xs.ctor === '[]' ? throwError('foldl1') : foldl(f, xs._0, xs._1);+ }++ function foldr1(f, xs) {+ if (xs.ctor === '[]') { throwError('foldr1'); }+ var arr = toArray(xs);+ var acc = arr.pop();+ for (var i = arr.length; i--; ) {+ acc = A2(f, arr[i], acc);+ }+ return acc;+ }++ function scanl(f, b, xs) {+ var arr = toArray(xs);+ arr.unshift(b);+ var len = arr.length;+ for (var i = 1; i < len; ++i) {+ arr[i] = A2(f, arr[i], arr[i-1]);+ }+ return fromArray(arr);+ }++ function scanl1(f, xs) {+ return xs.ctor === '[]' ? throwError('scanl1') : scanl(f, xs._0, xs._1);+ }++ function filter(pred, xs) {+ var arr = [];+ while (xs.ctor !== '[]') {+ if (pred(xs._0)) { arr.push(xs._0); }+ xs = xs._1;+ }+ return fromArray(arr);+ }++ function length(xs) {+ var out = 0;+ while (xs.ctor !== '[]') {+ out += 1;+ xs = xs._1;+ }+ return out;+ }++ function member(x, xs) {+ while (xs.ctor !== '[]') {+ if (Utils.eq(x,xs._0)) return true;+ xs = xs._1;+ }+ return false;+ }++ function reverse(xs) { return fromArray(toArray(xs).reverse()); }++ function concat(xss) {+ if (xss.ctor === '[]') return xss;+ var arr = toArray(xss);+ var xs = arr[arr.length-1];+ for (var i = arr.length-1; i--; ) {+ xs = append(arr[i], xs);+ }+ return xs;+ }++ function all(pred, xs) {+ while (xs.ctor !== '[]') {+ if (!pred(xs._0)) return false;+ xs = xs._1;+ }+ return true;+ }++ function any(pred, xs) {+ while (xs.ctor !== '[]') {+ if (pred(xs._0)) return true;+ xs = xs._1;+ }+ return false;+ }++ function zipWith(f, xs, ys) {+ var arr = [];+ while (xs.ctor !== '[]' && ys.ctor !== '[]') {+ arr.push(A2(f, xs._0, ys._0));+ xs = xs._1;+ ys = ys._1;+ }+ return fromArray(arr);+ }++ function zip(xs, ys) {+ var arr = [];+ while (xs.ctor !== '[]' && ys.ctor !== '[]') {+ arr.push(Utils.Tuple2(xs._0, ys._0));+ xs = xs._1;+ ys = ys._1;+ }+ return fromArray(arr);+ }++ function sort(xs) {+ return fromArray(toArray(xs).sort(Utils.cmp));+ }++ function sortBy(f, xs) {+ return fromArray(toArray(xs).sort(function(a,b){+ return Utils.cmp(f(a), f(b));+ }));+ }++ function sortWith(f, xs) {+ return fromArray(toArray(xs).sort(function(a,b){+ var ord = f(a)(b).ctor;+ return ord === 'EQ' ? 0 : ord === 'LT' ? -1 : 1;+ }));+ }++ function nth(xs, n) {+ return toArray(xs)[n];+ }++ function take(n, xs) {+ var arr = [];+ while (xs.ctor !== '[]' && n > 0) {+ arr.push(xs._0);+ xs = xs._1;+ --n;+ }+ return fromArray(arr);+ }++ function drop(n, xs) {+ while (xs.ctor !== '[]' && n > 0) {+ xs = xs._1;+ --n;+ }+ return xs;+ }++ function repeat(n, x) {+ var arr = [];+ var pattern = [x];+ while (n > 0) {+ if (n & 1) arr = arr.concat(pattern);+ n >>= 1, pattern = pattern.concat(pattern);+ }+ return fromArray(arr);+ }++ function join(sep, xss) {+ if (sep.text) {+ sep = Utils.makeText('',sep);+ xss = toArray(xss);+ for (var i = xss.length; i--; ) {+ xss[i] = Utils.makeText('',xss[i]);+ }+ return Utils.txt(xss.join(sep));+ }+ if (typeof sep === 'string') return toArray(xss).join(sep);+ if (xss.ctor === '[]') return Nil;+ var s = toArray(sep);+ var out = toArray(xss._0);+ xss = xss._1;+ while (xss.ctor !== '[]') {+ out = out.concat(s, toArray(xss._0));+ xss = xss._1;+ }+ return fromArray(out);+ }++ Elm.Native.List.values = {+ Nil:Nil,+ Cons:Cons,+ cons:F2(Cons),+ toArray:toArray,+ fromArray:fromArray,+ range:range,+ append:append,++ head:head,+ tail:tail,+ last:last,++ map:F2(map),+ foldl:F3(foldl),+ foldr:F3(foldr),++ foldl1:F2(foldl1),+ foldr1:F2(foldr1),+ scanl:F3(scanl),+ scanl1:F2(scanl1),+ filter:F2(filter),+ length:length,+ member:F2(member),+ reverse:reverse,+ concat:concat,++ all:F2(all),+ any:F2(any),+ zipWith:F3(zipWith),+ zip:F2(zip),+ sort:sort,+ sortBy:F2(sortBy),+ sortWith:F2(sortWith),+ nth:F2(nth),+ take:F2(take),+ drop:F2(drop),+ repeat:F2(repeat),++ join:F2(join)+ };+ return elm.Native.List.values = Elm.Native.List.values;++};+Elm.Native.Regex = {};+Elm.Native.Regex.make = function(elm) {+ elm.Native = elm.Native || {};+ elm.Native.Regex = elm.Native.Regex || {};+ if (elm.Native.Regex.values) return elm.Native.Regex.values;+ if ('values' in Elm.Native.Regex)+ return elm.Native.Regex.values = Elm.Native.Regex.values;++ var Maybe = Elm.Maybe.make(elm);+ var JS = Elm.JavaScript.make(elm);++ function escape(str) {+ return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');+ }+ function caseInsensitive(re) {+ return new RegExp(re.source, 'gi');+ }+ function pattern(raw) {+ return new RegExp(raw, 'g');+ }++ function contains(re, string) {+ return re.test(JS.fromString(string));+ }++ function findAll(re, string) {+ return find(Infinity, re, string);+ }+ function find(n, re, str) {+ var out = [];+ var number = 0;+ var string = JS.fromString(str);+ var result;+ while (number++ < n && (result = re.exec(string))) {+ var i = result.length - 1;+ var subs = new Array(i);+ while (i > 0) {+ var submatch = result[i];+ subs[--i] = submatch === undefined+ ? Maybe.Nothing+ : Maybe.Just(JS.toString(submatch));+ }+ out.push({+ _:{},+ match: JS.toString(result[0]),+ submatches: JS.toList(subs),+ index: result.index,+ number: number,+ });+ }+ return JS.toList(out);+ }++ function replaceAll(re, replacer, string) {+ return replace(Infinity, re, replacer, string);+ }+ function replace(n, re, replacer, string) {+ var count = 0;+ function jsReplacer(match) {+ if (count++ > n) return match;+ var i = arguments.length-3;+ var submatches = new Array(i);+ while (i > 0) {+ var submatch = arguments[i];+ submatches[--i] = submatch === undefined+ ? Maybe.Nothing+ : Maybe.Just(JS.toString(submatch));+ }+ return JS.fromString(replacer({+ _:{},+ match:match,+ submatches:JS.toList(submatches),+ index:arguments[i-1],+ number:count+ }));+ }+ return string.replace(re, jsReplacer);+ }++ function split(re, string) {+ return JS.toList(JS.fromString(string).split(re));+ }+ function splitN(n, re, str) {+ var string = JS.fromString(str);+ var result;+ var out = [];+ var start = re.lastIndex;+ while (n--) {+ if (!(result = re.exec(string))) break;+ out.push(string.slice(start, result.index));+ start = re.lastIndex;+ }+ out.push(string.slice(start));+ return JS.toList(out);+ }++ return Elm.Native.Regex.values = {+ pattern: pattern,+ caseInsensitive: caseInsensitive,+ escape: escape,++ contains: F2(contains),+ findAll: F2(findAll),+ find: F3(find),++ replaceAll: F3(replaceAll),+ replace: F4(replace),++ split: F2(split),+ splitN: F3(splitN),+ };+};Elm.Native.Show = {};+Elm.Native.Show.make = function(elm) {+ elm.Native = elm.Native || {};+ elm.Native.Show = elm.Native.Show || {};+ if (elm.Native.Show.values) return elm.Native.Show.values;++ var NList = Elm.Native.List.make(elm);+ var List = Elm.List.make(elm);+ var Maybe = Elm.Maybe.make(elm);+ var JS = Elm.JavaScript.make(elm);+ var Dict = Elm.Dict.make(elm);+ var Json = Elm.Json.make(elm);+ var Tuple2 = Elm.Native.Utils.make(elm).Tuple2;++ var toString = function(v) {+ var type = typeof v;+ if (type === "function") {+ var name = v.func ? v.func.name : v.name;+ return '<function' + (name === '' ? '' : ': ') + name + '>';+ } else if (type === "boolean") {+ return v ? "True" : "False";+ } else if (type === "number") {+ return v+"";+ } else if ((v instanceof String) && v.isChar) {+ return "'" + addSlashes(v) + "'";+ } else if (type === "string") {+ return '"' + addSlashes(v) + '"';+ } else if (type === "object" && '_' in v && probablyPublic(v)) {+ var output = [];+ for (var k in v._) {+ for (var i = v._[k].length; i--; ) {+ output.push(k + " = " + toString(v._[k][i]));+ }+ }+ for (var k in v) {+ if (k === '_') continue;+ output.push(k + " = " + toString(v[k]));+ }+ if (output.length === 0) return "{}";+ return "{ " + output.join(", ") + " }";+ } else if (type === "object" && 'ctor' in v) {+ if (v.ctor.substring(0,6) === "_Tuple") {+ var output = [];+ for (var k in v) {+ if (k === 'ctor') continue;+ output.push(toString(v[k]));+ }+ return "(" + output.join(",") + ")";+ } else if (v.ctor === "::") {+ var output = '[' + toString(v._0);+ v = v._1;+ while (v.ctor === "::") {+ output += "," + toString(v._0);+ v = v._1;+ }+ return output + ']';+ } else if (v.ctor === "[]") {+ return "[]";+ } else if (v.ctor === "RBNode" || v.ctor === "RBEmpty") {+ var cons = F3(function(k,v,acc){return NList.Cons(Tuple2(k,v),acc)});+ var list = A3(Dict.foldr, cons, NList.Nil, v);+ var name = "Dict";+ if (list.ctor === "::" && list._0._1.ctor === "_Tuple0") {+ name = "Set";+ list = A2(List.map, function(x){return x._0}, list);+ }+ return name + ".fromList " + toString(list);+ } else {+ var output = "";+ for (var i in v) {+ if (i === 'ctor') continue;+ var str = toString(v[i]);+ var parenless = str[0] === '{' || str[0] === '<' || str.indexOf(' ') < 0;+ output += ' ' + (parenless ? str : '(' + str + ')');+ }+ return v.ctor + output;+ }+ }+ if (type === 'object' && 'recv' in v) return '<signal>';+ return "<internal structure>";+ };++ function addSlashes(str) {+ return str.replace(/\\/g, '\\\\')+ .replace(/\n/g, '\\n')+ .replace(/\t/g, '\\t')+ .replace(/\r/g, '\\r')+ .replace(/\v/g, '\\v')+ .replace(/\0/g, '\\0')+ .replace(/\'/g, "\\'")+ .replace(/\"/g, '\\"');+ }++ function probablyPublic(v) {+ var keys = Object.keys(v);+ var len = keys.length;+ if (len === 3+ && 'props' in v+ && 'element' in v) return false;+ if (len === 5+ && 'horizontal' in v+ && 'vertical' in v+ && 'x' in v+ && 'y' in v) return false;+ if (len === 7+ && 'theta' in v+ && 'scale' in v+ && 'x' in v+ && 'y' in v+ && 'alpha' in v+ && 'form' in v) return false;+ return true;+ }++ return elm.Native.Show.values = { show:toString };+};+Elm.Native.String = {};+Elm.Native.String.make = function(elm) {+ elm.Native = elm.Native || {};+ elm.Native.String = elm.Native.String || {};+ if (elm.Native.String.values) return elm.Native.String.values;+ if ('values' in Elm.Native.String)+ return elm.Native.String.values = Elm.Native.String.values;++ var Char = Elm.Char.make(elm);+ var Maybe = Elm.Maybe.make(elm);+ var JS = Elm.JavaScript.make(elm);+ var Utils = Elm.Native.Utils.make(elm);++ function isEmpty(str) {+ return str.length === 0;+ }+ function cons(chr,str) {+ return chr + str;+ }+ function uncons(str) {+ var hd;+ return (hd = str[0]) ? Maybe.Just(Utils.Tuple2(Utils.chr(hd), str.slice(1)))+ : Maybe.Nothing;+ }+ function append(a,b) {+ return a + b;+ }+ function concat(strs) {+ return JS.fromList(strs).join('');+ }+ function length(str) {+ return str.length;+ }+ function map(f,str) {+ var out = str.split('');+ for (var i = out.length; i--; ) {+ out[i] = f(Utils.chr(out[i]));+ }+ return out.join('');+ }+ function filter(pred,str) {+ return str.split('').map(Utils.chr).filter(pred).join('');+ }+ function reverse(str) {+ return str.split('').reverse().join('');+ }+ function foldl(f,b,str) {+ var len = str.length;+ for (var i = 0; i < len; ++i) {+ b = A2(f, Utils.chr(str[i]), b);+ }+ return b;+ }+ function foldr(f,b,str) {+ for (var i = str.length; i--; ) {+ b = A2(f, Utils.chr(str[i]), b);+ }+ return b;+ }++ function split(sep, str) {+ return JS.toList(str.split(sep));+ }+ function join(sep, strs) {+ return JS.fromList(strs).join(sep);+ }+ function repeat(n, str) {+ var result = '';+ while (n > 0) {+ if (n & 1) result += str;+ n >>= 1, str += str;+ }+ return result;+ }++ function sub(start, end, str) {+ return str.slice(start,end);+ }+ function left(n, str) {+ return n < 1 ? "" : str.slice(0,n);+ }+ function right(n, str) {+ return n < 1 ? "" : str.slice(-n);+ }+ function dropLeft(n, str) {+ return n < 1 ? str : str.slice(n);+ }+ function dropRight(n, str) {+ return n < 1 ? str : str.slice(0,-n);+ }++ function pad(n,chr,str) {+ var half = (n - str.length) / 2;+ return repeat(Math.ceil(half),chr) + str + repeat(half|0,chr);+ }+ function padRight(n,chr,str) {+ return str + repeat(n - str.length, chr);+ }+ function padLeft(n,chr,str) {+ return repeat(n - str.length, chr) + str;+ }++ function trim(str) {+ return str.trim();+ }+ function trimLeft(str) {+ return str.trimLeft();+ }+ function trimRight(str) {+ return str.trimRight();+ }++ function words(str) {+ return JS.toList(str.split(/\s+/g));+ }+ function lines(str) {+ return JS.toList(str.split(/\r\n|\r|\n/g));+ }++ function toUpper(str) {+ return str.toUpperCase();+ }+ function toLower(str) {+ return str.toLowerCase();+ }++ function any(pred, str) {+ for (var i = str.length; i--; ) {+ if (pred(Utils.chr(str[i]))) return true;+ }+ return false;+ }+ function all(pred, str) {+ for (var i = str.length; i--; ) {+ if (!pred(Utils.chr(str[i]))) return false;+ }+ return true;+ }++ function contains(sub, str) {+ return str.indexOf(sub) > -1;+ }+ function startsWith(sub, str) {+ return str.indexOf(sub) === 0;+ }+ function endsWith(sub, str) {+ return str.lastIndexOf(sub) === str.length - sub.length;+ }+ function indexes(sub, str) {+ var subLen = sub.length;+ var i = 0;+ var is = [];+ while ((i = str.indexOf(sub, i)) > -1) {+ is.push(i);+ i = i + subLen;+ }+ return JS.toList(is);+ }++ function toInt(s) {+ var len = s.length;+ if (len === 0) { return Maybe.Nothing; }+ var start = 0;+ if (s[0] == '-') {+ if (len === 1) { return Maybe.Nothing; }+ start = 1;+ }+ for (var i = start; i < len; ++i) {+ if (!Char.isDigit(s[i])) { return Maybe.Nothing; }+ }+ return Maybe.Just(parseInt(s, 10));+ }++ function toFloat(s) {+ var len = s.length;+ if (len === 0) { return Maybe.Nothing; }+ var start = 0;+ if (s[0] == '-') {+ if (len === 1) { return Maybe.Nothing; }+ start = 1;+ }+ var dotCount = 0;+ for (var i = start; i < len; ++i) {+ if (Char.isDigit(s[i])) { continue; }+ if (s[i] === '.') {+ dotCount += 1;+ if (dotCount <= 1) { continue; }+ }+ return Maybe.Nothing;+ }+ return Maybe.Just(parseFloat(s));+ }++ function toList(str) {+ return JS.toList(str.split('').map(Utils.chr));+ }+ function fromList(chars) {+ return JS.fromList(chars).join('');+ }++ return Elm.Native.String.values = {+ isEmpty: isEmpty,+ cons: F2(cons),+ uncons: uncons,+ append: F2(append),+ concat: concat,+ length: length,+ map: F2(map),+ filter: F2(filter),+ reverse: reverse,+ foldl: F3(foldl),+ foldr: F3(foldr),++ split: F2(split),+ join: F2(join),+ repeat: F2(repeat),++ sub: F3(sub),+ left: F2(left),+ right: F2(right),+ dropLeft: F2(dropLeft),+ dropRight: F2(dropRight),++ pad: F3(pad),+ padLeft: F3(padLeft),+ padRight: F3(padRight),++ trim: trim,+ trimLeft: trimLeft,+ trimRight: trimRight,++ words: words,+ lines: lines,++ toUpper: toUpper,+ toLower: toLower,++ any: F2(any),+ all: F2(all),++ contains: F2(contains),+ startsWith: F2(startsWith),+ endsWith: F2(endsWith),+ indexes: F2(indexes),++ toInt: toInt,+ toFloat: toFloat,+ toList: toList,+ fromList: fromList,+ };+};Elm.Native.Text = {};+Elm.Native.Text.make = function(elm) {+ elm.Native = elm.Native || {};+ elm.Native.Text = elm.Native.Text || {};+ if (elm.Native.Text.values) return elm.Native.Text.values;++ var JS = Elm.JavaScript.make(elm);+ var Utils = Elm.Native.Utils.make(elm);+ var Color = Elm.Native.Color.make(elm);+ var Element = Elm.Graphics.Element.make(elm);+ var show = Elm.Native.Show.make(elm).show;++ function makeSpaces(s) {+ if (s.length == 0) { return s; }+ var arr = s.split('');+ if (arr[0] == ' ') { arr[0] = " " } + for (var i = arr.length; --i; ) {+ if (arr[i][0] == ' ' && arr[i-1] == ' ') {+ arr[i-1] = arr[i-1] + arr[i];+ arr[i] = '';+ }+ }+ for (var i = arr.length; i--; ) {+ if (arr[i].length > 1 && arr[i][0] == ' ') {+ var spaces = arr[i].split('');+ for (var j = spaces.length - 2; j >= 0; j -= 2) {+ spaces[j] = ' ';+ }+ arr[i] = spaces.join('');+ }+ }+ arr = arr.join('');+ if (arr[arr.length-1] === " ") {+ return arr.slice(0,-1) + ' ';+ }+ return arr;+ }++ function properEscape(str) {+ if (str.length == 0) return str;+ str = str //.replace(/&/g, "&")+ .replace(/"/g, '"')+ .replace(/'/g, "'")+ .replace(/</g, "<")+ .replace(/>/g, ">")+ .replace(/\n/g, "<br/>");+ var arr = str.split('<br/>');+ for (var i = arr.length; i--; ) {+ arr[i] = makeSpaces(arr[i]);+ }+ return arr.join('<br/>');+ }++ function toText(str) { return Utils.txt(properEscape(JS.fromString(str))); }++ function height(px, text) {+ return { style: 'font-size:' + px + 'px;', text:text }+ }+ function typeface(name, text) {+ return { style: 'font-family:' + name + ';', text:text }+ }+ function monospace(text) {+ return { style: 'font-family:monospace;', text:text }+ }+ function italic(text) {+ return { style: 'font-style:italic;', text:text }+ }+ function bold(text) {+ return { style: 'font-weight:bold;', text:text }+ }+ function link(href, text) {+ return { href: toText(href), text:text };+ }+ function underline(text) {+ return { line: ' underline', text:text };+ }+ function overline(text) {+ return { line: ' overline', text:text };+ }+ function strikeThrough(text) {+ return { line: ' line-through', text:text };+ }++ function color(c, text) {+ var color = (c._3 === 1)+ ? ('rgb(' + c._0 + ', ' + c._1 + ', ' + c._2 + ')')+ : ('rgba(' + c._0 + ', ' + c._1 + ', ' + c._2 + ', ' + c._3 + ')');+ return { style: 'color:' + color + ';', text:text };+ }++ function position(align) {+ function create(text) {+ var raw = {+ ctor:'RawHtml',+ html: Utils.makeText('text-align:' + align + ';', text),+ guid: null,+ args: [],+ };+ var pos = A2(Utils.htmlHeight, 0, raw);+ return A3(Element.newElement, pos._0, pos._1, raw);+ }+ return create;+ }++ function markdown(text, guid) {+ var raw = {+ ctor:'RawHtml',+ html: text,+ guid: guid,+ args: [],+ };+ var pos = A2(Utils.htmlHeight, 0, raw);+ return A3(Element.newElement, pos._0, pos._1, raw);+ }++ var text = position('left');+ function asText(v) {+ return text(monospace(toText(show(v))));+ }++ function plainText(v) {+ return text(toText(v));+ }++ return elm.Native.Text.values = {+ toText: toText,++ height : F2(height),+ italic : italic,+ bold : bold,+ underline : underline,+ overline : overline,+ strikeThrough : strikeThrough,+ monospace : monospace,+ typeface : F2(typeface),+ color : F2(color),+ link : F2(link),++ justified : position('justify'),+ centered : position('center'),+ righted : position('right'),+ text : text,+ plainText : plainText,+ markdown : markdown,++ asText : asText,+ };+};Elm.Native.Transform2D = {};+Elm.Native.Transform2D.make = function(elm) {++ elm.Native = elm.Native || {};+ elm.Native.Transform2D = elm.Native.Transform2D || {};+ if (elm.Native.Transform2D.values) return elm.Native.Transform2D.values;++ var A;+ if (typeof Float32Array === 'undefined') {+ A = function(arr) {+ this.length = arr.length;+ this[0] = arr[0];+ this[1] = arr[1];+ this[2] = arr[2];+ this[3] = arr[3];+ this[4] = arr[4];+ this[5] = arr[5];+ };+ } else {+ A = Float32Array;+ }++ // layout of matrix in an array is+ //+ // | m11 m12 dx |+ // | m21 m22 dy |+ // | 0 0 1 |+ //+ // new A([ m11, m12, dx, m21, m22, dy ])++ var identity = new A([1,0,0,0,1,0]);+ function matrix(m11, m12, m21, m22, dx, dy) {+ return new A([m11, m12, dx, m21, m22, dy]);+ }+ function rotation(t) {+ var c = Math.cos(t);+ var s = Math.sin(t);+ return new A([c, -s, 0, s, c, 0]);+ }+ function rotate(t,m) {+ var c = Math.cos(t);+ var s = Math.sin(t);+ var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4];+ return new A([m11*c + m12*s, -m11*s + m12*c, m[2],+ m21*c + m22*s, -m21*s + m22*c, m[5]]);+ }+ /*+ function move(xy,m) {+ var x = xy._0;+ var y = xy._1;+ var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4];+ return new A([m11, m12, m11*x + m12*y + m[2],+ m21, m22, m21*x + m22*y + m[5]]);+ }+ function scale(s,m) { return new A([m[0]*s, m[1]*s, m[2], m[3]*s, m[4]*s, m[5]]); }+ function scaleX(x,m) { return new A([m[0]*x, m[1], m[2], m[3]*x, m[4], m[5]]); }+ function scaleY(y,m) { return new A([m[0], m[1]*y, m[2], m[3], m[4]*y, m[5]]); }+ function reflectX(m) { return new A([-m[0], m[1], m[2], -m[3], m[4], m[5]]); }+ function reflectY(m) { return new A([m[0], -m[1], m[2], m[3], -m[4], m[5]]); }++ function transform(m11, m21, m12, m22, mdx, mdy, n) {+ var n11 = n[0], n12 = n[1], n21 = n[3], n22 = n[4], ndx = n[2], ndy = n[5];+ return new A([m11*n11 + m12*n21,+ m11*n12 + m12*n22,+ m11*ndx + m12*ndy + mdx,+ m21*n11 + m22*n21,+ m21*n12 + m22*n22,+ m21*ndx + m22*ndy + mdy]);+ }+ */+ function multiply(m, n) {+ var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4], mdx = m[2], mdy = m[5];+ var n11 = n[0], n12 = n[1], n21 = n[3], n22 = n[4], ndx = n[2], ndy = n[5];+ return new A([m11*n11 + m12*n21,+ m11*n12 + m12*n22,+ m11*ndx + m12*ndy + mdx,+ m21*n11 + m22*n21,+ m21*n12 + m22*n22,+ m21*ndx + m22*ndy + mdy]);+ }++ return elm.Native.Transform2D.values = {+ identity:identity,+ matrix:F6(matrix),+ rotation:rotation,+ multiply:F2(multiply)+ /*+ transform:F7(transform),+ rotate:F2(rotate),+ move:F2(move),+ scale:F2(scale),+ scaleX:F2(scaleX),+ scaleY:F2(scaleY),+ reflectX:reflectX,+ reflectY:reflectY+ */+ };++};+Elm.Native.Utils = {};+Elm.Native.Utils.make = function(elm) {++ elm.Native = elm.Native || {};+ elm.Native.Utils = elm.Native.Utils || {};+ if (elm.Native.Utils.values) return elm.Native.Utils.values;++ function eq(x,y) {+ if (x === y) return true;+ if (typeof x === "object") {+ var c = 0;+ for (var i in x) { ++c; if (!eq(x[i],y[i])) return false; }+ return c === Object.keys(y).length;+ }+ if (typeof x === 'function') {+ throw new Error('Equality error: general function equality is ' ++ 'undecidable, and therefore, unsupported');+ }+ return x === y;+ }++ // code in Generate/JavaScript.hs depends on the particular+ // integer values assigned to LT, EQ, and GT+ var LT = -1, EQ = 0, GT = 1, ord = ['LT','EQ','GT'];+ function compare(x,y) { return { ctor: ord[cmp(x,y)+1] } }+ function cmp(x,y) {+ var ord;+ if (typeof x !== 'object' || x instanceof String){+ return x === y ? EQ : x < y ? LT : GT;+ }++ if (x.ctor === "::" || x.ctor === "[]") {+ while (true) {+ if (x.ctor === "[]" && y.ctor === "[]") return EQ;+ if (x.ctor !== y.ctor) return x.ctor === '[]' ? LT : GT;+ ord = cmp(x._0, y._0);+ if (ord !== EQ) return ord;+ x = x._1;+ y = y._1;+ }+ }++ if (x.ctor.slice(0,6) === '_Tuple') {+ var n = x.ctor.slice(6) - 0;+ var err = 'cannot compare tuples with more than 6 elements.';+ if (n === 0) return EQ;+ if (n >= 1) { ord = cmp(x._0, y._0); if (ord !== EQ) return ord;+ if (n >= 2) { ord = cmp(x._1, y._1); if (ord !== EQ) return ord;+ if (n >= 3) { ord = cmp(x._2, y._2); if (ord !== EQ) return ord;+ if (n >= 4) { ord = cmp(x._3, y._3); if (ord !== EQ) return ord;+ if (n >= 5) { ord = cmp(x._4, y._4); if (ord !== EQ) return ord;+ if (n >= 6) { ord = cmp(x._5, y._5); if (ord !== EQ) return ord;+ if (n >= 7) throw new Error('Comparison error: ' + err); } } } } } }+ return EQ;+ }+ throw new Error('Comparison error: comparison is only defined on ints, ' ++ 'floats, times, chars, strings, lists of comparable values, ' ++ 'and tuples of comparable values.')+ }+++ var Tuple0 = { ctor: "_Tuple0" };+ function Tuple2(x,y) { return { ctor:"_Tuple2", _0:x, _1:y } }++ function chr(c) {+ var x = new String(c);+ x.isChar = true;+ return x;+ }++ function txt(str) {+ var t = new String(str);+ t.text = true;+ return t;+ }++ function makeText(style, text) {+ var style = style;+ var line = '';+ var href = '';+ while (true) {+ if (text.line) {+ line += text.line;+ text = text.text;+ continue;+ }+ if (text.style) {+ style += text.style;+ text = text.text;+ continue;+ }+ if (text.href) {+ href = text.href;+ text = text.text;+ continue;+ }+ if (href) text = '<a href="' + href + '">' + text + '</a>';+ if (line) style += 'text-decoration:' + line + ';';+ if (style) text = '<span style="' + style + '">' + text + '</span>';+ return text;+ }+ }++ var count = 0;+ function guid(_) { return count++ }++ function copy(r) {+ var o = {};+ for (var i in r) { o[i] = r[i]; }+ return o;+ }++ function remove(x,r) {+ var o = copy(r);+ if (x in o._) {+ o[x] = o._[x][0];+ o._[x] = o._[x].slice(1);+ if (o._[x].length === 0) { delete o._[x]; }+ } else {+ delete o[x];+ }+ return o;+ }++ function replace(kvs,r) {+ var o = copy(r);+ for (var i = kvs.length; i--; ) {+ var kvsi = kvs[i];+ o[kvsi[0]] = kvsi[1];+ }+ return o;+ }++ function insert(x,v,r) {+ var o = copy(r);+ if (x in o) o._[x] = [o[x]].concat(x in o._ ? o._[x].slice(0) : []);+ o[x] = v;+ return o;+ }++ function max(a,b) { return a > b ? a : b }+ function min(a,b) { return a < b ? a : b }++ function mod(a,b) {+ if (b === 0) {+ throw new Error("Cannot perform mod 0. Division by zero error.");+ }+ var r = a % b;+ var m = a === 0 ? 0 : (b > 0 ? (a >= 0 ? r : r+b) : -mod(-a,-b));++ return m === b ? 0 : m;+ }++ function htmlHeight(width, rawHtml) {+ // create dummy node+ var html = rawHtml.html;+ var t = document.createElement('div');+ t.innerHTML = html;+ if (width > 0) { t.style.width = width + "px"; }+ t.style.visibility = "hidden";+ t.style.styleFloat = "left";+ t.style.cssFloat = "left";++ document.body.appendChild(t);++ // insert interpolated values+ var args = rawHtml.args;+ var guid = rawHtml.guid;+ for (var i = args.length; i--; ) {+ var arg = args[i];+ var span = document.getElementById('md-' + guid + '-' + i);+ if (arg.isElement) {+ span.style.width = arg.props.width + 'px';+ span.style.height = arg.props.height + 'px';+ } else {+ span.innerHTML = arg;+ }+ }++ // get dimensions+ var style = window.getComputedStyle(t, null);+ var w = Math.ceil(style.getPropertyValue("width").slice(0,-2) - 0);+ var h = Math.ceil(style.getPropertyValue("height").slice(0,-2) - 0);+ document.body.removeChild(t);+ return Tuple2(w,h);+ }++ function getXY(e) {+ var posx = 0;+ var posy = 0;+ if (e.pageX || e.pageY) {+ posx = e.pageX;+ posy = e.pageY;+ } else if (e.clientX || e.clientY) {+ posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;+ posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;+ }++ if (elm.display === ElmRuntime.Display.COMPONENT) {+ var rect = elm.node.getBoundingClientRect();+ var relx = rect.left + document.body.scrollLeft + document.documentElement.scrollLeft;+ var rely = rect.top + document.body.scrollTop + document.documentElement.scrollTop;+ // TODO: figure out if there is a way to avoid rounding here+ posx = posx - Math.round(relx) - elm.node.clientLeft;+ posy = posy - Math.round(rely) - elm.node.clientTop;+ }+ return Tuple2(posx, posy);+ }++ return elm.Native.Utils.values = {+ eq:eq,+ cmp:cmp,+ compare:F2(compare),+ Tuple0:Tuple0,+ Tuple2:Tuple2,+ chr:chr,+ txt:txt,+ makeText:makeText,+ copy: copy,+ remove: remove,+ replace: replace,+ insert: insert,+ guid: guid,+ max : F2(max),+ min : F2(min),+ mod : F2(mod),+ htmlHeight: F2(htmlHeight),+ getXY: getXY,+ toFloat: function(x) { return +x; }+ };+};+Elm.Native.Graphics.Collage = {};+Elm.Native.Graphics.Collage.make = function(elm) {++ elm.Native = elm.Native || {};+ elm.Native.Graphics = elm.Native.Graphics || {};+ elm.Native.Graphics.Collage = elm.Native.Graphics.Collage || {};+ if (elm.Native.Graphics.Collage.values) return elm.Native.Graphics.Collage.values;++ var newElement = Elm.Graphics.Element.make(elm).newElement;+ var C = ElmRuntime.use(ElmRuntime.Render.Collage);++ function collage(w,h,forms) {+ return A3(newElement, w, h, {+ ctor: 'Custom',+ type: 'Collage',+ render: C.render,+ update: C.update,+ model: {w:w, h:h, forms:forms}+ });+ }+ return elm.Native.Graphics.Collage.values = { collage:F3(collage) };++};Elm.Native.Graphics.Input = {};+Elm.Native.Graphics.Input.make = function(elm) {++ elm.Native = elm.Native || {};+ elm.Native.Graphics = elm.Native.Graphics || {};+ elm.Native.Graphics.Input = elm.Native.Graphics.Input || {};+ if (elm.Native.Graphics.Input.values) return elm.Native.Graphics.Input.values;++ var Render = ElmRuntime.use(ElmRuntime.Render.Element);+ var newNode = ElmRuntime.use(ElmRuntime.Render.Utils).newElement;++ var Signal = Elm.Signal.make(elm);+ var newElement = Elm.Graphics.Element.make(elm).newElement;+ var JS = Elm.Native.JavaScript.make(elm);+ var Utils = Elm.Native.Utils.make(elm);+ var Tuple2 = Utils.Tuple2;++ function dropDown(values) {+ var entries = JS.fromList(values);+ var events = Signal.constant(entries[0]._1);++ var drop = newNode('select');+ drop.style.border = '0 solid';+ for (var i = 0; i < entries.length; ++i) {+ var option = newNode('option');+ var name = JS.fromString(entries[i]._0);+ option.value = name;+ option.innerHTML = name;+ drop.appendChild(option);+ }+ drop.addEventListener('change', function() {+ elm.notify(events.id, entries[drop.selectedIndex]._1);+ });++ var t = drop.cloneNode(true);+ t.style.visibility = "hidden";++ elm.node.appendChild(t);+ var style = window.getComputedStyle(t, null);+ var w = Math.ceil(style.getPropertyValue("width").slice(0,-2) - 0);+ var h = Math.ceil(style.getPropertyValue("height").slice(0,-2) - 0);+ elm.node.removeChild(t);+ + var element = A3(newElement, w, h, {+ ctor: 'Custom',+ type: 'DropDown',+ render: function render(model) { return drop; },+ update: function update(node, oldModel, newModel) {},+ model: {}+ });++ return Tuple2(Signal.constant(element), events);+ }++ function buttons(defaultValue) {+ var events = Signal.constant(defaultValue);++ function render(model) {+ var b = newNode('button');+ b.style.display = 'block';+ b.elmEvent = model.event;+ function click() { elm.notify(events.id, b.elmEvent); }+ b.addEventListener('click', click);+ b.innerHTML = model.text;+ return b;+ }++ function update(node, oldModel, newModel) {+ node.elmEvent = newModel.event;+ var txt = newModel.text;+ if (oldModel.text !== txt) node.innerHTML = txt;+ }++ function button(evnt, txt) {+ return A3(newElement, 100, 40, {+ ctor: 'Custom',+ type: 'Button',+ render: render,+ update: update,+ model: { event:evnt, text:JS.fromString(txt) }+ });+ }++ return { _:{}, button:F2(button), events:events };+ }++ function customButtons(defaultValue) {+ var events = Signal.constant(defaultValue);++ function render(model) {+ var btn = newNode('div');+ btn.elmEvent = model.event;++ btn.elmUp = Render.render(model.up);+ btn.elmHover = Render.render(model.hover);+ btn.elmDown = Render.render(model.down);++ function replace(node) {+ if (node !== btn.firstChild) btn.replaceChild(node, btn.firstChild);+ }+ var overCount = 0;+ function over(e) {+ if (overCount++ > 0) return;+ replace(btn.elmHover);+ }+ function out(e) {+ if (btn.contains(e.toElement || e.relatedTarget)) return;+ overCount = 0;+ replace(btn.elmUp);+ }+ function up() {+ replace(btn.elmHover);+ elm.notify(events.id, btn.elmEvent);+ }+ function down() { replace(btn.elmDown); }+ btn.addEventListener('mouseover', over);+ btn.addEventListener('mouseout' , out);+ btn.addEventListener('mousedown', down);+ btn.addEventListener('mouseup' , up);++ btn.appendChild(btn.elmUp);++ var clicker = newNode('div');+ clicker.style.width = btn.elmUp.style.width;+ clicker.style.height = btn.elmUp.style.height;+ clicker.style.position = 'absolute';+ clicker.style.top = 0;+ btn.appendChild(clicker);++ return btn;+ }++ function update(node, oldModel, newModel) {+ node.elmEvent = newModel.event;+ Render.update(node.elmUp, oldModel.up, newModel.up)+ Render.update(node.elmHover, oldModel.hover, newModel.hover)+ Render.update(node.elmDown, oldModel.down, newModel.down)+ }++ function button(evnt, up, hover, down) {+ return A3(newElement,+ Math.max(up.props.width, hover.props.width, down.props.width),+ Math.max(up.props.height, hover.props.height, down.props.height),+ { ctor: 'Custom',+ type: 'CustomButton',+ render: render,+ update: update,+ model: { event:evnt, up:up, hover:hover, down:down }+ });+ }++ return { _:{}, customButton:F4(button), events:events };+ }+++ function hoverables(defaultValue) {+ var events = Signal.constant(defaultValue);+ function hoverable(handler, elem) {+ function onHover(bool) {+ elm.notify(events.id, handler(bool));+ }+ var props = Utils.replace([['hover',onHover]], elem.props);+ return { props:props, element:elem.element };+ }+ return { _:{}, hoverable:F2(hoverable), events:events };+ }+++ function checkboxes(defaultValue) {+ var events = Signal.constant(defaultValue);++ function render(model) {+ var b = newNode('input');+ b.type = 'checkbox';+ b.checked = model.checked;+ b.style.display = 'block';+ b.elmHandler = model.handler;+ function change() { elm.notify(events.id, b.elmHandler(b.checked)); }+ b.addEventListener('change', change);+ return b;+ }++ function update(node, oldModel, newModel) {+ node.elmHandler = newModel.handler;+ node.checked = newModel.checked;+ return true;+ }++ function box(handler, checked) {+ return A3(newElement, 13, 13, {+ ctor: 'Custom',+ type: 'CheckBox',+ render: render,+ update: update,+ model: { checked:checked, handler:handler }+ });+ }++ return { _:{}, checkbox:F2(box), events:events };+ }++ function setRange(node, start, end, dir) {+ if (node.parentNode) {+ node.setSelectionRange(start, end, dir);+ } else {+ setTimeout(function(){node.setSelectionRange(start, end, dir);}, 0);+ }+ }++ function mkTextPool(type) { return function fields(defaultValue) {+ var events = Signal.constant(defaultValue);++ var state = null;++ function render(model) {+ var field = newNode('input');+ field.elmHandler = model.handler;++ field.id = 'test';+ field.type = type;+ field.placeholder = JS.fromString(model.placeHolder);+ field.value = JS.fromString(model.state.string);+ setRange(field, model.state.selectionStart, model.state.selectionEnd, 'forward');+ field.style.border = 'none';+ state = model.state;++ function update() {+ var start = field.selectionStart,+ end = field.selectionEnd;+ if (field.selectionDirection === 'backward') {+ start = end;+ end = field.selectionStart;+ }+ state = { _:{},+ string:JS.toString(field.value),+ selectionStart:start,+ selectionEnd:end };+ elm.notify(events.id, field.elmHandler(state));+ }+ function mousedown() {+ update();+ elm.node.addEventListener('mouseup', mouseup);+ }+ function mouseup() {+ update();+ elm.node.removeEventListener('mouseup', mouseup)+ }+ field.addEventListener('keyup', update);+ field.addEventListener('mousedown', mousedown);++ return field;+ }++ function update(node, oldModel, newModel) {+ node.elmHandler = newModel.handler;+ if (state === newModel.state) return;+ var newStr = JS.fromString(newModel.state.string);+ if (node.value !== newStr) node.value = newStr;++ var start = newModel.state.selectionStart;+ var end = newModel.state.selectionEnd;+ var direction = 'forward';+ if (end < start) {+ start = end;+ end = newModel.state.selectionStart;+ direction = 'backward';+ }+ + if (node.selectionStart !== start+ || node.selectionEnd !== end+ || node.selectionDirection !== direction) {+ setRange(node, start, end, direction);+ }+ }++ function field(handler, placeHolder, state) {+ return A3(newElement, 200, 30,+ { ctor: 'Custom',+ type: type + 'Input',+ render: render,+ update: update,+ model: { handler:handler,+ placeHolder:placeHolder,+ state:state }+ });+ }++ return { _:{}, field:F3(field), events:events };+ }+ }++ return elm.Native.Graphics.Input.values = {+ buttons:buttons,+ customButtons:customButtons,+ hoverables:hoverables,+ checkboxes:checkboxes,+ fields:mkTextPool('text'),+ emails:mkTextPool('email'),+ passwords:mkTextPool('password'),+ dropDown:dropDown+ };++};+Elm.Native.Http = {};+Elm.Native.Http.make = function(elm) {++ elm.Native = elm.Native || {};+ elm.Native.Http = elm.Native.Http || {};+ if (elm.Native.Http.values) return elm.Native.Http.values;+++ var JS = Elm.JavaScript.make(elm);+ var List = Elm.List.make(elm);+ var Signal = Elm.Signal.make(elm);+++ function registerReq(queue,responses) { return function(req) {+ if (req.url.ctor !== '[]') { sendReq(queue,responses,req); }+ };+ }++ function updateQueue(queue,responses) {+ if (queue.length > 0) {+ elm.notify(responses.id, queue[0].value);+ if (queue[0].value.ctor !== 'Waiting') {+ queue.shift();+ setTimeout(function() { updateQueue(queue,responses); }, 0);+ }+ }+ }++ function sendReq(queue,responses,req) {+ var response = { value: { ctor:'Waiting' } };+ queue.push(response);++ var request = null;+ if (window.ActiveXObject) { request = new ActiveXObject("Microsoft.XMLHTTP"); }+ if (window.XMLHttpRequest) { request = new XMLHttpRequest(); }+ request.onreadystatechange = function(e) {+ if (request.readyState === 4) {+ response.value = (request.status >= 200 && request.status < 300 ?+ { ctor:'Success', _0:JS.toString(request.responseText) } :+ { ctor:'Failure', _0:request.status, _1:JS.toString(request.statusText) });+ setTimeout(function() { updateQueue(queue,responses); }, 0);+ }+ };+ request.open(JS.fromString(req.verb), JS.fromString(req.url), true);+ function setHeader(pair) {+ request.setRequestHeader( JS.fromString(pair._0), JS.fromString(pair._1) );+ }+ List.map(setHeader)(req.headers);+ request.send(JS.fromString(req.body));+ }++ function send(requests) {+ var responses = Signal.constant(elm.Http.values.Waiting);+ var sender = A2( Signal.lift, registerReq([],responses), requests );+ function f(x) { return function(y) { return x; } }+ return A3( Signal.lift2, f, responses, sender );+ }++ return elm.Native.Http.values = {send:send};++};+Elm.Native.Keyboard = {};+Elm.Native.Keyboard.make = function(elm) {++ elm.Native = elm.Native || {};+ elm.Native.Keyboard = elm.Native.Keyboard || {};+ if (elm.Native.Keyboard.values) return elm.Native.Keyboard.values;++ // Duplicated from Native.Signal+ function send(node, timestep, changed) {+ var kids = node.kids;+ for (var i = kids.length; i--; ) {+ kids[i].recv(timestep, changed, node.id);+ }+ }++ var Signal = Elm.Signal.make(elm);+ var NList = Elm.Native.List.make(elm);+ var Utils = Elm.Native.Utils.make(elm);++ var downEvents = Signal.constant(0);+ var upEvents = Signal.constant(0);+ var blurEvents = Signal.constant(0);++ elm.addListener([downEvents.id], document, 'keydown', function down(e) {+ elm.notify(downEvents.id, e.keyCode);+ });++ elm.addListener([upEvents.id], document, 'keyup', function up(e) {+ elm.notify(upEvents.id, e.keyCode);+ });++ elm.addListener([blurEvents.id], document, 'blur', function blur(e) {+ elm.notify(blurEvents.id, NList.Nil);+ });++ function KeyMerge(down, up, blur) {+ var args = [down,up,blur];+ this.id = Utils.guid();+ // Ignore starting values here+ this.value = NList.Nil+ this.kids = [];+ + var n = args.length;+ var count = 0;+ var isChanged = false;++ this.recv = function(timestep, changed, parentID) {+ ++count;+ if (changed) { + // We know this a change must only be one of the following cases+ if (parentID === down.id && !(NList.member(down.value)(this.value))) {+ isChanged = true;+ this.value = NList.Cons(down.value, this.value); + } + if (parentID === up.id) {+ isChanged = true;+ var notEq = function(kc) { return kc !== up.value };+ this.value = NList.filter(notEq)(this.value);+ } + if (parentID === blur.id) {+ isChanged = true;+ this.value = NList.Nil;+ }+ }+ if (count == n) {+ send(this, timestep, isChanged);+ isChanged = false;+ count = 0;+ }+ };++ for (var i = n; i--; ) { args[i].kids.push(this); }++ }++ var keysDown = Signal.dropRepeats(new KeyMerge(downEvents,upEvents,blurEvents));++ function keySignal(f) {+ var signal = A2(Signal.lift, f, keysDown);+ // must set the default number of kids to make it possible to filter+ // these signals if they are not actually used.+ keysDown.defaultNumberOfKids += 1;+ signal.defaultNumberOfKids = 1;+ var filtered = Signal.dropRepeats(signal)+ filtered.defaultNumberOfKids = 0;+ return filtered;+ }++ function dir(up, down, left, right) {+ function f(ks) {+ var x = 0, y = 0;+ while (ks.ctor === "::") {+ switch (ks._0) {+ case left : --x; break;+ case right: ++x; break;+ case up : ++y; break;+ case down : --y; break;+ }+ ks = ks._1;+ }+ return { _:{}, x:x, y:y };+ }+ return keySignal(f);+ }++ function is(key) { return keySignal(NList.member(key)); }++ var lastPressed = downEvents;++ return elm.Native.Keyboard.values = {+ isDown:is,+ directions:F4(dir),+ keysDown:keysDown,+ lastPressed:lastPressed+ };++};+Elm.Native.Mouse = {};+Elm.Native.Mouse.make = function(elm) {++ elm.Native = elm.Native || {};+ elm.Native.Mouse = elm.Native.Mouse || {};+ if (elm.Native.Mouse.values) return elm.Native.Mouse.values;++ var Signal = Elm.Signal.make(elm);+ var Utils = Elm.Native.Utils.make(elm);++ var position = Signal.constant(Utils.Tuple2(0,0));+ position.defaultNumberOfKids = 2;++ // do not move x and y into Elm. By setting their default number+ // of kids, it is possible to detatch the mouse listeners if+ // they are not needed.+ var x = A2( Signal.lift, function(p){return p._0}, position);+ x.defaultNumberOfKids = 0;+ var y = A2( Signal.lift, function(p){return p._1}, position);+ y.defaultNumberOfKids = 0;++ var isDown = Signal.constant(false);+ var isClicked = Signal.constant(false);+ var clicks = Signal.constant(Utils.Tuple0);++ var node = elm.display === ElmRuntime.Display.FULLSCREEN ? document : elm.node;++ elm.addListener([isClicked.id, clicks.id], node, 'click', function click() {+ elm.notify(isClicked.id, true);+ elm.notify(clicks.id, Utils.Tuple0);+ elm.notify(isClicked.id, false);+ });+ elm.addListener([isDown.id], node, 'mousedown', function down() {+ elm.notify(isDown.id, true);+ });+ elm.addListener([isDown.id], node, 'mouseup', function up() {+ elm.notify(isDown.id, false);+ });+ elm.addListener([position.id], node, 'mousemove', function move(e) {+ elm.notify(position.id, Utils.getXY(e));+ });++ return elm.Native.Mouse.values = {+ position: position,+ x:x,+ y:y,+ isClicked: isClicked,+ isDown: isDown,+ clicks: clicks+ };+};Elm.Native.Random = {};+Elm.Native.Random.make = function(elm) {++ elm.Native = elm.Native || {};+ elm.Native.Random = elm.Native.Random || {};+ if (elm.Native.Random.values) return elm.Native.Random.values;++ var Signal = Elm.Signal.make(elm);+ var List = Elm.Native.List.make(elm);++ function range(min, max, signal) {+ function f(x) { return Math.floor(Math.random() * (max-min+1)) + min; }+ return A2( Signal.lift, f, signal );+ }++ function float_(signal) {+ function f(x) { return Math.random(); }+ return A2( Signal.lift, f, signal );+ }++ function floatList(signal) {+ function f(n) {+ if (n < 0) return List.Nil;+ var arr = new Array(n);+ for (var i = n; i--; ) {+ arr[i] = Math.random();+ }+ return List.fromArray(arr);+ }+ return A2( Signal.lift, f, signal );+ }++ return elm.Native.Random.values = {+ range: F3(range),+ float_: float_,+ floatList: floatList+ };++};++Elm.Native.Signal = {};+Elm.Native.Signal.make = function(elm) {++ elm.Native = elm.Native || {};+ elm.Native.Signal = elm.Native.Signal || {};+ if (elm.Native.Signal.values) return elm.Native.Signal.values;++ var Utils = Elm.Native.Utils.make(elm);+ var foldr1 = Elm.List.make(elm).foldr1;++ function send(node, timestep, changed) {+ var kids = node.kids;+ for (var i = kids.length; i--; ) {+ kids[i].recv(timestep, changed, node.id);+ }+ }++ function Input(base) {+ this.id = Utils.guid();+ this.value = base;+ this.kids = [];+ this.defaultNumberOfKids = 0;+ this.recv = function(timestep, eid, v) {+ var changed = eid === this.id;+ if (changed) { this.value = v; }+ send(this, timestep, changed);+ return changed;+ };+ elm.inputs.push(this);+ }++ function LiftN(update, args) {+ this.id = Utils.guid();+ this.value = update();+ this.kids = [];++ var n = args.length;+ var count = 0;+ var isChanged = false;++ this.recv = function(timestep, changed, parentID) {+ ++count;+ if (changed) { isChanged = true; }+ if (count == n) {+ if (isChanged) { this.value = update(); }+ send(this, timestep, isChanged);+ isChanged = false;+ count = 0;+ }+ };+ for (var i = n; i--; ) { args[i].kids.push(this); }+ }++ function lift(func, a) {+ function update() { return func(a.value); }+ return new LiftN(update, [a]);+ }+ function lift2(func, a, b) {+ function update() { return A2( func, a.value, b.value ); }+ return new LiftN(update, [a,b]);+ }+ function lift3(func, a, b, c) {+ function update() { return A3( func, a.value, b.value, c.value ); }+ return new LiftN(update, [a,b,c]);+ }+ function lift4(func, a, b, c, d) {+ function update() { return A4( func, a.value, b.value, c.value, d.value ); }+ return new LiftN(update, [a,b,c,d]);+ }+ function lift5(func, a, b, c, d, e) {+ function update() { return A5( func, a.value, b.value, c.value, d.value, e.value ); }+ return new LiftN(update, [a,b,c,d,e]);+ }+ function lift6(func, a, b, c, d, e, f) {+ function update() { return A6( func, a.value, b.value, c.value, d.value, e.value, f.value ); }+ return new LiftN(update, [a,b,c,d,e,f]);+ }+ function lift7(func, a, b, c, d, e, f, g) {+ function update() { return A7( func, a.value, b.value, c.value, d.value, e.value, f.value, g.value ); }+ return new LiftN(update, [a,b,c,d,e,f,g]);+ }+ function lift8(func, a, b, c, d, e, f, g, h) {+ function update() { return A8( func, a.value, b.value, c.value, d.value, e.value, f.value, g.value, h.value ); }+ return new LiftN(update, [a,b,c,d,e,f,g,h]);+ }++ function Foldp(step, state, input) {+ this.id = Utils.guid();+ this.value = state;+ this.kids = [];++ this.recv = function(timestep, changed, parentID) {+ if (changed) {+ this.value = A2( step, input.value, this.value );+ }+ send(this, timestep, changed);+ };+ input.kids.push(this);+ }++ function foldp(step, state, input) {+ return new Foldp(step, state, input);+ }++ function DropIf(pred,base,input) {+ this.id = Utils.guid();+ this.value = pred(input.value) ? base : input.value;+ this.kids = [];+ this.recv = function(timestep, changed, parentID) {+ var chng = changed && !pred(input.value);+ if (chng) { this.value = input.value; }+ send(this, timestep, chng);+ };+ input.kids.push(this);+ }++ function DropRepeats(input) {+ this.id = Utils.guid();+ this.value = input.value;+ this.kids = [];+ this.recv = function(timestep, changed, parentID) {+ var chng = changed && !Utils.eq(this.value,input.value);+ if (chng) { this.value = input.value; }+ send(this, timestep, chng);+ };+ input.kids.push(this);+ }++ function dropWhen(s1,b,s2) {+ var pairs = lift2( F2(function(x,y){return {x:x,y:y};}), s1, s2 );+ var dropped = new DropIf(function(p){return p.x;},{x:true,y:b},pairs);+ return lift(function(p){return p.y;}, dropped);+ }++ function timestamp(a) {+ function update() { return Utils.Tuple2(Date.now(), a.value); }+ return new LiftN(update, [a]);+ }++ function SampleOn(s1,s2) {+ this.id = Utils.guid();+ this.value = s2.value;+ this.kids = [];++ var count = 0;+ var isChanged = false;++ this.recv = function(timestep, changed, parentID) {+ if (parentID === s1.id) isChanged = changed;+ ++count;+ if (count == 2) {+ if (isChanged) { this.value = s2.value; }+ send(this, timestep, isChanged);+ count = 0;+ isChanged = false;+ }+ };+ s1.kids.push(this);+ s2.kids.push(this);+ }++ function sampleOn(s1,s2) { return new SampleOn(s1,s2); }++ function delay(t,s) {+ var delayed = new Input(s.value);+ var firstEvent = true;+ function update(v) {+ if (firstEvent) { firstEvent = false; return; }+ setTimeout(function() { elm.notify(delayed.id, v); }, t);+ }+ function first(a,b) { return a; }+ return new SampleOn(delayed, lift2(F2(first), delayed, lift(update,s)));+ }++ function Merge(s1,s2) {+ this.id = Utils.guid();+ this.value = s1.value;+ this.kids = [];++ var next = null;+ var count = 0;+ var isChanged = false;++ this.recv = function(timestep, changed, parentID) {+ ++count;+ if (changed) {+ isChanged = true;+ if (parentID == s2.id && next === null) { next = s2.value; }+ if (parentID == s1.id) { next = s1.value; }+ }++ if (count == 2) {+ if (isChanged) { this.value = next; next = null; }+ send(this, timestep, isChanged);+ isChanged = false;+ count = 0;+ }+ };+ s1.kids.push(this);+ s2.kids.push(this);+ }++ function merge(s1,s2) { return new Merge(s1,s2); }+ function merges(ss) { return A2(foldr1, F2(merge), ss); }++ return elm.Native.Signal.values = {+ constant : function(v) { return new Input(v); },+ lift : F2(lift ),+ lift2 : F3(lift2),+ lift3 : F4(lift3),+ lift4 : F5(lift4),+ lift5 : F6(lift5),+ lift6 : F7(lift6),+ lift7 : F8(lift7),+ lift8 : F9(lift8),+ foldp : F3(foldp),+ delay : F2(delay),+ merge : F2(merge),+ merges : merges,+ count : function(s) { return foldp(F2(function(_,c) { return c+1; }), 0, s); },+ countIf : F2(function(pred,s) {+ return foldp(F2(function(x,c){+ return pred(x) ? c+1 : c; }), 0, s)}),+ keepIf : F3(function(pred,base,sig) {+ return new DropIf(function(x) {return !pred(x);},base,sig); }),+ dropIf : F3(function(pred,base,sig) { return new DropIf(pred,base,sig); }),+ keepWhen : F3(function(s1,b,s2) {+ return dropWhen(lift(function(b){return !b;},s1), b, s2); }),+ dropWhen : F3(dropWhen),+ dropRepeats : function(s) { return new DropRepeats(s);},+ sampleOn : F2(sampleOn),+ timestamp : timestamp+ };+};+Elm.Native.Time = {};+Elm.Native.Time.make = function(elm) {++ elm.Native = elm.Native || {};+ elm.Native.Time = elm.Native.Time || {};+ if (elm.Native.Time.values) return elm.Native.Time.values;++ var Signal = Elm.Signal.make(elm);+ var NS = Elm.Native.Signal.make(elm);+ var Maybe = Elm.Maybe.make(elm);+ var Utils = Elm.Native.Utils.make(elm);++ function fpsWhen(desiredFPS, isOn) {+ var msPerFrame = 1000 / desiredFPS;+ var prev = Date.now(), curr = prev, diff = 0, wasOn = true;+ var ticker = Signal.constant(diff);+ function tick(zero) { return function() {+ curr = Date.now();+ diff = zero ? 0 : curr - prev;+ prev = curr;+ elm.notify(ticker.id, diff);+ };+ }+ var timeoutID = 0;+ function f(isOn, t) {+ if (isOn) {+ timeoutID = setTimeout(tick(!wasOn && isOn), msPerFrame);+ } else if (wasOn) {+ clearTimeout(timeoutID);+ }+ wasOn = isOn;+ return t;+ }+ return A3( Signal.lift2, F2(f), isOn, ticker );+ }++ function every(t) {+ var clock = Signal.constant(Date.now());+ setInterval(function() {+ elm.notify(clock.id, Date.now());+ }, t);+ return clock;+ }++ function since(t, s) {+ function cmp(a,b) { return !Utils.eq(a,b); }+ var dcount = Signal.count(A2(NS.delay, t, s));+ return A3( Signal.lift2, F2(cmp), Signal.count(s), dcount );+ }+ function read(s) {+ var t = Date.parse(s);+ return isNaN(t) ? Maybe.Nothing : Maybe.Just(t);+ }+ return elm.Native.Time.values = {+ fpsWhen : F2(fpsWhen),+ fps : function(t) { return fpsWhen(t, Signal.constant(true)); },+ every : every,+ delay : NS.delay,+ timestamp : NS.timestamp,+ since : F2(since),+ toDate : function(t) { return new window.Date(t); },+ read : read+ };++};+Elm.Native.Touch = {};+Elm.Native.Touch.make = function(elm) {++ elm.Native = elm.Native || {};+ elm.Native.Touch = elm.Native.Touch || {};+ if (elm.Native.Touch.values) return elm.Native.Touch.values;++ var Signal = Elm.Signal.make(elm);+ var JS = Elm.JavaScript.make(elm);+ var Utils = Elm.Native.Utils.make(elm);++ function Dict() {+ this.keys = [];+ this.values = [];++ this.insert = function(key,value) {+ this.keys.push(key);+ this.values.push(value);+ };+ this.lookup = function(key) {+ var i = this.keys.indexOf(key)+ return i >= 0 ? this.values[i] : {x:0,y:0,t:0};+ };+ this.remove = function(key) {+ var i = this.keys.indexOf(key);+ if (i < 0) return;+ var t = this.values[i];+ this.keys.splice(i,1);+ this.values.splice(i,1);+ return t;+ };+ this.clear = function() {+ this.keys = [];+ this.values = [];+ };+ }+ + var root = Signal.constant([]),+ tapTime = 500,+ hasTap = false,+ tap = {_:{},x:0,y:0},+ dict = new Dict();++ function touch(t) {+ var r = dict.lookup(t.identifier);+ var point = Utils.getXY(t);+ return {_ : {},+ id: t.identifier,+ x : point._0,+ y : point._1,+ x0: r.x,+ y0: r.y,+ t0: r.t+ };+ }++ var node = elm.display === ElmRuntime.Display.FULLSCREEN ? document : elm.node;++ function start(e) {+ var point = Utils.getXY(e);+ dict.insert(e.identifier,+ {x: point._0,+ y: point._1,+ t: Date.now()});+ }+ function end(e) {+ var t = dict.remove(e.identifier);+ if (Date.now() - t.t < tapTime) {+ hasTap = true;+ tap = {_:{}, x:t.x, y:t.y};+ }+ }++ function listen(name, f) {+ function update(e) {+ for (var i = e.changedTouches.length; i--; ) { f(e.changedTouches[i]); }+ var ts = new Array(e.touches.length);+ for (var i = e.touches.length; i--; ) { ts[i] = touch(e.touches[i]); }+ elm.notify(root.id, ts);+ e.preventDefault();+ }+ elm.addListener([root.id], node, name, update);+ }++ listen("touchstart", start);+ listen("touchmove", function(_){});+ listen("touchend", end);+ listen("touchcancel", end);+ listen("touchleave", end);++ var mouseID = -1;+ function move(e) {+ var point = Utils.getXY(e);+ for (var i = root.value.length; i--; ) {+ if (root.value[i].id === mouseID) {+ root.value[i].x = point._0;+ root.value[i].y = point._1;+ elm.notify(root.id, root.value);+ break;+ }+ }+ }+ elm.addListener([root.id], node, "mousedown", function down(e) {+ node.addEventListener("mousemove", move);+ e.identifier = mouseID;+ start(e);+ root.value.push(touch(e));+ elm.notify(root.id, root.value);+ });+ elm.addListener([root.id], node, "mouseup", function up(e) {+ node.removeEventListener("mousemove", move);+ e.identifier = mouseID;+ end(e);+ for (var i = root.value.length; i--; ) {+ if (root.value[i].id === mouseID) {+ root.value.splice(i, 1);+ --mouseID;+ break;+ }+ }+ elm.notify(root.id, root.value);+ });+ elm.addListener([root.id], node, "blur", function blur(e) {+ node.removeEventListener("mousemove", move);+ if (root.value.length > 0) {+ elm.notify(root.id, []);+ --mouseID;+ }+ dict.clear();+ });++ function dependency(f) {+ var sig = A2( Signal.lift, f, root );+ root.defaultNumberOfKids += 1;+ sig.defaultNumberOfKids = 0;+ return sig;+ }++ var touches = dependency(JS.toList);++ var taps = function() {+ var sig = dependency(function(_) { return tap; });+ sig.defaultNumberOfKids = 1;+ function pred(_) { var b = hasTap; hasTap = false; return b; }+ var sig2 = A3( Signal.keepIf, pred, {_:{},x:0,y:0}, sig);+ sig2.defaultNumberOfKids = 0;+ return sig2;+ }();++ return elm.Native.Touch.values = { touches: touches, taps: taps };++};Elm.Native.WebSocket = {};+Elm.Native.WebSocket.make = function(elm) {++ elm.Native = elm.Native || {};+ elm.Native.WebSocket = elm.Native.WebSocket || {};+ if (elm.Native.WebSocket.values) return elm.Native.WebSocket.values;++ var Signal = Elm.Signal.make(elm);+ var JS = Elm.JavaScript.make(elm);+ var List = Elm.Native.List.make(elm);++ function open(url, outgoing) {+ var incoming = Signal.constant(List.Nil);+ var ws = new WebSocket(JS.fromString(url));++ var pending = [];+ var ready = false;+ + ws.onopen = function(e) {+ var len = pending.length;+ for (var i = 0; i < len; ++i) { ws.send(pending[i]); }+ ready = true;+ };+ ws.onmessage = function(event) {+ elm.notify(incoming.id, JS.toString(event.data));+ };+ + function send(msg) {+ var s = JS.fromString(msg);+ ready ? ws.send(s) : pending.push(s);+ }+ + function take1(x,y) { return x }+ return A3(Signal.lift2, F2(take1), incoming, A2(Signal.lift, send, outgoing));+ }++ return elm.Native.WebSocket.values = { connect: F2(open) };+};+Elm.Native.Window = {};+Elm.Native.Window.make = function(elm) {++ elm.Native = elm.Native || {};+ elm.Native.Window = elm.Native.Window || {};+ if (elm.Native.Window.values) return elm.Native.Window.values;++ var Signal = Elm.Signal.make(elm);+ var Tuple2 = Elm.Native.Utils.make(elm).Tuple2;++ function getWidth() { return elm.node.clientWidth; }+ function getHeight() {+ if (elm.display === ElmRuntime.Display.FULLSCREEN) {+ return window.innerHeight;+ }+ return elm.node.clientHeight;+ }++ var dimensions = Signal.constant(Tuple2(getWidth(), getHeight()));+ dimensions.defaultNumberOfKids = 2;++ // Do not move width and height into Elm. By setting the default number of kids,+ // the resize listener can be detached.+ var width = A2(Signal.lift, function(p){return p._0;}, dimensions);+ width.defaultNumberOfKids = 0;++ var height = A2(Signal.lift, function(p){return p._1;}, dimensions);+ height.defaultNumberOfKids = 0;++ function resizeIfNeeded() {+ // Do not trigger event if the dimensions have not changed.+ // This should be most of the time.+ var w = getWidth();+ var h = getHeight();+ if (dimensions.value._0 === w && dimensions.value._1 === h) return;++ setTimeout(function () {+ // Check again to see if the dimensions have changed.+ // It is conceivable that the dimensions have changed+ // again while some other event was being processed.+ var w = getWidth();+ var h = getHeight();+ if (dimensions.value._0 === w && dimensions.value._1 === h) return;+ elm.notify(dimensions.id, Tuple2(w,h));+ }, 0);+ }+ elm.addListener([dimensions.id], window, 'resize', resizeIfNeeded);++ return elm.Native.Window.values = {+ dimensions:dimensions,+ width:width,+ height:height,+ resizeIfNeeded:resizeIfNeeded+ };++};+Elm.Basics = Elm.Basics || {};+Elm.Basics.make = function (_elm)+ {+ _elm.Basics = _elm.Basics || {};+ if (_elm.Basics.values)+ return _elm.Basics.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Basics";+ var Native = Native || {};+ Native.Basics = Elm.Native.Basics.make(_elm);+ var _op = {};+ _op["||"] = Native.Basics.or;+ _op["|>"] = F2(function (x,f)+ {+ return f(x)+ });+ var xor = Native.Basics.xor;+ var uncurry = F2(function (f,_v0)+ {+ return function ()+ {+ switch (_v0.ctor)+ {case+ "_Tuple2" :+ return A2(f,_v0._0,_v0._1)}+ _E.Case($moduleName,"on line 338, column 19 to 24");+ }()+ });+ var truncate = Native.Basics.truncate;+ var toFloat = Native.Basics.toFloat;+ var tan = Native.Basics.tan;+ var sqrt = Native.Basics.sqrt;+ var snd = function (_v4)+ {+ return function ()+ {+ switch (_v4.ctor)+ {case+ "_Tuple2" :+ return _v4._1}+ _E.Case($moduleName,"on line 322, column 13 to 14");+ }()+ };+ var sin = Native.Basics.sin;+ var round = Native.Basics.round;+ var rem = Native.Basics.rem;+ var radians = function (t)+ {+ return t+ };+ var pi = Native.Basics.pi;+ var otherwise = true;+ var not = Native.Basics.not;+ var mod = Native.Basics.mod;+ var min = Native.Basics.min;+ var max = Native.Basics.max;+ var logBase = Native.Basics.logBase;+ var id = function (x)+ {+ return x+ };+ var fst = function (_v8)+ {+ return function ()+ {+ switch (_v8.ctor)+ {case+ "_Tuple2" :+ return _v8._0}+ _E.Case($moduleName,"on line 318, column 13 to 14");+ }()+ };+ var floor = Native.Basics.floor;+ var flip = F3(function (f,b,a)+ {+ return A2(f,a,b)+ });+ var e = Native.Basics.e;+ var div = Native.Basics.div;+ var curry = F3(function (f,a,b)+ {+ return f({ctor: "_Tuple2", _0: a, _1: b})+ });+ var cos = Native.Basics.cos;+ var compare = Native.Basics.compare;+ var clamp = Native.Basics.clamp;+ var ceiling = Native.Basics.ceiling;+ var atan2 = Native.Basics.atan2;+ var atan = Native.Basics.atan;+ var asin = Native.Basics.asin;+ var acos = Native.Basics.acos;+ var abs = Native.Basics.abs;+ _op["^"] = Native.Basics.exp;+ var LT = {ctor: "LT"};+ var GT = {ctor: "GT"};+ var EQ = {ctor: "EQ"};+ _op[">="] = Native.Basics.ge;+ _op[">"] = Native.Basics.gt;+ _op["=="] = Native.Basics.eq;+ _op["<|"] = F2(function (f,x)+ {+ return f(x)+ });+ _op["<="] = Native.Basics.le;+ _op["<"] = Native.Basics.lt;+ _op["/="] = Native.Basics.neq;+ _op["/"] = Native.Basics.floatDiv;+ _op["."] = F3(function (f,g,x)+ {+ return f(g(x))+ });+ _op["-"] = Native.Basics.sub;+ _op["+"] = Native.Basics.add;+ var toPolar = function (_v12)+ {+ return function ()+ {+ switch (_v12.ctor)+ {case+ "_Tuple2" :+ return {ctor: "_Tuple2", _0: Native.Basics.sqrt(Math.pow(_v12._0,+ 2) + Math.pow(_v12._1,+ 2)), _1: A2(Native.Basics.atan2,+ _v12._1,+ _v12._0)}}+ _E.Case($moduleName,"on line 76, column 18 to 73");+ }()+ };+ _op["*"] = Native.Basics.mul;+ var degrees = function (d)+ {+ return d * Native.Basics.pi / 180+ };+ var fromPolar = function (_v16)+ {+ return function ()+ {+ switch (_v16.ctor)+ {case+ "_Tuple2" :+ return {ctor: "_Tuple2", _0: _v16._0 * Native.Basics.cos(_v16._1), _1: _v16._0 * Native.Basics.sin(_v16._1)}}+ _E.Case($moduleName,"on line 70, column 20 to 68");+ }()+ };+ var turns = function (r)+ {+ return 2 * Native.Basics.pi * r+ };+ _op["&&"] = Native.Basics.and;+ _elm.Basics.values = {_op: _op, radians: radians, degrees: degrees, turns: turns, fromPolar: fromPolar, toPolar: toPolar, div: div, rem: rem, mod: mod, cos: cos, sin: sin, tan: tan, acos: acos, asin: asin, atan: atan, atan2: atan2, sqrt: sqrt, abs: abs, logBase: logBase, clamp: clamp, pi: pi, e: e, compare: compare, min: min, max: max, xor: xor, not: not, otherwise: otherwise, round: round, truncate: truncate, floor: floor, ceiling: ceiling, toFloat: toFloat, id: id, fst: fst, snd: snd, flip: flip, curry: curry, uncurry: uncurry, LT: LT, EQ: EQ, GT: GT};+ return _elm.Basics.values+ };Elm.Bitwise = Elm.Bitwise || {};+Elm.Bitwise.make = function (_elm)+ {+ _elm.Bitwise = _elm.Bitwise || {};+ if (_elm.Bitwise.values)+ return _elm.Bitwise.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Bitwise";+ var Native = Native || {};+ Native.Bitwise = Elm.Native.Bitwise.make(_elm);+ var _op = {};+ var xor = Native.Bitwise.xor;+ var shiftRightLogical = Native.Bitwise.shiftRightLogical;+ var shiftRight = Native.Bitwise.shiftRightArithmatic;+ var shiftLeft = Native.Bitwise.shiftLeft;+ var or = Native.Bitwise.or;+ var complement = Native.Bitwise.complement;+ var and = Native.Bitwise.and;+ _elm.Bitwise.values = {_op: _op, and: and, or: or, xor: xor, complement: complement, shiftLeft: shiftLeft, shiftRight: shiftRight, shiftRightLogical: shiftRightLogical};+ return _elm.Bitwise.values+ };Elm.Char = Elm.Char || {};+Elm.Char.make = function (_elm)+ {+ _elm.Char = _elm.Char || {};+ if (_elm.Char.values)+ return _elm.Char.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Char";+ var Native = Native || {};+ Native.Char = Elm.Native.Char.make(_elm);+ var _op = {};+ var toUpper = Native.Char.toUpper;+ var toLower = Native.Char.toLower;+ var toLocaleUpper = Native.Char.toLocaleUpper;+ var toLocaleLower = Native.Char.toLocaleLower;+ var toCode = Native.Char.toCode;+ var isUpper = Native.Char.isUpper;+ var isOctDigit = Native.Char.isOctDigit;+ var isLower = Native.Char.isLower;+ var isHexDigit = Native.Char.isHexDigit;+ var isDigit = Native.Char.isDigit;+ var fromCode = Native.Char.fromCode;+ _elm.Char.values = {_op: _op, isUpper: isUpper, isLower: isLower, isDigit: isDigit, isOctDigit: isOctDigit, isHexDigit: isHexDigit, toUpper: toUpper, toLower: toLower, toLocaleUpper: toLocaleUpper, toLocaleLower: toLocaleLower, toCode: toCode, fromCode: fromCode};+ return _elm.Char.values+ };Elm.Color = Elm.Color || {};+Elm.Color.make = function (_elm)+ {+ _elm.Color = _elm.Color || {};+ if (_elm.Color.values)+ return _elm.Color.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Color";+ var Native = Native || {};+ Native.Color = Elm.Native.Color.make(_elm);+ var Basics = Elm.Basics.make(_elm);+ var _op = {};+ var hsva = Native.Color.hsva;+ var hsv = Native.Color.hsv;+ var greyscale = function (p)+ {+ return A3(hsv,0,0,1 - p)+ };+ var grayscale = function (p)+ {+ return A3(hsv,0,0,1 - p)+ };+ var complement = Native.Color.complement;+ var Radial = F5(function (a,b,c,d,e)+ {+ return {ctor: "Radial", _0: a, _1: b, _2: c, _3: d, _4: e}+ });+ var radial = Radial;+ var Linear = F3(function (a,b,c)+ {+ return {ctor: "Linear", _0: a, _1: b, _2: c}+ });+ var linear = Linear;+ var Color = F4(function (a,b,c,d)+ {+ return {ctor: "Color", _0: a, _1: b, _2: c, _3: d}+ });+ var black = A4(Color,0,0,0,1);+ var blue = A4(Color,52,101,164,1);+ var brown = A4(Color,193,125,17,1);+ var charcoal = A4(Color,85,87,83,1);+ var darkBlue = A4(Color,32,74,135,1);+ var darkBrown = A4(Color,143,89,2,1);+ var darkCharcoal = A4(Color,46,52,54,1);+ var darkGray = A4(Color,186,189,182,1);+ var darkGreen = A4(Color,78,154,6,1);+ var darkGrey = A4(Color,186,189,182,1);+ var darkOrange = A4(Color,206,92,0,1);+ var darkPurple = A4(Color,92,53,102,1);+ var darkRed = A4(Color,164,0,0,1);+ var darkYellow = A4(Color,196,160,0,1);+ var gray = A4(Color,211,215,207,1);+ var green = A4(Color,115,210,22,1);+ var grey = A4(Color,211,215,207,1);+ var lightBlue = A4(Color,114,159,207,1);+ var lightBrown = A4(Color,233,185,110,1);+ var lightCharcoal = A4(Color,136,138,133,1);+ var lightGray = A4(Color,238,238,236,1);+ var lightGreen = A4(Color,138,226,52,1);+ var lightGrey = A4(Color,238,238,236,1);+ var lightOrange = A4(Color,252,175,62,1);+ var lightPurple = A4(Color,173,127,168,1);+ var lightRed = A4(Color,239,41,41,1);+ var lightYellow = A4(Color,255,233,79,1);+ var orange = A4(Color,245,121,0,1);+ var purple = A4(Color,117,80,123,1);+ var red = A4(Color,204,0,0,1);+ var rgb = F3(function (r,g,b)+ {+ return A4(Color,r,g,b,1)+ });+ var rgba = Color;+ var white = A4(Color,255,255,255,1);+ var yellow = A4(Color,237,212,0,1);+ _elm.Color.values = {_op: _op, rgba: rgba, rgb: rgb, lightRed: lightRed, red: red, darkRed: darkRed, lightOrange: lightOrange, orange: orange, darkOrange: darkOrange, lightYellow: lightYellow, yellow: yellow, darkYellow: darkYellow, lightGreen: lightGreen, green: green, darkGreen: darkGreen, lightBlue: lightBlue, blue: blue, darkBlue: darkBlue, lightPurple: lightPurple, purple: purple, darkPurple: darkPurple, lightBrown: lightBrown, brown: brown, darkBrown: darkBrown, black: black, white: white, lightGrey: lightGrey, grey: grey, darkGrey: darkGrey, lightGray: lightGray, gray: gray, darkGray: darkGray, lightCharcoal: lightCharcoal, charcoal: charcoal, darkCharcoal: darkCharcoal, grayscale: grayscale, greyscale: greyscale, complement: complement, hsva: hsva, hsv: hsv, linear: linear, radial: radial, Color: Color, Linear: Linear, Radial: Radial};+ return _elm.Color.values+ };Elm.Date = Elm.Date || {};+Elm.Date.make = function (_elm)+ {+ _elm.Date = _elm.Date || {};+ if (_elm.Date.values)+ return _elm.Date.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Date";+ var Native = Native || {};+ Native.Date = Elm.Native.Date.make(_elm);+ var Time = Elm.Time.make(_elm);+ var Maybe = Elm.Maybe.make(_elm);+ var _op = {};+ var year = Native.Date.year;+ var toTime = Native.Date.toTime;+ var second = Native.Date.second;+ var read = Native.Date.read;+ var month = Native.Date.month;+ var minute = Native.Date.minute;+ var hour = Native.Date.hour;+ var dayOfWeek = Native.Date.dayOfWeek;+ var day = Native.Date.day;+ var Wed = {ctor: "Wed"};+ var Tue = {ctor: "Tue"};+ var Thu = {ctor: "Thu"};+ var Sun = {ctor: "Sun"};+ var Sep = {ctor: "Sep"};+ var Sat = {ctor: "Sat"};+ var Oct = {ctor: "Oct"};+ var Nov = {ctor: "Nov"};+ var Mon = {ctor: "Mon"};+ var May = {ctor: "May"};+ var Mar = {ctor: "Mar"};+ var Jun = {ctor: "Jun"};+ var Jul = {ctor: "Jul"};+ var Jan = {ctor: "Jan"};+ var Fri = {ctor: "Fri"};+ var Feb = {ctor: "Feb"};+ var Dec = {ctor: "Dec"};+ var Date = {ctor: "Date"};+ var Aug = {ctor: "Aug"};+ var Apr = {ctor: "Apr"};+ _elm.Date.values = {_op: _op, read: read, toTime: toTime, year: year, month: month, day: day, dayOfWeek: dayOfWeek, hour: hour, minute: minute, second: second, Date: Date, Mon: Mon, Tue: Tue, Wed: Wed, Thu: Thu, Fri: Fri, Sat: Sat, Sun: Sun, Jan: Jan, Feb: Feb, Mar: Mar, Apr: Apr, May: May, Jun: Jun, Jul: Jul, Aug: Aug, Sep: Sep, Oct: Oct, Nov: Nov, Dec: Dec};+ return _elm.Date.values+ };Elm.Dict = Elm.Dict || {};+Elm.Dict.make = function (_elm)+ {+ _elm.Dict = _elm.Dict || {};+ if (_elm.Dict.values)+ return _elm.Dict.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Dict";+ var Basics = Elm.Basics.make(_elm);+ var Maybe = Elm.Maybe.make(_elm);+ var Native = Native || {};+ Native.Error = Elm.Native.Error.make(_elm);+ var List = Elm.List.make(_elm);+ var Native = Native || {};+ Native.Utils = Elm.Native.Utils.make(_elm);+ var _op = {};+ var Same = {ctor: "Same"};+ var Remove = {ctor: "Remove"};+ var Red = {ctor: "Red"};+ var RBNode = F5(function (a,b,c,d,e)+ {+ return {ctor: "RBNode", _0: a, _1: b, _2: c, _3: d, _4: e}+ });+ var rotateLeft = function (t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBNode" :+ switch (t._4.ctor)+ {case+ "RBNode" :+ return A5(RBNode,+ t._0,+ t._4._1,+ t._4._2,+ A5(RBNode,Red,t._1,t._2,t._3,t._4._3),+ t._4._4)}+ break;}+ return Native.Error.raise("rotateLeft of a node without enough children")+ }()+ };+ var rotateLeftIfNeeded = function (t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBNode" :+ switch (t._4.ctor)+ {case+ "RBNode" :+ switch (t._4._0.ctor)+ {case+ "Red" :+ return rotateLeft(t)}+ break;}+ break;}+ return t+ }()+ };+ var rotateRight = function (t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBNode" :+ switch (t._3.ctor)+ {case+ "RBNode" :+ return A5(RBNode,+ t._0,+ t._3._1,+ t._3._2,+ t._3._3,+ A5(RBNode,+ Red,+ t._1,+ t._2,+ t._3._4,+ t._4))}+ break;}+ return Native.Error.raise("rotateRight of a node without enough children")+ }()+ };+ var rotateRightIfNeeded = function (t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBNode" :+ switch (t._3.ctor)+ {case+ "RBNode" :+ switch (t._3._0.ctor)+ {case+ "Red" :+ switch (t._3._3.ctor)+ {case+ "RBNode" :+ switch (t._3._3._0.ctor)+ {case+ "Red" :+ return rotateRight(t)}+ break;}+ break;}+ break;}+ break;}+ return t+ }()+ };+ var RBEmpty = function (a)+ {+ return {ctor: "RBEmpty", _0: a}+ };+ var max = function (t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBEmpty" :+ return Native.Error.raise("(max Empty) is not defined")+ case+ "RBNode" :+ switch (t._4.ctor)+ {case+ "RBEmpty" :+ return {ctor: "_Tuple2", _0: t._1, _1: t._2}}+ return max(t._4)}+ _E.Case($moduleName,"between lines 63 and 68");+ }()+ };+ var redden = function (t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBEmpty" :+ return Native.Error.raise("can\'t make a Leaf red")+ case+ "RBNode" :+ return A5(RBNode,Red,t._1,t._2,t._3,t._4)}+ _E.Case($moduleName,"between lines 302 and 306");+ }()+ };+ var NBlack = {ctor: "NBlack"};+ var LBlack = {ctor: "LBlack"};+ var empty = RBEmpty(LBlack);+ var findWithDefault = F3(function (base,k,t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBEmpty" :+ switch (t._0.ctor)+ {case+ "LBlack" :+ return base}+ break;+ case+ "RBNode" :+ return function ()+ {+ var _v71 = A2(Native.Utils.compare,+ k,+ t._1);+ switch (_v71.ctor)+ {case+ "EQ" :+ return t._2+ case+ "GT" :+ return A3(findWithDefault,+ base,+ k,+ t._4)+ case+ "LT" :+ return A3(findWithDefault,+ base,+ k,+ t._3)}+ _E.Case($moduleName,+ "between lines 86 and 91");+ }()}+ _E.Case($moduleName,+ "between lines 83 and 91");+ }()+ });+ var foldl = F3(function (f,acc,t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBEmpty" :+ switch (t._0.ctor)+ {case+ "LBlack" :+ return acc}+ break;+ case+ "RBNode" :+ return A3(foldl,+ f,+ A3(f,t._1,t._2,A3(foldl,f,acc,t._3)),+ t._4)}+ _E.Case($moduleName,"between lines 317 and 322");+ }()+ });+ var foldr = F3(function (f,acc,t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBEmpty" :+ switch (t._0.ctor)+ {case+ "LBlack" :+ return acc}+ break;+ case+ "RBNode" :+ return A3(foldr,+ f,+ A3(f,t._1,t._2,A3(foldr,f,acc,t._4)),+ t._3)}+ _E.Case($moduleName,"between lines 325 and 330");+ }()+ });+ var keys = function (t)+ {+ return A3(foldr,+ F3(function (k,v,acc)+ {+ return {ctor: "::", _0: k, _1: acc}+ }),+ _J.toList([]),+ t)+ };+ var toList = function (t)+ {+ return A3(foldr,+ F3(function (k,v,acc)+ {+ return {ctor: "::", _0: {ctor: "_Tuple2", _0: k, _1: v}, _1: acc}+ }),+ _J.toList([]),+ t)+ };+ var values = function (t)+ {+ return A3(foldr,+ F3(function (k,v,acc)+ {+ return {ctor: "::", _0: v, _1: acc}+ }),+ _J.toList([]),+ t)+ };+ var lookup = F2(function (k,t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBEmpty" :+ switch (t._0.ctor)+ {case+ "LBlack" :+ return Maybe.Nothing}+ break;+ case+ "RBNode" :+ return function ()+ {+ var _v93 = A2(Native.Utils.compare,k,t._1);+ switch (_v93.ctor)+ {case+ "EQ" :+ return Maybe.Just(t._2)+ case+ "GT" :+ return A2(lookup,k,t._4)+ case+ "LT" :+ return A2(lookup,k,t._3)}+ _E.Case($moduleName,+ "between lines 74 and 80");+ }()}+ _E.Case($moduleName,"between lines 71 and 80");+ }()+ });+ var member = F2(function (k,t)+ {+ return Maybe.isJust(A2(lookup,k,t))+ });+ var map = F2(function (f,t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBEmpty" :+ switch (t._0.ctor)+ {case+ "LBlack" :+ return RBEmpty(LBlack)}+ break;+ case+ "RBNode" :+ return A5(RBNode,+ t._0,+ t._1,+ f(t._2),+ A2(map,f,t._3),+ A2(map,f,t._4))}+ _E.Case($moduleName,"between lines 309 and 314");+ }()+ });+ var min = function (t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBEmpty" :+ switch (t._0.ctor)+ {case+ "LBlack" :+ return Native.Error.raise("(min Empty) is not defined")}+ break;+ case+ "RBNode" :+ switch (t._3.ctor)+ {case+ "RBEmpty" :+ switch (t._3._0.ctor)+ {case+ "LBlack" :+ return {ctor: "_Tuple2", _0: t._1, _1: t._2}}+ break;}+ return min(t._3)}+ _E.Case($moduleName,"between lines 56 and 59");+ }()+ };+ var LBBlack = {ctor: "LBBlack"};+ var Insert = {ctor: "Insert"};+ var Black = {ctor: "Black"};+ var blacken = function (t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBEmpty" :+ return RBEmpty(LBlack)+ case+ "RBNode" :+ return A5(RBNode,Black,t._1,t._2,t._3,t._4)}+ _E.Case($moduleName,"between lines 296 and 298");+ }()+ };+ var ensureBlackRoot = function (t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBEmpty" :+ switch (t._0.ctor)+ {case+ "LBlack" :+ return t}+ break;+ case+ "RBNode" :+ switch (t._0.ctor)+ {case+ "Black" :+ return t+ case+ "Red" :+ return A5(RBNode,+ Black,+ t._1,+ t._2,+ t._3,+ t._4)}+ break;}+ _E.Case($moduleName,"between lines 143 and 149");+ }()+ };+ var otherColor = function (c)+ {+ return function ()+ {+ switch (c.ctor)+ {case+ "Black" :+ return Red+ case+ "Red" :+ return Black}+ _E.Case($moduleName,"on line 122, column 16 to 57");+ }()+ };+ var color_flip = function (t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBNode" :+ switch (t._3.ctor)+ {case+ "RBNode" :+ switch (t._4.ctor)+ {case+ "RBNode" :+ return A5(RBNode,+ otherColor(t._0),+ t._1,+ t._2,+ A5(RBNode,+ otherColor(t._3._0),+ t._3._1,+ t._3._2,+ t._3._3,+ t._3._4),+ A5(RBNode,+ otherColor(t._4._0),+ t._4._1,+ t._4._2,+ t._4._3,+ t._4._4))}+ break;}+ break;}+ return Native.Error.raise("color_flip called on a Empty or Node with a Empty child")+ }()+ };+ var color_flipIfNeeded = function (t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBNode" :+ switch (t._3.ctor)+ {case+ "RBNode" :+ switch (t._3._0.ctor)+ {case+ "Red" :+ switch (t._4.ctor)+ {case+ "RBNode" :+ switch (t._4._0.ctor)+ {case+ "Red" :+ return color_flip(t)}+ break;}+ break;}+ break;}+ break;}+ return t+ }()+ };+ var fixUp = function (t)+ {+ return color_flipIfNeeded(rotateRightIfNeeded(rotateLeftIfNeeded(t)))+ };+ var BBlack = {ctor: "BBlack"};+ var blackish = function (_v156)+ {+ return function ()+ {+ switch (_v156.ctor)+ {case+ "RBNode" :+ return _N.eq(_v156._0,Black) || _N.eq(_v156._0,+ BBlack)}+ _E.Case($moduleName,"on line 260, column 31 to 56");+ }()+ };+ var isBBlack = function (t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBEmpty" :+ switch (t._0.ctor)+ {case+ "LBBlack" :+ return true}+ break;+ case+ "RBNode" :+ return function ()+ {+ switch (t._0.ctor)+ {case+ "BBlack" :+ return true}+ return false+ }()}+ return false+ }()+ };+ var lessBlack = function (c)+ {+ return function ()+ {+ switch (c.ctor)+ {case+ "BBlack" :+ return Black+ case+ "Black" :+ return Red+ case+ "NBlack" :+ return NBlack+ case+ "Red" :+ return NBlack}+ _E.Case($moduleName,"between lines 211 and 215");+ }()+ };+ var balance_node = function (t)+ {+ return function ()+ {+ var assemble = function (col)+ {+ return function (xk)+ {+ return function (xv)+ {+ return function (yk)+ {+ return function (yv)+ {+ return function (zk)+ {+ return function (zv)+ {+ return function (a)+ {+ return function (b)+ {+ return function (c)+ {+ return function (d)+ {+ return A5(RBNode,+ lessBlack(col),+ yk,+ yv,+ A5(RBNode,+ Black,+ xk,+ xv,+ a,+ b),+ A5(RBNode,+ Black,+ zk,+ zv,+ c,+ d))+ }+ }+ }+ }+ }+ }+ }+ }+ }+ }+ };+ return blackish(t) ? function ()+ {+ switch (t.ctor)+ {case+ "RBNode" :+ switch (t._3.ctor)+ {case+ "RBNode" :+ switch (t._3._0.ctor)+ {case+ "Red" :+ switch (t._3._3.ctor)+ {case+ "RBNode" :+ switch (t._3._3._0.ctor)+ {case+ "Red" :+ return assemble(t._0)(t._3._3._1)(t._3._3._2)(t._3._1)(t._3._2)(t._1)(t._2)(t._3._3._3)(t._3._3._4)(t._3._4)(t._4)}+ break;}+ switch (t._3._4.ctor)+ {case+ "RBNode" :+ switch (t._3._4._0.ctor)+ {case+ "Red" :+ return assemble(t._0)(t._3._1)(t._3._2)(t._3._4._1)(t._3._4._2)(t._1)(t._2)(t._3._3)(t._3._4._3)(t._3._4._4)(t._4)}+ break;}+ break;}+ break;}+ switch (t._4.ctor)+ {case+ "RBNode" :+ switch (t._4._0.ctor)+ {case+ "Red" :+ switch (t._4._3.ctor)+ {case+ "RBNode" :+ switch (t._4._3._0.ctor)+ {case+ "Red" :+ return assemble(t._0)(t._1)(t._2)(t._4._3._1)(t._4._3._2)(t._4._1)(t._4._2)(t._3)(t._4._3._3)(t._4._3._4)(t._4._4)}+ break;}+ switch (t._4._4.ctor)+ {case+ "RBNode" :+ switch (t._4._4._0.ctor)+ {case+ "Red" :+ return assemble(t._0)(t._1)(t._2)(t._4._1)(t._4._2)(t._4._4._1)(t._4._4._2)(t._3)(t._4._3)(t._4._4._3)(t._4._4._4)}+ break;}+ break;}+ break;}+ switch (t._0.ctor)+ {case+ "BBlack" :+ switch (t._4.ctor)+ {case+ "RBNode" :+ switch (t._4._0.ctor)+ {case+ "NBlack" :+ switch (t._4._3.ctor)+ {case+ "RBNode" :+ switch (t._4._3._0.ctor)+ {case+ "Black" :+ return function ()+ {+ switch (t._4._4.ctor)+ {case+ "RBNode" :+ switch (t._4._4._0.ctor)+ {case+ "Black" :+ return A5(RBNode,+ Black,+ t._4._3._1,+ t._4._3._2,+ A5(RBNode,+ Black,+ t._1,+ t._2,+ t._3,+ t._4._3._3),+ A5(balance,+ Black,+ t._4._1,+ t._4._2,+ t._4._3._4,+ redden(t._4._4)))}+ break;}+ return t+ }()}+ break;}+ break;}+ break;}+ switch (t._3.ctor)+ {case+ "RBNode" :+ switch (t._3._0.ctor)+ {case+ "NBlack" :+ switch (t._3._4.ctor)+ {case+ "RBNode" :+ switch (t._3._4._0.ctor)+ {case+ "Black" :+ return function ()+ {+ switch (t._3._3.ctor)+ {case+ "RBNode" :+ switch (t._3._3._0.ctor)+ {case+ "Black" :+ return A5(RBNode,+ Black,+ t._3._4._1,+ t._3._4._2,+ A5(balance,+ Black,+ t._3._1,+ t._3._2,+ redden(t._3._3),+ t._3._4._3),+ A5(RBNode,+ Black,+ t._1,+ t._2,+ t._3._4._4,+ t._4))}+ break;}+ return t+ }()}+ break;}+ break;}+ break;}+ break;}+ break;}+ return t+ }() : t+ }()+ };+ var balance = F5(function (c,k,v,l,r)+ {+ return balance_node(A5(RBNode,c,k,v,l,r))+ });+ var lessBlackTree = function (t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBEmpty" :+ return RBEmpty(LBlack)+ case+ "RBNode" :+ return A5(RBNode,+ lessBlack(t._0),+ t._1,+ t._2,+ t._3,+ t._4)}+ _E.Case($moduleName,"between lines 223 and 225");+ }()+ };+ var moreBlack = function (c)+ {+ return function ()+ {+ switch (c.ctor)+ {case+ "BBlack" :+ return BBlack+ case+ "Black" :+ return BBlack+ case+ "NBlack" :+ return Red+ case+ "Red" :+ return Black}+ _E.Case($moduleName,"between lines 205 and 209");+ }()+ };+ var bubble = F5(function (c,k,v,l,r)+ {+ return isBBlack(l) || isBBlack(r) ? A5(balance,+ moreBlack(c),+ k,+ v,+ lessBlackTree(l),+ lessBlackTree(r)) : A5(RBNode,+ c,+ k,+ v,+ l,+ r)+ });+ var remove_max = function (t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBNode" :+ switch (t._4.ctor)+ {case+ "RBEmpty" :+ return rem(t)}+ return A5(bubble,+ t._0,+ t._1,+ t._2,+ t._3,+ remove_max(t._4))}+ _E.Case($moduleName,"between lines 251 and 253");+ }()+ };+ var rem = function (t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBNode" :+ switch (t._3.ctor)+ {case+ "RBEmpty" :+ switch (t._4.ctor)+ {case+ "RBEmpty" :+ return function ()+ {+ switch (t._0.ctor)+ {case+ "Black" :+ return RBEmpty(LBBlack)+ case+ "Red" :+ return RBEmpty(LBlack)}+ _E.Case($moduleName,+ "between lines 230 and 233");+ }()}+ break;}+ switch (t._0.ctor)+ {case+ "Black" :+ switch (t._3.ctor)+ {case+ "RBEmpty" :+ switch (t._4.ctor)+ {case+ "RBNode" :+ return A5(RBNode,+ Black,+ t._4._1,+ t._4._2,+ t._4._3,+ t._4._4)}+ break;+ case+ "RBNode" :+ switch (t._4.ctor)+ {case+ "RBEmpty" :+ return A5(RBNode,+ Black,+ t._3._1,+ t._3._2,+ t._3._3,+ t._3._4)}+ break;}+ break;}+ return function ()+ {+ var l$ = remove_max(t._3);+ var $ = max(t._3),k = $._0,v = $._1;+ return A5(bubble,t._0,k,v,l$,t._4)+ }()}+ _E.Case($moduleName,"between lines 229 and 241");+ }()+ };+ var update = F3(function (k,u,t)+ {+ return function ()+ {+ var up = function (t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBEmpty" :+ switch (t._0.ctor)+ {case+ "LBlack" :+ return function ()+ {+ var _v283 = u(Maybe.Nothing);+ switch (_v283.ctor)+ {case+ "Just" :+ return {ctor: "_Tuple2", _0: Insert, _1: A5(RBNode,+ Red,+ k,+ _v283._0,+ empty,+ empty)}+ case+ "Nothing" :+ return {ctor: "_Tuple2", _0: Same, _1: empty}}+ _E.Case($moduleName,+ "between lines 166 and 169");+ }()}+ break;+ case+ "RBNode" :+ return function ()+ {+ var _v285 = A2(Native.Utils.compare,+ k,+ t._1);+ switch (_v285.ctor)+ {case+ "EQ" :+ return function ()+ {+ var _v286 = u(Maybe.Just(t._2));+ switch (_v286.ctor)+ {case+ "Just" :+ return {ctor: "_Tuple2", _0: Same, _1: A5(RBNode,+ t._0,+ t._1,+ _v286._0,+ t._3,+ t._4)}+ case+ "Nothing" :+ return {ctor: "_Tuple2", _0: Remove, _1: rem(t)}}+ _E.Case($moduleName,+ "between lines 170 and 173");+ }()+ case+ "GT" :+ return function ()+ {+ var $ = up(t._4),+ fl = $._0,+ r$ = $._1;+ return function ()+ {+ switch (fl.ctor)+ {case+ "Insert" :+ return {ctor: "_Tuple2", _0: Insert, _1: fixUp(A5(RBNode,+ t._0,+ t._1,+ t._2,+ t._3,+ r$))}+ case+ "Remove" :+ return {ctor: "_Tuple2", _0: Remove, _1: A5(bubble,+ t._0,+ t._1,+ t._2,+ t._3,+ r$)}+ case+ "Same" :+ return {ctor: "_Tuple2", _0: Same, _1: A5(RBNode,+ t._0,+ t._1,+ t._2,+ t._3,+ r$)}}+ _E.Case($moduleName,+ "between lines 179 and 183");+ }()+ }()+ case+ "LT" :+ return function ()+ {+ var $ = up(t._3),+ fl = $._0,+ l$ = $._1;+ return function ()+ {+ switch (fl.ctor)+ {case+ "Insert" :+ return {ctor: "_Tuple2", _0: Insert, _1: fixUp(A5(RBNode,+ t._0,+ t._1,+ t._2,+ l$,+ t._4))}+ case+ "Remove" :+ return {ctor: "_Tuple2", _0: Remove, _1: A5(bubble,+ t._0,+ t._1,+ t._2,+ l$,+ t._4)}+ case+ "Same" :+ return {ctor: "_Tuple2", _0: Same, _1: A5(RBNode,+ t._0,+ t._1,+ t._2,+ l$,+ t._4)}}+ _E.Case($moduleName,+ "between lines 174 and 178");+ }()+ }()}+ _E.Case($moduleName,+ "between lines 169 and 183");+ }()}+ _E.Case($moduleName,+ "between lines 165 and 183");+ }()+ };+ var $ = up(t),fl = $._0,t$ = $._1;+ return function ()+ {+ switch (fl.ctor)+ {case+ "Insert" :+ return ensureBlackRoot(t$)+ case+ "Remove" :+ return blacken(t$)+ case+ "Same" :+ return t$}+ _E.Case($moduleName,+ "between lines 184 and 189");+ }()+ }()+ });+ var insert = F3(function (k,v,t)+ {+ return function ()+ {+ var u = function (_v291)+ {+ return function ()+ {+ return Maybe.Just(v)+ }()+ };+ return A3(update,k,u,t)+ }()+ });+ var fromList = function (assocs)+ {+ return A3(List.foldl,+ F2(function (_v293,d)+ {+ return function ()+ {+ switch (_v293.ctor)+ {case+ "_Tuple2" :+ return A3(insert,_v293._0,_v293._1,d)}+ _E.Case($moduleName,+ "on line 360, column 43 to 55");+ }()+ }),+ empty,+ assocs)+ };+ var intersect = F2(function (t1,t2)+ {+ return function ()+ {+ var combine = F3(function (k,v,t)+ {+ return A2(member,+ k,+ t2) ? A3(insert,+ k,+ v,+ t) : t+ });+ return A3(foldl,combine,empty,t1)+ }()+ });+ var singleton = F2(function (k,v)+ {+ return A3(insert,k,v,RBEmpty(LBlack))+ });+ var union = F2(function (t1,t2)+ {+ return A3(foldl,insert,t2,t1)+ });+ var remove = F2(function (k,t)+ {+ return function ()+ {+ var u = function (_v297)+ {+ return function ()+ {+ return Maybe.Nothing+ }()+ };+ return A3(update,k,u,t)+ }()+ });+ var diff = F2(function (t1,t2)+ {+ return A3(foldl,+ F3(function (k,v,t)+ {+ return A2(remove,k,t)+ }),+ t1,+ t2)+ });+ var moreBlackTree = function (t)+ {+ return function ()+ {+ switch (t.ctor)+ {case+ "RBEmpty" :+ return RBEmpty(LBBlack)+ case+ "RBNode" :+ return A5(RBNode,+ moreBlack(t._0),+ t._1,+ t._2,+ t._3,+ t._4)}+ _E.Case($moduleName,"between lines 218 and 220");+ }()+ };+ _elm.Dict.values = {_op: _op, empty: empty, singleton: singleton, insert: insert, update: update, lookup: lookup, findWithDefault: findWithDefault, remove: remove, member: member, foldl: foldl, foldr: foldr, map: map, union: union, intersect: intersect, diff: diff, keys: keys, values: values, toList: toList, fromList: fromList};+ return _elm.Dict.values+ };Elm.Either = Elm.Either || {};+Elm.Either.make = function (_elm)+ {+ _elm.Either = _elm.Either || {};+ if (_elm.Either.values)+ return _elm.Either.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Either";+ var List = Elm.List.make(_elm);+ var _op = {};+ var Right = function (a)+ {+ return {ctor: "Right", _0: a}+ };+ var isRight = function (e)+ {+ return function ()+ {+ switch (e.ctor)+ {case+ "Right" :+ return true}+ return false+ }()+ };+ var Left = function (a)+ {+ return {ctor: "Left", _0: a}+ };+ var consEither = F2(function (e,_v2)+ {+ return function ()+ {+ switch (_v2.ctor)+ {case+ "_Tuple2" :+ return function ()+ {+ switch (e.ctor)+ {case+ "Left" :+ return {ctor: "_Tuple2", _0: {ctor: "::", _0: e._0, _1: _v2._0}, _1: _v2._1}+ case+ "Right" :+ return {ctor: "_Tuple2", _0: _v2._0, _1: {ctor: "::", _0: e._0, _1: _v2._1}}}+ _E.Case($moduleName,+ "between lines 66 and 68");+ }()}+ _E.Case($moduleName,"between lines 66 and 68");+ }()+ });+ var partition = function (es)+ {+ return A3(List.foldr,+ consEither,+ {ctor: "_Tuple2", _0: _J.toList([]), _1: _J.toList([])},+ es)+ };+ var consLeft = F2(function (e,vs)+ {+ return function ()+ {+ switch (e.ctor)+ {case+ "Left" :+ return {ctor: "::", _0: e._0, _1: vs}+ case+ "Right" :+ return vs}+ _E.Case($moduleName,"between lines 56 and 58");+ }()+ });+ var lefts = function (es)+ {+ return A3(List.foldr,consLeft,_J.toList([]),es)+ };+ var consRight = F2(function (e,vs)+ {+ return function ()+ {+ switch (e.ctor)+ {case+ "Left" :+ return vs+ case+ "Right" :+ return {ctor: "::", _0: e._0, _1: vs}}+ _E.Case($moduleName,"between lines 61 and 63");+ }()+ });+ var rights = function (es)+ {+ return A3(List.foldr,consRight,_J.toList([]),es)+ };+ var either = F3(function (f,g,e)+ {+ return function ()+ {+ switch (e.ctor)+ {case+ "Left" :+ return f(e._0)+ case+ "Right" :+ return g(e._0)}+ _E.Case($moduleName,"on line 31, column 16 to 60");+ }()+ });+ var isLeft = function (e)+ {+ return function ()+ {+ switch (e.ctor)+ {case+ "Left" :+ return true}+ return false+ }()+ };+ _elm.Either.values = {_op: _op, either: either, isLeft: isLeft, isRight: isRight, lefts: lefts, rights: rights, partition: partition, consLeft: consLeft, consRight: consRight, consEither: consEither, Left: Left, Right: Right};+ return _elm.Either.values+ };Elm.Http = Elm.Http || {};+Elm.Http.make = function (_elm)+ {+ _elm.Http = _elm.Http || {};+ if (_elm.Http.values)+ return _elm.Http.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Http";+ var Signal = Elm.Signal.make(_elm);+ var Native = Native || {};+ Native.Http = Elm.Native.Http.make(_elm);+ var _op = {};+ var send = Native.Http.send;+ var Waiting = {ctor: "Waiting"};+ var Success = function (a)+ {+ return {ctor: "Success", _0: a}+ };+ var Request = F4(function (a,b,c,d)+ {+ return {_: {}, body: c, headers: d, url: b, verb: a}+ });+ var get = function (url)+ {+ return A4(Request,"GET",url,"",_J.toList([]))+ };+ var sendGet = function (reqs)+ {+ return send(A2(Signal.lift,get,reqs))+ };+ var post = F2(function (url,body)+ {+ return A4(Request,"POST",url,body,_J.toList([]))+ });+ var request = Request;+ var Failure = F2(function (a,b)+ {+ return {ctor: "Failure", _0: a, _1: b}+ });+ _elm.Http.values = {_op: _op, request: request, get: get, post: post, send: send, sendGet: sendGet, Success: Success, Waiting: Waiting, Failure: Failure, Request: Request};+ return _elm.Http.values+ };Elm.JavaScript = Elm.JavaScript || {};+Elm.JavaScript.make = function (_elm)+ {+ _elm.JavaScript = _elm.JavaScript || {};+ if (_elm.JavaScript.values)+ return _elm.JavaScript.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "JavaScript";+ var Native = Native || {};+ Native.JavaScript = Elm.Native.JavaScript.make(_elm);+ var _op = {};+ var toString = Native.JavaScript.toString;+ var toList = Native.JavaScript.toList;+ var toInt = Native.JavaScript.toInt;+ var toFloat = Native.JavaScript.toFloat;+ var toBool = Native.JavaScript.toBool;+ var fromString = Native.JavaScript.fromString;+ var fromList = Native.JavaScript.fromList;+ var fromInt = Native.JavaScript.fromInt;+ var fromFloat = Native.JavaScript.fromFloat;+ var fromBool = Native.JavaScript.fromBool;+ var JSString = {ctor: "JSString"};+ var JSObject = {ctor: "JSObject"};+ var JSNumber = {ctor: "JSNumber"};+ var JSDomNode = {ctor: "JSDomNode"};+ var JSBool = {ctor: "JSBool"};+ var JSArray = function (a)+ {+ return {ctor: "JSArray", _0: a}+ };+ _elm.JavaScript.values = {_op: _op, toList: toList, toInt: toInt, toFloat: toFloat, toBool: toBool, toString: toString, fromList: fromList, fromInt: fromInt, fromFloat: fromFloat, fromBool: fromBool, fromString: fromString, JSNumber: JSNumber, JSBool: JSBool, JSString: JSString, JSArray: JSArray, JSDomNode: JSDomNode, JSObject: JSObject};+ return _elm.JavaScript.values+ };Elm.Json = Elm.Json || {};+Elm.Json.make = function (_elm)+ {+ _elm.Json = _elm.Json || {};+ if (_elm.Json.values)+ return _elm.Json.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Json";+ var Basics = Elm.Basics.make(_elm);+ var Dict = Elm.Dict.make(_elm);+ var Maybe = Elm.Maybe.make(_elm);+ var JavaScript = Elm.JavaScript.make(_elm);+ var Native = Native || {};+ Native.Json = Elm.Native.Json.make(_elm);+ var JavaScript = Elm.JavaScript.make(_elm);+ var _op = {};+ var toString = F2(function (sep,v)+ {+ return JavaScript.toString(A2(Native.Json.toJSString,sep,v))+ });+ var toJSString = Native.Json.toJSString;+ var toJSObject = Native.Json.toJSObject;+ var fromString = function (s)+ {+ return Native.Json.fromJSString(JavaScript.fromString(s))+ };+ var fromJSString = Native.Json.fromJSString;+ var fromJSObject = Native.Json.fromJSObject;+ var String = function (a)+ {+ return {ctor: "String", _0: a}+ };+ var Object = function (a)+ {+ return {ctor: "Object", _0: a}+ };+ var Number = function (a)+ {+ return {ctor: "Number", _0: a}+ };+ var Null = {ctor: "Null"};+ var Boolean = function (a)+ {+ return {ctor: "Boolean", _0: a}+ };+ var Array = function (a)+ {+ return {ctor: "Array", _0: a}+ };+ _elm.Json.values = {_op: _op, toString: toString, toJSString: toJSString, fromString: fromString, fromJSString: fromJSString, fromJSObject: fromJSObject, toJSObject: toJSObject, String: String, Number: Number, Boolean: Boolean, Null: Null, Array: Array, Object: Object};+ return _elm.Json.values+ };Elm.Keyboard = Elm.Keyboard || {};+Elm.Keyboard.make = function (_elm)+ {+ _elm.Keyboard = _elm.Keyboard || {};+ if (_elm.Keyboard.values)+ return _elm.Keyboard.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Keyboard";+ var Signal = Elm.Signal.make(_elm);+ var Native = Native || {};+ Native.Keyboard = Elm.Native.Keyboard.make(_elm);+ var _op = {};+ var lastPressed = Native.Keyboard.lastPressed;+ var keysDown = Native.Keyboard.keysDown;+ var isDown = Native.Keyboard.isDown;+ var shift = isDown(16);+ var space = isDown(32);+ var enter = isDown(13);+ var directions = Native.Keyboard.directions;+ var wasd = A4(directions,87,83,65,68);+ var ctrl = isDown(17);+ var arrows = A4(directions,38,40,37,39);+ _elm.Keyboard.values = {_op: _op, directions: directions, arrows: arrows, wasd: wasd, isDown: isDown, shift: shift, ctrl: ctrl, space: space, enter: enter, keysDown: keysDown, lastPressed: lastPressed};+ return _elm.Keyboard.values+ };Elm.List = Elm.List || {};+Elm.List.make = function (_elm)+ {+ _elm.List = _elm.List || {};+ if (_elm.List.values)+ return _elm.List.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "List";+ var Basics = Elm.Basics.make(_elm);+ var Native = Native || {};+ Native.List = Elm.Native.List.make(_elm);+ var _op = {};+ var zipWith = Native.List.zipWith;+ var zip = Native.List.zip;+ var take = Native.List.take;+ var tail = Native.List.tail;+ var sortWith = Native.List.sortWith;+ var sortBy = Native.List.sortBy;+ var sort = Native.List.sort;+ var scanl1 = Native.List.scanl1;+ var scanl = Native.List.scanl;+ var reverse = Native.List.reverse;+ var repeat = Native.List.repeat;+ var map = Native.List.map;+ var length = Native.List.length;+ var last = Native.List.last;+ var join = Native.List.join;+ var isEmpty = function (xs)+ {+ return function ()+ {+ switch (xs.ctor)+ {case+ "[]" :+ return true}+ return false+ }()+ };+ var head = Native.List.head;+ var foldr1 = Native.List.foldr1;+ var foldr = Native.List.foldr;+ var foldl1 = Native.List.foldl1;+ var maximum = foldl1(Basics.max);+ var minimum = foldl1(Basics.min);+ var foldl = Native.List.foldl;+ var or = A2(foldl,+ F2(function (x,y)+ {+ return x || y+ }),+ false);+ var product = A2(foldl,+ F2(function (x,y)+ {+ return x * y+ }),+ 1);+ var sum = A2(foldl,+ F2(function (x,y)+ {+ return x + y+ }),+ 0);+ var filter = Native.List.filter;+ var drop = Native.List.drop;+ var concat = Native.List.concat;+ var concatMap = F2(function (f,list)+ {+ return concat(A2(map,f,list))+ });+ var any = Native.List.any;+ var and = A2(foldl,+ F2(function (x,y)+ {+ return x && y+ }),+ true);+ var all = Native.List.all;+ _op["::"] = Native.List.cons;+ var intersperse = F2(function (sep,xs)+ {+ return function ()+ {+ switch (xs.ctor)+ {case+ "::" :+ switch (xs._1.ctor)+ {case+ "::" :+ return {ctor: "::", _0: xs._0, _1: {ctor: "::", _0: sep, _1: A2(intersperse,+ sep,+ {ctor: "::", _0: xs._1._0, _1: xs._1._1})}}+ case+ "[]" :+ return _J.toList([xs._0])}+ break;+ case+ "[]" :+ return _J.toList([])}+ _E.Case($moduleName,"between lines 212 and 217");+ }()+ });+ var partition = F2(function (pred,lst)+ {+ return function ()+ {+ switch (lst.ctor)+ {case+ "::" :+ return function ()+ {+ var $ = A2(partition,pred,lst._1),+ bs = $._0,+ cs = $._1;+ return pred(lst._0) ? {ctor: "_Tuple2", _0: {ctor: "::", _0: lst._0, _1: bs}, _1: cs} : {ctor: "_Tuple2", _0: bs, _1: {ctor: "::", _0: lst._0, _1: cs}}+ }()+ case+ "[]" :+ return {ctor: "_Tuple2", _0: _J.toList([]), _1: _J.toList([])}}+ _E.Case($moduleName,"between lines 169 and 179");+ }()+ });+ var unzip = function (pairs)+ {+ return function ()+ {+ switch (pairs.ctor)+ {case+ "::" :+ switch (pairs._0.ctor)+ {case+ "_Tuple2" :+ return function ()+ {+ var $ = unzip(pairs._1),xs = $._0,ys = $._1;+ return {ctor: "_Tuple2", _0: {ctor: "::", _0: pairs._0._0, _1: xs}, _1: {ctor: "::", _0: pairs._0._1, _1: ys}}+ }()}+ break;+ case+ "[]" :+ return {ctor: "_Tuple2", _0: _J.toList([]), _1: _J.toList([])}}+ _E.Case($moduleName,"between lines 194 and 202");+ }()+ };+ _op["++"] = Native.List.append;+ _elm.List.values = {_op: _op, head: head, tail: tail, last: last, isEmpty: isEmpty, map: map, foldl: foldl, foldr: foldr, foldl1: foldl1, foldr1: foldr1, scanl: scanl, scanl1: scanl1, filter: filter, length: length, reverse: reverse, all: all, any: any, and: and, or: or, concat: concat, concatMap: concatMap, sum: sum, product: product, maximum: maximum, minimum: minimum, partition: partition, zip: zip, zipWith: zipWith, unzip: unzip, join: join, intersperse: intersperse, take: take, drop: drop, repeat: repeat, sort: sort, sortBy: sortBy, sortWith: sortWith};+ return _elm.List.values+ };Elm.Maybe = Elm.Maybe || {};+Elm.Maybe.make = function (_elm)+ {+ _elm.Maybe = _elm.Maybe || {};+ if (_elm.Maybe.values)+ return _elm.Maybe.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Maybe";+ var Basics = Elm.Basics.make(_elm);+ var List = Elm.List.make(_elm);+ var _op = {};+ var Nothing = {ctor: "Nothing"};+ var Just = function (a)+ {+ return {ctor: "Just", _0: a}+ };+ var maybe = F3(function (b,f,m)+ {+ return function ()+ {+ switch (m.ctor)+ {case+ "Just" :+ return f(m._0)+ case+ "Nothing" :+ return b}+ _E.Case($moduleName,"between lines 28 and 33");+ }()+ });+ var cons = F2(function (mx,xs)+ {+ return A3(maybe,+ xs,+ function (x)+ {+ return {ctor: "::", _0: x, _1: xs}+ },+ mx)+ });+ var justs = A2(List.foldr,cons,_J.toList([]));+ var isJust = A2(maybe,+ false,+ function (_v2)+ {+ return function ()+ {+ return true+ }()+ });+ var isNothing = function ($)+ {+ return Basics.not(isJust($))+ };+ _elm.Maybe.values = {_op: _op, maybe: maybe, isJust: isJust, isNothing: isNothing, cons: cons, justs: justs, Just: Just, Nothing: Nothing};+ return _elm.Maybe.values+ };Elm.Mouse = Elm.Mouse || {};+Elm.Mouse.make = function (_elm)+ {+ _elm.Mouse = _elm.Mouse || {};+ if (_elm.Mouse.values)+ return _elm.Mouse.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Mouse";+ var Signal = Elm.Signal.make(_elm);+ var Native = Native || {};+ Native.Mouse = Elm.Native.Mouse.make(_elm);+ var _op = {};+ var y = Native.Mouse.y;+ var x = Native.Mouse.x;+ var position = Native.Mouse.position;+ var isDown = Native.Mouse.isDown;+ var isClicked = Native.Mouse.isClicked;+ var clicks = Native.Mouse.clicks;+ _elm.Mouse.values = {_op: _op, position: position, x: x, y: y, isDown: isDown, isClicked: isClicked, clicks: clicks};+ return _elm.Mouse.values+ };Elm.Prelude = Elm.Prelude || {};+Elm.Prelude.make = function (_elm)+ {+ _elm.Prelude = _elm.Prelude || {};+ if (_elm.Prelude.values)+ return _elm.Prelude.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Prelude";+ var Native = Native || {};+ Native.Show = Elm.Native.Show.make(_elm);+ var _op = {};+ var show = Native.Show.show;+ _elm.Prelude.values = {_op: _op, show: show};+ return _elm.Prelude.values+ };Elm.Random = Elm.Random || {};+Elm.Random.make = function (_elm)+ {+ _elm.Random = _elm.Random || {};+ if (_elm.Random.values)+ return _elm.Random.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Random";+ var Signal = Elm.Signal.make(_elm);+ var Native = Native || {};+ Native.Random = Elm.Native.Random.make(_elm);+ var _op = {};+ var range = Native.Random.range;+ var floatList = Native.Random.floatList;+ var $float = Native.Random.float_;+ _elm.Random.values = {_op: _op, range: range, $float: $float, floatList: floatList};+ return _elm.Random.values+ };Elm.Regex = Elm.Regex || {};+Elm.Regex.make = function (_elm)+ {+ _elm.Regex = _elm.Regex || {};+ if (_elm.Regex.values)+ return _elm.Regex.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Regex";+ var Maybe = Elm.Maybe.make(_elm);+ var Native = Native || {};+ Native.Regex = Elm.Native.Regex.make(_elm);+ var _op = {};+ var splitN = Native.Regex.splitN;+ var split = Native.Regex.split;+ var replaceAll = Native.Regex.replaceAll;+ var replace = Native.Regex.replace;+ var pattern = Native.Regex.pattern;+ var findAll = Native.Regex.findAll;+ var find = Native.Regex.find;+ var escape = Native.Regex.escape;+ var contains = Native.Regex.contains;+ var caseInsensitive = Native.Regex.caseInsensitive;+ var Regex = {ctor: "Regex"};+ var Match = F4(function (a,b,c,d)+ {+ return {_: {}, index: c, match: a, number: d, submatches: b}+ });+ _elm.Regex.values = {_op: _op, escape: escape, pattern: pattern, caseInsensitive: caseInsensitive, contains: contains, findAll: findAll, find: find, replaceAll: replaceAll, replace: replace, split: split, splitN: splitN, Regex: Regex, Match: Match};+ return _elm.Regex.values+ };Elm.Set = Elm.Set || {};+Elm.Set.make = function (_elm)+ {+ _elm.Set = _elm.Set || {};+ if (_elm.Set.values)+ return _elm.Set.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Set";+ var Maybe = Elm.Maybe.make(_elm);+ var Dict = Elm.Dict.make(_elm);+ var List = Elm.List.make(_elm);+ var _op = {};+ var union = Dict.union;+ var toList = Dict.keys;+ var singleton = function (k)+ {+ return A2(Dict.singleton,k,{ctor: "_Tuple0"})+ };+ var remove = Dict.remove;+ var member = Dict.member;+ var intersect = Dict.intersect;+ var insert = function (k)+ {+ return A2(Dict.insert,k,{ctor: "_Tuple0"})+ };+ var foldr = F3(function (f,b,s)+ {+ return A3(Dict.foldr,+ F3(function (k,_v0,b)+ {+ return function ()+ {+ return A2(f,k,b)+ }()+ }),+ b,+ s)+ });+ var foldl = F3(function (f,b,s)+ {+ return A3(Dict.foldl,+ F3(function (k,_v2,b)+ {+ return function ()+ {+ return A2(f,k,b)+ }()+ }),+ b,+ s)+ });+ var empty = Dict.empty;+ var fromList = function (xs)+ {+ return A3(List.foldl,insert,empty,xs)+ };+ var map = F2(function (f,s)+ {+ return fromList(A2(List.map,f,toList(s)))+ });+ var diff = Dict.diff;+ _elm.Set.values = {_op: _op, empty: empty, singleton: singleton, insert: insert, remove: remove, member: member, foldl: foldl, foldr: foldr, map: map, union: union, intersect: intersect, diff: diff, toList: toList, fromList: fromList};+ return _elm.Set.values+ };Elm.Signal = Elm.Signal || {};+Elm.Signal.make = function (_elm)+ {+ _elm.Signal = _elm.Signal || {};+ if (_elm.Signal.values)+ return _elm.Signal.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Signal";+ var Native = Native || {};+ Native.Signal = Elm.Native.Signal.make(_elm);+ var List = Elm.List.make(_elm);+ var _op = {};+ _op["~"] = F2(function (sf,s)+ {+ return A3(Native.Signal.lift2,+ F2(function (f,x)+ {+ return f(x)+ }),+ sf,+ s)+ });+ var sampleOn = Native.Signal.sampleOn;+ var merges = Native.Signal.merges;+ var merge = Native.Signal.merge;+ var lift8 = Native.Signal.lift8;+ var lift7 = Native.Signal.lift7;+ var lift6 = Native.Signal.lift6;+ var lift5 = Native.Signal.lift5;+ var lift4 = Native.Signal.lift4;+ var lift3 = Native.Signal.lift3;+ var lift2 = Native.Signal.lift2;+ var lift = Native.Signal.lift;+ var keepWhen = Native.Signal.keepWhen;+ var keepIf = Native.Signal.keepIf;+ var foldp = Native.Signal.foldp;+ var dropWhen = Native.Signal.dropWhen;+ var dropRepeats = Native.Signal.dropRepeats;+ var dropIf = Native.Signal.dropIf;+ var countIf = Native.Signal.countIf;+ var count = Native.Signal.count;+ var constant = Native.Signal.constant;+ var combine = A2(List.foldr,+ Native.Signal.lift2(F2(function (x,y)+ {+ return {ctor: "::", _0: x, _1: y}+ })),+ Native.Signal.constant(_J.toList([])));+ var Signal = {ctor: "Signal"};+ _op["<~"] = F2(function (f,s)+ {+ return A2(Native.Signal.lift,f,s)+ });+ _elm.Signal.values = {_op: _op, constant: constant, lift: lift, lift2: lift2, lift3: lift3, lift4: lift4, lift5: lift5, lift6: lift6, lift7: lift7, lift8: lift8, foldp: foldp, merge: merge, merges: merges, combine: combine, count: count, countIf: countIf, keepIf: keepIf, dropIf: dropIf, keepWhen: keepWhen, dropWhen: dropWhen, dropRepeats: dropRepeats, sampleOn: sampleOn, Signal: Signal};+ return _elm.Signal.values+ };Elm.String = Elm.String || {};+Elm.String.make = function (_elm)+ {+ _elm.String = _elm.String || {};+ if (_elm.String.values)+ return _elm.String.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "String";+ var Native = Native || {};+ Native.String = Elm.Native.String.make(_elm);+ var Maybe = Elm.Maybe.make(_elm);+ var _op = {};+ var words = Native.String.words;+ var uncons = Native.String.uncons;+ var trimRight = Native.String.trimRight;+ var trimLeft = Native.String.trimLeft;+ var trim = Native.String.trim;+ var toUpper = Native.String.toUpper;+ var toLower = Native.String.toLower;+ var toList = Native.String.toList;+ var toInt = Native.String.toInt;+ var toFloat = Native.String.toFloat;+ var sub = Native.String.sub;+ var startsWith = Native.String.startsWith;+ var split = Native.String.split;+ var right = Native.String.right;+ var reverse = Native.String.reverse;+ var repeat = Native.String.repeat;+ var padRight = Native.String.padRight;+ var padLeft = Native.String.padLeft;+ var pad = Native.String.pad;+ var map = Native.String.map;+ var lines = Native.String.lines;+ var length = Native.String.length;+ var left = Native.String.left;+ var join = Native.String.join;+ var isEmpty = Native.String.isEmpty;+ var indices = Native.String.indexes;+ var indexes = Native.String.indexes;+ var fromList = Native.String.fromList;+ var foldr = Native.String.foldr;+ var foldl = Native.String.foldl;+ var filter = Native.String.filter;+ var endsWith = Native.String.endsWith;+ var dropRight = Native.String.dropRight;+ var dropLeft = Native.String.dropLeft;+ var contains = Native.String.contains;+ var cons = Native.String.cons;+ var concat = Native.String.concat;+ var append = Native.String.append;+ var any = Native.String.any;+ var all = Native.String.all;+ _elm.String.values = {_op: _op, isEmpty: isEmpty, cons: cons, uncons: uncons, append: append, concat: concat, length: length, map: map, filter: filter, reverse: reverse, foldl: foldl, foldr: foldr, split: split, join: join, repeat: repeat, sub: sub, left: left, right: right, dropLeft: dropLeft, dropRight: dropRight, pad: pad, padLeft: padLeft, padRight: padRight, trim: trim, trimLeft: trimLeft, trimRight: trimRight, words: words, lines: lines, toUpper: toUpper, toLower: toLower, any: any, all: all, contains: contains, startsWith: startsWith, endsWith: endsWith, indexes: indexes, indices: indices, toInt: toInt, toFloat: toFloat, toList: toList, fromList: fromList};+ return _elm.String.values+ };Elm.Text = Elm.Text || {};+Elm.Text.make = function (_elm)+ {+ _elm.Text = _elm.Text || {};+ if (_elm.Text.values)+ return _elm.Text.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Text";+ var Basics = Elm.Basics.make(_elm);+ var Color = Elm.Color.make(_elm);+ var Graphics = Graphics || {};+ Graphics.Element = Elm.Graphics.Element.make(_elm);+ var Maybe = Elm.Maybe.make(_elm);+ var JavaScript = Elm.JavaScript.make(_elm);+ var Native = Native || {};+ Native.Text = Elm.Native.Text.make(_elm);+ var _op = {};+ var underline = Native.Text.underline;+ var typeface = Native.Text.typeface;+ var toText = Native.Text.toText;+ var text = Native.Text.text;+ var strikeThrough = Native.Text.strikeThrough;+ var righted = Native.Text.righted;+ var plainText = Native.Text.plainText;+ var overline = Native.Text.overline;+ var monospace = Native.Text.monospace;+ var markdown = Native.Text.markdown;+ var link = Native.Text.link;+ var justified = Native.Text.justified;+ var italic = Native.Text.italic;+ var height = Native.Text.height;+ var color = Native.Text.color;+ var centered = Native.Text.centered;+ var bold = Native.Text.bold;+ var asText = Native.Text.asText;+ var Text = {ctor: "Text"};+ _elm.Text.values = {_op: _op, toText: toText, typeface: typeface, monospace: monospace, link: link, height: height, color: color, bold: bold, italic: italic, overline: overline, underline: underline, strikeThrough: strikeThrough, justified: justified, centered: centered, righted: righted, text: text, plainText: plainText, markdown: markdown, asText: asText, Text: Text};+ return _elm.Text.values+ };Elm.Time = Elm.Time || {};+Elm.Time.make = function (_elm)+ {+ _elm.Time = _elm.Time || {};+ if (_elm.Time.values)+ return _elm.Time.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Time";+ var Basics = Elm.Basics.make(_elm);+ var Native = Native || {};+ Native.Time = Elm.Native.Time.make(_elm);+ var Signal = Elm.Signal.make(_elm);+ var _op = {};+ var timestamp = Native.Time.timestamp;+ var since = Native.Time.since;+ var millisecond = 1;+ var second = 1000 * millisecond;+ var minute = 60 * second;+ var inSeconds = function (t)+ {+ return t / second+ };+ var inMinutes = function (t)+ {+ return t / minute+ };+ var inMilliseconds = function (t)+ {+ return t+ };+ var hour = 60 * minute;+ var inHours = function (t)+ {+ return t / hour+ };+ var fpsWhen = Native.Time.fpsWhen;+ var fps = Native.Time.fps;+ var every = Native.Time.every;+ var delay = Native.Time.delay;+ _elm.Time.values = {_op: _op, millisecond: millisecond, second: second, minute: minute, hour: hour, inMilliseconds: inMilliseconds, inSeconds: inSeconds, inMinutes: inMinutes, inHours: inHours, fps: fps, fpsWhen: fpsWhen, every: every, since: since, timestamp: timestamp, delay: delay};+ return _elm.Time.values+ };Elm.Touch = Elm.Touch || {};+Elm.Touch.make = function (_elm)+ {+ _elm.Touch = _elm.Touch || {};+ if (_elm.Touch.values)+ return _elm.Touch.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Touch";+ var Signal = Elm.Signal.make(_elm);+ var Native = Native || {};+ Native.Touch = Elm.Native.Touch.make(_elm);+ var Time = Elm.Time.make(_elm);+ var _op = {};+ var touches = Native.Touch.touches;+ var taps = Native.Touch.taps;+ var Touch = F6(function (a,b,c,d,e,f)+ {+ return {_: {}, id: c, t0: f, x: a, x0: d, y: b, y0: e}+ });+ _elm.Touch.values = {_op: _op, touches: touches, taps: taps, Touch: Touch};+ return _elm.Touch.values+ };Elm.Transform2D = Elm.Transform2D || {};+Elm.Transform2D.make = function (_elm)+ {+ _elm.Transform2D = _elm.Transform2D || {};+ if (_elm.Transform2D.values)+ return _elm.Transform2D.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Transform2D";+ var Native = Native || {};+ Native.Transform2D = Elm.Native.Transform2D.make(_elm);+ var _op = {};+ var rotation = Native.Transform2D.rotation;+ var multiply = Native.Transform2D.multiply;+ var matrix = Native.Transform2D.matrix;+ var scale = function (s)+ {+ return A6(matrix,s,0,0,s,0,0)+ };+ var scaleX = function (x)+ {+ return A6(matrix,x,0,0,1,0,0)+ };+ var scaleY = function (y)+ {+ return A6(matrix,1,0,0,y,0,0)+ };+ var translation = F2(function (x,y)+ {+ return A6(matrix,1,0,0,1,x,y)+ });+ var identity = Native.Transform2D.identity;+ var Transform2D = {ctor: "Transform2D"};+ _elm.Transform2D.values = {_op: _op, identity: identity, matrix: matrix, rotation: rotation, translation: translation, scale: scale, scaleX: scaleX, scaleY: scaleY, multiply: multiply, Transform2D: Transform2D};+ return _elm.Transform2D.values+ };Elm.WebSocket = Elm.WebSocket || {};+Elm.WebSocket.make = function (_elm)+ {+ _elm.WebSocket = _elm.WebSocket || {};+ if (_elm.WebSocket.values)+ return _elm.WebSocket.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "WebSocket";+ var Signal = Elm.Signal.make(_elm);+ var Basics = Elm.Basics.make(_elm);+ var Native = Native || {};+ Native.WebSocket = Elm.Native.WebSocket.make(_elm);+ var _op = {};+ var connect = Native.WebSocket.connect;+ _elm.WebSocket.values = {_op: _op, connect: connect};+ return _elm.WebSocket.values+ };Elm.Window = Elm.Window || {};+Elm.Window.make = function (_elm)+ {+ _elm.Window = _elm.Window || {};+ if (_elm.Window.values)+ return _elm.Window.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Window";+ var Signal = Elm.Signal.make(_elm);+ var Native = Native || {};+ Native.Window = Elm.Native.Window.make(_elm);+ var _op = {};+ var width = Native.Window.width;+ var height = Native.Window.height;+ var dimensions = Native.Window.dimensions;+ _elm.Window.values = {_op: _op, dimensions: dimensions, width: width, height: height};+ return _elm.Window.values+ };Elm.Graphics = Elm.Graphics || {};+Elm.Graphics.Collage = Elm.Graphics.Collage || {};+Elm.Graphics.Collage.make = function (_elm)+ {+ _elm.Graphics = _elm.Graphics || {};+ _elm.Graphics.Collage = _elm.Graphics.Collage || {};+ if (_elm.Graphics.Collage.values)+ return _elm.Graphics.Collage.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Graphics.Collage";+ var Basics = Elm.Basics.make(_elm);+ var List = Elm.List.make(_elm);+ var Either = Elm.Either.make(_elm);+ var Transform2D = Elm.Transform2D.make(_elm);+ var Native = Native || {};+ Native.Graphics = Native.Graphics || {};+ Native.Graphics.Collage = Elm.Native.Graphics.Collage.make(_elm);+ var Graphics = Graphics || {};+ Graphics.Element = Elm.Graphics.Element.make(_elm);+ var Color = Elm.Color.make(_elm);+ var Maybe = Elm.Maybe.make(_elm);+ var JavaScript = Elm.JavaScript.make(_elm);+ var _op = {};+ var segment = F2(function (p1,p2)+ {+ return _J.toList([p1,p2])+ });+ var scale = F2(function (s,f)+ {+ return _N.replace([["scale",f.scale * s]],f)+ });+ var rotate = F2(function (t,f)+ {+ return _N.replace([["theta",f.theta + t]],f)+ });+ var rect = F2(function (w,h)+ {+ return function ()+ {+ var hw = w / 2;+ var hh = h / 2;+ return _J.toList([{ctor: "_Tuple2", _0: 0 - hw, _1: 0 - hh},+ {ctor: "_Tuple2", _0: 0 - hw, _1: hh},+ {ctor: "_Tuple2", _0: hw, _1: hh},+ {ctor: "_Tuple2", _0: hw, _1: 0 - hh}])+ }()+ });+ var square = function (n)+ {+ return A2(rect,n,n)+ };+ var polygon = function (points)+ {+ return points+ };+ var path = function (ps)+ {+ return ps+ };+ var oval = F2(function (w,h)+ {+ return function ()+ {+ var n = 50;+ var t = 2 * Basics.pi / n;+ var hw = w / 2;+ var hh = h / 2;+ var f = function (i)+ {+ return {ctor: "_Tuple2", _0: hw * Basics.cos(t * i), _1: hh * Basics.sin(t * i)}+ };+ return A2(List.map,f,_L.range(0,n - 1))+ }()+ });+ var ngon = F2(function (n,r)+ {+ return function ()+ {+ var m = Basics.toFloat(n);+ var t = 2 * Basics.pi / m;+ var f = function (i)+ {+ return {ctor: "_Tuple2", _0: r * Basics.cos(t * i), _1: r * Basics.sin(t * i)}+ };+ return A2(List.map,f,_L.range(0,m - 1))+ }()+ });+ var moveY = F2(function (y,f)+ {+ return _N.replace([["y",f.y + y]],f)+ });+ var moveX = F2(function (x,f)+ {+ return _N.replace([["x",f.x + x]],f)+ });+ var move = F2(function (_v0,f)+ {+ return function ()+ {+ switch (_v0.ctor)+ {case+ "_Tuple2" :+ return _N.replace([["x",f.x + _v0._0],+ ["y",f.y + _v0._1]],+ f)}+ _E.Case($moduleName,+ "on line 170, column 20 to 48");+ }()+ });+ var form = function (f)+ {+ return {_: {}, alpha: 1, form: f, scale: 1, theta: 0, x: 0, y: 0}+ };+ var collage = Native.Graphics.Collage.collage;+ var circle = function (r)+ {+ return A2(oval,2 * r,2 * r)+ };+ var alpha = F2(function (a,f)+ {+ return _N.replace([["alpha",a]],f)+ });+ var Texture = function (a)+ {+ return {ctor: "Texture", _0: a}+ };+ var Solid = function (a)+ {+ return {ctor: "Solid", _0: a}+ };+ var Smooth = {ctor: "Smooth"};+ var Sharp = function (a)+ {+ return {ctor: "Sharp", _0: a}+ };+ var Round = {ctor: "Round"};+ var Padded = {ctor: "Padded"};+ var LineStyle = F6(function (a,b,c,d,e,f)+ {+ return {_: {}, cap: c, color: a, dashOffset: f, dashing: e, join: d, width: b}+ });+ var Grad = function (a)+ {+ return {ctor: "Grad", _0: a}+ };+ var Form = F6(function (a,b,c,d,e,f)+ {+ return {_: {}, alpha: e, form: f, scale: b, theta: a, x: c, y: d}+ });+ var Flat = {ctor: "Flat"};+ var defaultLine = {_: {}, cap: Flat, color: Color.black, dashOffset: 0, dashing: _J.toList([]), join: Sharp(10), width: 1};+ var dashed = function (clr)+ {+ return _N.replace([["color",clr],+ ["dashing",_J.toList([8,4])]],+ defaultLine)+ };+ var dotted = function (clr)+ {+ return _N.replace([["color",clr],+ ["dashing",_J.toList([3,3])]],+ defaultLine)+ };+ var solid = function (clr)+ {+ return _N.replace([["color",clr]],defaultLine)+ };+ var FShape = F2(function (a,b)+ {+ return {ctor: "FShape", _0: a, _1: b}+ });+ var fill = F2(function (style,shape)+ {+ return form(A2(FShape,Either.Right(style),shape))+ });+ var filled = F2(function (color,shape)+ {+ return A2(fill,Solid(color),shape)+ });+ var gradient = F2(function (grad,shape)+ {+ return A2(fill,Grad(grad),shape)+ });+ var textured = F2(function (src,shape)+ {+ return A2(fill,Texture(src),shape)+ });+ var outlined = F2(function (style,shape)+ {+ return form(A2(FShape,Either.Left(style),shape))+ });+ var FPath = F2(function (a,b)+ {+ return {ctor: "FPath", _0: a, _1: b}+ });+ var traced = F2(function (style,path)+ {+ return form(A2(FPath,style,path))+ });+ var FImage = F4(function (a,b,c,d)+ {+ return {ctor: "FImage", _0: a, _1: b, _2: c, _3: d}+ });+ var sprite = F4(function (w,h,pos,src)+ {+ return form(A4(FImage,w,h,pos,src))+ });+ var FGroup = F2(function (a,b)+ {+ return {ctor: "FGroup", _0: a, _1: b}+ });+ var group = function (fs)+ {+ return form(A2(FGroup,Transform2D.identity,fs))+ };+ var groupTransform = F2(function (matrix,fs)+ {+ return form(A2(FGroup,matrix,fs))+ });+ var FElement = function (a)+ {+ return {ctor: "FElement", _0: a}+ };+ var toForm = function (e)+ {+ return form(FElement(e))+ };+ var Clipped = {ctor: "Clipped"};+ _elm.Graphics.Collage.values = {_op: _op, defaultLine: defaultLine, solid: solid, dashed: dashed, dotted: dotted, form: form, fill: fill, filled: filled, textured: textured, gradient: gradient, outlined: outlined, traced: traced, sprite: sprite, toForm: toForm, group: group, groupTransform: groupTransform, move: move, moveX: moveX, moveY: moveY, scale: scale, rotate: rotate, alpha: alpha, collage: collage, path: path, segment: segment, polygon: polygon, rect: rect, square: square, oval: oval, circle: circle, ngon: ngon, Solid: Solid, Texture: Texture, Grad: Grad, Flat: Flat, Round: Round, Padded: Padded, Smooth: Smooth, Sharp: Sharp, Clipped: Clipped, FPath: FPath, FShape: FShape, FImage: FImage, FElement: FElement, FGroup: FGroup, Form: Form, LineStyle: LineStyle};+ return _elm.Graphics.Collage.values+ };Elm.Graphics = Elm.Graphics || {};+Elm.Graphics.Element = Elm.Graphics.Element || {};+Elm.Graphics.Element.make = function (_elm)+ {+ _elm.Graphics = _elm.Graphics || {};+ _elm.Graphics.Element = _elm.Graphics.Element || {};+ if (_elm.Graphics.Element.values)+ return _elm.Graphics.Element.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Graphics.Element";+ var Basics = Elm.Basics.make(_elm);+ var Native = Native || {};+ Native.Utils = Elm.Native.Utils.make(_elm);+ var JavaScript = Elm.JavaScript.make(_elm);+ var JavaScript = Elm.JavaScript.make(_elm);+ var List = Elm.List.make(_elm);+ var Color = Elm.Color.make(_elm);+ var Maybe = Elm.Maybe.make(_elm);+ var _op = {};+ var widthOf = function (e)+ {+ return e.props.width+ };+ var tag = F2(function (name,e)+ {+ return function ()+ {+ var p = e.props;+ return {_: {}, element: e.element, props: _N.replace([["tag",+ JavaScript.fromString(name)]],+ p)}+ }()+ });+ var sizeOf = function (e)+ {+ return {ctor: "_Tuple2", _0: e.props.width, _1: e.props.height}+ };+ var opacity = F2(function (o,e)+ {+ return function ()+ {+ var p = e.props;+ return {_: {}, element: e.element, props: _N.replace([["opacity",+ o]],+ p)}+ }()+ });+ var link = F2(function (href,e)+ {+ return function ()+ {+ var p = e.props;+ return {_: {}, element: e.element, props: _N.replace([["href",+ JavaScript.fromString(href)]],+ p)}+ }()+ });+ var heightOf = function (e)+ {+ return e.props.height+ };+ var emptyStr = JavaScript.fromString("");+ var color = F2(function (c,e)+ {+ return function ()+ {+ var p = e.props;+ return {_: {}, element: e.element, props: _N.replace([["color",+ Maybe.Just(c)]],+ p)}+ }()+ });+ var Z = {ctor: "Z"};+ var middleAt = F2(function (x,y)+ {+ return {_: {}, horizontal: Z, vertical: Z, x: x, y: y}+ });+ var Tiled = {ctor: "Tiled"};+ var Spacer = {ctor: "Spacer"};+ var Relative = function (a)+ {+ return {ctor: "Relative", _0: a}+ };+ var middle = {_: {}, horizontal: Z, vertical: Z, x: Relative(0.5), y: Relative(0.5)};+ var relative = Relative;+ var RawHtml = {ctor: "RawHtml"};+ var Properties = F8(function (a,b,c,d,e,f,g,h)+ {+ return {_: {}, color: e, height: c, hover: h, href: f, id: a, opacity: d, tag: g, width: b}+ });+ var newElement = F3(function (w,h,e)+ {+ return {_: {}, element: e, props: A8(Properties,+ Native.Utils.guid({ctor: "_Tuple0"}),+ w,+ h,+ 1,+ Maybe.Nothing,+ emptyStr,+ emptyStr,+ {ctor: "_Tuple0"})}+ });+ var spacer = F2(function (w,h)+ {+ return A3(newElement,w,h,Spacer)+ });+ var empty = A2(spacer,0,0);+ var Position = F4(function (a,b,c,d)+ {+ return {_: {}, horizontal: a, vertical: b, x: c, y: d}+ });+ var Plain = {ctor: "Plain"};+ var P = {ctor: "P"};+ var midRightAt = F2(function (x,y)+ {+ return {_: {}, horizontal: P, vertical: Z, x: x, y: y}+ });+ var midTopAt = F2(function (x,y)+ {+ return {_: {}, horizontal: Z, vertical: P, x: x, y: y}+ });+ var topRightAt = F2(function (x,y)+ {+ return {_: {}, horizontal: P, vertical: P, x: x, y: y}+ });+ var N = {ctor: "N"};+ var bottomLeftAt = F2(function (x,y)+ {+ return {_: {}, horizontal: N, vertical: N, x: x, y: y}+ });+ var bottomRightAt = F2(function (x,y)+ {+ return {_: {}, horizontal: P, vertical: N, x: x, y: y}+ });+ var midBottomAt = F2(function (x,y)+ {+ return {_: {}, horizontal: Z, vertical: N, x: x, y: y}+ });+ var midLeftAt = F2(function (x,y)+ {+ return {_: {}, horizontal: N, vertical: Z, x: x, y: y}+ });+ var topLeftAt = F2(function (x,y)+ {+ return {_: {}, horizontal: N, vertical: P, x: x, y: y}+ });+ var Image = F4(function (a,b,c,d)+ {+ return {ctor: "Image", _0: a, _1: b, _2: c, _3: d}+ });+ var height = F2(function (nh,e)+ {+ return function ()+ {+ var p = e.props;+ var props = function ()+ {+ var _v0 = e.element;+ switch (_v0.ctor)+ {case+ "Image" :+ return _N.replace([["width",+ Basics.round(Basics.toFloat(_v0._1) / Basics.toFloat(_v0._2) * Basics.toFloat(nh))]],+ p)}+ return p+ }();+ return {_: {}, element: e.element, props: _N.replace([["height",+ nh]],+ p)}+ }()+ });+ var image = F3(function (w,h,src)+ {+ return A3(newElement,+ w,+ h,+ A4(Image,+ Plain,+ w,+ h,+ JavaScript.fromString(src)))+ });+ var tiledImage = F3(function (w,h,src)+ {+ return A3(newElement,+ w,+ h,+ A4(Image,+ Tiled,+ w,+ h,+ JavaScript.fromString(src)))+ });+ var width = F2(function (nw,e)+ {+ return function ()+ {+ var p = e.props;+ var props = function ()+ {+ var _v5 = e.element;+ switch (_v5.ctor)+ {case+ "Image" :+ return _N.replace([["height",+ Basics.round(Basics.toFloat(_v5._2) / Basics.toFloat(_v5._1) * Basics.toFloat(nw))]],+ p)+ case+ "RawHtml" :+ return _N.replace([["height",+ Basics.snd(A2(Native.Utils.htmlHeight,+ nw,+ e.element))]],+ p)}+ return p+ }();+ return {_: {}, element: e.element, props: _N.replace([["width",+ nw]],+ props)}+ }()+ });+ var size = F3(function (w,h,e)+ {+ return A2(height,h,A2(width,w,e))+ });+ var Flow = F2(function (a,b)+ {+ return {ctor: "Flow", _0: a, _1: b}+ });+ var Fitted = {ctor: "Fitted"};+ var fittedImage = F3(function (w,h,src)+ {+ return A3(newElement,+ w,+ h,+ A4(Image,+ Fitted,+ w,+ h,+ JavaScript.fromString(src)))+ });+ var Element = F2(function (a,b)+ {+ return {_: {}, element: b, props: a}+ });+ var DUp = {ctor: "DUp"};+ var up = DUp;+ var DRight = {ctor: "DRight"};+ var right = DRight;+ var beside = F2(function (lft,rht)+ {+ return A3(newElement,+ widthOf(lft) + widthOf(rht),+ A2(Basics.max,+ heightOf(lft),+ heightOf(rht)),+ A2(Flow,right,_J.toList([lft,rht])))+ });+ var DOut = {ctor: "DOut"};+ var layers = function (es)+ {+ return function ()+ {+ var ws = A2(List.map,widthOf,es);+ var hs = A2(List.map,heightOf,es);+ return A3(newElement,+ List.maximum(ws),+ List.maximum(hs),+ A2(Flow,DOut,es))+ }()+ };+ var outward = DOut;+ var DLeft = {ctor: "DLeft"};+ var left = DLeft;+ var DIn = {ctor: "DIn"};+ var inward = DIn;+ var DDown = {ctor: "DDown"};+ var above = F2(function (hi,lo)+ {+ return A3(newElement,+ A2(Basics.max,widthOf(hi),widthOf(lo)),+ heightOf(hi) + heightOf(lo),+ A2(Flow,DDown,_J.toList([hi,lo])))+ });+ var below = F2(function (lo,hi)+ {+ return A3(newElement,+ A2(Basics.max,widthOf(hi),widthOf(lo)),+ heightOf(hi) + heightOf(lo),+ A2(Flow,DDown,_J.toList([hi,lo])))+ });+ var down = DDown;+ var flow = F2(function (dir,es)+ {+ return function ()+ {+ var ws = A2(List.map,widthOf,es);+ var newFlow = F2(function (w,h)+ {+ return A3(newElement,+ w,+ h,+ A2(Flow,dir,es))+ });+ var hs = A2(List.map,heightOf,es);+ return _N.eq(es,+ _J.toList([])) ? empty : function ()+ {+ switch (dir.ctor)+ {case+ "DDown" :+ return A2(newFlow,+ List.maximum(ws),+ List.sum(hs))+ case+ "DIn" :+ return A2(newFlow,+ List.maximum(ws),+ List.maximum(hs))+ case+ "DLeft" :+ return A2(newFlow,+ List.sum(ws),+ List.maximum(hs))+ case+ "DOut" :+ return A2(newFlow,+ List.maximum(ws),+ List.maximum(hs))+ case+ "DRight" :+ return A2(newFlow,+ List.sum(ws),+ List.maximum(hs))+ case+ "DUp" :+ return A2(newFlow,+ List.maximum(ws),+ List.sum(hs))}+ _E.Case($moduleName,+ "between lines 206 and 216");+ }()+ }()+ });+ var Custom = {ctor: "Custom"};+ var Cropped = function (a)+ {+ return {ctor: "Cropped", _0: a}+ };+ var croppedImage = F4(function (pos,w,h,src)+ {+ return A3(newElement,+ w,+ h,+ A4(Image,+ Cropped(pos),+ w,+ h,+ JavaScript.fromString(src)))+ });+ var Container = F2(function (a,b)+ {+ return {ctor: "Container", _0: a, _1: b}+ });+ var container = F4(function (w,h,pos,e)+ {+ return A3(newElement,w,h,A2(Container,pos,e))+ });+ var Absolute = function (a)+ {+ return {ctor: "Absolute", _0: a}+ };+ var absolute = Absolute;+ var midLeft = _N.replace([["horizontal",N],["x",Absolute(0)]],+ middle);+ var midRight = _N.replace([["horizontal",P]],midLeft);+ var midTop = _N.replace([["vertical",P],["y",Absolute(0)]],middle);+ var midBottom = _N.replace([["vertical",N]],midTop);+ var topLeft = {_: {}, horizontal: N, vertical: P, x: Absolute(0), y: Absolute(0)};+ var bottomLeft = _N.replace([["vertical",N]],topLeft);+ var bottomRight = _N.replace([["horizontal",P]],bottomLeft);+ var topRight = _N.replace([["horizontal",P]],topLeft);+ _elm.Graphics.Element.values = {_op: _op, empty: empty, widthOf: widthOf, heightOf: heightOf, sizeOf: sizeOf, width: width, height: height, size: size, opacity: opacity, color: color, tag: tag, link: link, emptyStr: emptyStr, newElement: newElement, image: image, fittedImage: fittedImage, croppedImage: croppedImage, tiledImage: tiledImage, container: container, spacer: spacer, flow: flow, above: above, below: below, beside: beside, layers: layers, absolute: absolute, relative: relative, middle: middle, topLeft: topLeft, topRight: topRight, bottomLeft: bottomLeft, bottomRight: bottomRight, midLeft: midLeft, midRight: midRight, midTop: midTop, midBottom: midBottom, middleAt: middleAt, topLeftAt: topLeftAt, topRightAt: topRightAt, bottomLeftAt: bottomLeftAt, bottomRightAt: bottomRightAt, midLeftAt: midLeftAt, midRightAt: midRightAt, midTopAt: midTopAt, midBottomAt: midBottomAt, up: up, down: down, left: left, right: right, inward: inward, outward: outward, Image: Image, Container: Container, Flow: Flow, Spacer: Spacer, RawHtml: RawHtml, Custom: Custom, Plain: Plain, Fitted: Fitted, Cropped: Cropped, Tiled: Tiled, P: P, Z: Z, N: N, Absolute: Absolute, Relative: Relative, DUp: DUp, DDown: DDown, DLeft: DLeft, DRight: DRight, DIn: DIn, DOut: DOut, Properties: Properties, Element: Element, Position: Position};+ return _elm.Graphics.Element.values+ };Elm.Graphics = Elm.Graphics || {};+Elm.Graphics.Input = Elm.Graphics.Input || {};+Elm.Graphics.Input.make = function (_elm)+ {+ _elm.Graphics = _elm.Graphics || {};+ _elm.Graphics.Input = _elm.Graphics.Input || {};+ if (_elm.Graphics.Input.values)+ return _elm.Graphics.Input.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "Graphics.Input";+ var Basics = Elm.Basics.make(_elm);+ var Signal = Elm.Signal.make(_elm);+ var Native = Native || {};+ Native.Graphics = Native.Graphics || {};+ Native.Graphics.Input = Elm.Native.Graphics.Input.make(_elm);+ var List = Elm.List.make(_elm);+ var Graphics = Graphics || {};+ Graphics.Element = Elm.Graphics.Element.make(_elm);+ var Maybe = Elm.Maybe.make(_elm);+ var JavaScript = Elm.JavaScript.make(_elm);+ var _op = {};+ var id = function (x)+ {+ return x+ };+ var hoverables = Native.Graphics.Input.hoverables;+ var hoverable = function (elem)+ {+ return function ()+ {+ var pool = hoverables(false);+ return {ctor: "_Tuple2", _0: A2(pool.hoverable,+ id,+ elem), _1: pool.events}+ }()+ };+ var fields = Native.Graphics.Input.fields;+ var emptyFieldState = {_: {}, selectionEnd: 0, selectionStart: 0, string: ""};+ var field = function (placeHolder)+ {+ return function ()+ {+ var tfs = fields(emptyFieldState);+ var changes = Signal.dropRepeats(tfs.events);+ return {ctor: "_Tuple2", _0: A2(Signal.lift,+ A2(tfs.field,+ id,+ placeHolder),+ changes), _1: Signal.dropRepeats(A2(Signal.lift,+ function (_)+ {+ return _.string+ },+ changes))}+ }()+ };+ var password = function (placeHolder)+ {+ return function ()+ {+ var tfs = Native.Graphics.Input.passwords(emptyFieldState);+ var changes = Signal.dropRepeats(tfs.events);+ return {ctor: "_Tuple2", _0: A2(Signal.lift,+ A2(tfs.field,+ id,+ placeHolder),+ changes), _1: Signal.dropRepeats(A2(Signal.lift,+ function (_)+ {+ return _.string+ },+ changes))}+ }()+ };+ var email = function (placeHolder)+ {+ return function ()+ {+ var tfs = Native.Graphics.Input.emails(emptyFieldState);+ var changes = Signal.dropRepeats(tfs.events);+ return {ctor: "_Tuple2", _0: A2(Signal.lift,+ A2(tfs.field,+ id,+ placeHolder),+ changes), _1: Signal.dropRepeats(A2(Signal.lift,+ function (_)+ {+ return _.string+ },+ changes))}+ }()+ };+ var dropDown = Native.Graphics.Input.dropDown;+ var stringDropDown = function (strs)+ {+ return dropDown(A2(List.map,+ function (s)+ {+ return {ctor: "_Tuple2", _0: s, _1: s}+ },+ strs))+ };+ var customButtons = Native.Graphics.Input.customButtons;+ var customButton = F3(function (up,hover,down)+ {+ return function ()+ {+ var pool = customButtons({ctor: "_Tuple0"});+ return {ctor: "_Tuple2", _0: A4(pool.customButton,+ {ctor: "_Tuple0"},+ up,+ hover,+ down), _1: pool.events}+ }()+ });+ var checkboxes = Native.Graphics.Input.checkboxes;+ var checkbox = function (b)+ {+ return function ()+ {+ var cbs = checkboxes(b);+ return {ctor: "_Tuple2", _0: A2(Signal.lift,+ cbs.checkbox(id),+ cbs.events), _1: cbs.events}+ }()+ };+ var buttons = Native.Graphics.Input.buttons;+ var button = function (txt)+ {+ return function ()+ {+ var pool = buttons({ctor: "_Tuple0"});+ return {ctor: "_Tuple2", _0: A2(pool.button,+ {ctor: "_Tuple0"},+ txt), _1: pool.events}+ }()+ };+ var FieldState = F3(function (a,b,c)+ {+ return {_: {}, selectionEnd: c, selectionStart: b, string: a}+ });+ _elm.Graphics.Input.values = {_op: _op, id: id, buttons: buttons, button: button, customButtons: customButtons, customButton: customButton, checkboxes: checkboxes, checkbox: checkbox, hoverables: hoverables, hoverable: hoverable, fields: fields, emptyFieldState: emptyFieldState, field: field, password: password, email: email, dropDown: dropDown, stringDropDown: stringDropDown, FieldState: FieldState};+ return _elm.Graphics.Input.values+ };Elm.JavaScript = Elm.JavaScript || {};+Elm.JavaScript.Experimental = Elm.JavaScript.Experimental || {};+Elm.JavaScript.Experimental.make = function (_elm)+ {+ _elm.JavaScript = _elm.JavaScript || {};+ _elm.JavaScript.Experimental = _elm.JavaScript.Experimental || {};+ if (_elm.JavaScript.Experimental.values)+ return _elm.JavaScript.Experimental.values+ var N = Elm.Native,+ _N = N.Utils.make(_elm),+ _L = N.List.make(_elm),+ _E = N.Error.make(_elm),+ _J = N.JavaScript.make(_elm),+ $moduleName = "JavaScript.Experimental";+ var JavaScript = Elm.JavaScript.make(_elm);+ var Native = Native || {};+ Native.JavaScript = Elm.Native.JavaScript.make(_elm);+ var _op = {};+ var toRecord = Native.JavaScript.toRecord;+ var fromRecord = Native.JavaScript.fromRecord;+ _elm.JavaScript.Experimental.values = {_op: _op, toRecord: toRecord, fromRecord: fromRecord};+ return _elm.JavaScript.Experimental.values+ };(function() {++// Returns boolean indicating if the swap was successful.+// Requires that the two signal graphs have exactly the same+// structure.+ElmRuntime.swap = function(from, to) {+ function similar(nodeOld,nodeNew) {+ idOkay = nodeOld.id === nodeNew.id;+ lengthOkay = nodeOld.kids.length === nodeNew.kids.length;+ return idOkay && lengthOkay;+ }+ function swap(nodeOld,nodeNew) {+ nodeNew.value = nodeOld.value;+ return true;+ }+ var canSwap = depthFirstTraversals(similar, from.inputs, to.inputs);+ if (canSwap) { depthFirstTraversals(swap, from.inputs, to.inputs); }+ from.node.parentNode.replaceChild(to.node, from.node);+ return canSwap;+}++// Returns false if the node operation f ever fails.+function depthFirstTraversals(f, queueOld, queueNew) {+ if (queueOld.length !== queueNew.length) return false;+ queueOld = queueOld.slice(0);+ queueNew = queueNew.slice(0);++ var seen = [];+ while (queueOld.length > 0 && queueNew.length > 0) {+ var nodeOld = queueOld.pop();+ var nodeNew = queueNew.pop();+ if (seen.indexOf(nodeOld.id) < 0) {+ if (!f(nodeOld, nodeNew)) return false;+ queueOld = queueOld.concat(nodeOld.kids);+ queueNew = queueNew.concat(nodeNew.kids);+ seen.push(nodeOld.id);+ }+ }+ return true;+}++}());++(function() {+'use strict';++Elm.fullscreen = function(module) {+ var style = document.createElement('style');+ style.type = 'text/css';+ style.innerHTML = "html,head,body { padding:0; margin:0; }" ++ "body { font-family: calibri, helvetica, arial, sans-serif; }";+ document.head.appendChild(style);+ var container = document.createElement('div');+ document.body.appendChild(container);+ return init(ElmRuntime.Display.FULLSCREEN, container, module);+};++Elm.embed = function(module, container) {+ var tag = container.tagName;+ if (tag !== 'DIV') {+ throw new Error('Elm.node must be given a DIV, not a ' + tag + '.');+ } else if (container.hasChildNodes()) {+ throw new Error('Elm.node must be given an empty DIV. No children allowed!');+ }+ return init(ElmRuntime.Display.COMPONENT, container, module);+};++Elm.worker = function(module) {+ return init(ElmRuntime.Display.NONE, {}, module);+};++function init(display, container, module, moduleToReplace) {+ // defining state needed for an instance of the Elm RTS+ var inputs = [];++ var updateInProgress = false;+ function notify(id, v) {+ if (updateInProgress) {+ throw new Error(+ 'The notify function has been called synchronously!\n' ++ 'This can lead to frames being dropped.\n' ++ 'Definitely report this to <https://github.com/evancz/Elm/issues>\n');+ }+ updateInProgress = true;+ var timestep = Date.now();+ for (var i = inputs.length; i--; ) {+ inputs[i].recv(timestep, id, v);+ }+ updateInProgress = false;+ }++ var listeners = [];+ function addListener(relevantInputs, domNode, eventName, func) {+ domNode.addEventListener(eventName, func);+ var listener = {+ relevantInputs: relevantInputs,+ domNode: domNode,+ eventName: eventName,+ func: func+ };+ listeners.push(listener);+ }++ // create the actual RTS. Any impure modules will attach themselves to this+ // object. This permits many Elm programs to be embedded per document.+ var elm = {+ notify:notify,+ node:container,+ display:display,+ id:ElmRuntime.guid(),+ addListener:addListener,+ inputs:inputs+ };++ // Set up methods to communicate with Elm program from JS.+ function send(name, value) {+ if (typeof value === 'undefined') return function(v) { return send(name,v); };+ var e = document.createEvent('Event');+ e.initEvent(name + '_' + elm.id, true, true);+ e.value = value;+ document.dispatchEvent(e);+ }+ function recv(name, handler) {+ document.addEventListener(name + '_' + elm.id, handler);+ }++ recv('log', function(e) {console.log(e.value)});+ recv('title', function(e) {document.title = e.value});+ recv('redirect', function(e) {+ if (e.value.length > 0) { window.location = e.value; }+ });++ function swap(newModule) {+ removeListeners(listeners);+ var div = document.createElement('div');+ var newElm = init(display, div, newModule, elm);+ inputs = [];+ // elm.send = newElm.send;+ // elm.recv = newElm.recv;+ // elm.swap = newElm.swap;+ return newElm;+ }++ var Module = {};+ var reportAnyErrors = function() {};+ try {+ Module = module.make(elm);+ } catch(e) {+ var directions = "<br/> Open the developer console for more details."+ Module.main = Elm.Text.make(elm).text('<code>' + e.message + directions + '</code>');+ reportAnyErrors = function() { throw e; }+ }+ inputs = ElmRuntime.filterDeadInputs(inputs);+ filterListeners(inputs, listeners);+ if (display !== ElmRuntime.Display.NONE) {+ var graphicsNode = initGraphics(elm, Module);+ }+ if (typeof moduleToReplace !== 'undefined') {+ ElmRuntime.swap(moduleToReplace, elm);++ // rerender scene if graphics are enabled.+ if (typeof graphicsNode !== 'undefined') {+ graphicsNode.recv(0, true, 0);+ }+ }++ reportAnyErrors();+ return { send:send, recv:recv, swap:swap };+};++function filterListeners(inputs, listeners) {+ loop:+ for (var i = listeners.length; i--; ) {+ var listener = listeners[i];+ for (var j = inputs.length; j--; ) {+ if (listener.relevantInputs.indexOf(inputs[j].id) >= 0) {+ continue loop;+ }+ }+ listener.domNode.removeEventListener(listener.eventName, listener.func);+ }+}++function removeListeners(listeners) {+ for (var i = listeners.length; i--; ) {+ var listener = listeners[i];+ listener.domNode.removeEventListener(listener.eventName, listener.func);+ }+}++function initGraphics(elm, Module) {+ if (!('main' in Module))+ throw new Error("'main' is missing! What do I display?!");++ var signalGraph = Module.main;++ // make sure the signal graph is actually a signal & extract the visual model+ var Signal = Elm.Signal.make(elm);+ if (!('recv' in signalGraph)) {+ signalGraph = Signal.constant(signalGraph);+ }+ var currentScene = signalGraph.value;++ // Add the currentScene to the DOM+ var Render = ElmRuntime.use(ElmRuntime.Render.Element);+ elm.node.appendChild(Render.render(currentScene));++ // set up updates so that the DOM is adjusted as necessary.+ function domUpdate(newScene, currentScene) {+ ElmRuntime.draw(function(_) {+ Render.update(elm.node.firstChild, currentScene, newScene);+ if (elm.Native.Window) elm.Native.Window.values.resizeIfNeeded();+ });+ return newScene;+ }+ var renderer = A3(Signal.foldp, F2(domUpdate), currentScene, signalGraph);++ // must check for resize after 'renderer' is created so+ // that changes show up.+ if (elm.Native.Window) elm.Native.Window.values.resizeIfNeeded();++ return renderer;+}++}());++(function() {+'use strict';++ElmRuntime.Display = { FULLSCREEN: 0, COMPONENT: 1, NONE: 2 };++ElmRuntime.counter = 0;+ElmRuntime.guid = function() { return ElmRuntime.counter++; }++ElmRuntime.use = function(M) {+ if (typeof M === 'function') M = M();+ return M;+};++function isAlive(input) {+ if (!('defaultNumberOfKids' in input)) return true;+ var len = input.kids.length;+ if (len === 0) return false;+ if (len > input.defaultNumberOfKids) return true;+ var alive = false;+ for (var i = len; i--; ) {+ alive = alive || isAlive(input.kids[i]);+ }+ return alive;+}++ElmRuntime.filterDeadInputs = function(inputs) {+ var temp = [];+ for (var i = inputs.length; i--; ) {+ if (isAlive(inputs[i])) temp.push(inputs[i]);+ }+ return temp;+};++// define the draw function+var vendors = ['ms', 'moz', 'webkit', 'o'];+var window = window || {};+for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {+ window.requestAnimationFrame = window[vendors[i]+'RequestAnimationFrame'];+ window.cancelAnimationFrame = window[vendors[i]+'CancelAnimationFrame'] ||+ window[vendors[i]+'CancelRequestAnimationFrame'];+}++if (window.requestAnimationFrame && window.cancelAnimationFrame) {+ var previous = 0;+ ElmRuntime.draw = function(callback) {+ window.cancelAnimationFrame(previous);+ previous = window.requestAnimationFrame(callback);+ };+} else {+ ElmRuntime.draw = function(callback) { callback(); };+}++}());++ElmRuntime.Render.Collage = function() {++var Render = ElmRuntime.use(ElmRuntime.Render.Element);+var Transform = Elm.Transform2D.make({});+var Utils = ElmRuntime.use(ElmRuntime.Render.Utils);+var newElement = Utils.newElement,+ extract = Utils.extract, fromList = Utils.fromList,+ fromString = Utils.fromString, addTransform = Utils.addTransform;++function trace(ctx, path) {+ var points = fromList(path);+ var i = points.length - 1;+ if (i <= 0) return;+ ctx.moveTo(points[i]._0, points[i]._1);+ while (i--) { ctx.lineTo(points[i]._0, points[i]._1); }+ if (path.closed) {+ i = points.length - 1;+ ctx.lineTo(points[i]._0, points[i]._1);+ }+}++function line(ctx,style,path) {+ style.dashing.ctor === 'Nil' ? trace(ctx, path) : customLineHelp(ctx, style, path);+ ctx.scale(1,-1);+ ctx.stroke();+}++function customLineHelp(ctx, style, path) {+ var points = fromList(path);+ if (path.closed) points.push(points[0]);+ var pattern = fromList(style.dashing);+ var i = points.length - 1;+ if (i <= 0) return;+ var x0 = points[i]._0, y0 = points[i]._1;+ var x1=0, y1=0, dx=0, dy=0, remaining=0, nx=0, ny=0;+ var pindex = 0, plen = pattern.length;+ var draw = true, segmentLength = pattern[0];+ ctx.moveTo(x0,y0);+ while (i--) {+ x1 = points[i]._0; y1 = points[i]._1;+ dx = x1 - x0; dy = y1 - y0;+ remaining = Math.sqrt(dx * dx + dy * dy);+ while (segmentLength <= remaining) {+ x0 += dx * segmentLength / remaining;+ y0 += dy * segmentLength / remaining;+ ctx[draw ? 'lineTo' : 'moveTo'](x0, y0);+ // update starting position+ dx = x1 - x0; dy = y1 - y0;+ remaining = Math.sqrt(dx * dx + dy * dy);+ // update pattern+ draw = !draw;+ pindex = (pindex + 1) % plen;+ segmentLength = pattern[pindex];+ }+ if (remaining > 0) {+ ctx[draw ? 'lineTo' : 'moveTo'](x1, y1);+ segmentLength -= remaining;+ }+ x0 = x1; y0 = y1;+ }+}++function drawLine(ctx, style, path) {+ ctx.lineWidth = style.width;+ var cap = style.cap.ctor;+ ctx.lineCap = cap === 'Flat' ? 'butt' :+ cap === 'Round' ? 'round' : 'square';+ var join = style.join.ctor;+ ctx.lineJoin = join === 'Smooth' ? 'round' :+ join === 'Sharp' ? 'miter' : 'bevel';+ ctx.miterLimit = style.join._0 || 10;+ ctx.strokeStyle = extract(style.color);+ return line(ctx, style, path);+}++function texture(redo, ctx, src) {+ var img = new Image();+ img.src = fromString(src);+ img.onload = redo;+ return ctx.createPattern(img, 'repeat');+}++function gradient(ctx, grad) {+ var g;+ var stops = [];+ if (grad.ctor === 'Linear') {+ var p0 = grad._0, p1 = grad._1;+ g = ctx.createLinearGradient(p0._0, -p0._1, p1._0, -p1._1);+ stops = fromList(grad._2);+ } else {+ var p0 = grad._0, p2 = grad._2;+ g = ctx.createRadialGradient(p0._0, -p0._1, grad._1, p2._0, -p2._1, grad._3);+ stops = fromList(grad._4);+ }+ var len = stops.length;+ for (var i = 0; i < len; ++i) {+ var stop = stops[i];+ g.addColorStop(stop._0, extract(stop._1));+ }+ return g;+}++function drawShape(redo, ctx, style, path) {+ trace(ctx, path);+ var sty = style.ctor;+ ctx.fillStyle =+ sty === 'Solid' ? extract(style._0) :+ sty === 'Texture' ? texture(redo, ctx, style._0) : gradient(ctx, style._0);+ ctx.scale(1,-1);+ ctx.fill();+}++function drawImage(redo, ctx, form) {+ var img = new Image();+ img.onload = redo;+ img.src = fromString(form._3);+ var w = form._0,+ h = form._1,+ pos = form._2,+ srcX = pos._0,+ srcY = pos._1,+ srcW = w,+ srcH = h,+ destX = -w/2,+ destY = -h/2,+ destW = w,+ destH = h;++ ctx.scale(1,-1);+ ctx.drawImage(img, srcX, srcY, srcW, srcH, destX, destY, destW, destH);+}++function renderForm(redo, ctx, form) {+ ctx.save();+ var x = form.x, y = form.y, theta = form.theta, scale = form.scale;+ if (x !== 0 || y !== 0) ctx.translate(x, y);+ if (theta !== 0) ctx.rotate(theta);+ if (scale !== 1) ctx.scale(scale,scale);+ if (form.alpha !== 1) ctx.globalAlpha = ctx.globalAlpha * form.alpha;+ ctx.beginPath();+ var f = form.form;+ switch(f.ctor) {+ case 'FPath' : drawLine(ctx, f._0, f._1); break;+ case 'FImage': drawImage(redo, ctx, f); break;+ case 'FShape':+ if (f._0.ctor === 'Left') {+ f._1.closed = true;+ drawLine(ctx, f._0._0, f._1);+ } else {+ drawShape(redo, ctx, f._0._0, f._1);+ }+ break;+ }+ ctx.restore();+}++function formToMatrix(form) {+ var scale = form.scale;+ var matrix = A6( Transform.matrix, scale, 0, 0, scale, form.x, form.y );++ var theta = form.theta+ if (theta !== 0)+ matrix = A2( Transform.multiply, matrix, Transform.rotation(theta) );++ return matrix;+}++function str(n) {+ if (n < 0.00001 && n > -0.00001) return 0;+ return n;+}++function makeTransform(w, h, form, matrices) {+ var props = form.form._0.props;+ var m = A6( Transform.matrix, 1, 0, 0, -1,+ (w - props.width ) / 2,+ (h - props.height) / 2 );+ var len = matrices.length;+ for (var i = 0; i < len; ++i) { m = A2( Transform.multiply, m, matrices[i] ); }+ m = A2( Transform.multiply, m, formToMatrix(form) );++ return 'matrix(' + str( m[0]) + ', ' + str( m[3]) + ', ' ++ str(-m[1]) + ', ' + str(-m[4]) + ', ' ++ str( m[2]) + ', ' + str( m[5]) + ')';+}++function stepperHelp(list) {+ var arr = fromList(list);+ var i = 0;+ function peekNext() {+ return i < arr.length ? arr[i].form.ctor : '';+ }+ // assumes that there is a next element+ function next() {+ var out = arr[i];+ ++i;+ return out;+ }+ return { peekNext:peekNext, next:next };+}++function formStepper(forms) {+ var ps = [stepperHelp(forms)];+ var matrices = [];+ var alphas = [];+ function peekNext() {+ var len = ps.length;+ var formType = '';+ for (var i = 0; i < len; ++i ) {+ if (formType = ps[i].peekNext()) return formType;+ }+ return '';+ }+ // assumes that there is a next element+ function next(ctx) {+ while (!ps[0].peekNext()) {+ ps.shift();+ matrices.pop();+ alphas.shift();+ if (ctx) { ctx.restore(); }+ }+ var out = ps[0].next();+ var f = out.form;+ if (f.ctor === 'FGroup') {+ ps.unshift(stepperHelp(f._1));+ var m = A2(Transform.multiply, f._0, formToMatrix(out));+ ctx.save();+ ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);+ matrices.push(m);++ var alpha = (alphas[0] || 1) * out.alpha;+ alphas.unshift(alpha);+ ctx.globalAlpha = alpha;+ }+ return out;+ }+ function transforms() { return matrices; }+ function alpha() { return alphas[0] || 1; }+ return { peekNext:peekNext, next:next, transforms:transforms, alpha:alpha };+}++function makeCanvas(w,h) {+ var canvas = newElement('canvas');+ canvas.style.width = w + 'px';+ canvas.style.height = h + 'px';+ canvas.style.display = "block";+ canvas.style.position = "absolute";+ canvas.width = w;+ canvas.height = h;+ return canvas;+}++function render(model) {+ var div = newElement('div');+ div.style.overflow = 'hidden';+ update(div, model, model);+ return div;+}++function nodeStepper(w,h,div) {+ var kids = div.childNodes;+ var i = 0;+ function transform(transforms, ctx) {+ ctx.translate(w/2, h/2);+ ctx.scale(1,-1);+ var len = transforms.length;+ for (var i = 0; i < len; ++i) {+ var m = transforms[i];+ ctx.save();+ ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);+ }+ return ctx;+ }+ function nextContext(transforms) {+ while (i < kids.length) {+ var node = kids[i];+ if (node.getContext) {+ node.width = w;+ node.height = h;+ node.style.width = w + 'px';+ node.style.height = h + 'px';+ ++i;+ return transform(transforms, node.getContext('2d'));+ }+ div.removeChild(node);+ }+ var canvas = makeCanvas(w,h);+ div.appendChild(canvas);+ // we have added a new node, so we must step our position+ ++i;+ return transform(transforms, canvas.getContext('2d'));+ }+ function addElement(matrices, alpha, form) {+ var kid = kids[i];+ var elem = form.form._0;++ var node = (!kid || kid.getContext)+ ? Render.render(elem)+ : (Render.update(kid, kid.oldElement, elem), kids[i]);++ node.style.position = 'absolute';+ node.style.opacity = alpha * form.alpha;+ addTransform(node.style, makeTransform(w, h, form, matrices));+ node.oldElement = elem;+ ++i;+ if (!kid) {+ div.appendChild(node);+ } else if (kid.getContext) {+ div.insertBefore(node, kid);+ }+ }+ function clearRest() {+ while (i < kids.length) {+ div.removeChild(kids[i]);+ }+ }+ return { nextContext:nextContext, addElement:addElement, clearRest:clearRest };+}+++function update(div, _, model) {+ var w = model.w;+ var h = model.h;++ var forms = formStepper(model.forms);+ var nodes = nodeStepper(w,h,div);+ var ctx = null;+ var formType = '';++ while (formType = forms.peekNext()) {+ // make sure we have context if we need it+ if (ctx === null && formType !== 'FElement') {+ ctx = nodes.nextContext(forms.transforms());+ ctx.globalAlpha = forms.alpha();+ }++ var form = forms.next(ctx);+ // if it is FGroup, all updates are made within formStepper when next is called.+ if (formType === 'FElement') {+ // update or insert an element, get a new context+ nodes.addElement(forms.transforms(), forms.alpha(), form);+ ctx = null;+ } else if (formType !== 'FGroup') {+ renderForm(function() { update(div, model, model); }, ctx, form);+ }+ }+ nodes.clearRest();+ return false;+}++return { render:render, update:update };++};++ElmRuntime.Render.Element = function() {+'use strict';++var Utils = ElmRuntime.use(ElmRuntime.Render.Utils);+var newElement = Utils.newElement, extract = Utils.extract,+ addTransform = Utils.addTransform, removeTransform = Utils.removeTransform,+ fromList = Utils.fromList, eq = Utils.eq;++function setProps(props, e) {+ e.style.width = (props.width |0) + 'px';+ e.style.height = (props.height|0) + 'px';+ if (props.opacity !== 1) { e.style.opacity = props.opacity; }+ if (props.color.ctor === 'Just') {+ e.style.backgroundColor = extract(props.color._0);+ }+ if (props.tag !== '') { e.id = props.tag; }+ if (props.href !== '') {+ var a = newElement('a');+ a.href = props.href;+ a.style.width = '100%';+ a.style.height = '100%';+ a.style.top = 0;+ a.style.left = 0;+ a.style.display = 'block';+ a.style.position = 'absolute';+ e.style.position = 'relative';+ e.appendChild(a);+ }+ if (props.hover.ctor !== '_Tuple0') {+ var overCount = 0;+ e.addEventListener('mouseover', function() {+ if (overCount++ > 0) return;+ props.hover(true);+ });+ e.addEventListener('mouseout', function(evt) {+ if (e.contains(evt.toElement || evt.relatedTarget)) return;+ overCount = 0;+ props.hover(false);+ });+ }+ return e;+}++function image(props, img) {+ switch (img._0.ctor) {+ case 'Plain': return plainImage(img._3);+ case 'Fitted': return fittedImage(props.width, props.height, img._3);+ case 'Cropped': return croppedImage(img,props.width,props.height,img._3);+ case 'Tiled': return tiledImage(img._3);+ }+}++function plainImage(src) {+ var img = newElement('img');+ img.src = src;+ img.name = src;+ img.style.display = "block";+ return img;+}++function tiledImage(src) {+ var div = newElement('div');+ div.style.backgroundImage = 'url(' + src + ')';+ return div;+}++function fittedImage(w, h, src) {+ var div = newElement('div');+ div.style.background = 'url(' + src + ') no-repeat center';+ div.style.webkitBackgroundSize = 'cover';+ div.style.MozBackgroundSize = 'cover';+ div.style.OBackgroundSize = 'cover';+ div.style.backgroundSize = 'cover';+ return div;+}++function croppedImage(elem, w, h, src) {+ var pos = elem._0._0;+ var e = newElement('div');+ e.style.overflow = "hidden";++ var img = newElement('img');+ img.onload = function() {+ var sw = w / elem._1, sh = h / elem._2;+ img.style.width = ((this.width * sw)|0) + 'px';+ img.style.height = ((this.height * sh)|0) + 'px';+ img.style.marginLeft = ((- pos._0 * sw)|0) + 'px';+ img.style.marginTop = ((- pos._1 * sh)|0) + 'px';+ };+ img.src = src;+ img.name = src;+ e.appendChild(img);+ return e;+}++function goIn(e) { e.style.position = 'absolute'; return e; }+function goDown(e) { return e }+function goRight(e) { e.style.styleFloat = e.style.cssFloat = "left"; return e; }+function flowWith(f, array) {+ var container = newElement('div');+ for (var i = array.length; i--; ) {+ container.appendChild(f(render(array[i])));+ }+ return container;+}++function flow(dir,elist) {+ var array = fromList(elist);+ switch(dir.ctor) {+ case "DDown": array.reverse();+ case "DUp": return flowWith(goDown,array);+ case "DRight": array.reverse();+ case "DLeft": return flowWith(goRight,array);+ case "DOut": array.reverse();+ case "DIn": return flowWith(goIn,array);+ }+}++function toPos(pos) {+ switch(pos.ctor) {+ case "Absolute": return pos._0 + "px";+ case "Relative": return (pos._0 * 100) + "%";+ }+}++// must clear right, left, top, bottom, and transform+// before calling this function+function setPos(pos,w,h,e) {+ e.style.position = 'absolute';+ e.style.margin = 'auto';+ var transform = '';+ switch(pos.horizontal.ctor) {+ case 'P': e.style.right = toPos(pos.x); e.style.removeProperty('left'); break;+ case 'Z': transform = 'translateX(' + ((-w/2)|0) + 'px) ';+ case 'N': e.style.left = toPos(pos.x); e.style.removeProperty('right'); break;+ }+ switch(pos.vertical.ctor) {+ case 'N': e.style.bottom = toPos(pos.y); e.style.removeProperty('top'); break;+ case 'Z': transform += 'translateY(' + ((-h/2)|0) + 'px)';+ case 'P': e.style.top = toPos(pos.y); e.style.removeProperty('bottom'); break;+ }+ if (transform !== '') addTransform(e.style, transform);+ return e;+}++function container(pos,elem) {+ var e = render(elem);+ setPos(pos, elem.props.width, elem.props.height, e);+ var div = newElement('div');+ div.style.position = 'relative';+ div.style.overflow = 'hidden';+ div.appendChild(e);+ return div;+}++function rawHtml(elem) {+ var html = elem.html;+ var args = elem.args;+ var guid = elem.guid;++ var div = newElement('div');+ div.innerHTML = html;+ div.style.visibility = "hidden";+ document.body.appendChild(div);++ for (var i = args.length; i--; ) {+ var arg = args[i];+ var span = document.getElementById('md-' + guid + '-' + i);+ if (arg.isText) {+ span.innerHTML = arg;+ } else {+ span.style.display = 'block';+ span.style.width = arg.props.width + 'px';+ span.style.height = arg.props.height + 'px';+ span.appendChild(render(arg));+ }+ }+ document.body.removeChild(div);+ div.style.visibility = 'visible';+ return div;+}++function render(elem) { return setProps(elem.props, makeElement(elem)); }+function makeElement(e) {+ var elem = e.element;+ switch(elem.ctor) {+ case 'Image': return image(e.props, elem);+ case 'Flow': return flow(elem._0, elem._1);+ case 'Container': return container(elem._0, elem._1);+ case 'Spacer': return newElement('div');+ case 'RawHtml': return rawHtml(elem);+ case 'Custom': return elem.render(elem.model);+ }+}++function update(node, curr, next) {+ if (node.tagName === 'A') { node = node.firstChild; }+ if (curr.props.id === next.props.id) return updateProps(node, curr, next);+ if (curr.element.ctor !== next.element.ctor) {+ node.parentNode.replaceChild(render(next),node);+ return true;+ }+ var nextE = next.element, currE = curr.element;+ switch(nextE.ctor) {+ case "Spacer": break;+ case "RawHtml":+ // only markdown blocks have guids, so this must be a text block+ if (nextE.guid === null) {+ node.innerHTML = nextE.html;+ break;+ }+ if (nextE.guid !== currE.guid) {+ node.parentNode.replaceChild(render(next),node);+ return true;+ }+ var nargs = nextE.args;+ var cargs = currE.args;+ for (var i = nargs.length; i--; ) {+ var narg = nargs[i];+ var carg = cargs[i]+ if (narg == carg) continue;+ var span = document.getElementById('md-' + currE.guid + '-' + i);+ if (narg.isElement) {+ if (carg.isElement) {+ update(span, carg, narg);+ } else {+ span.style.display = 'block';+ var e = render(narg);+ span.innerHTML = '';+ span.appendChild(e);+ }+ } else {+ span.style.display = 'inline';+ span.innerHTML = narg;+ }+ }+ break;+ case "Image":+ if (nextE._0.ctor === 'Plain') {+ if (nextE._3 !== currE._3) node.src = nextE._3;+ } else if (!eq(nextE,currE) ||+ next.props.width !== curr.props.width ||+ next.props.height !== curr.props.height) {+ node.parentNode.replaceChild(render(next),node);+ return true;+ }+ break;+ case "Flow":+ var arr = fromList(nextE._1);+ for (var i = arr.length; i--; ) { arr[i] = arr[i].element.ctor; }+ if (nextE._0.ctor !== currE._0.ctor) {+ node.parentNode.replaceChild(render(next),node);+ return true;+ }+ var nexts = fromList(nextE._1);+ var kids = node.childNodes;+ if (nexts.length !== kids.length) {+ node.parentNode.replaceChild(render(next),node);+ return true;+ }+ var currs = fromList(currE._1);+ var goDir = function(x) { return x; };+ switch(nextE._0.ctor) {+ case "DDown": case "DUp": goDir = goDown; break;+ case "DRight": case "DLeft": goDir = goRight; break;+ case "DOut": case "DIn": goDir = goIn; break;+ }+ for (var i = kids.length; i-- ;) {+ update(kids[i],currs[i],nexts[i]);+ goDir(kids[i]);+ }+ break;+ case "Container":+ update(node.firstChild, currE._1, nextE._1);+ setPos(nextE._0, nextE._1.props.width, nextE._1.props.height, node.firstChild);+ break;+ case "Custom":+ if (currE.type === nextE.type) {+ var done = nextE.update(node, currE.model, nextE.model);+ if (done) return;+ } else {+ return node.parentNode.replaceChild(render(next), node);+ }+ }+ updateProps(node, curr, next);+}++function updateProps(node, curr, next) {+ var props = next.props, currP = curr.props, e = node;+ if (props.width !== currP.width) e.style.width = (props.width |0) + 'px';+ if (props.height !== currP.height) e.style.height = (props.height|0) + 'px';+ if (props.opacity !== 1 && props.opacity !== currP.opacity) {+ e.style.opacity = props.opacity;+ }+ var nextColor = (props.color.ctor === 'Just' ?+ extract(props.color._0) : '');+ if (e.style.backgroundColor !== nextColor) {+ e.style.backgroundColor = (nextColor === '' ? 'transparent' : nextColor);+ }+ if (props.tag !== currP.tag) { e.id = props.tag; }+ if (props.href !== currP.href) {+ if (currP.href === '') {+ var a = newElement('a');+ a.href = props.href;+ a.style.width = '100%';+ a.style.height = '100%';+ a.style.top = 0;+ a.style.left = 0;+ a.style.display = 'block';+ a.style.position = 'absolute';+ e.style.position = 'relative';+ e.appendChild(a);+ } else {+ node.lastNode.href = props.href;+ }+ }+}++return { render:render, update:update };++};+ElmRuntime.Render.Utils = function() {+ function newElement(elementType) {+ var e = document.createElement(elementType);+ e.style.padding = "0";+ e.style.margin = "0";+ return e;+ }++ function addTo(container, elem) {+ container.appendChild(elem);+ }++ function extract(c) {+ if (c._3 === 1) { return 'rgb(' + c._0 + ', ' + c._1 + ', ' + c._2 + ')'; }+ return 'rgba(' + c._0 + ', ' + c._1 + ', ' + c._2 + ', ' + c._3 + ')';+ }++ function addTransform(style, trans) {+ style.transform = trans;+ style.msTransform = trans;+ style.MozTransform = trans;+ style.webkitTransform = trans;+ style.OTransform = trans;+ }++ function removeTransform(style) {+ style.transform = 'none';+ style.msTransform = 'none';+ style.MozTransform = 'none';+ style.webkitTransform = 'none';+ style.OTransform = 'none';+ }++ var List = Elm.Native.List.make({});++ return {addTo:addTo,+ newElement:newElement,+ extract : extract,+ fromList: List.toArray,+ fromString: function(s) { return s; },+ toString: function(s) { return s; },+ eq: Elm.Native.Utils.make({}).eq,+ addTransform: addTransform,+ removeTransform: removeTransform}; };
data/interfaces.data view
binary file changed (105776 → 112467 bytes)