packages feed

fay 0.10.0.0 → 0.10.1.0

raw patch · 52 files changed

+813/−523 lines, 52 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

+ Language.Fay.FFI: data Fay a
+ Language.Fay.Prelude: (!!) :: [a] -> Int -> a
+ Language.Fay.Prelude: ($!) :: (a -> b) -> a -> b
+ Language.Fay.Prelude: (**) :: Double -> Double -> Double
+ Language.Fay.Prelude: (^) :: Num a => a -> Int -> a
+ Language.Fay.Prelude: (^^) :: Double -> Int -> Double
+ Language.Fay.Prelude: Left :: a -> Either a b
+ Language.Fay.Prelude: Right :: b -> Either a b
+ Language.Fay.Prelude: abs :: (Num a, Ord a) => a -> a
+ Language.Fay.Prelude: acos :: Double -> Double
+ Language.Fay.Prelude: acosh :: Double -> Double
+ Language.Fay.Prelude: all :: (a -> Bool) -> [a] -> Bool
+ Language.Fay.Prelude: and :: [Bool] -> Bool
+ Language.Fay.Prelude: asTypeOf :: a -> a -> a
+ Language.Fay.Prelude: asin :: Double -> Double
+ Language.Fay.Prelude: asinh :: Double -> Double
+ Language.Fay.Prelude: atan :: Double -> Double
+ Language.Fay.Prelude: atanh :: Double -> Double
+ Language.Fay.Prelude: break :: (a -> Bool) -> [a] -> ([a], [a])
+ Language.Fay.Prelude: ceiling :: Double -> Int
+ Language.Fay.Prelude: cos :: Double -> Double
+ Language.Fay.Prelude: cosh :: Double -> Double
+ Language.Fay.Prelude: curry :: ((a, b) -> c) -> a -> b -> c
+ Language.Fay.Prelude: cycle :: [a] -> [a]
+ Language.Fay.Prelude: data Either a b
+ Language.Fay.Prelude: div :: Int -> Int -> Int
+ Language.Fay.Prelude: divMod :: Int -> Int -> (Int, Int)
+ Language.Fay.Prelude: drop :: Int -> [a] -> [a]
+ Language.Fay.Prelude: dropWhile :: (a -> Bool) -> [a] -> [a]
+ Language.Fay.Prelude: either :: (a -> c) -> (b -> c) -> Either a b -> c
+ Language.Fay.Prelude: enumFromThen :: Num t => t -> t -> [t]
+ Language.Fay.Prelude: enumFromThenTo :: (Ord t, Num t) => t -> t -> t -> [t]
+ Language.Fay.Prelude: error :: String -> a
+ Language.Fay.Prelude: even :: Int -> Bool
+ Language.Fay.Prelude: exp :: Double -> Double
+ Language.Fay.Prelude: floor :: Double -> Int
+ Language.Fay.Prelude: foldl1 :: (a -> a -> a) -> [a] -> a
+ Language.Fay.Prelude: foldr1 :: (a -> a -> a) -> [a] -> a
+ Language.Fay.Prelude: gcd :: Int -> Int -> Int
+ Language.Fay.Prelude: head :: [a] -> a
+ Language.Fay.Prelude: id :: a -> a
+ Language.Fay.Prelude: init :: [a] -> [a]
+ Language.Fay.Prelude: iterate :: (a -> a) -> a -> [a]
+ Language.Fay.Prelude: last :: [a] -> a
+ Language.Fay.Prelude: lcm :: Int -> Int -> Int
+ Language.Fay.Prelude: lines :: String -> [String]
+ Language.Fay.Prelude: log :: Double -> Double
+ Language.Fay.Prelude: logBase :: Double -> Double -> Double
+ Language.Fay.Prelude: maximum :: (Num a, Foreign a) => [a] -> a
+ Language.Fay.Prelude: minimum :: (Num a, Foreign a) => [a] -> a
+ Language.Fay.Prelude: negate :: Num a => a -> a
+ Language.Fay.Prelude: notElem :: Eq a => a -> [a] -> Bool
+ Language.Fay.Prelude: odd :: Int -> Bool
+ Language.Fay.Prelude: or :: [Bool] -> Bool
+ Language.Fay.Prelude: pi :: Double
+ Language.Fay.Prelude: pred :: Num a => a -> a
+ Language.Fay.Prelude: print :: Foreign a => a -> Fay ()
+ Language.Fay.Prelude: product :: Num a => [a] -> a
+ Language.Fay.Prelude: properFraction :: Double -> (Int, Double)
+ Language.Fay.Prelude: putStrLn :: String -> Fay ()
+ Language.Fay.Prelude: quot :: Int -> Int -> Int
+ Language.Fay.Prelude: quotRem :: Int -> Int -> (Int, Int)
+ Language.Fay.Prelude: recip :: Double -> Double
+ Language.Fay.Prelude: rem :: Int -> Int -> Int
+ Language.Fay.Prelude: repeat :: a -> [a]
+ Language.Fay.Prelude: replicate :: Int -> a -> [a]
+ Language.Fay.Prelude: round :: Double -> Int
+ Language.Fay.Prelude: scanl :: (a -> b -> a) -> a -> [b] -> [a]
+ Language.Fay.Prelude: scanl1 :: (a -> a -> a) -> [a] -> [a]
+ Language.Fay.Prelude: scanr :: (a -> b -> b) -> b -> [a] -> [b]
+ Language.Fay.Prelude: scanr1 :: (a -> a -> a) -> [a] -> [a]
+ Language.Fay.Prelude: seq :: a -> b -> b
+ Language.Fay.Prelude: sequence_ :: Monad m => [m a] -> m ()
+ Language.Fay.Prelude: signum :: (Num a, Ord a) => a -> a
+ Language.Fay.Prelude: sin :: Double -> Double
+ Language.Fay.Prelude: sinh :: Double -> Double
+ Language.Fay.Prelude: span :: (a -> Bool) -> [a] -> ([a], [a])
+ Language.Fay.Prelude: splitAt :: Int -> [a] -> ([a], [a])
+ Language.Fay.Prelude: sqrt :: Double -> Double
+ Language.Fay.Prelude: subtract :: Num a => a -> a -> a
+ Language.Fay.Prelude: succ :: Num a => a -> a
+ Language.Fay.Prelude: sum :: Num a => [a] -> a
+ Language.Fay.Prelude: tail :: [a] -> [a]
+ Language.Fay.Prelude: take :: Int -> [a] -> [a]
+ Language.Fay.Prelude: takeWhile :: (a -> Bool) -> [a] -> [a]
+ Language.Fay.Prelude: tan :: Double -> Double
+ Language.Fay.Prelude: tanh :: Double -> Double
+ Language.Fay.Prelude: truncate :: Double -> Int
+ Language.Fay.Prelude: uncurry :: (a -> b -> c) -> (a, b) -> c
+ Language.Fay.Prelude: undefined :: a
+ Language.Fay.Prelude: unlines :: [String] -> String
+ Language.Fay.Prelude: until :: (a -> Bool) -> (a -> a) -> a -> a
+ Language.Fay.Prelude: unwords :: [String] -> String
+ Language.Fay.Prelude: unzip :: [(a, b)] -> ([a], [b])
+ Language.Fay.Prelude: unzip3 :: [(a, b, c)] -> ([a], [b], [c])
+ Language.Fay.Prelude: words :: String -> [String]
+ Language.Fay.Prelude: zip3 :: [a] -> [b] -> [c] -> [(a, b, c)]
+ Language.Fay.Prelude: zipWith3 :: (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
- Language.Fay.Prelude: any :: (t -> Bool) -> [t] -> Bool
+ Language.Fay.Prelude: any :: (a -> Bool) -> [a] -> Bool
- Language.Fay.Prelude: enumFromTo :: (Eq t, Num t) => t -> t -> [t]
+ Language.Fay.Prelude: enumFromTo :: (Ord t, Num t) => t -> t -> [t]
- Language.Fay.Prelude: max :: Double -> Double -> Double
+ Language.Fay.Prelude: max :: (Num a, Foreign a) => a -> a -> a
- Language.Fay.Prelude: min :: Double -> Double -> Double
+ Language.Fay.Prelude: min :: (Num a, Foreign a) => a -> a -> a
- Language.Fay.Prelude: mod :: Double -> Double -> Double
+ Language.Fay.Prelude: mod :: Int -> Int -> Int

Files

fay.cabal view
@@ -1,5 +1,5 @@ name:                fay-version:             0.10.0.0+version:             0.10.1.0 synopsis:            A compiler for Fay, a Haskell subset that compiles to JavaScript. description:         Fay is a proper subset of Haskell which can be compiled (type-checked)                      with GHC, and compiled to JavaScript. It is lazy, pure, with a Fay monad,@@ -22,38 +22,31 @@                      .                      /Release Notes/                      .-                     * Add TCO optimization.-                     .-                     * Added uncurrying optimization for non-partial applications.+                     * Enable strict list for arithmetic sequences optimisation only when compiler optimise flag set.                      .-                     * Add simple benchmarking program.+                     * Add print and putStrLn to the Prelude                      .-                     * Add SVG logo.+                     * Add list utility functions from the standard Prelude                      .-                     * Added Defined type and appropriate serialization.+                     * Test optimized as well as unoptimized builds.                      .-                     * Treat Maybe as a nullable value in conversions.+                     * Standard precendence and associativity for infix operators                      .-                     * Added oscillator example.+                     * Add function utilities from Prelude, including seq                      .-                     * Add optimization flag.--                     * Support tuple serialization.-                     * Fix list length in pats (closes #145).+                     * Add math functions in Prelude                      .-                     * Name resolution and some export list support.--                     * Add codeworld space invaders example.+                     * Add support for sections (desugaring to lambdas)                      .-                     * NoImplicitPrelude is now passed automatically to GHC. Does not break code that uses the pragma (see #134).+                     * Added example of the ContT and Deferred monad, sleep and readFile.                      .-                     * Add support for list comprehensions using desugaring from Haskell report. See #40 and #132.+                     * Add more of the prelude, including error and a lot of math stuff.                      .-                     * Make error messages a tiny bit friendlier, and some general house-keeping.+                     * Remove needs for module declarations in modules that define main.                      .-                     * Support negation expressions (see #116).+                     * Support enumThen ([1,2..]) style lists.                      .-                     * Rewrite readFromFay using only Data, no Read/Show requirements (see #112).+                     * Add support for enumFromThenTo ([1,2..10]) lists.                      .                      See full history at: <https://github.com/faylang/fay/commits> homepage:            http://fay-lang.org/
js/runtime.js view
@@ -37,6 +37,18 @@      (this.value = this.value(), this.forced = true, this.value)); }; +function Fay$$seq(x) {+  return function(y) {+    _(x,false);+    return y;+  }+}++function Fay$$seq$36$uncurried(x,y) {+  _(x,false);+  return y;+}+ /*******************************************************************************  * Monad.  */
src/Language/Fay/Compiler.hs view
@@ -27,7 +27,7 @@ import           Language.Fay.Compiler.Misc import           Language.Fay.Print         (printJSString) import           Language.Fay.Types-+import qualified Language.Fay.Stdlib as Stdlib (enumFromTo,enumFromThenTo) import           Control.Applicative import           Control.Monad.Error import           Control.Monad.IO@@ -207,7 +207,8 @@ typecheck :: [FilePath] -> [String] -> Bool -> String -> Compile () typecheck includeDirs ghcFlags wall fp = do   res <- liftIO $ readAllFromProcess' "ghc" (-    ["-fno-code", "-package fay", "-XNoImplicitPrelude", fp] ++ map ("-i" ++) includeDirs ++ ghcFlags ++ wallF) ""+    ["-fno-code", "-package fay", "-XNoImplicitPrelude", "-main-is", "Language.Fay.DummyMain", fp]+    ++ map ("-i" ++) includeDirs ++ ghcFlags ++ wallF) ""   either error (warn . fst) res    where     wallF | wall = ["-Wall"]@@ -536,14 +537,12 @@     Con qname                     -> compileVar qname     Do stmts                      -> compileDoBlock stmts     Lambda _ pats exp             -> compileLambda pats exp-    EnumFrom i                    -> do e <- compileExp i-                                        name <- resolveName "enumFrom"-                                        return (JsApp (JsName (JsNameVar name)) [e])-    EnumFromTo i i'               -> do f <- compileExp i-                                        t <- compileExp i'-                                        name <- resolveName "enumFromTo"-                                        return (JsApp (JsApp (JsName (JsNameVar name)) [f])-                                                      [t])+    LeftSection e o               -> compileExp =<< desugarLeftSection e o+    RightSection o e              -> compileExp =<< desugarRightSection o e+    EnumFrom i                    -> compileEnumFrom i+    EnumFromTo i i'               -> compileEnumFromTo i i'+    EnumFromThen a b              -> compileEnumFromThen a b+    EnumFromThenTo a b z          -> compileEnumFromThenTo a b z     RecConstr name fieldUpdates -> compileRecConstr name fieldUpdates     RecUpdate rec  fieldUpdates -> updateRec rec fieldUpdates     ListComp exp stmts            -> compileExp =<< desugarListComp exp stmts@@ -644,7 +643,7 @@                 [JsEarlyReturn exp]                 (reverse (zip uniqueNames pats)) --- | Compile list comprehensions.+-- | Desugar list comprehensions. desugarListComp :: Exp -> [QualStmt] -> Compile Exp desugarListComp e [] =     return (List [ e ])@@ -664,6 +663,16 @@ desugarListComp _ (s                             : _    ) =     throwError (UnsupportedQualStmt s) +-- | Desugar left sections to lambdas.+desugarLeftSection :: Exp -> QOp -> Compile Exp+desugarLeftSection e o = withScopedTmpName $ \tmp ->+    return (Lambda undefined [PVar tmp] (InfixApp e o (Var (UnQual tmp))))++-- | Desugar left sections to lambdas.+desugarRightSection :: QOp -> Exp -> Compile Exp+desugarRightSection o e = withScopedTmpName $ \tmp ->+    return (Lambda undefined [PVar tmp] (InfixApp (Var (UnQual tmp)) o e))+ -- | Compile case expressions. compileCase :: Exp -> [Alt] -> Compile JsExp compileCase exp alts = do@@ -948,3 +957,79 @@     String string -> return (JsApp (JsName (JsBuiltIn "list"))                                    [JsLit (JsStr string)])     lit           -> throwError (UnsupportedLiteral lit)++-- | Maximum number of elements to allow in strict list representation+-- of arithmetic sequences.+maxStrictASLen :: Int+maxStrictASLen = 10++-- | Compile [e1..] arithmetic sequences.+compileEnumFrom :: Exp -> Compile JsExp+compileEnumFrom i = do+  e <- compileExp i+  name <- resolveName "enumFrom"+  return (JsApp (JsName (JsNameVar name)) [e])++-- | Compile [e1..e3] arithmetic sequences.+compileEnumFromTo :: Exp -> Exp -> Compile JsExp+compileEnumFromTo i i' = do+  f <- compileExp i+  t <- compileExp i'+  name <- resolveName "enumFromTo"+  cfg <- gets stateConfig+  return $ case optEnumFromTo cfg f t of+    Just s -> s+    _ -> JsApp (JsApp (JsName (JsNameVar name)) [f]) [t]++-- | Optimize short literal [e1..e3] arithmetic sequences.+optEnumFromTo :: CompileConfig -> JsExp -> JsExp -> Maybe JsExp+optEnumFromTo cfg (JsLit f) (JsLit t) =+  if configOptimize cfg+  then case (f,t) of+    (JsInt fl, JsInt tl) -> strict JsInt fl tl+    (JsFloating fl, JsFloating tl) -> strict JsFloating fl tl+    _ -> Nothing+  else Nothing+    where strict :: (Enum a, Ord a, Num a) => (a -> JsLit) -> a -> a -> Maybe JsExp+          strict litfn f t =+            if fromEnum t - fromEnum f < maxStrictASLen+            then Just . makeList . map (JsLit . litfn) $ Stdlib.enumFromTo f t+            else Nothing+optEnumFromTo _ _ _ = Nothing++-- | Compile [e1,e2..] arithmetic sequences.+compileEnumFromThen :: Exp -> Exp -> Compile JsExp+compileEnumFromThen a b = do+  fr <- compileExp a+  th <- compileExp b+  name <- resolveName "enumFromThen"+  return (JsApp (JsApp (JsName (JsNameVar name)) [fr]) [th])++-- | Compile [e1,e2..e3] arithmetic sequences.+compileEnumFromThenTo :: Exp -> Exp -> Exp -> Compile JsExp+compileEnumFromThenTo a b z = do+  fr <- compileExp a+  th <- compileExp b+  to <- compileExp z+  name <- resolveName "enumFromThenTo"+  cfg <- gets stateConfig+  return $ case optEnumFromThenTo cfg fr th to of+    Just s -> s+    _ -> JsApp (JsApp (JsApp (JsName (JsNameVar name)) [fr]) [th]) [to]++-- | Optimize short literal [e1,e2..e3] arithmetic sequences.+optEnumFromThenTo :: CompileConfig -> JsExp -> JsExp -> JsExp -> Maybe JsExp+optEnumFromThenTo cfg (JsLit fr) (JsLit th) (JsLit to) =+  if configOptimize cfg+  then case (fr,th,to) of+    (JsInt frl, JsInt thl, JsInt tol) -> strict JsInt frl thl tol+    (JsFloating frl, JsFloating thl, JsFloating tol) -> strict JsFloating frl thl tol+    _ -> Nothing+  else Nothing+    where strict :: (Enum a, Ord a, Num a) => (a -> JsLit) -> a -> a -> a -> Maybe JsExp+          strict litfn fr th to =+            if (fromEnum to - fromEnum fr) `div`+               (fromEnum th - fromEnum fr) + 1 < maxStrictASLen+            then Just . makeList . map (JsLit . litfn) $ Stdlib.enumFromThenTo fr th to+            else Nothing+optEnumFromThenTo _ _ _ _ = Nothing
src/Language/Fay/FFI.hs view
@@ -2,7 +2,11 @@ {-# LANGUAGE NoImplicitPrelude    #-} {-# LANGUAGE TypeSynonymInstances #-} -module Language.Fay.FFI where+module Language.Fay.FFI+  (Fay+  ,Foreign+  ,ffi)+  where  import           Language.Fay.Types (Fay) import           Prelude            (Bool, Char, Double, String, Int, Maybe, error)
src/Language/Fay/Prelude.hs view
@@ -38,8 +38,8 @@ import           Language.Fay.Types  (Fay) import           Data.Data import           Prelude             (Bool(..), Char, Double, Eq(..), Int, Integer, Maybe(..), Monad,- Ord, Read(..), Show(), String, error, read, (&&), (*), (+), (-),- (/), (/=), (<), (<=), (==), (>), (>=), (||))+                                      Ord, Read(..), Show(), String, read, (&&), (*), (+), (-),+                                      (/), (/=), (<), (<=), (==), (>), (>=), (||))  (>>) :: Fay a -> Fay b -> Fay b (>>) = error "Language.Fay.Prelude.(>>): Used (>>) outside JS."
src/Language/Fay/Stdlib.hs view
@@ -1,67 +1,179 @@-{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE NoImplicitPrelude         #-} module Language.Fay.Stdlib   (($)+  ,($!)+  ,(!!)   ,(++)   ,(.)   ,(=<<)+  ,(**)+  ,(^^)+  ,(^)   ,Defined(..)+  ,Either(..)   ,Ordering(..)-  ,show-  ,fromInteger-  ,fromRational+  ,abs+  ,acos+  ,acosh+  ,all+  ,and   ,any+  ,asin+  ,asinh+  ,asTypeOf+  ,atan+  ,atanh+  ,break+  ,ceiling   ,compare   ,concat   ,concatMap   ,const+  ,cos+  ,cosh+  ,curry+  ,cycle+  ,div+  ,divMod+  ,drop+  ,dropWhile+  ,either   ,elem   ,enumFrom+  ,enumFromThen+  ,enumFromThenTo   ,enumFromTo-  ,fromIntegral+  ,error+  ,even+  ,exp   ,filter   ,find   ,flip+  ,floor   ,foldl+  ,foldl1   ,foldr+  ,foldr1   ,forM_+  ,fromInteger+  ,fromIntegral+  ,fromRational   ,fst-  ,length-  ,mod+  ,gcd+  ,head+  ,id+  ,init   ,insertBy   ,intercalate   ,intersperse+  ,iterate+  ,last+  ,lcm+  ,length+  ,lines+  ,log+  ,logBase   ,lookup   ,map   ,mapM_+  ,max+  ,maximum   ,maybe+  ,min+  ,minimum+  ,mod+  ,negate   ,not+  ,notElem   ,nub   ,null+  ,odd+  ,or   ,otherwise+  ,pi+  ,pred   ,prependToAll+  ,print+  ,product+  ,properFraction+  ,putStrLn+  ,quot+  ,quotRem+  ,recip+  ,rem+  ,repeat+  ,replicate   ,reverse+  ,round+  ,scanl+  ,scanl1+  ,scanr+  ,scanr1+  ,seq   ,sequence+  ,sequence_+  ,show+  ,signum+  ,sin+  ,sinh   ,snd   ,sort   ,sortBy+  ,span+  ,splitAt+  ,sqrt+  ,subtract+  ,succ+  ,sum+  ,tail+  ,take+  ,takeWhile+  ,tan+  ,tanh+  ,truncate+  ,uncurry+  ,undefined+  ,unlines+  ,until+  ,unwords+  ,unzip+  ,unzip3   ,when+  ,words   ,zip+  ,zip3   ,zipWith-  ,max-  ,min)+  ,zipWith3)   where  import           Language.Fay.FFI import           Prelude          (Bool (..), Double, Eq (..), Fractional, Int,-                                   Integer, Maybe (..), Monad (..), Num ((+)),-                                   Ord ((>), (<)), Rational, Show, String, (||))+                                   Integer, Maybe (..), Monad (..),+                                   Num ((+), (-), (*)), Fractional ((/)),+                                   Ord ((>), (<)), Rational, Show, String,+                                   (&&), (||), seq) -show :: (Foreign a,Show a) => a -> String+error :: String -> a+error str = case error' str of 0 -> error str ; _ -> error str++error' :: String -> Int+error' = ffi "(function() { throw %1 })()"++undefined :: a+undefined = error "Prelude.undefined"++show :: (Foreign a, Show a) => a -> String show = ffi "JSON.stringify(%1)"  data Defined a = Undefined | Defined a instance Foreign a => Foreign (Defined a) +data Either a b = Left a | Right b++either :: (a -> c) -> (b -> c) -> Either a b -> c+either f _ (Left a) = f a+either _ g (Right b) = g b+ -- There is only Double in JS. fromInteger :: a -> a fromInteger x = x@@ -69,6 +181,124 @@ fromRational :: a -> a fromRational x = x +negate :: Num a => a -> a+negate x = (-x)++abs :: (Num a, Ord a) => a -> a+abs x = if x < 0 then negate x else x++signum :: (Num a, Ord a) => a -> a+signum x = if x > 0 then 1 else if x == 0 then 0 else -1++pi :: Double+pi = ffi "Math.PI"++exp :: Double -> Double+exp = ffi "Math.exp(%1)"++sqrt :: Double -> Double+sqrt = ffi "Math.sqrt(%1)"++log :: Double -> Double+log = ffi "Math.log(%1)"++(**) :: Double -> Double -> Double+(**) = unsafePow+infixr 8 **++(^^) :: Double -> Int -> Double+(^^) = unsafePow+infixr 8 ^^++unsafePow :: (Foreign a, Num a, Foreign b, Num b) => a -> b -> a+unsafePow = ffi "Math.pow(%1,%2)"++(^) :: Num a => a -> Int -> a+a ^ b | b < 0  = error "(^): negative exponent"+      | b == 0 = 1+      | even b = let x = a ^ (b `quot` 2) in x * x+a ^ b          = a * a ^ (b - 1)+infixr 8 ^++logBase :: Double -> Double -> Double+logBase b x = log x / log b++sin :: Double -> Double+sin = ffi "Math.sin(%1)"++tan :: Double -> Double+tan = ffi "Math.tan(%1)"++cos :: Double -> Double+cos = ffi "Math.cos(%1)"++asin :: Double -> Double+asin = ffi "Math.asin(%1)"++atan :: Double -> Double+atan = ffi "Math.atan(%1)"++acos :: Double -> Double+acos = ffi "Math.acos(%1)"++sinh :: Double -> Double+sinh x = (exp x - exp (-x)) / 2++tanh :: Double -> Double+tanh x = let a = exp x ; b = exp (-x) in (a - b) / (a + b)++cosh :: Double -> Double+cosh x = (exp x + exp (-x)) / 2++asinh :: Double -> Double+asinh x = log (x + sqrt(x**2 + 1))++atanh :: Double -> Double+atanh x = log ((1 + x) / (1 - x)) / 2++acosh :: Double -> Double+acosh x = log (x + sqrt (x**2 - 1))++properFraction :: Double -> (Int, Double)+properFraction x = let a = truncate x in (a, x - fromIntegral a)++truncate :: Double -> Int+truncate x = if x < 0 then ceiling x else floor x++round :: Double -> Int+round = ffi "Math.round(%1)"++ceiling :: Double -> Int+ceiling = ffi "Math.ceil(%1)"++floor :: Double -> Int+floor = ffi "Math.floor(%1)"++subtract :: Num a => a -> a -> a+subtract = flip (-)++even :: Int -> Bool+even x = x `rem` 2 == 0++odd :: Int -> Bool+odd x = not (even x)++gcd :: Int -> Int -> Int+gcd a b = go (abs a) (abs b)+  where go x 0 = x+        go x y = go y (x `rem` y)++lcm :: Int -> Int -> Int+lcm _ 0 = 0+lcm 0 _ = 0+lcm a b = abs ((a `quot` (gcd a b)) * b)++curry :: ((a, b) -> c) -> a -> b -> c+curry f x y = f (x, y)++uncurry :: (a -> b -> c) -> (a, b) -> c+uncurry f p = case p of (x, y) -> f x y+ snd :: (t, t1) -> t1 snd (_,x) = x @@ -79,10 +309,6 @@ find p (x:xs) = if p x then Just x else find p xs find _ [] = Nothing -any :: (t -> Bool) -> [t] -> Bool-any p (x:xs) = if p x then True else any p xs-any _ [] = False- filter :: (a -> Bool) -> [a] -> [a] filter p (x:xs) = if p x then x : filter p xs else filter p xs filter _ []     = []@@ -112,6 +338,9 @@ elem x (y:ys)   = x == y || elem x ys elem _ []       = False +notElem :: Eq a => a -> [a] -> Bool+notElem x ys = not (elem x ys)+ data Ordering = GT | LT | EQ  sort :: Ord a => [a] -> [a]@@ -142,23 +371,75 @@ when :: Monad m => Bool -> m a -> m () when p m = if p then m >> return () else return () +succ :: Num a => a -> a+succ x = x + 1++pred :: Num a => a -> a+pred x = x - 1+ enumFrom :: Num a => a -> [a] enumFrom i = i : enumFrom (i + 1) -enumFromTo :: (Eq t, Num t) => t -> t -> [t]+enumFromTo :: (Ord t, Num t) => t -> t -> [t] enumFromTo i n =-  if i == n-     then [i]-     else i : enumFromTo (i + 1) n+  if i > n then [] else i : enumFromTo (i + 1) n -zipWith :: (a->b->c) -> [a]->[b]->[c]+enumFromBy :: (Num t) => t -> t -> [t]+enumFromBy fr by = fr : enumFromBy (fr + by) by++enumFromThen :: (Num t) => t -> t -> [t]+enumFromThen fr th = enumFromBy fr (th - fr)++enumFromByTo :: (Ord t, Num t) => t -> t -> t -> [t]+enumFromByTo fr by to = if by < 0 then neg fr else pos fr+  where neg x = if x < to then [] else x : neg (x + by)+        pos x = if x > to then [] else x : pos (x + by)++enumFromThenTo :: (Ord t, Num t) => t -> t -> t -> [t]+enumFromThenTo fr th to = enumFromByTo fr (th - fr) to++zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] zipWith f (a:as) (b:bs) = f a b : zipWith f as bs zipWith _ _      _      = [] +zipWith3 :: (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]+zipWith3 f (a:as) (b:bs) (c:cs) = f a b c : zipWith3 f as bs cs+zipWith3 _ _      _      _      = []+ zip :: [a] -> [b] -> [(a,b)] zip (a:as) (b:bs) = (a,b) : zip as bs zip _      _      = [] +zip3 :: [a] -> [b] -> [c] -> [(a, b, c)]+zip3 (a:as) (b:bs) (c:cs) = (a,b,c) : zip3 as bs cs+zip3 _      _      _      = []++unzip :: [(a, b)] -> ([a], [b])+unzip ((x,y):ps) = case unzip ps of (xs,ys) -> (x:xs, y:ys)+unzip []         = ([], [])++unzip3 :: [(a, b, c)] -> ([a], [b], [c])+unzip3 ((x,y,z):ps) = case unzip3 ps of (xs,ys,zs) -> (x:xs, y:ys, z:zs)+unzip3 []           = ([], [], [])++lines :: String -> [String]+lines []   = []+lines s    = case break isLineBreak s of (a, [])   -> [a]+                                         (a, _:cs) -> a : lines cs+  where isLineBreak c = c == '\r' || c == '\n'++unlines :: [String] -> String+unlines = intercalate "\n"++words :: String -> [String]+words str = words' (dropWhile isSpace str)+  where words' []  = []+        words' s = case break isSpace s of (a,b) -> a : words b+        isSpace c  = c `elem` " \t\r\n\f\v"++unwords :: [String] -> String+unwords = intercalate " "+ flip :: (t1 -> t2 -> t) -> t2 -> t1 -> t flip f x y = f y x @@ -168,6 +449,7 @@  (.) :: (t1 -> t) -> (t2 -> t1) -> t2 -> t (f . g) x = f (g x)+infixr 9 .  (++) :: [a] -> [a] -> [a] x ++ y = conc x y@@ -192,10 +474,70 @@ foldr _ z []     = z foldr f z (x:xs) = f x (foldr f z xs) +foldr1 :: (a -> a -> a) -> [a] -> a+foldr1 _ [x]    = x+foldr1 f (x:xs) = f x (foldr1 f xs)+foldr1 _ []     = error "foldr1: empty list"+ foldl :: (t1 -> t -> t1) -> t1 -> [t] -> t1 foldl _ z []     = z foldl f z (x:xs) = foldl f (f z x) xs +foldl1 :: (a -> a -> a) -> [a] -> a+foldl1 f (x:xs) = foldl f x xs+foldl1 _ []     = error "foldl1: empty list"++and :: [Bool] -> Bool+and []     = True+and (x:xs) = x && and xs++or :: [Bool] -> Bool+or []     = False+or (x:xs) = x || or xs++any :: (a -> Bool) -> [a] -> Bool+any _ []     = False+any p (x:xs) = p x || any p xs++all :: (a -> Bool) -> [a] -> Bool+all _ []     = True+all p (x:xs) = p x && all p xs++maximum :: (Num a, Foreign a) => [a] -> a+maximum [] = error "maximum: empty list"+maximum xs = foldl1 max xs++minimum :: (Num a, Foreign a) => [a] -> a+minimum [] = error "minimum: empty list"+minimum xs = foldl1 min xs++product :: Num a => [a] -> a+product [] = error "product: empty list"+product xs = foldl (*) 1 xs++sum :: Num a => [a] -> a+sum [] = error "sum: empty list"+sum xs = foldl (+) 0 xs++scanl :: (a -> b -> a) -> a -> [b] -> [a]+scanl f z l = z : case l of [] -> []+                            (x:xs) -> scanl f (f z x) xs++scanl1 :: (a -> a -> a) -> [a] -> [a]+scanl1 _ [] = []+scanl1 f (x:xs) = scanl f x xs++scanr :: (a -> b -> b) -> b -> [a] -> [b]+scanr _ z [] = [z]+scanr f z (x:xs) = case scanr f z xs of (h:t) -> f x h : h : t+                                        _     -> undefined++scanr1 :: (a -> a -> a) -> [a] -> [a]+scanr1 _ []     = []+scanr1 _ [x]    = [x]+scanr1 f (x:xs) = case scanr1 f xs of (h:t) -> f x h : h : t+                                      _     -> undefined+ lookup :: Eq a1 => a1 -> [(a1, a)] -> Maybe a lookup _key []          =  Nothing lookup  key ((x,y):xys) =@@ -228,18 +570,56 @@ length :: [a] -> Int length xs = length' 0 xs +length' :: Int -> [a] -> Int length' acc (_:xs) = length' (acc+1) xs length' acc _ = acc -mod :: Double -> Double -> Double-mod = ffi "%1 %% %2"+rem :: Int -> Int -> Int+rem x y = if y == 0 then error "Division by zero" else rem' x y+infixl 7 `rem` -min :: Double -> Double -> Double+rem' :: Int -> Int -> Int+rem' = ffi "%1 %% %2"++quot :: Int -> Int -> Int+quot x y = if y == 0 then error "Division by zero" else quot' x y+infixl 7 `quot`++quot' :: Int -> Int -> Int+quot' = ffi "~~(%1/%2)"++quotRem :: Int -> Int -> (Int, Int)+quotRem x y = (quot x y, rem x y)++div :: Int -> Int -> Int+div x y+  | x > 0 && y < 0 = quot (x-1) y - 1+  | x < 0 && y > 0 = quot (x+1) y - 1+div x y            = quot x y+infixl 7 `div`++mod :: Int -> Int -> Int+mod x y+  | x > 0 && y < 0 = rem (x-1) y + y + 1+  | x < 0 && y > 0 = rem (x+1) y + y - 1+mod x y            = rem x y+infixl 7 `mod`++divMod :: Int -> Int -> (Int, Int)+divMod x y+  | x > 0 && y < 0 = case (x-1) `quotRem` y of (q,r) -> (q-1, r+y+1)+  | x < 0 && y > 1 = case (x+1) `quotRem` y of (q,r) -> (q-1, r+y-1)+divMod x y         = quotRem x y++min :: (Num a, Foreign a) => a -> a -> a min = ffi "Math.min(%1,%2)" -max :: Double -> Double -> Double+max :: (Num a, Foreign a) => a -> a -> a max = ffi "Math.max(%1,%2)" +recip :: Double -> Double+recip x = 1 / x+ fromIntegral :: Int -> Double fromIntegral = ffi "%1" @@ -261,3 +641,99 @@ sequence ms = foldr k (return []) ms             where               k m m' = do { x <- m; xs <- m'; return (x:xs) }++sequence_ :: Monad m => [m a] -> m ()+sequence_ []     = return ()+sequence_ (m:ms) = m >> sequence_ ms++id :: a -> a+id x = x++asTypeOf :: a -> a -> a+asTypeOf = const++until :: (a -> Bool) -> (a -> a) -> a -> a+until p f x = if p x then x else until p f (f x)++($!) :: (a -> b) -> a -> b+f $! x = x `seq` f x+infixr 0 $!++(!!) :: [a] -> Int -> a+a !! b = if b < 0 then error "(!!): negative index" else go a b+  where go []    _ = error "(!!): index too large"+        go (h:_) 0 = h+        go (_:t) n = go t (n-1)+infixl 9 !!++head :: [a] -> a+head []    = error "head: empty list"+head (h:_) = h++tail :: [a] -> [a]+tail []    = error "tail: empty list"+tail (_:t) = t++init :: [a] -> [a]+init []    = error "init: empty list"+init [a]   = [a]+init (h:t) = h : init t++last :: [a] -> a+last []    = error "last: empty list"+last [a]   = a+last (_:t) = last t++iterate :: (a -> a) -> a -> [a]+iterate f x = x : iterate f (f x)++repeat :: a -> [a]+repeat x = x : repeat x++replicate :: Int -> a -> [a]+replicate 0 _ = []+replicate n x = if n < 0 then error "replicate: negative length"+                         else x : replicate (n-1) x++cycle :: [a] -> [a]+cycle [] = error "cycle: empty list"+cycle xs = xs' where xs' = xs ++ xs'++take :: Int -> [a] -> [a]+take 0 _  = []+take _ [] = []+take n (x:xs) = if n < 0 then error "take: negative length"+                         else x : take (n-1) xs++drop :: Int -> [a] -> [a]+drop 0 xs = xs+drop _ [] = []+drop n (_:xs) = if n < 0 then error "drop: negative length"+                         else drop (n-1) xs++splitAt :: Int -> [a] -> ([a], [a])+splitAt 0 xs     = ([], xs)+splitAt _ []     = ([], [])+splitAt n (x:xs) = if n < 0 then error "splitAt: negative length"+                            else case splitAt (n-1) xs of (a,b) -> (x:a, b)++takeWhile :: (a -> Bool) -> [a] -> [a]+takeWhile _ []     = []+takeWhile p (x:xs) = if p x then x : takeWhile p xs else []++dropWhile :: (a -> Bool) -> [a] -> [a]+dropWhile _ []     = []+dropWhile p (x:xs) = if p x then dropWhile p xs else x:xs++span :: (a -> Bool) -> [a] -> ([a], [a])+span _ []     = ([], [])+span p (x:xs) = if p x then case span p xs of (a,b) -> (x:a, b) else ([], x:xs)++break :: (a -> Bool) -> [a] -> ([a], [a])+break p = span (not . p)++print :: (Foreign a) => a -> Fay ()+print = ffi "(function(x) { if (console && console.log) console.log(x) })(%1)"++putStrLn :: String -> Fay ()+putStrLn = ffi "(function(x) { if (console && console.log) console.log(x) })(%1)"
src/Language/Fay/Types.hs view
@@ -120,7 +120,7 @@   ,(Symbol ">>=",[ScopeImported "Fay$" (Just "bind")])   ,(Ident "return",[ScopeImported "Fay$" (Just "return")])   ,(Ident "force",[ScopeImported "Fay$" (Just "force")])-  ,(Symbol "*",[ScopeImported "Fay$" (Just "mult")])+  ,(Ident "seq",[ScopeImported "Fay$" (Just "seq")])   ,(Symbol "*",[ScopeImported "Fay$" (Just "mult")])   ,(Symbol "+",[ScopeImported "Fay$" (Just "add")])   ,(Symbol "-",[ScopeImported "Fay$" (Just "sub")])
src/Tests.hs view
@@ -27,19 +27,23 @@ -- | Make the case-by-case unit tests. makeCompilerTests :: IO Test makeCompilerTests = do-  files <- fmap (map ("tests" </>) . sort . filter dotHs) $ getDirectoryContents "tests"-  return $ testGroup "Tests" $ flip map files $ \file ->-    testCase file $ do-      let root = (reverse . drop 1 . dropWhile (/='.') . reverse) file-          out = toJsName file-      outExists <- doesFileExist root-      compileFromTo def { configTypecheck = False, configDirectoryIncludes = ["tests/"] } file (Just out)-      result <- runJavaScriptFile out-      if outExists-         then do output <- readFile root-                 assertEqual file output (either show id result)-         else assertEqual file True (either (const True) (const False) result)-  where dotHs = isSuffixOf ".hs"+  files <- fmap (map ("tests" </>) . sort . filter (isSuffixOf ".hs")) $ getDirectoryContents "tests"+  return $ testGroup "Tests" $ flip map files $ \file -> testCase file $ do+    testFile False file+    testFile True file++testFile :: Bool -> String -> IO ()+testFile opt file = do+  let root = (reverse . drop 1 . dropWhile (/='.') . reverse) file+      out = toJsName file+      config = def { configOptimize = opt }+  outExists <- doesFileExist root+  compileFromTo config { configTypecheck = False, configDirectoryIncludes = ["tests/"] } file (Just out)+  result <- runJavaScriptFile out+  if outExists+     then do output <- readFile root+             assertEqual file output (either show id result)+     else assertEqual file True (either (const True) (const False) result)  -- | Run a JS file. runJavaScriptFile :: String -> IO (Either String String)
tests/Bool.hs view
@@ -1,12 +1,5 @@---module Bool where--import           Language.Fay.FFI import           Language.Fay.Prelude  main :: Fay () main = print True -print :: Bool -> Fay ()-print = ffi "console.log(%1)"
tests/Double.hs view
@@ -1,11 +1,4 @@---module Double where--import           Language.Fay.FFI import           Language.Fay.Prelude  main = print (2 * 4 / 2) -print :: Double -> Fay ()-print = ffi "console.log(%1)"
tests/Double2.hs view
@@ -1,11 +1,4 @@---module Double2 where--import           Language.Fay.FFI import           Language.Fay.Prelude  main = print (10 + (2 * (4 / 2))) -print :: Double -> Fay ()-print = ffi "console.log(%1)"
tests/Double3.hs view
@@ -1,11 +1,4 @@---module Double3 where--import           Language.Fay.FFI import           Language.Fay.Prelude  main = print (5 * 3 / 2) -print :: Double -> Fay ()-print = ffi "console.log(%1)"
tests/Double4.hs view
@@ -1,11 +1,4 @@---module Double4 where--import           Language.Fay.FFI import           Language.Fay.Prelude  main = print 1 -print :: Double -> Fay ()-print = ffi "console.log(%1)"
tests/HierarchicalImport.hs view
@@ -1,14 +1,6 @@---module HierarchicalImport where--import           Language.Fay.FFI import           Language.Fay.Prelude- import           Hierarchical.Export  main :: Fay ()-main = printS exported+main = putStrLn exported -printS :: String -> Fay ()-printS = ffi "console.log(%1)"
tests/List.hs view
@@ -1,11 +1,7 @@---module List where- import           Language.Fay.FFI import           Language.Fay.Prelude -main = print (showList (take 5 (let ns = 1 : map' (\x -> x + 1) ns in ns)))+main = putStrLn (showList (take 5 (let ns = 1 : map' (\x -> x + 1) ns in ns)))  take 0 _      = [] take n (x:xs) = x : take (n - 1) xs@@ -13,8 +9,5 @@ map' f []     = [] map' f (x:xs) = f x : map' f xs -print :: String -> Fay ()-print = ffi "console.log(%1)"--showList :: [Double] -> String+showList :: [a] -> String showList = ffi "JSON.stringify(%1)"
tests/List2.hs view
@@ -1,11 +1,7 @@---module List2 where- import           Language.Fay.FFI import           Language.Fay.Prelude -main = print (showList (take 5 (let ns = 1 : map' (foo 123) ns in ns)))+main = putStrLn (showList (take 5 (let ns = 1 : map' (foo 123) ns in ns)))  foo x y = x * y / 2 @@ -14,9 +10,6 @@  map' f []     = [] map' f (x:xs) = f x : map' f xs--print :: String -> Fay ()-print = ffi "console.log(%1)"  showList :: [Double] -> String showList = ffi "JSON.stringify(%1)"
tests/Monad.hs view
@@ -1,11 +1,7 @@ {-# LANGUAGE EmptyDataDecls    #-} - -- | Monads test. -module Monad where--import           Language.Fay.FFI import           Language.Fay.Prelude  main :: Fay ()@@ -18,5 +14,3 @@   print x   print y -print :: Double -> Fay ()-print = ffi "console.log(%1)"
tests/Monad2.hs view
@@ -4,18 +4,12 @@  -- | Monads test. -module Monad2 where--import           Language.Fay.FFI import           Language.Fay.Prelude  main :: Fay () main = do   -- State monad test-  return (let result = runState demo 60 in fst result ++ ": " ++ show (snd result)) >>= print--print :: String -> Fay ()-print = ffi "console.log(%1)"+  return (let result = runState demo 60 in fst result ++ ": " ++ show (snd result)) >>= putStrLn  -------------------------------------------------------------------------------- -- A monad interface
tests/RecCon.hs view
@@ -1,16 +1,8 @@---module RecCon where--import           Language.Fay.FFI import           Language.Fay.Prelude  data Bool = True | False  main = print (head (fix (\xs -> 123 : xs)))--print :: Double -> Fay ()-print = ffi "console.log(%1)"  head (x:xs) = x 
tests/RecDecl.hs view
@@ -1,7 +1,3 @@---module RecDecl where- import           Language.Fay.FFI import           Language.Fay.Prelude @@ -49,8 +45,8 @@   print r''    print r1-  printS (show (i r1))-  printS (show (c r1))+  putStrLn (show (i r1))+  putStrLn (show (c r1))   print r2   print r'   print r3@@ -58,8 +54,3 @@   print x1   print x2 -printS :: String -> Fay ()-printS = ffi "console.log(%1)"--print :: Foreign f => f -> Fay ()-print = ffi "console.log(%1)"
tests/RecordImport_Export.hs view
@@ -1,5 +1,3 @@-- module RecordImport_Export where  import           Language.Fay.Prelude
tests/RecordImport_Import.hs view
@@ -1,8 +1,3 @@---module RecordImport_Import where--import           Language.Fay.FFI import           Language.Fay.Prelude  import           RecordImport_Export@@ -20,10 +15,7 @@ showFields :: Fields -> String showFields (Fields a b) = "Fields " ++ show a ++ " " ++ show b -printS :: String -> Fay ()-printS = ffi "console.log(%1)"- main = do-  printS $ showR $ R 1-  printS $ showFields $ Fields { fieldFoo = 2, fieldBar = 3 }+  putStrLn $ showR $ R 1+  putStrLn $ showFields $ Fields { fieldFoo = 2, fieldBar = 3 } 
tests/String.hs view
@@ -1,11 +1,4 @@---module String where--import           Language.Fay.FFI import           Language.Fay.Prelude -main = print "Hello, World!"+main = putStrLn "Hello, World!" -print :: String -> Fay ()-print = ffi "console.log(%1)"
tests/asPatternMatch view
@@ -1,3 +1,6 @@-{"car":{"car":1,"cdr":{"car":2,"cdr":{"car":3,"cdr":null}}},"cdr":{"car":{"car":1,"cdr":{"car":2,"cdr":{"car":3,"cdr":null}}},"cdr":null}}-{"car":{"car":1,"cdr":{"car":2,"cdr":{"car":3,"cdr":null}}},"cdr":{"car":1,"cdr":{"car":{"car":2,"cdr":{"car":3,"cdr":null}},"cdr":null}}}-{"car":{"car":1,"cdr":{"car":2,"cdr":{"car":3,"cdr":null}}},"cdr":{"car":1,"cdr":{"car":{"car":2,"cdr":{"car":3,"cdr":null}},"cdr":null}}}+{ car: { car: 1, cdr: { car: 2, cdr: [Object] } },+  cdr: { car: { car: 1, cdr: [Object] }, cdr: null } }+{ car: { car: 1, cdr: { car: 2, cdr: [Object] } },+  cdr: { car: 1, cdr: { car: [Object], cdr: null } } }+{ car: { car: 1, cdr: { car: 2, cdr: [Object] } },+  cdr: { car: 1, cdr: { car: [Object], cdr: null } } }
tests/asPatternMatch.hs view
@@ -1,8 +1,3 @@---module AsPatternMatch where--import           Language.Fay.FFI import           Language.Fay.Prelude  matchSame :: [a] -> ([a],[a])@@ -14,11 +9,8 @@ matchNested :: (a, [b]) -> ([b],b,[b]) matchNested (a,b@(x:xs)) = (b,x,xs) -print :: String -> Fay ()-print = ffi "console.log(%1)"- main :: Fay () main = do-  print $ show $ matchSame [1,2,3]-  print $ show $ matchSplit [1,2,3]-  print $ show $ matchNested (1, [1,2,3])+  print $ matchSame [1,2,3]+  print $ matchSplit [1,2,3]+  print $ matchNested (1, [1,2,3])
tests/basicFunctions.hs view
@@ -1,11 +1,6 @@---module BasicFunctions where--import           Language.Fay.FFI import           Language.Fay.Prelude -main = print (concat' ["Hello, ","World!"])+main = putStrLn (concat' ["Hello, ","World!"])  concat' = foldr' append [] @@ -15,5 +10,3 @@ append (x:xs) ys = x : append xs ys append []     ys = ys -print :: String -> Fay ()-print = ffi "console.log(%1)"
tests/case.hs view
@@ -1,13 +1,6 @@---module Case where--import           Language.Fay.FFI import           Language.Fay.Prelude -main = print (case True of-               True -> "Hello!"-               False -> "Ney!")+main = putStrLn (case True of+                   True -> "Hello!"+                   False -> "Ney!") -print :: String -> Fay ()-print = ffi "console.log(%1)"
tests/case2.hs view
@@ -1,13 +1,6 @@---module Case2 where--import           Language.Fay.FFI import           Language.Fay.Prelude -main = print (case False of-               True -> "Hello!"-               False -> "Ney!")+main = putStrLn (case False of+                   True -> "Hello!"+                   False -> "Ney!") -print :: String -> Fay ()-print = ffi "console.log(%1)"
tests/caseList.hs view
@@ -1,15 +1,8 @@---module CaseList where--import           Language.Fay.FFI import           Language.Fay.Prelude -main = print (case [1,2,3,4,5] of+main = putStrLn (case [1,2,3,4,5] of   [1,2,3,4,6] -> "6!"   [1,2,4,2,4] -> "a!"   [1,2,3,4,5] -> "OK."   _           -> "Broken.") -print :: String -> Fay ()-print = ffi "console.log(%1)"
tests/caseWildcard.hs view
@@ -1,13 +1,6 @@---module CaseWildCard where--import           Language.Fay.FFI import           Language.Fay.Prelude -main = print (case False of-               True -> "Hello!"-               _    -> "Ney!")+main = putStrLn (case False of+                  True -> "Hello!"+                  _    -> "Ney!") -print :: String -> Fay ()-print = ffi "console.log(%1)"
tests/do.hs view
@@ -1,11 +1,4 @@---module Do where--import           Language.Fay.FFI import           Language.Fay.Prelude -main = do print "Hello,"; print "World!"+main = do putStrLn "Hello,"; putStrLn "World!" -print :: String -> Fay ()-print = ffi "console.log(%1)"
tests/doAssingPatternMatch.hs view
@@ -1,13 +1,6 @@---module DoAssignPatternMatch where--import           Language.Fay.FFI import           Language.Fay.Prelude  main = do   [1,2] <- return [1,2]-  print "OK."+  putStrLn "OK." -print :: String -> Fay ()-print = ffi "console.log(%1)"
tests/doBindAssign.hs view
@@ -1,13 +1,6 @@---module DoBindAssign where--import           Language.Fay.FFI import           Language.Fay.Prelude  main = do   x <- return "Hello, World!" >>= return-  print x+  putStrLn x -print :: String -> Fay ()-print = ffi "console.log(%1)"
tests/emptyMain.hs view
@@ -1,8 +1,3 @@---module EmptyMain where--import           Language.Fay.FFI import           Language.Fay.Prelude  main = return ()
tests/fix.hs view
@@ -1,14 +1,6 @@---module Fix where--import           Language.Fay.FFI import           Language.Fay.Prelude  main = print (head (tail (fix (\xs -> 123 : xs))))--print :: Double -> Fay ()-print = ffi "console.log(%1)"  head (x:xs) = x 
tests/fromInteger.hs view
@@ -1,12 +1,4 @@---module FromInteger where--import           Language.Fay.FFI import           Language.Fay.Prelude -print :: String -> Fay ()-print = ffi "console.log(%1)"- main :: Fay ()-main = print $ show $ fromInteger 5+main = putStrLn $ show $ fromInteger 5
tests/infixDataConst.hs view
@@ -1,11 +1,5 @@---module Test where--import           Language.Fay.FFI import           Language.Fay.Prelude - data Ty1 = Integer `InfixConst1` Integer instance Foreign Ty1 @@ -19,5 +13,3 @@  main = print t -print :: Ty3 -> Fay ()-print = ffi "console.log(%1)"
tests/ints.hs view
@@ -1,13 +1,5 @@---module Ints where--import           Language.Fay.FFI import           Language.Fay.Prelude  main = do   print 123 --- | Print using console.log.-print :: Int -> Fay ()-print = ffi "console.log(%1)"
tests/mutableReference.hs view
@@ -2,9 +2,6 @@  {-# LANGUAGE EmptyDataDecls    #-} --module MutableReference where- import           Language.Fay.FFI import           Language.Fay.Prelude @@ -13,7 +10,7 @@   ref <- newRef "Hello, World!"   x <- readRef ref   writeRef ref "Hai!"-  readRef ref >>= print+  readRef ref >>= putStrLn  data Ref a instance Show (Ref a)@@ -28,5 +25,3 @@ readRef :: Foreign a => Ref a -> Fay a readRef = ffi "Fay$$readRef(%1)" -print :: String -> Fay ()-print = ffi "console.log(%1)"
tests/patternGuards view
@@ -1,3 +1,3 @@-[ true, false ]-[ 2, 1, 0 ]-[ true, false ]+[true,false]+[2,1,0]+[true,false]
tests/patternGuards.hs view
@@ -1,12 +1,9 @@ {-# LANGUAGE FlexibleInstances #-} --module PatternGuards where- -- | As pattern matches -import           Language.Fay.FFI import           Language.Fay.Prelude+import           Language.Fay.FFI  isPositive :: Double -> Bool isPositive x | x > 0 = True@@ -22,13 +19,12 @@ -- Not called, throws "non-exhaustive guard" nonExhaustive x | x > 1 = True -printD :: [Double] -> Fay ()-printD = ffi "console.log(%1)"-printB :: [Bool] -> Fay ()-printB = ffi "console.log(%1)"- main :: Fay () main = do-  printB [isPositive 1, isPositive 0]-  printD [threeConds 3, threeConds 1, threeConds 0]-  printB [withOtherwise 2, withOtherwise 0]+  putStrLn $ showList [isPositive 1, isPositive 0]+  putStrLn $ showList [threeConds 3, threeConds 1, threeConds 0]+  putStrLn $ showList [withOtherwise 2, withOtherwise 0]++showList :: [a] -> String+showList = ffi "JSON.stringify(%1)"+
tests/patternMatchFail.hs view
@@ -1,11 +1,4 @@---module PatternMatchFail where--import           Language.Fay.FFI import           Language.Fay.Prelude -main = print ((\a 'a' -> "OK.") 0 'b')+main = putStrLn ((\a 'a' -> "OK.") 0 'b') -print :: String -> Fay ()-print = ffi "console.log(%1)"
tests/recordFunctionPatternMatch.hs view
@@ -1,18 +1,11 @@---module RecordFunctionPatternMatch where--import           Language.Fay.FFI import           Language.Fay.Prelude  data Person = Person String String Int -main = print (foo (Person "Chris" "Done" 14))+main = putStrLn (foo (Person "Chris" "Done" 14))  foo (Person "Chris" "Done" 13) = "Foo!" foo (Person "Chris" "Barf" 14) = "Bar!" foo (Person "Chris" "Done" 14) = "Hello!" foo _ = "World!" -print :: String -> Fay ()-print = ffi "console.log(%1)"
tests/recordPatternMatch.hs view
@@ -1,15 +1,8 @@---module RecordPatternMatch where--import           Language.Fay.FFI import           Language.Fay.Prelude  data Person = Person String String Int -main = print (case Person "Chris" "Done" 14 of-                Person "Chris" "Done" 13 -> "Hello!"-                _ -> "World!")+main = putStrLn (case Person "Chris" "Done" 14 of+                   Person "Chris" "Done" 13 -> "Hello!"+                   _ -> "World!") -print :: String -> Fay ()-print = ffi "console.log(%1)"
tests/recordPatternMatch2.hs view
@@ -1,17 +1,10 @@---module RecordPatternMatch2 where--import           Language.Fay.FFI import           Language.Fay.Prelude  data Person = Person String String Int -main = print (case Person "Chris" "Done" 14 of-                Person "Chris" "Done" 13 -> "Foo!"-                Person "Chris" "Barf" 14 -> "Bar!"-                Person "Chris" "Done" 14 -> "Hello!"-                _ -> "World!")+main = putStrLn (case Person "Chris" "Done" 14 of+                   Person "Chris" "Done" 13 -> "Foo!"+                   Person "Chris" "Barf" 14 -> "Bar!"+                   Person "Chris" "Done" 14 -> "Hello!"+                   _ -> "World!") -print :: String -> Fay ()-print = ffi "console.log(%1)"
tests/recordUseBeforeDefine.hs view
@@ -1,8 +1,3 @@---module RecordUseBeforeDefine where--import           Language.Fay.FFI import           Language.Fay.Prelude  import           Hierarchical.RecordDefined@@ -16,5 +11,3 @@  data R = R Double -print :: Double -> Fay ()-print = ffi "console.log(%1)"
tests/records.hs view
@@ -1,8 +1,3 @@---module Records where--import           Language.Fay.FFI import           Language.Fay.Prelude  data Person1 = Person1 String String Int@@ -15,10 +10,8 @@ p3  = Person3 "Chris" "Done" 13  main = do-  print (case p1 of Person1 "Chris" "Done" 13 -> "Hello!")-  print (case p2 of Person2 "Chris" "Done" 13 -> "Hello!")-  print (case p2a of Person2 "Chris" "Done" 13 -> "Hello!")-  print (case p3 of Person3 "Chris" "Done" 13 -> "Hello!")+  putStrLn (case p1 of Person1 "Chris" "Done" 13 -> "Hello!")+  putStrLn (case p2 of Person2 "Chris" "Done" 13 -> "Hello!")+  putStrLn (case p2a of Person2 "Chris" "Done" 13 -> "Hello!")+  putStrLn (case p3 of Person3 "Chris" "Done" 13 -> "Hello!") -print :: String -> Fay ()-print = ffi "console.log(%1)"
tests/reservedWords.hs view
@@ -1,51 +1,46 @@ {-# LANGUAGE EmptyDataDecls    #-} --module ReservedWords where--import           Language.Fay.FFI import           Language.Fay.Prelude  main = do   -- All reserved words-  let break = "break" in printS break-  let catch = "catch" in printS catch-  let const = "const" in printS const-  let continue = "continue" in printS continue-  let debugger = "debugger" in printS debugger-  let delete = "delete" in printS delete-  let enum = "enum" in printS enum-  let export = "export" in printS export-  let extends = "extends" in printS extends-  let finally = "finally" in printS finally-  let for = "for" in printS for-  let function = "function" in printS function-  let implements = "implements" in printS implements-  let instanceof = "instanceof" in printS instanceof-  let interface = "interface" in printS interface-  let new = "new" in printS new-  let null = "null" in printS null-  let package = "package" in printS package-  let private = "private" in printS private-  let protected = "protected" in printS protected-  let public = "public" in printS public-  let return = "return" in printS return-  let static = "static" in printS static-  let super = "super" in printS super-  let switch = "switch" in printS switch-  let this = "this" in printS this-  let throw = "throw" in printS throw-  let try = "try" in printS try-  let typeof = "typeof" in printS typeof-  let undefined = "undefined" in printS undefined-  let var = "var" in printS var-  let void = "void" in printS void-  let while = "while" in printS while-  let with = "with" in printS with-  let yield = "yield" in printS yield+  let break = "break" in putStrLn break+  let catch = "catch" in putStrLn catch+  let const = "const" in putStrLn const+  let continue = "continue" in putStrLn continue+  let debugger = "debugger" in putStrLn debugger+  let delete = "delete" in putStrLn delete+  let enum = "enum" in putStrLn enum+  let export = "export" in putStrLn export+  let extends = "extends" in putStrLn extends+  let finally = "finally" in putStrLn finally+  let for = "for" in putStrLn for+  let function = "function" in putStrLn function+  let implements = "implements" in putStrLn implements+  let instanceof = "instanceof" in putStrLn instanceof+  let interface = "interface" in putStrLn interface+  let new = "new" in putStrLn new+  let null = "null" in putStrLn null+  let package = "package" in putStrLn package+  let private = "private" in putStrLn private+  let protected = "protected" in putStrLn protected+  let public = "public" in putStrLn public+  let return = "return" in putStrLn return+  let static = "static" in putStrLn static+  let super = "super" in putStrLn super+  let switch = "switch" in putStrLn switch+  let this = "this" in putStrLn this+  let throw = "throw" in putStrLn throw+  let try = "try" in putStrLn try+  let typeof = "typeof" in putStrLn typeof+  let undefined = "undefined" in putStrLn undefined+  let var = "var" in putStrLn var+  let void = "void" in putStrLn void+  let while = "while" in putStrLn while+  let with = "with" in putStrLn with+  let yield = "yield" in putStrLn yield -  printS ""+  putStrLn ""   -- Stdlib functions that need to be encoded-  printS $ const "stdconst" 2-printS :: String -> Fay ()-printS = ffi "console.log(%1)"+  putStrLn $ const "stdconst" 2+
tests/tailRecursion.hs view
@@ -1,17 +1,9 @@ -- | This is to test tail-recursive calls are iterative.----module Tail where--import           Language.Fay.FFI import           Language.Fay.Prelude  main = do-  print (sum 100000 0 :: Double)+  print (sumTo 100000 0 :: Double) -sum 0 acc = acc-sum n acc = sum (n - 1) (acc + n)+sumTo 0 acc = acc+sumTo n acc = sumTo (n - 1) (acc + n) -print :: Double -> Fay ()-print = ffi "console.log(%1)"
tests/then.hs view
@@ -1,11 +1,4 @@---module Then where--import           Language.Fay.FFI import           Language.Fay.Prelude -main = print "Hello," >> print "World!"+main = putStrLn "Hello," >> putStrLn "World!" -print :: String -> Fay ()-print = ffi "console.log(%1)"
tests/utf8.hs view
@@ -2,138 +2,133 @@  -- | Unicode test. -module Utf8 where--import           Language.Fay.FFI import           Language.Fay.Prelude  main :: Fay () main = do   -- Latin-1 Supplement-  printS "¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ"+  putStrLn "¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ"    -- Latin Extended-A-  printS "Ā ā Ă ă Ą ą Ć ć Ĉ ĉ Ċ ċ Č č Ď ď Đ đ Ē ē Ĕ ĕ Ė ė Ę ę Ě ě Ĝ ĝ Ğ ğ Ġ ġ Ģ ģ Ĥ ĥ Ħ ħ Ĩ ĩ Ī ī Ĭ ĭ Į į İ ı IJ ij Ĵ ĵ Ķ ķ ĸ Ĺ ĺ Ļ ļ Ľ ľ Ŀ ŀ Ł ł Ń ń Ņ ņ Ň ň ʼn Ŋ ŋ Ō ō Ŏ ŏ Ő ő Œ œ Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ŝ ŝ Ş ş Š š Ţ ţ Ť ť Ŧ ŧ Ũ ũ Ū ū Ŭ ŭ Ů ů Ű ű Ų ų Ŵ ŵ Ŷ ŷ Ÿ Ź ź Ż ż Ž ž ſ"+  putStrLn "Ā ā Ă ă Ą ą Ć ć Ĉ ĉ Ċ ċ Č č Ď ď Đ đ Ē ē Ĕ ĕ Ė ė Ę ę Ě ě Ĝ ĝ Ğ ğ Ġ ġ Ģ ģ Ĥ ĥ Ħ ħ Ĩ ĩ Ī ī Ĭ ĭ Į į İ ı IJ ij Ĵ ĵ Ķ ķ ĸ Ĺ ĺ Ļ ļ Ľ ľ Ŀ ŀ Ł ł Ń ń Ņ ņ Ň ň ʼn Ŋ ŋ Ō ō Ŏ ŏ Ő ő Œ œ Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ŝ ŝ Ş ş Š š Ţ ţ Ť ť Ŧ ŧ Ũ ũ Ū ū Ŭ ŭ Ů ů Ű ű Ų ų Ŵ ŵ Ŷ ŷ Ÿ Ź ź Ż ż Ž ž ſ"    -- Latin Extended-B-  printS "ƀ Ɓ Ƃ ƃ Ƅ ƅ Ɔ Ƈ ƈ Ɖ Ɗ Ƌ ƌ ƍ Ǝ Ə Ɛ Ƒ ƒ Ɠ Ɣ ƕ Ɩ Ɨ Ƙ ƙ ƚ ƛ Ɯ Ɲ ƞ Ɵ Ơ ơ Ƣ ƣ Ƥ ƥ Ʀ Ƨ ƨ Ʃ ƪ ƫ Ƭ ƭ Ʈ Ư ư Ʊ Ʋ Ƴ ƴ Ƶ ƶ Ʒ Ƹ ƹ ƺ ƻ Ƽ ƽ ƾ ƿ ǀ ǁ ǂ ǃ DŽ Dž dž LJ Lj lj NJ Nj nj Ǎ ǎ Ǐ ǐ Ǒ ǒ Ǔ ǔ Ǖ ǖ Ǘ ǘ Ǚ ǚ Ǜ ǜ ǝ Ǟ ǟ Ǡ ǡ Ǣ ǣ Ǥ ǥ Ǧ ǧ Ǩ ǩ Ǫ ǫ Ǭ ǭ Ǯ ǯ ǰ DZ Dz dz Ǵ ǵ Ǻ ǻ Ǽ ǽ Ǿ ǿ Ȁ ȁ Ȃ ȃ ..."+  putStrLn "ƀ Ɓ Ƃ ƃ Ƅ ƅ Ɔ Ƈ ƈ Ɖ Ɗ Ƌ ƌ ƍ Ǝ Ə Ɛ Ƒ ƒ Ɠ Ɣ ƕ Ɩ Ɨ Ƙ ƙ ƚ ƛ Ɯ Ɲ ƞ Ɵ Ơ ơ Ƣ ƣ Ƥ ƥ Ʀ Ƨ ƨ Ʃ ƪ ƫ Ƭ ƭ Ʈ Ư ư Ʊ Ʋ Ƴ ƴ Ƶ ƶ Ʒ Ƹ ƹ ƺ ƻ Ƽ ƽ ƾ ƿ ǀ ǁ ǂ ǃ DŽ Dž dž LJ Lj lj NJ Nj nj Ǎ ǎ Ǐ ǐ Ǒ ǒ Ǔ ǔ Ǖ ǖ Ǘ ǘ Ǚ ǚ Ǜ ǜ ǝ Ǟ ǟ Ǡ ǡ Ǣ ǣ Ǥ ǥ Ǧ ǧ Ǩ ǩ Ǫ ǫ Ǭ ǭ Ǯ ǯ ǰ DZ Dz dz Ǵ ǵ Ǻ ǻ Ǽ ǽ Ǿ ǿ Ȁ ȁ Ȃ ȃ ..."   -- IPA Extensions-  printS "ɐ ɑ ɒ ɓ ɔ ɕ ɖ ɗ ɘ ə ɚ ɛ ɜ ɝ ɞ ɟ ɠ ɡ ɢ ɣ ɤ ɥ ɦ ɧ ɨ ɩ ɪ ɫ ɬ ɭ ɮ ɯ ɰ ɱ ɲ ɳ ɴ ɵ ɶ ɷ ɸ ɹ ɺ ɻ ɼ ɽ ɾ ɿ ʀ ʁ ʂ ʃ ʄ ʅ ʆ ʇ ʈ ʉ ʊ ʋ ʌ ʍ ʎ ʏ ʐ ʑ ʒ ʓ ʔ ʕ ʖ ʗ ʘ ʙ ʚ ʛ ʜ ʝ ʞ ʟ ʠ ʡ ʢ ʣ ʤ ʥ ʦ ʧ ʨ"+  putStrLn "ɐ ɑ ɒ ɓ ɔ ɕ ɖ ɗ ɘ ə ɚ ɛ ɜ ɝ ɞ ɟ ɠ ɡ ɢ ɣ ɤ ɥ ɦ ɧ ɨ ɩ ɪ ɫ ɬ ɭ ɮ ɯ ɰ ɱ ɲ ɳ ɴ ɵ ɶ ɷ ɸ ɹ ɺ ɻ ɼ ɽ ɾ ɿ ʀ ʁ ʂ ʃ ʄ ʅ ʆ ʇ ʈ ʉ ʊ ʋ ʌ ʍ ʎ ʏ ʐ ʑ ʒ ʓ ʔ ʕ ʖ ʗ ʘ ʙ ʚ ʛ ʜ ʝ ʞ ʟ ʠ ʡ ʢ ʣ ʤ ʥ ʦ ʧ ʨ"   -- Spacing Modifier Letters-  printS "ʰ ʱ ʲ ʳ ʴ ʵ ʶ ʷ ʸ ʹ ʺ ʻ ʼ ʽ ʾ ʿ ˀ ˁ ˂ ˃ ˄ ˅ ˆ ˇ ˈ ˉ ˊ ˋ ˌ ˍ ˎ ˏ ː ˑ ˒ ˓ ˔ ˕ ˖ ˗ ˘ ˙ ˚ ˛ ˜ ˝ ˞ ˠ ˡ ˢ ˣ ˤ ˥ ˦ ˧ ˨ ˩"+  putStrLn "ʰ ʱ ʲ ʳ ʴ ʵ ʶ ʷ ʸ ʹ ʺ ʻ ʼ ʽ ʾ ʿ ˀ ˁ ˂ ˃ ˄ ˅ ˆ ˇ ˈ ˉ ˊ ˋ ˌ ˍ ˎ ˏ ː ˑ ˒ ˓ ˔ ˕ ˖ ˗ ˘ ˙ ˚ ˛ ˜ ˝ ˞ ˠ ˡ ˢ ˣ ˤ ˥ ˦ ˧ ˨ ˩"   -- Combining Diacritical Marks-  printS "̀ ́ ̂ ̃ ̄ ̅ ̆ ̇ ̈ ̉ ̊ ̋ ̌ ̍ ̎ ̏ ̐ ̑ ̒ ̓ ̔ ̕ ̖ ̗ ̘ ̙ ̚ ̛ ̜ ̝ ̞ ̟ ̠ ̡ ̢ ̣ ̤ ̥ ̦ ̧ ̨ ̩ ̪ ̫ ̬ ̭ ̮ ̯ ̰ ̱ ̲ ̳ ̴ ̵ ̶ ̷ ̸ ̹ ̺ ̻ ̼ ̽ ̾ ̿ ̀ ́ ͂ ̓ ̈́ ͅ ͠ ͡"+  putStrLn "̀ ́ ̂ ̃ ̄ ̅ ̆ ̇ ̈ ̉ ̊ ̋ ̌ ̍ ̎ ̏ ̐ ̑ ̒ ̓ ̔ ̕ ̖ ̗ ̘ ̙ ̚ ̛ ̜ ̝ ̞ ̟ ̠ ̡ ̢ ̣ ̤ ̥ ̦ ̧ ̨ ̩ ̪ ̫ ̬ ̭ ̮ ̯ ̰ ̱ ̲ ̳ ̴ ̵ ̶ ̷ ̸ ̹ ̺ ̻ ̼ ̽ ̾ ̿ ̀ ́ ͂ ̓ ̈́ ͅ ͠ ͡"   -- Greek-  printS "ʹ ͵ ͺ ; ΄ ΅ Ά · Έ Ή Ί Ό Ύ Ώ ΐ Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω Ϊ Ϋ ά έ ή ί ΰ α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ ς σ τ υ φ χ ψ ω ϊ ϋ ό ύ ώ ϐ ϑ ϒ ϓ ϔ ϕ ϖ Ϛ Ϝ Ϟ Ϡ Ϣ ϣ Ϥ ϥ Ϧ ϧ Ϩ ϩ Ϫ ϫ Ϭ ϭ Ϯ ϯ ϰ ϱ ϲ ϳ"+  putStrLn "ʹ ͵ ͺ ; ΄ ΅ Ά · Έ Ή Ί Ό Ύ Ώ ΐ Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω Ϊ Ϋ ά έ ή ί ΰ α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ ς σ τ υ φ χ ψ ω ϊ ϋ ό ύ ώ ϐ ϑ ϒ ϓ ϔ ϕ ϖ Ϛ Ϝ Ϟ Ϡ Ϣ ϣ Ϥ ϥ Ϧ ϧ Ϩ ϩ Ϫ ϫ Ϭ ϭ Ϯ ϯ ϰ ϱ ϲ ϳ"   -- Cyrillic-  printS "Ё Ђ Ѓ Є Ѕ І Ї Ј Љ Њ Ћ Ќ Ў Џ А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я ё ђ ѓ є ѕ і ї ј љ њ ћ ќ ў џ Ѡ ѡ Ѣ ѣ Ѥ ѥ Ѧ ѧ Ѩ ѩ Ѫ ѫ Ѭ ѭ Ѯ ѯ Ѱ ѱ Ѳ ѳ Ѵ ѵ Ѷ ѷ Ѹ ѹ Ѻ ѻ Ѽ ѽ Ѿ ѿ Ҁ ҁ ҂ ҃ ..."+  putStrLn "Ё Ђ Ѓ Є Ѕ І Ї Ј Љ Њ Ћ Ќ Ў Џ А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я ё ђ ѓ є ѕ і ї ј љ њ ћ ќ ў џ Ѡ ѡ Ѣ ѣ Ѥ ѥ Ѧ ѧ Ѩ ѩ Ѫ ѫ Ѭ ѭ Ѯ ѯ Ѱ ѱ Ѳ ѳ Ѵ ѵ Ѷ ѷ Ѹ ѹ Ѻ ѻ Ѽ ѽ Ѿ ѿ Ҁ ҁ ҂ ҃ ..."   -- Armenian-  printS "Ա Բ Գ Դ Ե Զ Է Ը Թ Ժ Ի Լ Խ Ծ Կ Հ Ձ Ղ Ճ Մ Յ Ն Շ Ո Չ Պ Ջ Ռ Ս Վ Տ Ր Ց Ւ Փ Ք Օ Ֆ ՙ ՚ ՛ ՜ ՝ ՞ ՟ ա բ գ դ ե զ է ը թ ժ ի լ խ ծ կ հ ձ ղ ճ մ յ ն շ ո չ պ ջ ռ ս վ տ ր ց ւ փ ք օ ֆ և ։"+  putStrLn "Ա Բ Գ Դ Ե Զ Է Ը Թ Ժ Ի Լ Խ Ծ Կ Հ Ձ Ղ Ճ Մ Յ Ն Շ Ո Չ Պ Ջ Ռ Ս Վ Տ Ր Ց Ւ Փ Ք Օ Ֆ ՙ ՚ ՛ ՜ ՝ ՞ ՟ ա բ գ դ ե զ է ը թ ժ ի լ խ ծ կ հ ձ ղ ճ մ յ ն շ ո չ պ ջ ռ ս վ տ ր ց ւ փ ք օ ֆ և ։"   -- Hebrew-  printS "֑ ֒ ֓ ֔ ֕ ֖ ֗ ֘ ֙ ֚ ֛ ֜ ֝ ֞ ֟ ֠ ֡ ֣ ֤ ֥ ֦ ֧ ֨ ֩ ֪ ֫ ֬ ֭ ֮ ֯ ְ ֱ ֲ ֳ ִ ֵ ֶ ַ ָ ֹ ֻ ּ ֽ ־ ֿ ׀ ׁ ׂ ׃ ׄ א ב ג ד ה ו ז ח ט י ך כ ל ם מ ן נ ס ע ף פ ץ צ ק ר ש ת װ ױ ײ ׳ ״"+  putStrLn "֑ ֒ ֓ ֔ ֕ ֖ ֗ ֘ ֙ ֚ ֛ ֜ ֝ ֞ ֟ ֠ ֡ ֣ ֤ ֥ ֦ ֧ ֨ ֩ ֪ ֫ ֬ ֭ ֮ ֯ ְ ֱ ֲ ֳ ִ ֵ ֶ ַ ָ ֹ ֻ ּ ֽ ־ ֿ ׀ ׁ ׂ ׃ ׄ א ב ג ד ה ו ז ח ט י ך כ ל ם מ ן נ ס ע ף פ ץ צ ק ר ש ת װ ױ ײ ׳ ״"   -- Arabic-  printS "، ؛ ؟ ء آ أ ؤ إ ئ ا ب ة ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ـ ف ق ك ل م ن ه و ى ي ً ٌ ٍ َ ُ ِ ّ ْ ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ ٪ ٫ ٬ ٭ ٰ ٱ ٲ ٳ ٴ ٵ ٶ ٷ ٸ ٹ ٺ ٻ ټ ٽ پ ٿ ڀ ځ ڂ ڃ ڄ څ چ ڇ ڈ ډ ڊ ڋ ڌ ڍ ڎ ڏ ڐ ڑ ڒ ړ ڔ ڕ ږ ڗ ژ ڙ ښ ڛ ڜ ڝ ڞ ڟ ڠ ڡ ڢ ڣ ڤ ڥ ڦ ڧ ڨ ک ڪ ګ ڬ ڭ ڮ گ ڰ ڱ ..."+  putStrLn "، ؛ ؟ ء آ أ ؤ إ ئ ا ب ة ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ـ ف ق ك ل م ن ه و ى ي ً ٌ ٍ َ ُ ِ ّ ْ ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ ٪ ٫ ٬ ٭ ٰ ٱ ٲ ٳ ٴ ٵ ٶ ٷ ٸ ٹ ٺ ٻ ټ ٽ پ ٿ ڀ ځ ڂ ڃ ڄ څ چ ڇ ڈ ډ ڊ ڋ ڌ ڍ ڎ ڏ ڐ ڑ ڒ ړ ڔ ڕ ږ ڗ ژ ڙ ښ ڛ ڜ ڝ ڞ ڟ ڠ ڡ ڢ ڣ ڤ ڥ ڦ ڧ ڨ ک ڪ ګ ڬ ڭ ڮ گ ڰ ڱ ..."   -- Devanagari-  printS "ँ ं ः अ आ इ ई उ ऊ ऋ ऌ ऍ ऎ ए ऐ ऑ ऒ ओ औ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न ऩ प फ ब भ म य र ऱ ल ळ ऴ व श ष स ह ़ ऽ ा ि ी ु ू ृ ॄ ॅ ॆ े ै ॉ ॊ ो ौ ् ॐ ॑ ॒ ॓ ॔ क़ ख़ ग़ ज़ ड़ ढ़ फ़ य़ ॠ ॡ ॢ ॣ । ॥ ० १ २ ३ ४ ५ ६ ७ ८ ९ ॰"+  putStrLn "ँ ं ः अ आ इ ई उ ऊ ऋ ऌ ऍ ऎ ए ऐ ऑ ऒ ओ औ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न ऩ प फ ब भ म य र ऱ ल ळ ऴ व श ष स ह ़ ऽ ा ि ी ु ू ृ ॄ ॅ ॆ े ै ॉ ॊ ो ौ ् ॐ ॑ ॒ ॓ ॔ क़ ख़ ग़ ज़ ड़ ढ़ फ़ य़ ॠ ॡ ॢ ॣ । ॥ ० १ २ ३ ४ ५ ६ ७ ८ ९ ॰"   -- Bengali-  printS "ঁ ং ঃ অ আ ই ঈ উ ঊ ঋ ঌ এ ঐ ও ঔ ক খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড ঢ ণ ত থ দ ধ ন প ফ ব ভ ম য র ল শ ষ স হ ় া ি ী ু ূ ৃ ৄ ে ৈ ো ৌ ্ ৗ ড় ঢ় য় ৠ ৡ ৢ ৣ ০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯ ৰ ৱ ৲ ৳ ৴ ৵ ৶ ৷ ৸ ৹ ৺"+  putStrLn "ঁ ং ঃ অ আ ই ঈ উ ঊ ঋ ঌ এ ঐ ও ঔ ক খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড ঢ ণ ত থ দ ধ ন প ফ ব ভ ম য র ল শ ষ স হ ় া ি ী ু ূ ৃ ৄ ে ৈ ো ৌ ্ ৗ ড় ঢ় য় ৠ ৡ ৢ ৣ ০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯ ৰ ৱ ৲ ৳ ৴ ৵ ৶ ৷ ৸ ৹ ৺"   -- Gurmukhi-  printS "ਂ ਅ ਆ ਇ ਈ ਉ ਊ ਏ ਐ ਓ ਔ ਕ ਖ ਗ ਘ ਙ ਚ ਛ ਜ ਝ ਞ ਟ ਠ ਡ ਢ ਣ ਤ ਥ ਦ ਧ ਨ ਪ ਫ ਬ ਭ ਮ ਯ ਰ ਲ ਲ਼ ਵ ਸ਼ ਸ ਹ ਼ ਾ ਿ ੀ ੁ ੂ ੇ ੈ ੋ ੌ ੍ ਖ਼ ਗ਼ ਜ਼ ੜ ਫ਼ ੦ ੧ ੨ ੩ ੪ ੫ ੬ ੭ ੮ ੯ ੰ ੱ ੲ ੳ ੴ"+  putStrLn "ਂ ਅ ਆ ਇ ਈ ਉ ਊ ਏ ਐ ਓ ਔ ਕ ਖ ਗ ਘ ਙ ਚ ਛ ਜ ਝ ਞ ਟ ਠ ਡ ਢ ਣ ਤ ਥ ਦ ਧ ਨ ਪ ਫ ਬ ਭ ਮ ਯ ਰ ਲ ਲ਼ ਵ ਸ਼ ਸ ਹ ਼ ਾ ਿ ੀ ੁ ੂ ੇ ੈ ੋ ੌ ੍ ਖ਼ ਗ਼ ਜ਼ ੜ ਫ਼ ੦ ੧ ੨ ੩ ੪ ੫ ੬ ੭ ੮ ੯ ੰ ੱ ੲ ੳ ੴ"   -- Gujarati-  printS "ઁ ં ઃ અ આ ઇ ઈ ઉ ઊ ઋ ઍ એ ઐ ઑ ઓ ઔ ક ખ ગ ઘ ઙ ચ છ જ ઝ ઞ ટ ઠ ડ ઢ ણ ત થ દ ધ ન પ ફ બ ભ મ ય ર લ ળ વ શ ષ સ હ ઼ ઽ ા િ ી ુ ૂ ૃ ૄ ૅ ે ૈ ૉ ો ૌ ્ ૐ ૠ ૦ ૧ ૨ ૩ ૪ ૫ ૬ ૭ ૮ ૯"+  putStrLn "ઁ ં ઃ અ આ ઇ ઈ ઉ ઊ ઋ ઍ એ ઐ ઑ ઓ ઔ ક ખ ગ ઘ ઙ ચ છ જ ઝ ઞ ટ ઠ ડ ઢ ણ ત થ દ ધ ન પ ફ બ ભ મ ય ર લ ળ વ શ ષ સ હ ઼ ઽ ા િ ી ુ ૂ ૃ ૄ ૅ ે ૈ ૉ ો ૌ ્ ૐ ૠ ૦ ૧ ૨ ૩ ૪ ૫ ૬ ૭ ૮ ૯"   -- Oriya-  printS "ଁ ଂ ଃ ଅ ଆ ଇ ଈ ଉ ଊ ଋ ଌ ଏ ଐ ଓ ଔ କ ଖ ଗ ଘ ଙ ଚ ଛ ଜ ଝ ଞ ଟ ଠ ଡ ଢ ଣ ତ ଥ ଦ ଧ ନ ପ ଫ ବ ଭ ମ ଯ ର ଲ ଳ ଶ ଷ ସ ହ ଼ ଽ ା ି ୀ ୁ ୂ ୃ େ ୈ ୋ ୌ ୍ ୖ ୗ ଡ଼ ଢ଼ ୟ ୠ ୡ ୦ ୧ ୨ ୩ ୪ ୫ ୬ ୭ ୮ ୯ ୰"+  putStrLn "ଁ ଂ ଃ ଅ ଆ ଇ ଈ ଉ ଊ ଋ ଌ ଏ ଐ ଓ ଔ କ ଖ ଗ ଘ ଙ ଚ ଛ ଜ ଝ ଞ ଟ ଠ ଡ ଢ ଣ ତ ଥ ଦ ଧ ନ ପ ଫ ବ ଭ ମ ଯ ର ଲ ଳ ଶ ଷ ସ ହ ଼ ଽ ା ି ୀ ୁ ୂ ୃ େ ୈ ୋ ୌ ୍ ୖ ୗ ଡ଼ ଢ଼ ୟ ୠ ୡ ୦ ୧ ୨ ୩ ୪ ୫ ୬ ୭ ୮ ୯ ୰"   -- Tamil-  printS "ஂ ஃ அ ஆ இ ஈ உ ஊ எ ஏ ஐ ஒ ஓ ஔ க ங ச ஜ ஞ ட ண த ந ன ப ம ய ர ற ல ள ழ வ ஷ ஸ ஹ ா ி ீ ு ூ ெ ே ை ொ ோ ௌ ் ௗ ௧ ௨ ௩ ௪ ௫ ௬ ௭ ௮ ௯ ௰ ௱ ௲"+  putStrLn "ஂ ஃ அ ஆ இ ஈ உ ஊ எ ஏ ஐ ஒ ஓ ஔ க ங ச ஜ ஞ ட ண த ந ன ப ம ய ர ற ல ள ழ வ ஷ ஸ ஹ ா ி ீ ு ூ ெ ே ை ொ ோ ௌ ் ௗ ௧ ௨ ௩ ௪ ௫ ௬ ௭ ௮ ௯ ௰ ௱ ௲"   -- Telugu-  printS "ఁ ం ః అ ఆ ఇ ఈ ఉ ఊ ఋ ఌ ఎ ఏ ఐ ఒ ఓ ఔ క ఖ గ ఘ ఙ చ ఛ జ ఝ ఞ ట ఠ డ ఢ ణ త థ ద ధ న ప ఫ బ భ మ య ర ఱ ల ళ వ శ ష స హ ా ి ీ ు ూ ృ ౄ ె ే ై ొ ో ౌ ్ ౕ ౖ ౠ ౡ ౦ ౧ ౨ ౩ ౪ ౫ ౬ ౭ ౮ ౯"+  putStrLn "ఁ ం ః అ ఆ ఇ ఈ ఉ ఊ ఋ ఌ ఎ ఏ ఐ ఒ ఓ ఔ క ఖ గ ఘ ఙ చ ఛ జ ఝ ఞ ట ఠ డ ఢ ణ త థ ద ధ న ప ఫ బ భ మ య ర ఱ ల ళ వ శ ష స హ ా ి ీ ు ూ ృ ౄ ె ే ై ొ ో ౌ ్ ౕ ౖ ౠ ౡ ౦ ౧ ౨ ౩ ౪ ౫ ౬ ౭ ౮ ౯"   -- Kannada-  printS "ಂ ಃ ಅ ಆ ಇ ಈ ಉ ಊ ಋ ಌ ಎ ಏ ಐ ಒ ಓ ಔ ಕ ಖ ಗ ಘ ಙ ಚ ಛ ಜ ಝ ಞ ಟ ಠ ಡ ಢ ಣ ತ ಥ ದ ಧ ನ ಪ ಫ ಬ ಭ ಮ ಯ ರ ಱ ಲ ಳ ವ ಶ ಷ ಸ ಹ ಾ ಿ ೀ ು ೂ ೃ ೄ ೆ ೇ ೈ ೊ ೋ ೌ ್ ೕ ೖ ೞ ೠ ೡ ೦ ೧ ೨ ೩ ೪ ೫ ೬ ೭ ೮ ೯"+  putStrLn "ಂ ಃ ಅ ಆ ಇ ಈ ಉ ಊ ಋ ಌ ಎ ಏ ಐ ಒ ಓ ಔ ಕ ಖ ಗ ಘ ಙ ಚ ಛ ಜ ಝ ಞ ಟ ಠ ಡ ಢ ಣ ತ ಥ ದ ಧ ನ ಪ ಫ ಬ ಭ ಮ ಯ ರ ಱ ಲ ಳ ವ ಶ ಷ ಸ ಹ ಾ ಿ ೀ ು ೂ ೃ ೄ ೆ ೇ ೈ ೊ ೋ ೌ ್ ೕ ೖ ೞ ೠ ೡ ೦ ೧ ೨ ೩ ೪ ೫ ೬ ೭ ೮ ೯"   -- Malayalam-  printS "ം ഃ അ ആ ഇ ഈ ഉ ഊ ഋ ഌ എ ഏ ഐ ഒ ഓ ഔ ക ഖ ഗ ഘ ങ ച ഛ ജ ഝ ഞ ട ഠ ഡ ഢ ണ ത ഥ ദ ധ ന പ ഫ ബ ഭ മ യ ര റ ല ള ഴ വ ശ ഷ സ ഹ ാ ി ീ ു ൂ ൃ െ േ ൈ ൊ ോ ൌ ് ൗ ൠ ൡ ൦ ൧ ൨ ൩ ൪ ൫ ൬ ൭ ൮ ൯"+  putStrLn "ം ഃ അ ആ ഇ ഈ ഉ ഊ ഋ ഌ എ ഏ ഐ ഒ ഓ ഔ ക ഖ ഗ ഘ ങ ച ഛ ജ ഝ ഞ ട ഠ ഡ ഢ ണ ത ഥ ദ ധ ന പ ഫ ബ ഭ മ യ ര റ ല ള ഴ വ ശ ഷ സ ഹ ാ ി ീ ു ൂ ൃ െ േ ൈ ൊ ോ ൌ ് ൗ ൠ ൡ ൦ ൧ ൨ ൩ ൪ ൫ ൬ ൭ ൮ ൯"   -- Thai-  printS "ก ข ฃ ค ฅ ฆ ง จ ฉ ช ซ ฌ ญ ฎ ฏ ฐ ฑ ฒ ณ ด ต ถ ท ธ น บ ป ผ ฝ พ ฟ ภ ม ย ร ฤ ล ฦ ว ศ ษ ส ห ฬ อ ฮ ฯ ะ ั า ำ ิ ี ึ ื ุ ู ฺ ฿ เ แ โ ใ ไ ๅ ๆ ็ ่ ้ ๊ ๋ ์ ํ ๎ ๏ ๐ ๑ ๒ ๓ ๔ ๕ ๖ ๗ ๘ ๙ ๚ ๛"+  putStrLn "ก ข ฃ ค ฅ ฆ ง จ ฉ ช ซ ฌ ญ ฎ ฏ ฐ ฑ ฒ ณ ด ต ถ ท ธ น บ ป ผ ฝ พ ฟ ภ ม ย ร ฤ ล ฦ ว ศ ษ ส ห ฬ อ ฮ ฯ ะ ั า ำ ิ ี ึ ื ุ ู ฺ ฿ เ แ โ ใ ไ ๅ ๆ ็ ่ ้ ๊ ๋ ์ ํ ๎ ๏ ๐ ๑ ๒ ๓ ๔ ๕ ๖ ๗ ๘ ๙ ๚ ๛"   -- Lao-  printS "ກ ຂ ຄ ງ ຈ ຊ ຍ ດ ຕ ຖ ທ ນ ບ ປ ຜ ຝ ພ ຟ ມ ຢ ຣ ລ ວ ສ ຫ ອ ຮ ຯ ະ ັ າ ຳ ິ ີ ຶ ື ຸ ູ ົ ຼ ຽ ເ ແ ໂ ໃ ໄ ໆ ່ ້ ໊ ໋ ໌ ໍ ໐ ໑ ໒ ໓ ໔ ໕ ໖ ໗ ໘ ໙ ໜ ໝ"+  putStrLn "ກ ຂ ຄ ງ ຈ ຊ ຍ ດ ຕ ຖ ທ ນ ບ ປ ຜ ຝ ພ ຟ ມ ຢ ຣ ລ ວ ສ ຫ ອ ຮ ຯ ະ ັ າ ຳ ິ ີ ຶ ື ຸ ູ ົ ຼ ຽ ເ ແ ໂ ໃ ໄ ໆ ່ ້ ໊ ໋ ໌ ໍ ໐ ໑ ໒ ໓ ໔ ໕ ໖ ໗ ໘ ໙ ໜ ໝ"   -- Tibetan-  printS "ༀ ༁ ༂ ༃ ༄ ༅ ༆ ༇ ༈ ༉ ༊ ་ ༌ ། ༎ ༏ ༐ ༑ ༒ ༓ ༔ ༕ ༖ ༗ ༘ ༙ ༚ ༛ ༜ ༝ ༞ ༟ ༠ ༡ ༢ ༣ ༤ ༥ ༦ ༧ ༨ ༩ ༪ ༫ ༬ ༭ ༮ ༯ ༰ ༱ ༲ ༳ ༴ ༵ ༶ ༷ ༸ ༹ ༺ ༻ ༼ ༽ ༾ ༿ ཀ ཁ ག གྷ ང ཅ ཆ ཇ ཉ ཊ ཋ ཌ ཌྷ ཎ ཏ ཐ ད དྷ ན པ ཕ བ བྷ མ ཙ ཚ ཛ ཛྷ ཝ ཞ ཟ འ ཡ ར ལ ཤ ཥ ས ཧ ཨ ཀྵ ཱ ི ཱི ུ ཱུ ྲྀ ཷ ླྀ ཹ ེ ཻ ོ ཽ ཾ ཿ ྀ ཱྀ ྂ ྃ ྄ ྅ ྆ ྇ ..."+  putStrLn "ༀ ༁ ༂ ༃ ༄ ༅ ༆ ༇ ༈ ༉ ༊ ་ ༌ ། ༎ ༏ ༐ ༑ ༒ ༓ ༔ ༕ ༖ ༗ ༘ ༙ ༚ ༛ ༜ ༝ ༞ ༟ ༠ ༡ ༢ ༣ ༤ ༥ ༦ ༧ ༨ ༩ ༪ ༫ ༬ ༭ ༮ ༯ ༰ ༱ ༲ ༳ ༴ ༵ ༶ ༷ ༸ ༹ ༺ ༻ ༼ ༽ ༾ ༿ ཀ ཁ ག གྷ ང ཅ ཆ ཇ ཉ ཊ ཋ ཌ ཌྷ ཎ ཏ ཐ ད དྷ ན པ ཕ བ བྷ མ ཙ ཚ ཛ ཛྷ ཝ ཞ ཟ འ ཡ ར ལ ཤ ཥ ས ཧ ཨ ཀྵ ཱ ི ཱི ུ ཱུ ྲྀ ཷ ླྀ ཹ ེ ཻ ོ ཽ ཾ ཿ ྀ ཱྀ ྂ ྃ ྄ ྅ ྆ ྇ ..."   -- Georgian-  printS "Ⴀ Ⴁ Ⴂ Ⴃ Ⴄ Ⴅ Ⴆ Ⴇ Ⴈ Ⴉ Ⴊ Ⴋ Ⴌ Ⴍ Ⴎ Ⴏ Ⴐ Ⴑ Ⴒ Ⴓ Ⴔ Ⴕ Ⴖ Ⴗ Ⴘ Ⴙ Ⴚ Ⴛ Ⴜ Ⴝ Ⴞ Ⴟ Ⴠ Ⴡ Ⴢ Ⴣ Ⴤ Ⴥ ა ბ გ დ ე ვ ზ თ ი კ ლ მ ნ ო პ ჟ რ ს ტ უ ფ ქ ღ ყ შ ჩ ც ძ წ ჭ ხ ჯ ჰ ჱ ჲ ჳ ჴ ჵ ჶ ჻"+  putStrLn "Ⴀ Ⴁ Ⴂ Ⴃ Ⴄ Ⴅ Ⴆ Ⴇ Ⴈ Ⴉ Ⴊ Ⴋ Ⴌ Ⴍ Ⴎ Ⴏ Ⴐ Ⴑ Ⴒ Ⴓ Ⴔ Ⴕ Ⴖ Ⴗ Ⴘ Ⴙ Ⴚ Ⴛ Ⴜ Ⴝ Ⴞ Ⴟ Ⴠ Ⴡ Ⴢ Ⴣ Ⴤ Ⴥ ა ბ გ დ ე ვ ზ თ ი კ ლ მ ნ ო პ ჟ რ ს ტ უ ფ ქ ღ ყ შ ჩ ც ძ წ ჭ ხ ჯ ჰ ჱ ჲ ჳ ჴ ჵ ჶ ჻"   -- Hangul Jamo-  printS "ᄀ ᄁ ᄂ ᄃ ᄄ ᄅ ᄆ ᄇ ᄈ ᄉ ᄊ ᄋ ᄌ ᄍ ᄎ ᄏ ᄐ ᄑ ᄒ ᄓ ᄔ ᄕ ᄖ ᄗ ᄘ ᄙ ᄚ ᄛ ᄜ ᄝ ᄞ ᄟ ᄠ ᄡ ᄢ ᄣ ᄤ ᄥ ᄦ ᄧ ᄨ ᄩ ᄪ ᄫ ᄬ ᄭ ᄮ ᄯ ᄰ ᄱ ᄲ ᄳ ᄴ ᄵ ᄶ ᄷ ᄸ ᄹ ᄺ ᄻ ᄼ ᄽ ᄾ ᄿ ᅀ ᅁ ᅂ ᅃ ᅄ ᅅ ᅆ ᅇ ᅈ ᅉ ᅊ ᅋ ᅌ ᅍ ᅎ ᅏ ᅐ ᅑ ᅒ ᅓ ᅔ ᅕ ᅖ ᅗ ᅘ ᅙ ᅟ ᅠ ᅡ ᅢ ᅣ ᅤ ᅥ ᅦ ᅧ ᅨ ᅩ ᅪ ᅫ ᅬ ᅭ ᅮ ᅯ ᅰ ᅱ ᅲ ᅳ ᅴ ᅵ ᅶ ᅷ ᅸ ᅹ ᅺ ᅻ ᅼ ᅽ ᅾ ᅿ ᆀ ᆁ ᆂ ᆃ ᆄ ..."+  putStrLn "ᄀ ᄁ ᄂ ᄃ ᄄ ᄅ ᄆ ᄇ ᄈ ᄉ ᄊ ᄋ ᄌ ᄍ ᄎ ᄏ ᄐ ᄑ ᄒ ᄓ ᄔ ᄕ ᄖ ᄗ ᄘ ᄙ ᄚ ᄛ ᄜ ᄝ ᄞ ᄟ ᄠ ᄡ ᄢ ᄣ ᄤ ᄥ ᄦ ᄧ ᄨ ᄩ ᄪ ᄫ ᄬ ᄭ ᄮ ᄯ ᄰ ᄱ ᄲ ᄳ ᄴ ᄵ ᄶ ᄷ ᄸ ᄹ ᄺ ᄻ ᄼ ᄽ ᄾ ᄿ ᅀ ᅁ ᅂ ᅃ ᅄ ᅅ ᅆ ᅇ ᅈ ᅉ ᅊ ᅋ ᅌ ᅍ ᅎ ᅏ ᅐ ᅑ ᅒ ᅓ ᅔ ᅕ ᅖ ᅗ ᅘ ᅙ ᅟ ᅠ ᅡ ᅢ ᅣ ᅤ ᅥ ᅦ ᅧ ᅨ ᅩ ᅪ ᅫ ᅬ ᅭ ᅮ ᅯ ᅰ ᅱ ᅲ ᅳ ᅴ ᅵ ᅶ ᅷ ᅸ ᅹ ᅺ ᅻ ᅼ ᅽ ᅾ ᅿ ᆀ ᆁ ᆂ ᆃ ᆄ ..."   -- Latin Extended Additional-  printS "Ḁ ḁ Ḃ ḃ Ḅ ḅ Ḇ ḇ Ḉ ḉ Ḋ ḋ Ḍ ḍ Ḏ ḏ Ḑ ḑ Ḓ ḓ Ḕ ḕ Ḗ ḗ Ḙ ḙ Ḛ ḛ Ḝ ḝ Ḟ ḟ Ḡ ḡ Ḣ ḣ Ḥ ḥ Ḧ ḧ Ḩ ḩ Ḫ ḫ Ḭ ḭ Ḯ ḯ Ḱ ḱ Ḳ ḳ Ḵ ḵ Ḷ ḷ Ḹ ḹ Ḻ ḻ Ḽ ḽ Ḿ ḿ Ṁ ṁ Ṃ ṃ Ṅ ṅ Ṇ ṇ Ṉ ṉ Ṋ ṋ Ṍ ṍ Ṏ ṏ Ṑ ṑ Ṓ ṓ Ṕ ṕ Ṗ ṗ Ṙ ṙ Ṛ ṛ Ṝ ṝ Ṟ ṟ Ṡ ṡ Ṣ ṣ Ṥ ṥ Ṧ ṧ Ṩ ṩ Ṫ ṫ Ṭ ṭ Ṯ ṯ Ṱ ṱ Ṳ ṳ Ṵ ṵ Ṷ ṷ Ṹ ṹ Ṻ ṻ Ṽ ṽ Ṿ ṿ ..."+  putStrLn "Ḁ ḁ Ḃ ḃ Ḅ ḅ Ḇ ḇ Ḉ ḉ Ḋ ḋ Ḍ ḍ Ḏ ḏ Ḑ ḑ Ḓ ḓ Ḕ ḕ Ḗ ḗ Ḙ ḙ Ḛ ḛ Ḝ ḝ Ḟ ḟ Ḡ ḡ Ḣ ḣ Ḥ ḥ Ḧ ḧ Ḩ ḩ Ḫ ḫ Ḭ ḭ Ḯ ḯ Ḱ ḱ Ḳ ḳ Ḵ ḵ Ḷ ḷ Ḹ ḹ Ḻ ḻ Ḽ ḽ Ḿ ḿ Ṁ ṁ Ṃ ṃ Ṅ ṅ Ṇ ṇ Ṉ ṉ Ṋ ṋ Ṍ ṍ Ṏ ṏ Ṑ ṑ Ṓ ṓ Ṕ ṕ Ṗ ṗ Ṙ ṙ Ṛ ṛ Ṝ ṝ Ṟ ṟ Ṡ ṡ Ṣ ṣ Ṥ ṥ Ṧ ṧ Ṩ ṩ Ṫ ṫ Ṭ ṭ Ṯ ṯ Ṱ ṱ Ṳ ṳ Ṵ ṵ Ṷ ṷ Ṹ ṹ Ṻ ṻ Ṽ ṽ Ṿ ṿ ..."   -- Greek Extended-  printS "ἀ ἁ ἂ ἃ ἄ ἅ ἆ ἇ Ἀ Ἁ Ἂ Ἃ Ἄ Ἅ Ἆ Ἇ ἐ ἑ ἒ ἓ ἔ ἕ Ἐ Ἑ Ἒ Ἓ Ἔ Ἕ ἠ ἡ ἢ ἣ ἤ ἥ ἦ ἧ Ἠ Ἡ Ἢ Ἣ Ἤ Ἥ Ἦ Ἧ ἰ ἱ ἲ ἳ ἴ ἵ ἶ ἷ Ἰ Ἱ Ἲ Ἳ Ἴ Ἵ Ἶ Ἷ ὀ ὁ ὂ ὃ ὄ ὅ Ὀ Ὁ Ὂ Ὃ Ὄ Ὅ ὐ ὑ ὒ ὓ ὔ ὕ ὖ ὗ Ὑ Ὓ Ὕ Ὗ ὠ ὡ ὢ ὣ ὤ ὥ ὦ ὧ Ὠ Ὡ Ὢ Ὣ Ὤ Ὥ Ὦ Ὧ ὰ ά ὲ έ ὴ ή ὶ ί ὸ ό ὺ ύ ὼ ώ ᾀ ᾁ ᾂ ᾃ ᾄ ᾅ ᾆ ᾇ ᾈ ᾉ ᾊ ᾋ ᾌ ᾍ ..."+  putStrLn "ἀ ἁ ἂ ἃ ἄ ἅ ἆ ἇ Ἀ Ἁ Ἂ Ἃ Ἄ Ἅ Ἆ Ἇ ἐ ἑ ἒ ἓ ἔ ἕ Ἐ Ἑ Ἒ Ἓ Ἔ Ἕ ἠ ἡ ἢ ἣ ἤ ἥ ἦ ἧ Ἠ Ἡ Ἢ Ἣ Ἤ Ἥ Ἦ Ἧ ἰ ἱ ἲ ἳ ἴ ἵ ἶ ἷ Ἰ Ἱ Ἲ Ἳ Ἴ Ἵ Ἶ Ἷ ὀ ὁ ὂ ὃ ὄ ὅ Ὀ Ὁ Ὂ Ὃ Ὄ Ὅ ὐ ὑ ὒ ὓ ὔ ὕ ὖ ὗ Ὑ Ὓ Ὕ Ὗ ὠ ὡ ὢ ὣ ὤ ὥ ὦ ὧ Ὠ Ὡ Ὢ Ὣ Ὤ Ὥ Ὦ Ὧ ὰ ά ὲ έ ὴ ή ὶ ί ὸ ό ὺ ύ ὼ ώ ᾀ ᾁ ᾂ ᾃ ᾄ ᾅ ᾆ ᾇ ᾈ ᾉ ᾊ ᾋ ᾌ ᾍ ..."   -- General Punctuation-  printS "‐ ‑ ‒ – — ― ‖ ‗ ‘ ’ ‚ ‛ “ ” „ ‟"+  putStrLn "‐ ‑ ‒ – — ― ‖ ‗ ‘ ’ ‚ ‛ “ ” „ ‟"   -- Superscripts and Subscripts-  printS "⁰ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ⁺ ⁻ ⁼ ⁽ ⁾ ⁿ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₊ ₋ ₌ ₍ ₎"+  putStrLn "⁰ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ⁺ ⁻ ⁼ ⁽ ⁾ ⁿ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₊ ₋ ₌ ₍ ₎"   -- Currency Symbols-  printS "₠ ₡ ₢ ₣ ₤ ₥ ₦ ₧ ₨ ₩ ₪ ₫"+  putStrLn "₠ ₡ ₢ ₣ ₤ ₥ ₦ ₧ ₨ ₩ ₪ ₫"   -- Combining Marks for Symbols-  printS "⃐ ⃑ ⃒ ⃓ ⃔ ⃕ ⃖ ⃗ ⃘ ⃙ ⃚ ⃛ ⃜ ⃝ ⃞ ⃟ ⃠ ⃡"+  putStrLn "⃐ ⃑ ⃒ ⃓ ⃔ ⃕ ⃖ ⃗ ⃘ ⃙ ⃚ ⃛ ⃜ ⃝ ⃞ ⃟ ⃠ ⃡"   -- Letterlike Symbols-  printS "℀ ℁ ℂ ℃ ℄ ℅ ℆ ℇ ℈ ℉ ℊ ℋ ℌ ℍ ℎ ℏ ℐ ℑ ℒ ℓ ℔ ℕ № ℗ ℘ ℙ ℚ ℛ ℜ ℝ ℞ ℟ ℠ ℡ ™ ℣ ℤ ℥ Ω ℧ ℨ ℩ K Å ℬ ℭ ℮ ℯ ℰ ℱ Ⅎ ℳ ℴ ℵ ℶ ℷ ℸ"+  putStrLn "℀ ℁ ℂ ℃ ℄ ℅ ℆ ℇ ℈ ℉ ℊ ℋ ℌ ℍ ℎ ℏ ℐ ℑ ℒ ℓ ℔ ℕ № ℗ ℘ ℙ ℚ ℛ ℜ ℝ ℞ ℟ ℠ ℡ ™ ℣ ℤ ℥ Ω ℧ ℨ ℩ K Å ℬ ℭ ℮ ℯ ℰ ℱ Ⅎ ℳ ℴ ℵ ℶ ℷ ℸ"   -- Number Forms-  printS "⅓ ⅔ ⅕ ⅖ ⅗ ⅘ ⅙ ⅚ ⅛ ⅜ ⅝ ⅞ ⅟ Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ Ⅼ Ⅽ Ⅾ Ⅿ ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ ⅺ ⅻ ⅼ ⅽ ⅾ ⅿ ↀ ↁ ↂ"+  putStrLn "⅓ ⅔ ⅕ ⅖ ⅗ ⅘ ⅙ ⅚ ⅛ ⅜ ⅝ ⅞ ⅟ Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ Ⅼ Ⅽ Ⅾ Ⅿ ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ ⅺ ⅻ ⅼ ⅽ ⅾ ⅿ ↀ ↁ ↂ"   -- Arrows-  printS "← ↑ → ↓ ↔ ↕ ↖ ↗ ↘ ↙ ↚ ↛ ↜ ↝ ↞ ↟ ↠ ↡ ↢ ↣ ↤ ↥ ↦ ↧ ↨ ↩ ↪ ↫ ↬ ↭ ↮ ↯ ↰ ↱ ↲ ↳ ↴ ↵ ↶ ↷ ↸ ↹ ↺ ↻ ↼ ↽ ↾ ↿ ⇀ ⇁ ⇂ ⇃ ⇄ ⇅ ⇆ ⇇ ⇈ ⇉ ⇊ ⇋ ⇌ ⇍ ⇎ ⇏ ⇐ ⇑ ⇒ ⇓ ⇔ ⇕ ⇖ ⇗ ⇘ ⇙ ⇚ ⇛ ⇜ ⇝ ⇞ ⇟ ⇠ ⇡ ⇢ ⇣ ⇤ ⇥ ⇦ ⇧ ⇨ ⇩ ⇪"+  putStrLn "← ↑ → ↓ ↔ ↕ ↖ ↗ ↘ ↙ ↚ ↛ ↜ ↝ ↞ ↟ ↠ ↡ ↢ ↣ ↤ ↥ ↦ ↧ ↨ ↩ ↪ ↫ ↬ ↭ ↮ ↯ ↰ ↱ ↲ ↳ ↴ ↵ ↶ ↷ ↸ ↹ ↺ ↻ ↼ ↽ ↾ ↿ ⇀ ⇁ ⇂ ⇃ ⇄ ⇅ ⇆ ⇇ ⇈ ⇉ ⇊ ⇋ ⇌ ⇍ ⇎ ⇏ ⇐ ⇑ ⇒ ⇓ ⇔ ⇕ ⇖ ⇗ ⇘ ⇙ ⇚ ⇛ ⇜ ⇝ ⇞ ⇟ ⇠ ⇡ ⇢ ⇣ ⇤ ⇥ ⇦ ⇧ ⇨ ⇩ ⇪"   -- Mathematical Operators-  printS "∀ ∁ ∂ ∃ ∄ ∅ ∆ ∇ ∈ ∉ ∊ ∋ ∌ ∍ ∎ ∏ ∐ ∑ − ∓ ∔ ∕ ∖ ∗ ∘ ∙ √ ∛ ∜ ∝ ∞ ∟ ∠ ∡ ∢ ∣ ∤ ∥ ∦ ∧ ∨ ∩ ∪ ∫ ∬ ∭ ∮ ∯ ∰ ∱ ∲ ∳ ∴ ∵ ∶ ∷ ∸ ∹ ∺ ∻ ∼ ∽ ∾ ∿ ≀ ≁ ≂ ≃ ≄ ≅ ≆ ≇ ≈ ≉ ≊ ≋ ≌ ≍ ≎ ≏ ≐ ≑ ≒ ≓ ≔ ≕ ≖ ≗ ≘ ≙ ≚ ≛ ≜ ≝ ≞ ≟ ≠ ≡ ≢ ≣ ≤ ≥ ≦ ≧ ≨ ≩ ≪ ≫ ≬ ≭ ≮ ≯ ≰ ≱ ≲ ≳ ≴ ≵ ≶ ≷ ≸ ≹ ≺ ≻ ≼ ≽ ≾ ≿ ..."+  putStrLn "∀ ∁ ∂ ∃ ∄ ∅ ∆ ∇ ∈ ∉ ∊ ∋ ∌ ∍ ∎ ∏ ∐ ∑ − ∓ ∔ ∕ ∖ ∗ ∘ ∙ √ ∛ ∜ ∝ ∞ ∟ ∠ ∡ ∢ ∣ ∤ ∥ ∦ ∧ ∨ ∩ ∪ ∫ ∬ ∭ ∮ ∯ ∰ ∱ ∲ ∳ ∴ ∵ ∶ ∷ ∸ ∹ ∺ ∻ ∼ ∽ ∾ ∿ ≀ ≁ ≂ ≃ ≄ ≅ ≆ ≇ ≈ ≉ ≊ ≋ ≌ ≍ ≎ ≏ ≐ ≑ ≒ ≓ ≔ ≕ ≖ ≗ ≘ ≙ ≚ ≛ ≜ ≝ ≞ ≟ ≠ ≡ ≢ ≣ ≤ ≥ ≦ ≧ ≨ ≩ ≪ ≫ ≬ ≭ ≮ ≯ ≰ ≱ ≲ ≳ ≴ ≵ ≶ ≷ ≸ ≹ ≺ ≻ ≼ ≽ ≾ ≿ ..."   -- Miscellaneous Technical-  printS "⌀ ⌂ ⌃ ⌄ ⌅ ⌆ ⌇ ⌈ ⌉ ⌊ ⌋ ⌌ ⌍ ⌎ ⌏ ⌐ ⌑ ⌒ ⌓ ⌔ ⌕ ⌖ ⌗ ⌘ ⌙ ⌚ ⌛ ⌜ ⌝ ⌞ ⌟ ⌠ ⌡ ⌢ ⌣ ⌤ ⌥ ⌦ ⌧ ⌨ 〈 〉 ⌫ ⌬ ⌭ ⌮ ⌯ ⌰ ⌱ ⌲ ⌳ ⌴ ⌵ ⌶ ⌷ ⌸ ⌹ ⌺ ⌻ ⌼ ⌽ ⌾ ⌿ ⍀ ⍁ ⍂ ⍃ ⍄ ⍅ ⍆ ⍇ ⍈ ⍉ ⍊ ⍋ ⍌ ⍍ ⍎ ⍏ ⍐ ⍑ ⍒ ⍓ ⍔ ⍕ ⍖ ⍗ ⍘ ⍙ ⍚ ⍛ ⍜ ⍝ ⍞ ⍟ ⍠ ⍡ ⍢ ⍣ ⍤ ⍥ ⍦ ⍧ ⍨ ⍩ ⍪ ⍫ ⍬ ⍭ ⍮ ⍯ ⍰ ⍱ ⍲ ⍳ ⍴ ⍵ ⍶ ⍷ ⍸ ⍹ ⍺"+  putStrLn "⌀ ⌂ ⌃ ⌄ ⌅ ⌆ ⌇ ⌈ ⌉ ⌊ ⌋ ⌌ ⌍ ⌎ ⌏ ⌐ ⌑ ⌒ ⌓ ⌔ ⌕ ⌖ ⌗ ⌘ ⌙ ⌚ ⌛ ⌜ ⌝ ⌞ ⌟ ⌠ ⌡ ⌢ ⌣ ⌤ ⌥ ⌦ ⌧ ⌨ 〈 〉 ⌫ ⌬ ⌭ ⌮ ⌯ ⌰ ⌱ ⌲ ⌳ ⌴ ⌵ ⌶ ⌷ ⌸ ⌹ ⌺ ⌻ ⌼ ⌽ ⌾ ⌿ ⍀ ⍁ ⍂ ⍃ ⍄ ⍅ ⍆ ⍇ ⍈ ⍉ ⍊ ⍋ ⍌ ⍍ ⍎ ⍏ ⍐ ⍑ ⍒ ⍓ ⍔ ⍕ ⍖ ⍗ ⍘ ⍙ ⍚ ⍛ ⍜ ⍝ ⍞ ⍟ ⍠ ⍡ ⍢ ⍣ ⍤ ⍥ ⍦ ⍧ ⍨ ⍩ ⍪ ⍫ ⍬ ⍭ ⍮ ⍯ ⍰ ⍱ ⍲ ⍳ ⍴ ⍵ ⍶ ⍷ ⍸ ⍹ ⍺"   -- Control Pictures-  printS "␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏ ␐ ␑ ␒ ␓ ␔ ␕ ␖ ␗ ␘ ␙ ␚ ␛ ␜ ␝ ␞ ␟ ␠ ␡ ␢ ␣ ␤"+  putStrLn "␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏ ␐ ␑ ␒ ␓ ␔ ␕ ␖ ␗ ␘ ␙ ␚ ␛ ␜ ␝ ␞ ␟ ␠ ␡ ␢ ␣ ␤"   -- Optical Character Recognition-  printS "⑀ ⑁ ⑂ ⑃ ⑄ ⑅ ⑆ ⑇ ⑈ ⑉ ⑊"+  putStrLn "⑀ ⑁ ⑂ ⑃ ⑄ ⑅ ⑆ ⑇ ⑈ ⑉ ⑊"   -- -- Enclosed Alphanumerics-  printS "① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ..."+  putStrLn "① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ..."   -- Box Drawing-  printS "─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏ ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟ ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯ ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿ ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╌ ╍ ╎ ╏ ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟ ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯ ╰ ╱ ╲ ╳ ╴ ╵ ╶ ╷ ╸ ╹ ╺ ╻ ╼ ╽ ╾ ╿"+  putStrLn "─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏ ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟ ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯ ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿ ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╌ ╍ ╎ ╏ ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟ ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯ ╰ ╱ ╲ ╳ ╴ ╵ ╶ ╷ ╸ ╹ ╺ ╻ ╼ ╽ ╾ ╿"   -- Block Elements-  printS "▀ ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊ ▋ ▌ ▍ ▎ ▏ ▐ ░ ▒ ▓ ▔ ▕"+  putStrLn "▀ ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊ ▋ ▌ ▍ ▎ ▏ ▐ ░ ▒ ▓ ▔ ▕"   -- Geometric Shapes-  printS "■ □ ▢ ▣ ▤ ▥ ▦ ▧ ▨ ▩ ▪ ▫ ▬ ▭ ▮ ▯ ▰ ▱ ▲ △ ▴ ▵ ▶ ▷ ▸ ▹ ► ▻ ▼ ▽ ▾ ▿ ◀ ◁ ◂ ◃ ◄ ◅ ◆ ◇ ◈ ◉ ◊ ○ ◌ ◍ ◎ ● ◐ ◑ ◒ ◓ ◔ ◕ ◖ ◗ ◘ ◙ ◚ ◛ ◜ ◝ ◞ ◟ ◠ ◡ ◢ ◣ ◤ ◥ ◦ ◧ ◨ ◩ ◪ ◫ ◬ ◭ ◮ ◯"+  putStrLn "■ □ ▢ ▣ ▤ ▥ ▦ ▧ ▨ ▩ ▪ ▫ ▬ ▭ ▮ ▯ ▰ ▱ ▲ △ ▴ ▵ ▶ ▷ ▸ ▹ ► ▻ ▼ ▽ ▾ ▿ ◀ ◁ ◂ ◃ ◄ ◅ ◆ ◇ ◈ ◉ ◊ ○ ◌ ◍ ◎ ● ◐ ◑ ◒ ◓ ◔ ◕ ◖ ◗ ◘ ◙ ◚ ◛ ◜ ◝ ◞ ◟ ◠ ◡ ◢ ◣ ◤ ◥ ◦ ◧ ◨ ◩ ◪ ◫ ◬ ◭ ◮ ◯"   -- Miscellaneous Symbols-  printS "☀ ☁ ☂ ☃ ☄ ★ ☆ ☇ ☈ ☉ ☊ ☋ ☌ ☍ ☎ ☏ ☐ ☑ ☒ ☓ ☚ ☛ ☜ ☝ ☞ ☟ ☠ ☡ ☢ ☣ ☤ ☥ ☦ ☧ ☨ ☩ ☪ ☫ ☬ ☭ ☮ ☯ ☰ ☱ ☲ ☳ ☴ ☵ ☶ ☷ ☸ ☹ ☺ ☻ ☼ ☽ ☾ ☿ ♀ ♁ ♂ ♃ ♄ ♅ ♆ ♇ ♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓ ♔ ♕ ♖ ♗ ♘ ♙ ♚ ♛ ♜ ♝ ♞ ♟ ♠ ♡ ♢ ♣ ♤ ♥ ♦ ♧ ♨ ♩ ♪ ♫ ♬ ♭ ♮ ♯"+  putStrLn "☀ ☁ ☂ ☃ ☄ ★ ☆ ☇ ☈ ☉ ☊ ☋ ☌ ☍ ☎ ☏ ☐ ☑ ☒ ☓ ☚ ☛ ☜ ☝ ☞ ☟ ☠ ☡ ☢ ☣ ☤ ☥ ☦ ☧ ☨ ☩ ☪ ☫ ☬ ☭ ☮ ☯ ☰ ☱ ☲ ☳ ☴ ☵ ☶ ☷ ☸ ☹ ☺ ☻ ☼ ☽ ☾ ☿ ♀ ♁ ♂ ♃ ♄ ♅ ♆ ♇ ♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓ ♔ ♕ ♖ ♗ ♘ ♙ ♚ ♛ ♜ ♝ ♞ ♟ ♠ ♡ ♢ ♣ ♤ ♥ ♦ ♧ ♨ ♩ ♪ ♫ ♬ ♭ ♮ ♯"   -- Dingbats-  printS "✁ ✂ ✃ ✄ ✆ ✇ ✈ ✉ ✌ ✍ ✎ ✏ ✐ ✑ ✒ ✓ ✔ ✕ ✖ ✗ ✘ ✙ ✚ ✛ ✜ ✝ ✞ ✟ ✠ ✡ ✢ ✣ ✤ ✥ ✦ ✧ ✩ ✪ ✫ ✬ ✭ ✮ ✯ ✰ ✱ ✲ ✳ ✴ ✵ ✶ ✷ ✸ ✹ ✺ ✻ ✼ ✽ ✾ ✿ ❀ ❁ ❂ ❃ ❄ ❅ ❆ ❇ ❈ ❉ ❊ ❋ ❍ ❏ ❐ ❑ ❒ ❖ ❘ ❙ ❚ ❛ ❜ ❝ ❞ ❡ ❢ ❣ ❤ ❥ ❦ ❧ ❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿ ➀ ➁ ➂ ➃ ➄ ➅ ➆ ➇ ➈ ➉ ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓ ➔ ➘ ➙ ➚ ➛ ➜ ➝ ..."+  putStrLn "✁ ✂ ✃ ✄ ✆ ✇ ✈ ✉ ✌ ✍ ✎ ✏ ✐ ✑ ✒ ✓ ✔ ✕ ✖ ✗ ✘ ✙ ✚ ✛ ✜ ✝ ✞ ✟ ✠ ✡ ✢ ✣ ✤ ✥ ✦ ✧ ✩ ✪ ✫ ✬ ✭ ✮ ✯ ✰ ✱ ✲ ✳ ✴ ✵ ✶ ✷ ✸ ✹ ✺ ✻ ✼ ✽ ✾ ✿ ❀ ❁ ❂ ❃ ❄ ❅ ❆ ❇ ❈ ❉ ❊ ❋ ❍ ❏ ❐ ❑ ❒ ❖ ❘ ❙ ❚ ❛ ❜ ❝ ❞ ❡ ❢ ❣ ❤ ❥ ❦ ❧ ❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿ ➀ ➁ ➂ ➃ ➄ ➅ ➆ ➇ ➈ ➉ ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓ ➔ ➘ ➙ ➚ ➛ ➜ ➝ ..."   -- CJK Symbols and Punctuation-  printS "  、 。 〃 〄 々 〆 〇 〈 〉 《 》 「 」 『 』 【 】 〒 〓 〔 〕 〖 〗 〘 〙 〚 〛 〜 〝 〞 〟 〠 〡 〢 〣 〤 〥 〦 〧 〨 〩 〪 〫 〬 〭 〮 〯 〰 〱 〲 〳 〴 〵 〶 〷 〿"+  putStrLn "  、 。 〃 〄 々 〆 〇 〈 〉 《 》 「 」 『 』 【 】 〒 〓 〔 〕 〖 〗 〘 〙 〚 〛 〜 〝 〞 〟 〠 〡 〢 〣 〤 〥 〦 〧 〨 〩 〪 〫 〬 〭 〮 〯 〰 〱 〲 〳 〴 〵 〶 〷 〿"   -- Hiragana-  printS "ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た だ ち ぢ っ つ づ て で と ど な に ぬ ね の は ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み む め も ゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ ゐ ゑ を ん ゔ ゙ ゚ ゛ ゜ ゝ ゞ"+  putStrLn "ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た だ ち ぢ っ つ づ て で と ど な に ぬ ね の は ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み む め も ゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ ゐ ゑ を ん ゔ ゙ ゚ ゛ ゜ ゝ ゞ"   -- Katakana-  printS "ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク グ ケ ゲ コ ゴ サ ザ シ ジ ス ズ セ ゼ ソ ゾ タ ダ チ ヂ ッ ツ ヅ テ デ ト ド ナ ニ ヌ ネ ノ ハ バ パ ヒ ビ ピ フ ブ プ ヘ ベ ペ ホ ボ ポ マ ミ ム メ モ ャ ヤ ュ ユ ョ ヨ ラ リ ル レ ロ ヮ ワ ヰ ヱ ヲ ン ヴ ヵ ヶ ヷ ヸ ヹ ヺ ・ ー ヽ ヾ"+  putStrLn "ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク グ ケ ゲ コ ゴ サ ザ シ ジ ス ズ セ ゼ ソ ゾ タ ダ チ ヂ ッ ツ ヅ テ デ ト ド ナ ニ ヌ ネ ノ ハ バ パ ヒ ビ ピ フ ブ プ ヘ ベ ペ ホ ボ ポ マ ミ ム メ モ ャ ヤ ュ ユ ョ ヨ ラ リ ル レ ロ ヮ ワ ヰ ヱ ヲ ン ヴ ヵ ヶ ヷ ヸ ヹ ヺ ・ ー ヽ ヾ"   -- Bopomofo-  printS "ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ ㄢ ㄣ ㄤ ㄥ ㄦ ㄧ ㄨ ㄩ ㄪ ㄫ ㄬ"+  putStrLn "ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ ㄢ ㄣ ㄤ ㄥ ㄦ ㄧ ㄨ ㄩ ㄪ ㄫ ㄬ"   -- Hangul Compatibility Jamo-  printS "ㄱ ㄲ ㄳ ㄴ ㄵ ㄶ ㄷ ㄸ ㄹ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ ㅂ ㅃ ㅄ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ ㅤ ㅥ ㅦ ㅧ ㅨ ㅩ ㅪ ㅫ ㅬ ㅭ ㅮ ㅯ ㅰ ㅱ ㅲ ㅳ ㅴ ㅵ ㅶ ㅷ ㅸ ㅹ ㅺ ㅻ ㅼ ㅽ ㅾ ㅿ ㆀ ㆁ ㆂ ㆃ ㆄ ㆅ ㆆ ㆇ ㆈ ㆉ ㆊ ㆋ ㆌ ㆍ ㆎ"+  putStrLn "ㄱ ㄲ ㄳ ㄴ ㄵ ㄶ ㄷ ㄸ ㄹ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ ㅂ ㅃ ㅄ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ ㅤ ㅥ ㅦ ㅧ ㅨ ㅩ ㅪ ㅫ ㅬ ㅭ ㅮ ㅯ ㅰ ㅱ ㅲ ㅳ ㅴ ㅵ ㅶ ㅷ ㅸ ㅹ ㅺ ㅻ ㅼ ㅽ ㅾ ㅿ ㆀ ㆁ ㆂ ㆃ ㆄ ㆅ ㆆ ㆇ ㆈ ㆉ ㆊ ㆋ ㆌ ㆍ ㆎ"   -- Kanbun-  printS "㆐ ㆑ ㆒ ㆓ ㆔ ㆕ ㆖ ㆗ ㆘ ㆙ ㆚ ㆛ ㆜ ㆝ ㆞ ㆟"+  putStrLn "㆐ ㆑ ㆒ ㆓ ㆔ ㆕ ㆖ ㆗ ㆘ ㆙ ㆚ ㆛ ㆜ ㆝ ㆞ ㆟"   -- Enclosed CJK Letters and Months-  printS "㈀ ㈁ ㈂ ㈃ ㈄ ㈅ ㈆ ㈇ ㈈ ㈉ ㈊ ㈋ ㈌ ㈍ ㈎ ㈏ ㈐ ㈑ ㈒ ㈓ ㈔ ㈕ ㈖ ㈗ ㈘ ㈙ ㈚ ㈛ ㈜ ㈠ ㈡ ㈢ ㈣ ㈤ ㈥ ㈦ ㈧ ㈨ ㈩ ㈪ ㈫ ㈬ ㈭ ㈮ ㈯ ㈰ ㈱ ㈲ ㈳ ㈴ ㈵ ㈶ ㈷ ㈸ ㈹ ㈺ ㈻ ㈼ ㈽ ㈾ ㈿ ㉀ ㉁ ㉂ ㉃ ㉠ ㉡ ㉢ ㉣ ㉤ ㉥ ㉦ ㉧ ㉨ ㉩ ㉪ ㉫ ㉬ ㉭ ㉮ ㉯ ㉰ ㉱ ㉲ ㉳ ㉴ ㉵ ㉶ ㉷ ㉸ ㉹ ㉺ ㉻ ㉿ ㊀ ㊁ ㊂ ㊃ ㊄ ㊅ ㊆ ㊇ ㊈ ㊉ ㊊ ㊋ ㊌ ㊍ ㊎ ㊏ ㊐ ㊑ ㊒ ㊓ ㊔ ㊕ ㊖ ㊗ ㊘ ㊙ ㊚ ㊛ ㊜ ㊝ ㊞ ㊟ ㊠ ㊡ ..."+  putStrLn "㈀ ㈁ ㈂ ㈃ ㈄ ㈅ ㈆ ㈇ ㈈ ㈉ ㈊ ㈋ ㈌ ㈍ ㈎ ㈏ ㈐ ㈑ ㈒ ㈓ ㈔ ㈕ ㈖ ㈗ ㈘ ㈙ ㈚ ㈛ ㈜ ㈠ ㈡ ㈢ ㈣ ㈤ ㈥ ㈦ ㈧ ㈨ ㈩ ㈪ ㈫ ㈬ ㈭ ㈮ ㈯ ㈰ ㈱ ㈲ ㈳ ㈴ ㈵ ㈶ ㈷ ㈸ ㈹ ㈺ ㈻ ㈼ ㈽ ㈾ ㈿ ㉀ ㉁ ㉂ ㉃ ㉠ ㉡ ㉢ ㉣ ㉤ ㉥ ㉦ ㉧ ㉨ ㉩ ㉪ ㉫ ㉬ ㉭ ㉮ ㉯ ㉰ ㉱ ㉲ ㉳ ㉴ ㉵ ㉶ ㉷ ㉸ ㉹ ㉺ ㉻ ㉿ ㊀ ㊁ ㊂ ㊃ ㊄ ㊅ ㊆ ㊇ ㊈ ㊉ ㊊ ㊋ ㊌ ㊍ ㊎ ㊏ ㊐ ㊑ ㊒ ㊓ ㊔ ㊕ ㊖ ㊗ ㊘ ㊙ ㊚ ㊛ ㊜ ㊝ ㊞ ㊟ ㊠ ㊡ ..."   -- CJK Compatibility-  printS "㌀ ㌁ ㌂ ㌃ ㌄ ㌅ ㌆ ㌇ ㌈ ㌉ ㌊ ㌋ ㌌ ㌍ ㌎ ㌏ ㌐ ㌑ ㌒ ㌓ ㌔ ㌕ ㌖ ㌗ ㌘ ㌙ ㌚ ㌛ ㌜ ㌝ ㌞ ㌟ ㌠ ㌡ ㌢ ㌣ ㌤ ㌥ ㌦ ㌧ ㌨ ㌩ ㌪ ㌫ ㌬ ㌭ ㌮ ㌯ ㌰ ㌱ ㌲ ㌳ ㌴ ㌵ ㌶ ㌷ ㌸ ㌹ ㌺ ㌻ ㌼ ㌽ ㌾ ㌿ ㍀ ㍁ ㍂ ㍃ ㍄ ㍅ ㍆ ㍇ ㍈ ㍉ ㍊ ㍋ ㍌ ㍍ ㍎ ㍏ ㍐ ㍑ ㍒ ㍓ ㍔ ㍕ ㍖ ㍗ ㍘ ㍙ ㍚ ㍛ ㍜ ㍝ ㍞ ㍟ ㍠ ㍡ ㍢ ㍣ ㍤ ㍥ ㍦ ㍧ ㍨ ㍩ ㍪ ㍫ ㍬ ㍭ ㍮ ㍯ ㍰ ㍱ ㍲ ㍳ ㍴ ㍵ ㍶ ㍻ ㍼ ㍽ ㍾ ㍿ ㎀ ㎁ ㎂ ㎃ ..."+  putStrLn "㌀ ㌁ ㌂ ㌃ ㌄ ㌅ ㌆ ㌇ ㌈ ㌉ ㌊ ㌋ ㌌ ㌍ ㌎ ㌏ ㌐ ㌑ ㌒ ㌓ ㌔ ㌕ ㌖ ㌗ ㌘ ㌙ ㌚ ㌛ ㌜ ㌝ ㌞ ㌟ ㌠ ㌡ ㌢ ㌣ ㌤ ㌥ ㌦ ㌧ ㌨ ㌩ ㌪ ㌫ ㌬ ㌭ ㌮ ㌯ ㌰ ㌱ ㌲ ㌳ ㌴ ㌵ ㌶ ㌷ ㌸ ㌹ ㌺ ㌻ ㌼ ㌽ ㌾ ㌿ ㍀ ㍁ ㍂ ㍃ ㍄ ㍅ ㍆ ㍇ ㍈ ㍉ ㍊ ㍋ ㍌ ㍍ ㍎ ㍏ ㍐ ㍑ ㍒ ㍓ ㍔ ㍕ ㍖ ㍗ ㍘ ㍙ ㍚ ㍛ ㍜ ㍝ ㍞ ㍟ ㍠ ㍡ ㍢ ㍣ ㍤ ㍥ ㍦ ㍧ ㍨ ㍩ ㍪ ㍫ ㍬ ㍭ ㍮ ㍯ ㍰ ㍱ ㍲ ㍳ ㍴ ㍵ ㍶ ㍻ ㍼ ㍽ ㍾ ㍿ ㎀ ㎁ ㎂ ㎃ ..."   -- CJK Unified Ideographs-  printS "一 丁 丂 七 丄 丅 丆 万 丈 三 上 下 丌 不 与 丏 丐 丑 丒 专 且 丕 世 丗 丘 丙 业 丛 东 丝 丞 丟 丠 両 丢 丣 两 严 並 丧 丨 丩 个 丫 丬 中 丮 丯 丰 丱 串 丳 临 丵 丶 丷 丸 丹 为 主 丼 丽 举 丿 乀 乁 乂 乃 乄 久 乆 乇 么 义 乊 之 乌 乍 乎 乏 乐 乑 乒 乓 乔 乕 乖 乗 乘 乙 乚 乛 乜 九 乞 也 习 乡 乢 乣 乤 乥 书 乧 乨 乩 乪 乫 乬 乭 乮 乯 买 乱 乲 乳 乴 乵 乶 乷 乸 乹 乺 乻 乼 乽 乾 乿 ..."+  putStrLn "一 丁 丂 七 丄 丅 丆 万 丈 三 上 下 丌 不 与 丏 丐 丑 丒 专 且 丕 世 丗 丘 丙 业 丛 东 丝 丞 丟 丠 両 丢 丣 两 严 並 丧 丨 丩 个 丫 丬 中 丮 丯 丰 丱 串 丳 临 丵 丶 丷 丸 丹 为 主 丼 丽 举 丿 乀 乁 乂 乃 乄 久 乆 乇 么 义 乊 之 乌 乍 乎 乏 乐 乑 乒 乓 乔 乕 乖 乗 乘 乙 乚 乛 乜 九 乞 也 习 乡 乢 乣 乤 乥 书 乧 乨 乩 乪 乫 乬 乭 乮 乯 买 乱 乲 乳 乴 乵 乶 乷 乸 乹 乺 乻 乼 乽 乾 乿 ..."   -- Hangul Syllables-  printS "가 각 갂 갃 간 갅 갆 갇 갈 갉 갊 갋 갌 갍 갎 갏 감 갑 값 갓 갔 강 갖 갗 갘 같 갚 갛 개 객 갞 갟 갠 갡 갢 갣 갤 갥 갦 갧 갨 갩 갪 갫 갬 갭 갮 갯 갰 갱 갲 갳 갴 갵 갶 갷 갸 갹 갺 갻 갼 갽 갾 갿 걀 걁 걂 걃 걄 걅 걆 걇 걈 걉 걊 걋 걌 걍 걎 걏 걐 걑 걒 걓 걔 걕 걖 걗 걘 걙 걚 걛 걜 걝 걞 걟 걠 걡 걢 걣 걤 걥 걦 걧 걨 걩 걪 걫 걬 걭 걮 걯 거 걱 걲 걳 건 걵 걶 걷 걸 걹 걺 걻 걼 걽 걾 걿 ..."+  putStrLn "가 각 갂 갃 간 갅 갆 갇 갈 갉 갊 갋 갌 갍 갎 갏 감 갑 값 갓 갔 강 갖 갗 갘 같 갚 갛 개 객 갞 갟 갠 갡 갢 갣 갤 갥 갦 갧 갨 갩 갪 갫 갬 갭 갮 갯 갰 갱 갲 갳 갴 갵 갶 갷 갸 갹 갺 갻 갼 갽 갾 갿 걀 걁 걂 걃 걄 걅 걆 걇 걈 걉 걊 걋 걌 걍 걎 걏 걐 걑 걒 걓 걔 걕 걖 걗 걘 걙 걚 걛 걜 걝 걞 걟 걠 걡 걢 걣 걤 걥 걦 걧 걨 걩 걪 걫 걬 걭 걮 걯 거 걱 걲 걳 건 걵 걶 걷 걸 걹 걺 걻 걼 걽 걾 걿 ..."   -- CJK Compatibility Ideographs-  printS "豈 更 車 賈 滑 串 句 龜 龜 契 金 喇 奈 懶 癩 羅 蘿 螺 裸 邏 樂 洛 烙 珞 落 酪 駱 亂 卵 欄 爛 蘭 鸞 嵐 濫 藍 襤 拉 臘 蠟 廊 朗 浪 狼 郎 來 冷 勞 擄 櫓 爐 盧 老 蘆 虜 路 露 魯 鷺 碌 祿 綠 菉 錄 鹿 論 壟 弄 籠 聾 牢 磊 賂 雷 壘 屢 樓 淚 漏 累 縷 陋 勒 肋 凜 凌 稜 綾 菱 陵 讀 拏 樂 諾 丹 寧 怒 率 異 北 磻 便 復 不 泌 數 索 參 塞 省 葉 說 殺 辰 沈 拾 若 掠 略 亮 兩 凉 梁 糧 良 諒 量 勵 ..."+  putStrLn "豈 更 車 賈 滑 串 句 龜 龜 契 金 喇 奈 懶 癩 羅 蘿 螺 裸 邏 樂 洛 烙 珞 落 酪 駱 亂 卵 欄 爛 蘭 鸞 嵐 濫 藍 襤 拉 臘 蠟 廊 朗 浪 狼 郎 來 冷 勞 擄 櫓 爐 盧 老 蘆 虜 路 露 魯 鷺 碌 祿 綠 菉 錄 鹿 論 壟 弄 籠 聾 牢 磊 賂 雷 壘 屢 樓 淚 漏 累 縷 陋 勒 肋 凜 凌 稜 綾 菱 陵 讀 拏 樂 諾 丹 寧 怒 率 異 北 磻 便 復 不 泌 數 索 參 塞 省 葉 說 殺 辰 沈 拾 若 掠 略 亮 兩 凉 梁 糧 良 諒 量 勵 ..."   -- Alphabetic Presentation Forms-  printS "ff fi fl ffi ffl ſt st ﬓ ﬔ ﬕ ﬖ ﬗ ﬞ ײַ ﬠ ﬡ ﬢ ﬣ ﬤ ﬥ ﬦ ﬧ ﬨ ﬩ שׁ שׂ שּׁ שּׂ אַ אָ אּ בּ גּ דּ הּ וּ זּ טּ יּ ךּ כּ לּ מּ נּ סּ ףּ פּ צּ קּ רּ שּ תּ וֹ בֿ כֿ פֿ ﭏ"+  putStrLn "ff fi fl ffi ffl ſt st ﬓ ﬔ ﬕ ﬖ ﬗ ﬞ ײַ ﬠ ﬡ ﬢ ﬣ ﬤ ﬥ ﬦ ﬧ ﬨ ﬩ שׁ שׂ שּׁ שּׂ אַ אָ אּ בּ גּ דּ הּ וּ זּ טּ יּ ךּ כּ לּ מּ נּ סּ ףּ פּ צּ קּ רּ שּ תּ וֹ בֿ כֿ פֿ ﭏ"   -- Arabic Presentation Forms-A-  printS "ﭐ ﭑ ﭒ ﭓ ﭔ ﭕ ﭖ ﭗ ﭘ ﭙ ﭚ ﭛ ﭜ ﭝ ﭞ ﭟ ﭠ ﭡ ﭢ ﭣ ﭤ ﭥ ﭦ ﭧ ﭨ ﭩ ﭪ ﭫ ﭬ ﭭ ﭮ ﭯ ﭰ ﭱ ﭲ ﭳ ﭴ ﭵ ﭶ ﭷ ﭸ ﭹ ﭺ ﭻ ﭼ ﭽ ﭾ ﭿ ﮀ ﮁ ﮂ ﮃ ﮄ ﮅ ﮆ ﮇ ﮈ ﮉ ﮊ ﮋ ﮌ ﮍ ﮎ ﮏ ﮐ ﮑ ﮒ ﮓ ﮔ ﮕ ﮖ ﮗ ﮘ ﮙ ﮚ ﮛ ﮜ ﮝ ﮞ ﮟ ﮠ ﮡ ﮢ ﮣ ﮤ ﮥ ﮦ ﮧ ﮨ ﮩ ﮪ ﮫ ﮬ ﮭ ﮮ ﮯ ﮰ ﮱ ﯓ ﯔ ﯕ ﯖ ﯗ ﯘ ﯙ ﯚ ﯛ ﯜ ﯝ ﯞ ﯟ ﯠ ﯡ ﯢ ﯣ ﯤ ﯥ ﯦ ﯧ ﯨ ﯩ ﯪ ﯫ ﯬ ﯭ ﯮ ﯯ ﯰ ..."+  putStrLn "ﭐ ﭑ ﭒ ﭓ ﭔ ﭕ ﭖ ﭗ ﭘ ﭙ ﭚ ﭛ ﭜ ﭝ ﭞ ﭟ ﭠ ﭡ ﭢ ﭣ ﭤ ﭥ ﭦ ﭧ ﭨ ﭩ ﭪ ﭫ ﭬ ﭭ ﭮ ﭯ ﭰ ﭱ ﭲ ﭳ ﭴ ﭵ ﭶ ﭷ ﭸ ﭹ ﭺ ﭻ ﭼ ﭽ ﭾ ﭿ ﮀ ﮁ ﮂ ﮃ ﮄ ﮅ ﮆ ﮇ ﮈ ﮉ ﮊ ﮋ ﮌ ﮍ ﮎ ﮏ ﮐ ﮑ ﮒ ﮓ ﮔ ﮕ ﮖ ﮗ ﮘ ﮙ ﮚ ﮛ ﮜ ﮝ ﮞ ﮟ ﮠ ﮡ ﮢ ﮣ ﮤ ﮥ ﮦ ﮧ ﮨ ﮩ ﮪ ﮫ ﮬ ﮭ ﮮ ﮯ ﮰ ﮱ ﯓ ﯔ ﯕ ﯖ ﯗ ﯘ ﯙ ﯚ ﯛ ﯜ ﯝ ﯞ ﯟ ﯠ ﯡ ﯢ ﯣ ﯤ ﯥ ﯦ ﯧ ﯨ ﯩ ﯪ ﯫ ﯬ ﯭ ﯮ ﯯ ﯰ ..."   -- Combining Half Marks-  printS "︠ ︡ ︢ ︣"+  putStrLn "︠ ︡ ︢ ︣"   -- CJK Compatibility Forms-  printS "︰ ︱ ︲ ︳ ︴ ︵ ︶ ︷ ︸ ︹ ︺ ︻ ︼ ︽ ︾ ︿ ﹀ ﹁ ﹂ ﹃ ﹄ ﹉ ﹊ ﹋ ﹌ ﹍ ﹎ ﹏"+  putStrLn "︰ ︱ ︲ ︳ ︴ ︵ ︶ ︷ ︸ ︹ ︺ ︻ ︼ ︽ ︾ ︿ ﹀ ﹁ ﹂ ﹃ ﹄ ﹉ ﹊ ﹋ ﹌ ﹍ ﹎ ﹏"   -- Small Form Variants-  printS "﹐ ﹑ ﹒ ﹔ ﹕ ﹖ ﹗ ﹘ ﹙ ﹚ ﹛ ﹜ ﹝ ﹞ ﹟ ﹠ ﹡ ﹢ ﹣ ﹤ ﹥ ﹦ ﹨ ﹩ ﹪ ﹫"+  putStrLn "﹐ ﹑ ﹒ ﹔ ﹕ ﹖ ﹗ ﹘ ﹙ ﹚ ﹛ ﹜ ﹝ ﹞ ﹟ ﹠ ﹡ ﹢ ﹣ ﹤ ﹥ ﹦ ﹨ ﹩ ﹪ ﹫"   -- Arabic Presentation Forms-B-  printS "ﹰ ﹱ ﹲ ﹴ ﹶ ﹷ ﹸ ﹹ ﹺ ﹻ ﹼ ﹽ ﹾ ﹿ ﺀ ﺁ ﺂ ﺃ ﺄ ﺅ ﺆ ﺇ ﺈ ﺉ ﺊ ﺋ ﺌ ﺍ ﺎ ﺏ ﺐ ﺑ ﺒ ﺓ ﺔ ﺕ ﺖ ﺗ ﺘ ﺙ ﺚ ﺛ ﺜ ﺝ ﺞ ﺟ ﺠ ﺡ ﺢ ﺣ ﺤ ﺥ ﺦ ﺧ ﺨ ﺩ ﺪ ﺫ ﺬ ﺭ ﺮ ﺯ ﺰ ﺱ ﺲ ﺳ ﺴ ﺵ ﺶ ﺷ ﺸ ﺹ ﺺ ﺻ ﺼ ﺽ ﺾ ﺿ ﻀ ﻁ ﻂ ﻃ ﻄ ﻅ ﻆ ﻇ ﻈ ﻉ ﻊ ﻋ ﻌ ﻍ ﻎ ﻏ ﻐ ﻑ ﻒ ﻓ ﻔ ﻕ ﻖ ﻗ ﻘ ﻙ ﻚ ﻛ ﻜ ﻝ ﻞ ﻟ ﻠ ﻡ ﻢ ﻣ ﻤ ﻥ ﻦ ﻧ ﻨ ﻩ ﻪ ﻫ ﻬ ﻭ ﻮ ﻯ ﻰ ﻱ ..."+  putStrLn "ﹰ ﹱ ﹲ ﹴ ﹶ ﹷ ﹸ ﹹ ﹺ ﹻ ﹼ ﹽ ﹾ ﹿ ﺀ ﺁ ﺂ ﺃ ﺄ ﺅ ﺆ ﺇ ﺈ ﺉ ﺊ ﺋ ﺌ ﺍ ﺎ ﺏ ﺐ ﺑ ﺒ ﺓ ﺔ ﺕ ﺖ ﺗ ﺘ ﺙ ﺚ ﺛ ﺜ ﺝ ﺞ ﺟ ﺠ ﺡ ﺢ ﺣ ﺤ ﺥ ﺦ ﺧ ﺨ ﺩ ﺪ ﺫ ﺬ ﺭ ﺮ ﺯ ﺰ ﺱ ﺲ ﺳ ﺴ ﺵ ﺶ ﺷ ﺸ ﺹ ﺺ ﺻ ﺼ ﺽ ﺾ ﺿ ﻀ ﻁ ﻂ ﻃ ﻄ ﻅ ﻆ ﻇ ﻈ ﻉ ﻊ ﻋ ﻌ ﻍ ﻎ ﻏ ﻐ ﻑ ﻒ ﻓ ﻔ ﻕ ﻖ ﻗ ﻘ ﻙ ﻚ ﻛ ﻜ ﻝ ﻞ ﻟ ﻠ ﻡ ﻢ ﻣ ﻤ ﻥ ﻦ ﻧ ﻨ ﻩ ﻪ ﻫ ﻬ ﻭ ﻮ ﻯ ﻰ ﻱ ..."   -- Halfwidth and Fullwidth Forms-  printS "! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ 。 「 」 、 ・ ヲ ァ ィ ゥ ェ ォ ャ ュ ョ ッ ー ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ ..."+  putStrLn "! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ 。 「 」 、 ・ ヲ ァ ィ ゥ ェ ォ ャ ュ ョ ッ ー ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ ..." -printS :: String -> Fay ()-printS = ffi "console.log(%1)"
tests/where.hs view
@@ -1,13 +1,6 @@---module Where where--import           Language.Fay.FFI import           Language.Fay.Prelude -main = print $ "Hello " ++ friends ++ family+main = putStrLn $ "Hello " ++ friends ++ family   where friends = "my friends"         family = " and family" -print :: String -> Fay ()-print = ffi "console.log(%1)"