packages feed

jsaddle 0.4.0.5 → 0.9.9.4

raw patch · 56 files changed

Files

jsaddle.cabal view
@@ -1,82 +1,131 @@ name: jsaddle-version: 0.4.0.5+version: 0.9.9.4 cabal-version: >=1.10 build-type: Simple license: MIT license-file: LICENSE maintainer: Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>-synopsis: High level interface for webkit-javascriptcore+synopsis: Interface for JavaScript that works with GHCJS and GHC description:-    This package provides an EDSL for calling JavaScript code using-    the JavaScriptCore engine and low level Haskell bindings-    in the webkit-javascriptcore library <https://github.com/ghcjs/webkit-javascriptcore>.+    This package provides an EDSL for calling JavaScript that+    can be used both from GHCJS and GHC.  When using GHC+    the application is run using Warp and WebSockets to+    drive a small JavaScript helper. category: Web, Javascript author: Hamish Mackenzie+tested-with: GHC==9.12.2, GHC==9.10.1, GHC==9.8.4, GHC==9.6.7, GHC==9.4.8, GHC==9.2.8, GHC==9.0.2, GHC==8.10.7, GHC==8.8.4, GHC==8.6.5, GHC==8.4.4  source-repository head     type: git     location: https://github.com/ghcjs/jsaddle+    subdir: jsaddle +flag call-stacks+  description: Include HasCallStack constraint on calls unchecked calls+  default: False++flag check-unchecked+  description: Fail unchecked calls when they are called (rather than when the result is evaluated)+  default: False+ library -    if impl(ghcjs -any)+    if impl(ghcjs -any) || arch(javascript)         build-depends:-            ghcjs-base -any,-            ghcjs-prim -any+            ghcjs-base -any+        -- GHC includes GHC.JS.Prim in base+        if impl(ghcjs -any)+            build-depends:+                ghcjs-prim -any     else         build-depends:-            haskell-gi-base >= 0.17 && < 0.19,-            gi-glib >=2.0.2 && <2.1,-            gi-gtk >=3.0.2 && <3.1,-            gi-webkit >=3.0.2 && <3.1,-            gi-javascriptcore >=3.0.2 && <3.1,-            webkitgtk3-javascriptcore >=0.14.0.0 && <0.15+            attoparsec >=0.11 && <0.15,+            containers >=0.5.6.2 && <0.9,+            deepseq >=1.3 && < 1.6,+            filepath >=1.4.0.0 && <1.6,+            ghc-prim,+            http-types >=0.8.6 && <0.13,+            process >=1.2.3.0 && <1.7,+            random >= 1.1 && < 1.4,+            ref-tf >=0.4.0.1 && <0.6,+            scientific >=0.3 && <0.4,+            stm >=2.4.4 && <2.6,+            time >=1.5.0.1 && <1.16,+            unordered-containers >=0.2 && <0.3,+            vector >=0.10 && <0.14,+            unliftio-core >=0.1 && < 0.3         exposed-modules:-            Language.Javascript.JSaddle.Test+            Data.JSString+            Data.JSString.Internal+            Data.JSString.Internal.Fusion+            Data.JSString.Internal.Fusion.CaseMapping+            Data.JSString.Internal.Fusion.Common+            Data.JSString.Internal.Fusion.Types+            Data.JSString.Internal.Search+            Data.JSString.Internal.Type+            Data.JSString.Text+            GHCJS.Prim+            GHCJS.Prim.Internal+            GHCJS.Types+            GHCJS.Concurrent+            GHCJS.Foreign+            GHCJS.Foreign.Internal+            GHCJS.Internal.Types+            GHCJS.Marshal+            GHCJS.Marshal.Internal+            GHCJS.Marshal.Pure+            GHCJS.Buffer+            GHCJS.Buffer.Types+            JavaScript.TypedArray+            JavaScript.TypedArray.ArrayBuffer+            JavaScript.TypedArray.ArrayBuffer.Internal+            JavaScript.TypedArray.ArrayBuffer.Type+            JavaScript.TypedArray.DataView.Internal+            JavaScript.TypedArray.Immutable+            JavaScript.TypedArray.Internal+            JavaScript.TypedArray.Internal.Types+            JavaScript.Array+            JavaScript.Array.Internal+            JavaScript.Object+            JavaScript.Object.Internal+            Language.Javascript.JSaddle.Debug+            Language.Javascript.JSaddle.Native+            Language.Javascript.JSaddle.Native.Internal+            Language.Javascript.JSaddle.Null+        hs-source-dirs: src-ghc     exposed-modules:         Language.Javascript.JSaddle         Language.Javascript.JSaddle.Arguments         Language.Javascript.JSaddle.Classes+        Language.Javascript.JSaddle.Classes.Internal         Language.Javascript.JSaddle.Evaluate         Language.Javascript.JSaddle.Exception+        Language.Javascript.JSaddle.Helper+        Language.Javascript.JSaddle.Marshal.String         Language.Javascript.JSaddle.Monad-        Language.Javascript.JSaddle.Native         Language.Javascript.JSaddle.Object         Language.Javascript.JSaddle.Properties+        Language.Javascript.JSaddle.Run+        Language.Javascript.JSaddle.Run.Files         Language.Javascript.JSaddle.String         Language.Javascript.JSaddle.Value         Language.Javascript.JSaddle.Types     build-depends:-        template-haskell -any,-        base <5,-        lens >=3.8.5 && <4.15,-        text >=0.11.2.3 && <1.3,-        transformers >=0.3.0.0 && <0.6+        aeson >=0.11.3.0 && <2.3,+        base >=4.9 && <5,+        base-compat >=0.9.0 && <0.16,+        base64-bytestring >=1.0.0.1 && <1.3,+        bytestring >=0.10.6.0 && <0.13,+        exceptions >=0.8 && <0.11,+        kan-extensions >= 5 && < 6,+        lens >=3.8.5 && <5.4,+        primitive >=0.6.1.0 && <0.10,+        text >=1.2.1.3 && <1.3 || >= 2.0 && < 2.2,+        transformers >=0.4.2.0 && <0.7     default-language: Haskell2010     hs-source-dirs: src-    ghc-options: -ferror-spans--test-suite test-tool--    if impl(ghcjs -any)-        buildable: False-    else-        build-depends:-            haskell-gi-base >= 0.17 && < 0.19,-            gi-glib >=2.0.2 && <2.1,-            gi-gtk >=3.0.2 && <3.1,-            gi-webkit >=3.0.2 && <3.1,-            gi-javascriptcore >=3.0.2 && <3.1,-            webkitgtk3-javascriptcore >=0.14.0.0 && <0.15-    type: exitcode-stdio-1.0-    main-is: DocTest.hs-    build-depends:-        QuickCheck -any,-        base -any,-        doctest -any,-        vector >=0.11.0.0 && <0.12,-        text >=0.11.2.3 && <1.3,-        jsaddle -any-    default-language: Haskell2010-    hs-source-dirs: tests-    ghc-options: -ferror-spans+    ghc-options: -ferror-spans -Wall+    if flag(check-unchecked)+        cpp-options: -DCHECK_UNCHECKED+    if flag(call-stacks) || flag(check-unchecked)+        cpp-options: -DJSADDLE_HAS_CALL_STACK
+ src-ghc/Data/JSString.hs view
@@ -0,0 +1,1404 @@+{-# LANGUAGE MagicHash, BangPatterns, UnboxedTuples, TypeFamilies+  #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-| Manipulation of JavaScript strings, API and fusion implementation+    based on Data.Text by Tom Harper, Duncan Coutts, Bryan O'Sullivan e.a.+ -}+module Data.JSString ( JSString++                       -- * Creation and elimination+                     , pack+                     , unpack, unpack'+                     , singleton+                     , empty++                       -- * Basic interface+                     , cons+                     , snoc+                     , append+                     , uncons+                     , head+                     , last+                     , tail+                     , init+                     , null+                     , length+                     , compareLength++                       -- * Transformations+                     , map+                     , intercalate+                     , intersperse+                     , transpose+                     , reverse+                     , replace++                       -- ** Case conversion+                     , toCaseFold+                     , toLower+                     , toUpper+                     , toTitle++                       -- ** Justification+                     , justifyLeft+                     , justifyRight+                     , center++                       -- * Folds+                     , foldl+                     , foldl'+                     , foldl1+                     , foldl1'+                     , foldr+                     , foldr1++                       -- ** Special folds+                     , concat+                     , concatMap+                     , any+                     , all+                     , maximum+                     , minimum++                       -- * Construction++                       -- ** Scans+                     , scanl+                     , scanl1+                     , scanr+                     , scanr1++                       -- ** Accumulating maps+                     , mapAccumL+                     , mapAccumR++                       -- ** Generation and unfolding+                     , replicate+                     , unfoldr+                     , unfoldrN++                       -- * Substrings++                       -- ** Breaking strings+                     , take+                     , takeEnd+                     , drop+                     , dropEnd+                     , takeWhile+                     , dropWhile+                     , dropWhileEnd+                     , dropAround+                     , strip+                     , stripStart+                     , stripEnd+                     , splitAt+                     , breakOn+                     , breakOnEnd+                     , break+                     , span+                     , group+                     , group'+                     , groupBy+                     , inits+                     , tails++                       -- ** Breaking into many substrings+                     , splitOn, splitOn'+                     , split+                     , chunksOf, chunksOf'++                       -- ** Breaking into lines and words+                     , lines, lines'+                     , words, words'+                     , unlines+                     , unwords++                       -- * Predicates+                     , isPrefixOf+                     , isSuffixOf+                     , isInfixOf++                       -- ** View patterns+                     , stripPrefix+                     , stripSuffix+                     , commonPrefixes++                       -- * Searching+                     , filter+                     , breakOnAll, breakOnAll'+                     , find+                     , partition++                       -- * Indexing+                     , index+                     , findIndex+                     , count++                       -- * Zipping+                     , zip+                     , zipWith+                     ) where++import           Prelude+  ( Char, Bool(..), Int, Maybe(..), String, Eq(..), Ord(..), Ordering(..), (++)+  , Read(..), Show(..), (&&), (||), (+), (-), (.), ($), ($!), (>>)+  , not, seq, return, otherwise, quot)+import qualified Prelude                              as P++import           Control.DeepSeq                      (NFData(..))+import           Data.Char                            (isSpace)+import           Data.Coerce                          (coerce)+import qualified Data.List                            as L+import           Data.Data+import qualified Data.Text                            as T+import qualified Data.Text.Internal.Fusion            as TF+import qualified Data.Text.Internal.Fusion.Common     as TF++import           GHC.Exts+  ( Int#, (+#), (-#), (>=#), (>#), isTrue#, chr#, Char(..)+  , Int(..), Addr#, tagToEnum#)+import qualified GHC.Exts                             as Exts+import qualified GHC.CString                          as GHC++import           Unsafe.Coerce++import           GHCJS.Prim                           (JSVal)++import           Data.JSString.Internal.Type+import           Data.JSString.Internal.Fusion        (stream, unstream)+import qualified Data.JSString.Internal.Fusion        as S+import qualified Data.JSString.Internal.Fusion.Common as S++instance Exts.IsList JSString where+  type Item JSString = Char+  fromList           = pack+  toList             = unpack++-- -----------------------------------------------------------------------------+-- * Conversion to/from 'JSString'++-- | /O(n)/ Convert a 'String' into a 'JSString'.  Subject to+-- fusion.+pack :: String -> JSString+pack = coerce T.pack+{-# INLINE [1] pack #-}++{-# RULES+"JSSTRING pack -> fused" [~1] forall x.+    pack x = unstream (S.map safe (S.streamList x))+"JSSTRING pack -> unfused" [1] forall x.+    unstream (S.map safe (S.streamList x)) = pack x+  #-}++-- | /O(n)/ Convert a 'JSString' into a 'String'.  Subject to fusion.+unpack :: JSString -> String+unpack = S.unstreamList . stream+{-# INLINE [1] unpack #-}++unpack' :: JSString -> String+unpack' = coerce T.unpack+{-# INLINE unpack' #-}++-- | /O(n)/ Convert a literal string into a JSString.  Subject to fusion.+unpackCString# :: Addr# -> JSString+unpackCString# = coerce T.unpackCString#+{-# NOINLINE unpackCString# #-}++{-# RULES "JSSTRING literal" forall a.+    unstream (S.map safe (S.streamList (GHC.unpackCString# a)))+      = unpackCString# a #-}++{-# RULES "JSSTRING literal UTF8" forall a.+    unstream (S.map safe (S.streamList (GHC.unpackCStringUtf8# a)))+      = unpackCString# a #-}++{-# RULES "JSSTRING empty literal"+    unstream (S.map safe (S.streamList []))+      = empty_ #-}++{-# RULES "JSSTRING singleton literal" forall a.+    unstream (S.map safe (S.streamList [a]))+      = singleton a #-}+++-- | /O(1)/ Convert a character into a 'JSString'.  Subject to fusion.+-- Performs replacement on invalid scalar values.+singleton :: Char -> JSString+singleton = coerce T.singleton+{-# INLINE [1] singleton #-}++{-# RULES+"JSSTRING singleton -> fused" [~1] forall a.+    singleton a = unstream (S.singleton (safe a))+"JSSTRING singleton -> unfused" [1] forall a.+    unstream (S.singleton (safe a)) = singleton a+ #-}++-- This is intended to reduce inlining bloat.+-- singleton_ :: Char -> Text+-- singleton_ c = js_singleton c++-- Text (A.run x) 0 len+--  where x :: ST s (A.MArray s)+--        x = do arr <- A.new len+--               _ <- unsafeWrite arr 0 d+--               return arr+--        len | d < '\x10000' = 1+-- x           | otherwise     = 2+--        d = safe c+-- {-# NOINLINE singleton_ #-}++-- -----------------------------------------------------------------------------+-- * Basic functions++-- | /O(n)/ Adds a character to the front of a 'JSString'.  This function+-- is more costly than its 'List' counterpart because it requires+-- copying a new array.  Subject to fusion.  Performs replacement on+-- invalid scalar values.+cons :: Char -> JSString -> JSString+cons = coerce T.cons+{-# INLINE [1] cons #-}++{-# RULES+"JSSTRING cons -> fused" [~1] forall c x.+    cons c x = unstream (S.cons (safe c) (stream x))+"JSSTRING cons -> unfused" [1] forall c x.+    unstream (S.cons (safe c) (stream x)) = cons c x+ #-}++infixr 5 `cons`++-- | /O(n)/ Adds a character to the end of a 'JSString'.  This copies the+-- entire array in the process, unless fused.  Subject to fusion.+-- Performs replacement on invalid scalar values.+snoc :: JSString -> Char -> JSString+snoc = coerce T.snoc+  -- unstream (S.snoc (stream t) (safe c))+{-# INLINE [1] snoc #-}++{-# RULES+"JSSTRING snoc -> fused" [~1] forall x c.+    snoc x c = unstream (S.snoc (stream x) (safe c))+"JSSTRING snoc -> unfused" [1] forall x c.+    unstream (S.snoc (stream x) (safe c)) = snoc x c+ #-}++-- | /O(n)/ Appends one 'JSString' to the other by copying both of them+-- into a new 'JSString'.  Subject to fusion.+append :: JSString -> JSString -> JSString+append = coerce T.append+{-# INLINE [1] append #-}++{-# RULES+"JSSTRING append -> fused" [~1] forall x1 x2.+    append x1 x2 = unstream (S.append (stream x1) (stream x2))+"JSSTRING append -> unfused" [1] forall x1 x2.+    unstream (S.append (stream x1) (stream x2)) = append x1 x2+ #-}++-- | /O(1)/ Returns the first character of a 'JSString', which must be+-- non-empty.  Subject to fusion.+head :: JSString -> Char+head = coerce T.head+{-# INLINE [1] head #-}++{-# RULES+"JSSTRING head -> fused" [~1] forall x.+    head x = S.head (stream x)+"JSSTRING head -> unfused" [1] forall x.+    S.head (stream x) = head x+ #-}+++-- | /O(1)/ Returns the first character and rest of a 'JSString', or+-- 'Nothing' if empty. Subject to fusion.+uncons :: JSString -> Maybe (Char, JSString)+uncons = coerce T.uncons+{-# INLINE [1] uncons #-}++-- | Lifted from Control.Arrow and specialized.+second :: (b -> c) -> (a,b) -> (a,c)+second f (a, b) = (a, f b)++-- | /O(1)/ Returns the last character of a 'JSString', which must be+-- non-empty.  Subject to fusion.+last :: JSString -> Char+last = coerce T.last+{-# INLINE [1] last #-}++{-# RULES+"JSSTRING last -> fused" [~1] forall x.+    last x = S.last (stream x)+"JSSTRING last -> unfused" [1] forall x.+    S.last (stream x) = last x+  #-}++-- | /O(1)/ Returns all characters after the head of a 'JSString', which+-- must be non-empty.  Subject to fusion.+tail :: JSString -> JSString+tail = coerce T.tail+{-# INLINE [1] tail #-}++{-# RULES+"JSSTRING tail -> fused" [~1] forall x.+    tail x = unstream (S.tail (stream x))+"JSSTRING tail -> unfused" [1] forall x.+    unstream (S.tail (stream x)) = tail x+ #-}++-- | /O(1)/ Returns all but the last character of a 'JSString', which must+-- be non-empty.  Subject to fusion.+init :: JSString -> JSString+init = coerce T.init+{-# INLINE [1] init #-}++{-# RULES+"JSSTRING init -> fused" [~1] forall t.+    init t = unstream (S.init (stream t))+"JSSTRING init -> unfused" [1] forall t.+    unstream (S.init (stream t)) = init t+ #-}++-- | /O(1)/ Tests whether a 'JSString' is empty or not.  Subject to+-- fusion.+null :: JSString -> Bool+null = coerce T.null+{-# INLINE [1] null #-}++{-# RULES+"JSSTRING null -> fused" [~1] forall t.+    null t = S.null (stream t)+"JSSTRING null -> unfused" [1] forall t.+    S.null (stream t) = null t+ #-}++-- | /O(n)/ Returns the number of characters in a 'JSString'.+-- Subject to fusion.+length :: JSString -> Int+length = coerce T.length+{-# INLINE [1] length #-}++{-# RULES+"JSSTRING length -> fused" [~1] forall x.+    length x = S.length (stream x)+"JSSTRING length -> unfused" [1] forall x.+    S.length (stream x) = length x+ #-}++-- | /O(n)/ Compare the count of characters in a 'JSString' to a number.+-- Subject to fusion.+--+-- This function gives the same answer as comparing against the result+-- of 'length', but can short circuit if the count of characters is+-- greater than the number, and hence be more efficient.+compareLength :: JSString -> Int -> Ordering+compareLength = coerce T.compareLength+{-# INLINE [1] compareLength #-}++{-# RULES+"JSSTRING compareN/length -> compareLength" [~1] forall t n.+    compare (length t) n = compareLength t n+  #-}++{-# RULES+"JSSTRING ==N/length -> compareLength/==EQ" [~1] forall t n.+    (==) (length t) n = compareLength t n == EQ+  #-}++{-# RULES+"JSSTRING /=N/length -> compareLength//=EQ" [~1] forall t n.+    (/=) (length t) n = compareLength t n /= EQ+  #-}++{-# RULES+"JSSTRING <N/length -> compareLength/==LT" [~1] forall t n.+    (<) (length t) n = compareLength t n == LT+  #-}++{-# RULES+"JSSTRING <=N/length -> compareLength//=GT" [~1] forall t n.+    (<=) (length t) n = compareLength t n /= GT+  #-}++{-# RULES+"JSSTRING >N/length -> compareLength/==GT" [~1] forall t n.+    (>) (length t) n = compareLength t n == GT+  #-}++{-# RULES+"JSSTRING >=N/length -> compareLength//=LT" [~1] forall t n.+    (>=) (length t) n = compareLength t n /= LT+  #-}++-- -----------------------------------------------------------------------------+-- * Transformations+-- | /O(n)/ 'map' @f@ @t@ is the 'JSString' obtained by applying @f@ to+-- each element of @t@.  Subject to fusion.  Performs replacement on+-- invalid scalar values.+map :: (Char -> Char) -> JSString -> JSString+map = coerce T.map+{-# INLINE [1] map #-}++-- | /O(n)/ The 'intercalate' function takes a 'JSString' and a list of+-- 'JSString's and concatenates the list after interspersing the first+-- argument between each element of the list.+intercalate :: JSString -> [JSString] -> JSString+intercalate = coerce T.intercalate+{-# INLINE [1] intercalate #-}++-- | /O(n)/ The 'intersperse' function takes a character and places it+-- between the characters of a 'JSString'.  Subject to fusion.  Performs+-- replacement on invalid scalar values.+intersperse     :: Char -> JSString -> JSString+intersperse = coerce T.intersperse+{-# INLINE [1] intersperse #-}++{-# RULES+"JSSTRING intersperse -> fused" [~1] forall c x.+    intersperse c x = unstream (S.intersperse (safe c) (stream x))+"JSSTRING intersperse -> unfused" [1] forall c x.+    unstream (S.intersperse (safe c) (stream x)) = intersperse c x+ #-}++-- | /O(n)/ Reverse the characters of a string. Subject to fusion.+reverse :: JSString -> JSString+reverse = coerce T.reverse+{-# INLINE [1] reverse #-}++{-# RULES+"JSSTRING reverse -> fused" [~1] forall x.+    reverse x = S.reverse (stream x)+"JSSTRING reverse -> unfused" [1] forall x.+    S.reverse (stream x) = reverse x+ #-}++-- | /O(m+n)/ Replace every non-overlapping occurrence of @needle@ in+-- @haystack@ with @replacement@.+--+-- This function behaves as though it was defined as follows:+--+-- @+-- replace needle replacement haystack =+--   'intercalate' replacement ('splitOn' needle haystack)+-- @+--+-- As this suggests, each occurrence is replaced exactly once.  So if+-- @needle@ occurs in @replacement@, that occurrence will /not/ itself+-- be replaced recursively:+--+-- > replace "oo" "foo" "oo" == "foo"+--+-- In cases where several instances of @needle@ overlap, only the+-- first one will be replaced:+--+-- > replace "ofo" "bar" "ofofo" == "barfo"+--+-- In (unlikely) bad cases, this function's time complexity degrades+-- towards /O(n*m)/.+replace :: JSString+        -- ^ @needle@ to search for.  If this string is empty, an+        -- error will occur.+        -> JSString+        -- ^ @replacement@ to replace @needle@ with.+        -> JSString+        -- ^ @haystack@ in which to search.+        -> JSString+replace = coerce T.replace+{-# INLINE replace #-}++-- ----------------------------------------------------------------------------+-- ** Case conversions (folds)++-- $case+--+-- When case converting 'JSString' values, do not use combinators like+-- @map toUpper@ to case convert each character of a string+-- individually, as this gives incorrect results according to the+-- rules of some writing systems.  The whole-string case conversion+-- functions from this module, such as @toUpper@, obey the correct+-- case conversion rules.  As a result, these functions may map one+-- input character to two or three output characters. For examples,+-- see the documentation of each function.+--+-- /Note/: In some languages, case conversion is a locale- and+-- context-dependent operation. The case conversion functions in this+-- module are /not/ locale sensitive. Programs that require locale+-- sensitivity should use appropriate versions of the+-- <http://hackage.haskell.org/package/text-icu-0.6.3.7/docs/Data-Text-ICU.html#g:4 case mapping functions from the text-icu package >.++-- | /O(n)/ Convert a string to folded case.  Subject to fusion.+--+-- This function is mainly useful for performing caseless (also known+-- as case insensitive) string comparisons.+--+-- A string @x@ is a caseless match for a string @y@ if and only if:+--+-- @toCaseFold x == toCaseFold y@+--+-- The result string may be longer than the input string, and may+-- differ from applying 'toLower' to the input string.  For instance,+-- the Armenian small ligature \"&#xfb13;\" (men now, U+FB13) is case+-- folded to the sequence \"&#x574;\" (men, U+0574) followed by+-- \"&#x576;\" (now, U+0576), while the Greek \"&#xb5;\" (micro sign,+-- U+00B5) is case folded to \"&#x3bc;\" (small letter mu, U+03BC)+-- instead of itself.+toCaseFold :: JSString -> JSString+toCaseFold = coerce T.toCaseFold+{-# INLINE [0] toCaseFold #-}++-- | /O(n)/ Convert a string to lower case, using simple case+-- conversion.  Subject to fusion.+--+-- The result string may be longer than the input string.  For+-- instance, \"&#x130;\" (Latin capital letter I with dot above,+-- U+0130) maps to the sequence \"i\" (Latin small letter i, U+0069)+-- followed by \" &#x307;\" (combining dot above, U+0307).+toLower :: JSString -> JSString+toLower = coerce T.toLower+{-# INLINE [1] toLower #-}++{-# RULES+"JSSTRING toLower -> fused" [~1] forall x.+    toLower x = unstream (S.toLower (stream x))+"JSSTRING toLower -> unfused" [1] forall x.+    unstream (S.toLower (stream x)) = toLower x+ #-}++-- | /O(n)/ Convert a string to upper case, using simple case+-- conversion.  Subject to fusion.+--+-- The result string may be longer than the input string.  For+-- instance, the German \"&#xdf;\" (eszett, U+00DF) maps to the+-- two-letter sequence \"SS\".+toUpper :: JSString -> JSString+toUpper = coerce T.toUpper+{-# INLINE [1] toUpper #-}++{-# RULES+"JSSTRING toUpper -> fused" [~1] forall x.+    toUpper x = unstream (S.toUpper(stream x))+"JSSTRING toUpper -> unfused" [1] forall x.+    unstream (S.toUpper (stream x)) = toUpper x+ #-}++-- | /O(n)/ Convert a string to title case, using simple case+-- conversion. Subject to fusion.+--+-- The first letter of the input is converted to title case, as is+-- every subsequent letter that immediately follows a non-letter.+-- Every letter that immediately follows another letter is converted+-- to lower case.+--+-- The result string may be longer than the input string. For example,+-- the Latin small ligature &#xfb02; (U+FB02) is converted to the+-- sequence Latin capital letter F (U+0046) followed by Latin small+-- letter l (U+006C).+--+-- /Note/: this function does not take language or culture specific+-- rules into account. For instance, in English, different style+-- guides disagree on whether the book name \"The Hill of the Red+-- Fox\" is correctly title cased&#x2014;but this function will+-- capitalize /every/ word.+toTitle :: JSString -> JSString+toTitle = coerce T.toTitle+{-# INLINE toTitle #-}++-- | /O(n)/ Left-justify a string to the given length, using the+-- specified fill character on the right. Subject to fusion.+-- Performs replacement on invalid scalar values.+--+-- Examples:+--+-- > justifyLeft 7 'x' "foo"    == "fooxxxx"+-- > justifyLeft 3 'x' "foobar" == "foobar"+justifyLeft :: Int -> Char -> JSString -> JSString+justifyLeft = coerce T.justifyLeft+{-# INLINE [1] justifyLeft #-}++{-# RULES+"JSSTRING justifyLeft -> fused" [~1] forall k c t.+    justifyLeft k c t = unstream (S.justifyLeftI k c (stream t))+"JSSTRING justifyLeft -> unfused" [1] forall k c t.+    unstream (S.justifyLeftI k c (stream t)) = justifyLeft k c t+  #-}++-- | /O(n)/ Right-justify a string to the given length, using the+-- specified fill character on the left.  Performs replacement on+-- invalid scalar values.+--+-- Examples:+--+-- > justifyRight 7 'x' "bar"    == "xxxxbar"+-- > justifyRight 3 'x' "foobar" == "foobar"+justifyRight :: Int -> Char -> JSString -> JSString+justifyRight = coerce T.justifyRight+{-# INLINE justifyRight #-}++-- | /O(n)/ Center a string to the given length, using the specified+-- fill character on either side.  Performs replacement on invalid+-- scalar values.+--+-- Examples:+--+-- > center 8 'x' "HS" = "xxxHSxxx"+center :: Int -> Char -> JSString -> JSString+center = coerce T.center+{-# INLINE center #-}++-- | /O(n)/ The 'transpose' function transposes the rows and columns+-- of its 'JSString' argument.  Note that this function uses 'pack',+-- 'unpack', and the list version of transpose, and is thus not very+-- efficient.+transpose :: [JSString] -> [JSString]+transpose = coerce T.transpose++-- -----------------------------------------------------------------------------+-- * Reducing 'JSString's (folds)++-- | /O(n)/ 'foldl', applied to a binary operator, a starting value+-- (typically the left-identity of the operator), and a 'JSString',+-- reduces the 'JSString' using the binary operator, from left to right.+-- Subject to fusion.+foldl :: (a -> Char -> a) -> a -> JSString -> a+foldl f = coerce (T.foldl f)+{-# INLINE foldl #-}++-- | /O(n)/ A strict version of 'foldl'.  Subject to fusion.+foldl' :: (a -> Char -> a) -> a -> JSString -> a+foldl' f = coerce (T.foldl' f)+{-# INLINE foldl' #-}++-- | /O(n)/ A variant of 'foldl' that has no starting value argument,+-- and thus must be applied to a non-empty 'JSString'.  Subject to fusion.+foldl1 :: (Char -> Char -> Char) -> JSString -> Char+foldl1 = coerce T.foldl1+{-# INLINE foldl1 #-}++-- | /O(n)/ A strict version of 'foldl1'.  Subject to fusion.+foldl1' :: (Char -> Char -> Char) -> JSString -> Char+foldl1' = coerce T.foldl1'+{-# INLINE foldl1' #-}++-- | /O(n)/ 'foldr', applied to a binary operator, a starting value+-- (typically the right-identity of the operator), and a 'JSString',+-- reduces the 'JSString' using the binary operator, from right to left.+-- Subject to fusion.+foldr :: (Char -> a -> a) -> a -> JSString -> a+foldr f = coerce (T.foldr f)+{-# INLINE foldr #-}++-- | /O(n)/ A variant of 'foldr' that has no starting value argument,+-- and thus must be applied to a non-empty 'JSString'.  Subject to+-- fusion.+foldr1 :: (Char -> Char -> Char) -> JSString -> Char+foldr1 = coerce T.foldr1+{-# INLINE foldr1 #-}++-- -----------------------------------------------------------------------------+-- ** Special folds++-- | /O(n)/ Concatenate a list of 'JSString's.+concat :: [JSString] -> JSString+concat = coerce T.concat++-- | /O(n)/ Map a function over a 'JSString' that results in a 'JSString', and+-- concatenate the results.+concatMap :: (Char -> JSString) -> JSString -> JSString+concatMap = coerce T.concatMap+{-# INLINE concatMap #-}++-- | /O(n)/ 'any' @p@ @t@ determines whether any character in the+-- 'JSString' @t@ satisifes the predicate @p@. Subject to fusion.+any :: (Char -> Bool) -> JSString -> Bool+any = coerce T.any+{-# INLINE any #-}++-- | /O(n)/ 'all' @p@ @t@ determines whether all characters in the+-- 'JSString' @t@ satisify the predicate @p@. Subject to fusion.+all :: (Char -> Bool) -> JSString -> Bool+all = coerce T.all+{-# INLINE all #-}++-- | /O(n)/ 'maximum' returns the maximum value from a 'JSString', which+-- must be non-empty. Subject to fusion.+maximum :: JSString -> Char+maximum = coerce T.maximum+{-# INLINE maximum #-}++-- | /O(n)/ 'minimum' returns the minimum value from a 'JSString', which+-- must be non-empty. Subject to fusion.+minimum :: JSString -> Char+minimum = coerce T.minimum+{-# INLINE minimum #-}++-- -----------------------------------------------------------------------------+-- * Building 'JSString's++-- | /O(n)/ 'scanl' is similar to 'foldl', but returns a list of+-- successive reduced values from the left. Subject to fusion.+-- Performs replacement on invalid scalar values.+--+-- > scanl f z [x1, x2, ...] == [z, z `f` x1, (z `f` x1) `f` x2, ...]+--+-- Note that+--+-- > last (scanl f z xs) == foldl f z xs.+scanl :: (Char -> Char -> Char) -> Char -> JSString -> JSString+scanl = coerce T.scanl+{-# INLINE scanl #-}++-- | /O(n)/ 'scanl1' is a variant of 'scanl' that has no starting+-- value argument.  Subject to fusion.  Performs replacement on+-- invalid scalar values.+--+-- > scanl1 f [x1, x2, ...] == [x1, x1 `f` x2, ...]+scanl1 :: (Char -> Char -> Char) -> JSString -> JSString+scanl1 = coerce T.scanl1+{-# INLINE scanl1 #-}++-- | /O(n)/ 'scanr' is the right-to-left dual of 'scanl'.  Performs+-- replacement on invalid scalar values.+--+-- > scanr f v == reverse . scanl (flip f) v . reverse+scanr :: (Char -> Char -> Char) -> Char -> JSString -> JSString+scanr = coerce T.scanr+{-# INLINE scanr #-}++-- | /O(n)/ 'scanr1' is a variant of 'scanr' that has no starting+-- value argument.  Subject to fusion.  Performs replacement on+-- invalid scalar values.+scanr1 :: (Char -> Char -> Char) -> JSString -> JSString+scanr1 = coerce T.scanr1+{-# INLINE scanr1 #-}++-- | /O(n)/ Like a combination of 'map' and 'foldl''. Applies a+-- function to each element of a 'JSString', passing an accumulating+-- parameter from left to right, and returns a final 'JSString'.  Performs+-- replacement on invalid scalar values.+mapAccumL :: (a -> Char -> (a,Char)) -> a -> JSString -> (a, JSString)+mapAccumL f = coerce (T.mapAccumL f)+{-# INLINE mapAccumL #-}++-- | The 'mapAccumR' function behaves like a combination of 'map' and+-- a strict 'foldr'; it applies a function to each element of a+-- 'JSString', passing an accumulating parameter from right to left, and+-- returning a final value of this accumulator together with the new+-- 'JSString'.+-- Performs replacement on invalid scalar values.+mapAccumR :: (a -> Char -> (a,Char)) -> a -> JSString -> (a, JSString)+mapAccumR f = coerce (T.mapAccumR f)+{-# INLINE mapAccumR #-}++-- -----------------------------------------------------------------------------+-- ** Generating and unfolding 'JSString's++-- | /O(n*m)/ 'replicate' @n@ @t@ is a 'JSString' consisting of the input+-- @t@ repeated @n@ times.+replicate :: Int -> JSString -> JSString+replicate = coerce T.replicate+{-# INLINE [1] replicate #-}++-- | /O(n)/, where @n@ is the length of the result. The 'unfoldr'+-- function is analogous to the List 'L.unfoldr'. 'unfoldr' builds a+-- 'JSString' from a seed value. The function takes the element and+-- returns 'Nothing' if it is done producing the 'JSString', otherwise+-- 'Just' @(a,b)@.  In this case, @a@ is the next 'Char' in the+-- string, and @b@ is the seed value for further production. Subject+-- to fusion.  Performs replacement on invalid scalar values.+unfoldr     :: (a -> Maybe (Char,a)) -> a -> JSString+unfoldr f = coerce (T.unfoldr f)+{-# INLINE unfoldr #-}++-- | /O(n)/ Like 'unfoldr', 'unfoldrN' builds a 'JSString' from a seed+-- value. However, the length of the result should be limited by the+-- first argument to 'unfoldrN'. This function is more efficient than+-- 'unfoldr' when the maximum length of the result is known and+-- correct, otherwise its performance is similar to 'unfoldr'. Subject+-- to fusion.  Performs replacement on invalid scalar values.+unfoldrN     :: Int -> (a -> Maybe (Char,a)) -> a -> JSString+unfoldrN n f = coerce (T.unfoldrN n f)+{-# INLINE unfoldrN #-}++-- -----------------------------------------------------------------------------+-- * Substrings++-- | /O(n)/ 'take' @n@, applied to a 'JSString', returns the prefix of the+-- 'JSString' of length @n@, or the 'JSString' itself if @n@ is greater than+-- the length of the JSString. Subject to fusion.+take :: Int -> JSString -> JSString+take = coerce T.take+{-# INLINE [1] take #-}+{-+iterN :: Int -> JSString -> Int+iterN n t@(Text _arr _off len) = loop 0 0+  where loop !i !cnt+            | i >= len || cnt >= n = i+            | otherwise            = loop (i+d) (cnt+1)+          where d = iter_ t i+-}+{-# RULES+"JSSTRING take -> fused" [~1] forall n t.+    take n t = unstream (S.take n (stream t))+"JSSTRING take -> unfused" [1] forall n t.+    unstream (S.take n (stream t)) = take n t+  #-}++-- | /O(n)/ 'takeEnd' @n@ @t@ returns the suffix remaining after+-- taking @n@ characters from the end of @t@.+--+-- Examples:+--+-- > takeEnd 3 "foobar" == "bar"+takeEnd :: Int -> JSString -> JSString+takeEnd = coerce T.takeEnd++-- | /O(n)/ 'drop' @n@, applied to a 'JSString', returns the suffix of the+-- 'JSString' after the first @n@ characters, or the empty 'JSString' if @n@+-- is greater than the length of the 'JSString'. Subject to fusion.+drop :: Int -> JSString -> JSString+drop = coerce T.drop+{-# INLINE [1] drop #-}++{-# RULES+"JSSTRING drop -> fused" [~1] forall n t.+    drop n t = unstream (S.drop n (stream t))+"JSSTRING drop -> unfused" [1] forall n t.+    unstream (S.drop n (stream t)) = drop n t+  #-}++-- | /O(n)/ 'dropEnd' @n@ @t@ returns the prefix remaining after+-- dropping @n@ characters from the end of @t@.+--+-- Examples:+--+-- > dropEnd 3 "foobar" == "foo"+dropEnd :: Int -> JSString -> JSString+dropEnd = coerce T.dropEnd++-- | /O(n)/ 'takeWhile', applied to a predicate @p@ and a 'JSString',+-- returns the longest prefix (possibly empty) of elements that+-- satisfy @p@.  Subject to fusion.+takeWhile :: (Char -> Bool) -> JSString -> JSString+takeWhile = coerce T.takeWhile+{-# INLINE [1] takeWhile #-}++{-# RULES+"TEXT takeWhile -> fused" [~1] forall p t.+    takeWhile p t = unstream (S.takeWhile p (stream t))+"TEXT takeWhile -> unfused" [1] forall p t.+    unstream (S.takeWhile p (stream t)) = takeWhile p t+  #-}++-- | /O(n)/ 'dropWhile' @p@ @t@ returns the suffix remaining after+-- 'takeWhile' @p@ @t@. Subject to fusion.+dropWhile :: (Char -> Bool) -> JSString -> JSString+dropWhile = coerce T.dropWhile+{-# INLINE [1] dropWhile #-}++{-# RULES+"TEXT dropWhile -> fused" [~1] forall p t.+    dropWhile p t = unstream (S.dropWhile p (stream t))+"TEXT dropWhile -> unfused" [1] forall p t.+    unstream (S.dropWhile p (stream t)) = dropWhile p t+  #-}++-- | /O(n)/ 'dropWhileEnd' @p@ @t@ returns the prefix remaining after+-- dropping characters that fail the predicate @p@ from the end of+-- @t@.  Subject to fusion.+-- Examples:+--+-- > dropWhileEnd (=='.') "foo..." == "foo"+dropWhileEnd :: (Char -> Bool) -> JSString -> JSString+dropWhileEnd = coerce T.dropWhileEnd+{-# INLINE [1] dropWhileEnd #-}++{-# RULES+"TEXT dropWhileEnd -> fused" [~1] forall p t.+    dropWhileEnd p t = S.reverse (S.dropWhile p (S.reverseStream t))+"TEXT dropWhileEnd -> unfused" [1] forall p t.+    S.reverse (S.dropWhile p (S.reverseStream t)) = dropWhileEnd p t+  #-}++-- | /O(n)/ 'dropAround' @p@ @t@ returns the substring remaining after+-- dropping characters that fail the predicate @p@ from both the+-- beginning and end of @t@.  Subject to fusion.+dropAround :: (Char -> Bool) -> JSString -> JSString+dropAround = coerce T.dropAround+{-# INLINE [1] dropAround #-}++-- | /O(n)/ Remove leading white space from a string.  Equivalent to:+--+-- > dropWhile isSpace+stripStart :: JSString -> JSString+stripStart = coerce T.stripStart+{-# INLINE [1] stripStart #-}++-- | /O(n)/ Remove trailing white space from a string.  Equivalent to:+--+-- > dropWhileEnd isSpace+stripEnd :: JSString -> JSString+stripEnd = coerce T.stripEnd+{-# INLINE [1] stripEnd #-}++-- | /O(n)/ Remove leading and trailing white space from a string.+-- Equivalent to:+--+-- > dropAround isSpace+strip :: JSString -> JSString+strip = coerce T.strip+{-# INLINE [1] strip #-}++-- | /O(n)/ 'splitAt' @n t@ returns a pair whose first element is a+-- prefix of @t@ of length @n@, and whose second is the remainder of+-- the string. It is equivalent to @('take' n t, 'drop' n t)@.+splitAt :: Int -> JSString -> (JSString, JSString)+splitAt = coerce T.splitAt+{-# INLINE splitAt #-}++-- | /O(n)/ 'span', applied to a predicate @p@ and text @t@, returns+-- a pair whose first element is the longest prefix (possibly empty)+-- of @t@ of elements that satisfy @p@, and whose second is the+-- remainder of the list.+span :: (Char -> Bool) -> JSString -> (JSString, JSString)+span = coerce T.span+{-# INLINE span #-}++-- | /O(n)/ 'break' is like 'span', but the prefix returned is+-- over elements that fail the predicate @p@.+break :: (Char -> Bool) -> JSString -> (JSString, JSString)+break = coerce T.break+{-# INLINE break #-}++-- | /O(n)/ Group characters in a string according to a predicate.+groupBy :: (Char -> Char -> Bool) -> JSString -> [JSString]+groupBy = coerce T.groupBy++-- | /O(n)/ Group characters in a string by equality.+group :: JSString -> [JSString]+group = coerce T.group+{-# INLINE group #-}++group' :: JSString -> [JSString]+group' = coerce T.group+{-# INLINE group' #-}++-- | /O(n^2)/ Return all initial segments of the given 'JSString', shortest+-- first.+inits :: JSString -> [JSString]+inits = coerce T.inits++-- | /O(n^2)/ Return all final segments of the given 'JSString', longest+-- first.+tails :: JSString -> [JSString]+tails = coerce T.tails++-- $split+--+-- Splitting functions in this library do not perform character-wise+-- copies to create substrings; they just construct new 'JSString's that+-- are slices of the original.++-- | /O(m+n)/ Break a 'JSString' into pieces separated by the first 'JSString'+-- argument (which cannot be empty), consuming the delimiter. An empty+-- delimiter is invalid, and will cause an error to be raised.+--+-- Examples:+--+-- > splitOn "\r\n" "a\r\nb\r\nd\r\ne" == ["a","b","d","e"]+-- > splitOn "aaa"  "aaaXaaaXaaaXaaa"  == ["","X","X","X",""]+-- > splitOn "x"    "x"                == ["",""]+--+-- and+--+-- > intercalate s . splitOn s         == id+-- > splitOn (singleton c)             == split (==c)+--+-- (Note: the string @s@ to split on above cannot be empty.)+--+-- In (unlikely) bad cases, this function's time complexity degrades+-- towards /O(n*m)/.+splitOn :: JSString+        -- ^ String to split on. If this string is empty, an error+        -- will occur.+        -> JSString+        -- ^ Input text.+        -> [JSString]+splitOn = coerce T.splitOn+{-# INLINE [1] splitOn #-}++-- RULES+-- "JSSTRING splitOn/singleton -> split/==" [~1] forall c t.+--    splitOn (singleton c) t = split (==c) t+--++splitOn' :: JSString+         -- ^ String to split on. If this string is empty, an error+         -- will occur.+         -> JSString+         -- ^ Input text.+         -> [JSString]+splitOn' = coerce T.splitOn+{-# NOINLINE splitOn' #-}+--- {-# INLINE [1] splitOn' #-}++-- | /O(n)/ Splits a 'JSString' into components delimited by separators,+-- where the predicate returns True for a separator element.  The+-- resulting components do not contain the separators.  Two adjacent+-- separators result in an empty component in the output.  eg.+--+-- > split (=='a') "aabbaca" == ["","","bb","c",""]+-- > split (=='a') ""        == [""]+split :: (Char -> Bool) -> JSString -> [JSString]+split = coerce T.split+{-# INLINE split #-}++-- | /O(n)/ Splits a 'JSString' into components of length @k@.  The last+-- element may be shorter than the other chunks, depending on the+-- length of the input. Examples:+--+-- > chunksOf 3 "foobarbaz"   == ["foo","bar","baz"]+-- > chunksOf 4 "haskell.org" == ["hask","ell.","org"]+chunksOf :: Int -> JSString -> [JSString]+chunksOf = coerce T.chunksOf+{-# INLINE chunksOf #-}++-- | /O(n)/ Splits a 'JSString' into components of length @k@.  The last+-- element may be shorter than the other chunks, depending on the+-- length of the input. Examples:+--+-- > chunksOf 3 "foobarbaz"   == ["foo","bar","baz"]+-- > chunksOf 4 "haskell.org" == ["hask","ell.","org"]+chunksOf' :: Int -> JSString -> [JSString]+chunksOf' = coerce T.chunksOf+{-# INLINE chunksOf' #-}++-- ----------------------------------------------------------------------------+-- * Searching++-------------------------------------------------------------------------------+-- ** Searching with a predicate++-- | /O(n)/ The 'find' function takes a predicate and a 'JSString', and+-- returns the first element matching the predicate, or 'Nothing' if+-- there is no such element.+find :: (Char -> Bool) -> JSString -> Maybe Char+find = coerce T.find+{-# INLINE find #-}++-- | /O(n)/ The 'partition' function takes a predicate and a 'JSString',+-- and returns the pair of 'JSString's with elements which do and do not+-- satisfy the predicate, respectively; i.e.+--+-- > partition p t == (filter p t, filter (not . p) t)+partition :: (Char -> Bool) -> JSString -> (JSString, JSString)+partition = coerce T.partition+{-# INLINE partition #-}++-- | /O(n)/ 'filter', applied to a predicate and a 'JSString',+-- returns a 'JSString' containing those characters that satisfy the+-- predicate.+filter :: (Char -> Bool) -> JSString -> JSString+filter = coerce T.filter+{-# INLINE filter #-}++-- | /O(n+m)/ Find the first instance of @needle@ (which must be+-- non-'null') in @haystack@.  The first element of the returned tuple+-- is the prefix of @haystack@ before @needle@ is matched.  The second+-- is the remainder of @haystack@, starting with the match.+--+-- Examples:+--+-- > breakOn "::" "a::b::c" ==> ("a", "::b::c")+-- > breakOn "/" "foobar"   ==> ("foobar", "")+--+-- Laws:+--+-- > append prefix match == haystack+-- >   where (prefix, match) = breakOn needle haystack+--+-- If you need to break a string by a substring repeatedly (e.g. you+-- want to break on every instance of a substring), use 'breakOnAll'+-- instead, as it has lower startup overhead.+--+-- In (unlikely) bad cases, this function's time complexity degrades+-- towards /O(n*m)/.+breakOn :: JSString -> JSString -> (JSString, JSString)+breakOn = coerce T.breakOn+{-# INLINE breakOn #-}++-- | /O(n+m)/ Similar to 'breakOn', but searches from the end of the+-- string.+--+-- The first element of the returned tuple is the prefix of @haystack@+-- up to and including the last match of @needle@.  The second is the+-- remainder of @haystack@, following the match.+--+-- > breakOnEnd "::" "a::b::c" ==> ("a::b::", "c")+breakOnEnd :: JSString -> JSString -> (JSString, JSString)+breakOnEnd = coerce T.breakOnEnd+{-# INLINE breakOnEnd #-}++-- | /O(n+m)/ Find all non-overlapping instances of @needle@ in+-- @haystack@.  Each element of the returned list consists of a pair:+--+-- * The entire string prior to the /k/th match (i.e. the prefix)+--+-- * The /k/th match, followed by the remainder of the string+--+-- Examples:+--+-- > breakOnAll "::" ""+-- > ==> []+-- > breakOnAll "/" "a/b/c/"+-- > ==> [("a", "/b/c/"), ("a/b", "/c/"), ("a/b/c", "/")]+--+-- In (unlikely) bad cases, this function's time complexity degrades+-- towards /O(n*m)/.+--+-- The @needle@ parameter may not be empty.+breakOnAll :: JSString              -- ^ @needle@ to search for+           -> JSString              -- ^ @haystack@ in which to search+           -> [(JSString, JSString)]+breakOnAll = coerce T.breakOnAll+{-# INLINE breakOnAll #-}++breakOnAll' :: JSString              -- ^ @needle@ to search for+            -> JSString              -- ^ @haystack@ in which to search+            -> [(JSString, JSString)]+breakOnAll' = coerce T.breakOnAll+{-# INLINE breakOnAll' #-}++-------------------------------------------------------------------------------+-- ** Indexing 'JSString's++-- $index+--+-- If you think of a 'JSString' value as an array of 'Char' values (which+-- it is not), you run the risk of writing inefficient code.+--+-- An idiom that is common in some languages is to find the numeric+-- offset of a character or substring, then use that number to split+-- or trim the searched string.  With a 'JSString' value, this approach+-- would require two /O(n)/ operations: one to perform the search, and+-- one to operate from wherever the search ended.+--+-- For example, suppose you have a string that you want to split on+-- the substring @\"::\"@, such as @\"foo::bar::quux\"@. Instead of+-- searching for the index of @\"::\"@ and taking the substrings+-- before and after that index, you would instead use @breakOnAll \"::\"@.++-- | /O(n)/ 'JSString' index (subscript) operator, starting from 0.+index :: JSString -> Int -> Char+index = coerce T.index+{-# INLINE index #-}++-- | /O(n)/ The 'findIndex' function takes a predicate and a 'JSString'+-- and returns the index of the first element in the 'JSString' satisfying+-- the predicate. Subject to fusion.+findIndex :: (Char -> Bool) -> JSString -> Maybe Int+findIndex = coerce T.findIndex+{-# INLINE findIndex #-}++-- | /O(n+m)/ The 'count' function returns the number of times the+-- query string appears in the given 'JSString'. An empty query string is+-- invalid, and will cause an error to be raised.+--+-- In (unlikely) bad cases, this function's time complexity degrades+-- towards /O(n*m)/.+count :: JSString -> JSString -> Int+count = coerce T.count+{-# INLINE [1] count #-}++--  RULES+-- "JSSTRING count/singleton -> countChar" [~1] forall c t.+--    count (singleton c) t = countChar c t+--++-------------------------------------------------------------------------------+-- * Zipping++-- | /O(n)/ 'zip' takes two 'JSString's and returns a list of+-- corresponding pairs of bytes. If one input 'JSString' is short,+-- excess elements of the longer 'JSString' are discarded. This is+-- equivalent to a pair of 'unpack' operations.+zip :: JSString -> JSString -> [(Char,Char)]+zip = coerce T.zip+{-# INLINE [0] zip #-}++-- | /O(n)/ 'zipWith' generalises 'zip' by zipping with the function+-- given as the first argument, instead of a tupling function.+-- Performs replacement on invalid scalar values.+zipWith :: (Char -> Char -> Char) -> JSString -> JSString -> JSString+zipWith = coerce T.zipWith+{-# INLINE [0] zipWith #-}++-- | /O(n)/ Breaks a 'JSString' up into a list of words, delimited by 'Char's+-- representing white space.+words :: JSString -> [JSString]+words = coerce T.words+{-# INLINE words #-}++-- fixme: strict words' that allocates the whole list in one go+words' :: JSString -> [JSString]+words' = coerce T.words+{-# INLINE words' #-}++-- | /O(n)/ Breaks a 'JSString' up into a list of 'JSString's at+-- newline 'Char's. The resulting strings do not contain newlines.+lines :: JSString -> [JSString]+lines = coerce T.lines+{-# INLINE lines #-}++lines' :: JSString -> [JSString]+lines' = coerce T.lines+{-# INLINE lines' #-}++{-+-- | /O(n)/ Portably breaks a 'JSString' up into a list of 'JSString's at line+-- boundaries.+--+-- A line boundary is considered to be either a line feed, a carriage+-- return immediately followed by a line feed, or a carriage return.+-- This accounts for both Unix and Windows line ending conventions,+-- and for the old convention used on Mac OS 9 and earlier.+lines' :: Text -> [Text]+lines' ps | null ps   = []+          | otherwise = h : case uncons t of+                              Nothing -> []+                              Just (c,t')+                                  | c == '\n' -> lines t'+                                  | c == '\r' -> case uncons t' of+                                                   Just ('\n',t'') -> lines t''+                                                   _               -> lines t'+    where (h,t)    = span notEOL ps+          notEOL c = c /= '\n' && c /= '\r'++-}++-- | /O(n)/ Joins lines, after appending a terminating newline to+-- each.+unlines :: [JSString] -> JSString+unlines = coerce T.unlines+{-# INLINE unlines #-}++-- | /O(n)/ Joins words using single space characters.+unwords :: [JSString] -> JSString+unwords = coerce T.unwords+{-# INLINE unwords #-}++-- | /O(n)/ The 'isPrefixOf' function takes two 'JSString's and returns+-- 'True' iff the first is a prefix of the second.  Subject to fusion.+isPrefixOf :: JSString -> JSString -> Bool+isPrefixOf = coerce T.isPrefixOf+{-# INLINE [1] isPrefixOf #-}++{-# RULES+"JSSTRING isPrefixOf -> fused" [~1] forall x y.+    isPrefixOf x y = S.isPrefixOf (stream x) (stream y)+"JSSTRING isPrefixOf -> unfused" [1] forall x y.+     S.isPrefixOf (stream x) (stream y) = isPrefixOf x y+  #-}++-- | /O(n)/ The 'isSuffixOf' function takes two 'JSString's and returns+-- 'True' iff the first is a suffix of the second.+isSuffixOf :: JSString -> JSString -> Bool+isSuffixOf = coerce T.isSuffixOf+{-# INLINE isSuffixOf #-}++-- | The 'isInfixOf' function takes two 'JSString's and returns+-- 'True' iff the first is contained, wholly and intact, anywhere+-- within the second.+--+-- Complexity depends on how the JavaScript engine implements+-- String.prototype.find.+isInfixOf :: JSString -> JSString -> Bool+isInfixOf = coerce T.isInfixOf+{-# INLINE [1] isInfixOf #-}++{-# RULES+"JSSTRING isInfixOf/singleton -> S.elem/S.stream" [~1] forall n h.+    isInfixOf (singleton n) h = S.elem n (S.stream h)+  #-}++-------------------------------------------------------------------------------+-- * View patterns++-- | /O(n)/ Return the suffix of the second string if its prefix+-- matches the entire first string.+--+-- Examples:+--+-- > stripPrefix "foo" "foobar" == Just "bar"+-- > stripPrefix ""    "baz"    == Just "baz"+-- > stripPrefix "foo" "quux"   == Nothing+--+-- This is particularly useful with the @ViewPatterns@ extension to+-- GHC, as follows:+--+-- > {-# LANGUAGE ViewPatterns #-}+-- > import Data.Text as T+-- >+-- > fnordLength :: JSString -> Int+-- > fnordLength (stripPrefix "fnord" -> Just suf) = T.length suf+-- > fnordLength _                                 = -1+stripPrefix :: JSString -> JSString -> Maybe JSString+stripPrefix = coerce T.stripPrefix+{-# INLINE stripPrefix #-}++-- | /O(n)/ Find the longest non-empty common prefix of two strings+-- and return it, along with the suffixes of each string at which they+-- no longer match.+--+-- If the strings do not have a common prefix or either one is empty,+-- this function returns 'Nothing'.+--+-- Examples:+--+-- > commonPrefixes "foobar" "fooquux" == Just ("foo","bar","quux")+-- > commonPrefixes "veeble" "fetzer"  == Nothing+-- > commonPrefixes "" "baz"           == Nothing+commonPrefixes :: JSString -> JSString -> Maybe (JSString,JSString,JSString)+commonPrefixes = coerce T.commonPrefixes+{-# INLINE commonPrefixes #-}++-- | /O(n)/ Return the prefix of the second string if its suffix+-- matches the entire first string.+--+-- Examples:+--+-- > stripSuffix "bar" "foobar" == Just "foo"+-- > stripSuffix ""    "baz"    == Just "baz"+-- > stripSuffix "foo" "quux"   == Nothing+--+-- This is particularly useful with the @ViewPatterns@ extension to+-- GHC, as follows:+--+-- > {-# LANGUAGE ViewPatterns #-}+-- > import Data.Text as T+-- >+-- > quuxLength :: Text -> Int+-- > quuxLength (stripSuffix "quux" -> Just pre) = T.length pre+-- > quuxLength _                                = -1+stripSuffix :: JSString -> JSString -> Maybe JSString+stripSuffix = coerce T.stripSuffix+{-# INLINE stripSuffix #-}++---- | Add a list of non-negative numbers.  Errors out on overflow.+--sumP :: String -> [Int] -> Int+--sumP fun = go 0+--  where go !a (x:xs)+--            | ax >= 0   = go ax xs+--            | otherwise = overflowError fun+--          where ax = a + x+--        go a  _         = a+--+--emptyError :: String -> a+--emptyError fun = P.error $ "Data.JSString." ++ fun ++ ": empty input"+--+--overflowError :: String -> a+--overflowError fun = P.error $ "Data.JSString." ++ fun ++ ": size overflow"+--+--charWidth :: Int# -> Int#+--charWidth cp | isTrue# (cp >=# 0x10000#) = 2#+--             | otherwise                 = 1#+--{-# INLINE charWidth #-}
+ src-ghc/Data/JSString/Internal.hs view
@@ -0,0 +1,1 @@+module Data.JSString.Internal where
+ src-ghc/Data/JSString/Internal/Fusion.hs view
@@ -0,0 +1,127 @@+{-# LANGUAGE BangPatterns, MagicHash+  #-}+module Data.JSString.Internal.Fusion ( -- * Types+                                       Stream(..)+                                     , Step(..)++                                       -- * Creation and elimination+                                     , stream+                                     , unstream+                                     , reverseStream++                                     , length++                                       -- * Transformations+                                     , reverse++                                       -- * Construction+                                       -- ** Scans+                                     , reverseScanr++                                       -- ** Accumulating maps+                                     , mapAccumL++                                       -- ** Generation and unfolding+                                     , unfoldrN++                                       -- * Indexing+                                     , index+                                     , findIndex+                                     , countChar+                                     ) where++--import           GHC.Exts (Char(..), Int(..), chr#, Int#, isTrue#, (-#), (+#), (>=#))++import           Prelude hiding (length, reverse)+import qualified Data.Text.Internal.Fusion as T+--import           Data.Char+import           Data.Coerce (coerce)++import           Data.JSString.Internal.Type (JSString(..))+--import qualified Data.JSString.Internal.Type          as I+import           Data.JSString.Internal.Fusion.Types+import qualified Data.JSString.Internal.Fusion.Common as S++--import           System.IO.Unsafe++--import           GHCJS.Prim++default (Int)++-- | /O(n)/ Convert a 'JSString' into a 'Stream Char'.+stream :: JSString -> Stream Char+stream = coerce T.stream+{-# INLINE [0] stream #-}++-- | /O(n)/ Convert a 'JSString' into a 'Stream Char', but iterate+-- backwards.+reverseStream :: JSString -> Stream Char+reverseStream = coerce T.reverseStream+{-# INLINE [0] reverseStream #-}++-- | /O(n)/ Convert a 'Stream Char' into a 'JSString'.+unstream :: Stream Char -> JSString+unstream = coerce T.unstream+{-# INLINE [0] unstream #-}+{-# RULES "STREAM stream/unstream fusion" forall s. stream (unstream s) = s #-}+++-- ----------------------------------------------------------------------------+-- * Basic stream functions++--runJSString :: ((a -> IO a) -> IO a) -> a+--runJSString f = unsafePerformIO (f pure)++length :: Stream Char -> Int+length = S.lengthI+{-# INLINE[0] length #-}++-- | /O(n)/ Reverse the characters of a string.+reverse :: Stream Char -> JSString+reverse = coerce T.reverse+{-# INLINE [0] reverse #-}++-- | /O(n)/ Perform the equivalent of 'scanr' over a list, only with+-- the input and result reversed.+reverseScanr :: (Char -> Char -> Char) -> Char -> Stream Char -> Stream Char+reverseScanr = coerce T.reverseScanr+{-# INLINE reverseScanr #-}++-- | /O(n)/ Like 'unfoldr', 'unfoldrN' builds a stream from a seed+-- value. However, the length of the result is limited by the+-- first argument to 'unfoldrN'. This function is more efficient than+-- 'unfoldr' when the length of the result is known.+unfoldrN :: Int -> (a -> Maybe (Char,a)) -> a -> Stream Char+unfoldrN n = S.unfoldrNI n+{-# INLINE [0] unfoldrN #-}++-------------------------------------------------------------------------------+-- ** Indexing streams++-- | /O(n)/ stream index (subscript) operator, starting from 0.+index :: Stream Char -> Int -> Char+index = S.indexI+{-# INLINE [0] index #-}++-- | The 'findIndex' function takes a predicate and a stream and+-- returns the index of the first element in the stream+-- satisfying the predicate.+findIndex :: (Char -> Bool) -> Stream Char -> Maybe Int+findIndex = S.findIndexI+{-# INLINE [0] findIndex #-}++-- | /O(n)/ The 'count' function returns the number of times the query+-- element appears in the given stream.+countChar :: Char -> Stream Char -> Int+countChar = S.countCharI+{-# INLINE [0] countChar #-}++-- | /O(n)/ Like a combination of 'map' and 'foldl''. Applies a+-- function to each element of a 'Text', passing an accumulating+-- parameter from left to right, and returns a final 'JSString'.+mapAccumL :: (a -> Char -> (a, Char)) -> a -> Stream Char -> (a, JSString)+mapAccumL a b c = coerce (T.mapAccumL a b c)+{-# INLINE [0] mapAccumL #-}++-------------------------------------------------------------------------------+
+ src-ghc/Data/JSString/Internal/Fusion/CaseMapping.hs view
@@ -0,0 +1,7652 @@+-- AUTOMATICALLY GENERATED - DO NOT EDIT+-- Generated by scripts/CaseMapping.hs+-- CaseFolding-14.0.0.txt+-- Date: 2021-03-08, 19:35:41 GMT+-- SpecialCasing-14.0.0.txt+-- Date: 2021-03-08, 19:35:55 GMT++{-# LANGUAGE LambdaCase, MagicHash, PartialTypeSignatures #-}+{-# OPTIONS_GHC -Wno-partial-type-signatures #-}+module Data.JSString.Internal.Fusion.CaseMapping where+import GHC.Int+import GHC.Exts+unI64 :: Int64 -> _ {- unboxed Int64 -}+unI64 (I64# n) = n++upperMapping :: Char# -> _ {- unboxed Int64 -}+{-# NOINLINE upperMapping #-}+upperMapping = \case+  -- LATIN SMALL LETTER SHARP S+  '\x00df'# -> unI64 174063699+  -- LATIN SMALL LIGATURE FF+  '\xfb00'# -> unI64 146800710+  -- LATIN SMALL LIGATURE FI+  '\xfb01'# -> unI64 153092166+  -- LATIN SMALL LIGATURE FL+  '\xfb02'# -> unI64 159383622+  -- LATIN SMALL LIGATURE FFI+  '\xfb03'# -> unI64 321057542111302+  -- LATIN SMALL LIGATURE FFL+  '\xfb04'# -> unI64 334251681644614+  -- LATIN SMALL LIGATURE LONG S T+  '\xfb05'# -> unI64 176160851+  -- LATIN SMALL LIGATURE ST+  '\xfb06'# -> unI64 176160851+  -- ARMENIAN SMALL LIGATURE ECH YIWN+  '\x0587'# -> unI64 2856322357+  -- ARMENIAN SMALL LIGATURE MEN NOW+  '\xfb13'# -> unI64 2831156548+  -- ARMENIAN SMALL LIGATURE MEN ECH+  '\xfb14'# -> unI64 2795504964+  -- ARMENIAN SMALL LIGATURE MEN INI+  '\xfb15'# -> unI64 2808087876+  -- ARMENIAN SMALL LIGATURE VEW NOW+  '\xfb16'# -> unI64 2831156558+  -- ARMENIAN SMALL LIGATURE MEN XEH+  '\xfb17'# -> unI64 2812282180+  -- LATIN SMALL LETTER N PRECEDED BY APOSTROPHE+  '\x0149'# -> unI64 163578556+  -- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS+  '\x0390'# -> unI64 3382099394429849+  -- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS+  '\x03b0'# -> unI64 3382099394429861+  -- LATIN SMALL LETTER J WITH CARON+  '\x01f0'# -> unI64 1635778634+  -- LATIN SMALL LETTER H WITH LINE BELOW+  '\x1e96'# -> unI64 1713373256+  -- LATIN SMALL LETTER T WITH DIAERESIS+  '\x1e97'# -> unI64 1627390036+  -- LATIN SMALL LETTER W WITH RING ABOVE+  '\x1e98'# -> unI64 1631584343+  -- LATIN SMALL LETTER Y WITH RING ABOVE+  '\x1e99'# -> unI64 1631584345+  -- LATIN SMALL LETTER A WITH RIGHT HALF RING+  '\x1e9a'# -> unI64 1472200769+  -- GREEK SMALL LETTER UPSILON WITH PSILI+  '\x1f50'# -> unI64 1650459557+  -- GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA+  '\x1f52'# -> unI64 3377701370987429+  -- GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA+  '\x1f54'# -> unI64 3382099417498533+  -- GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI+  '\x1f56'# -> unI64 3667972440720293+  -- GREEK SMALL LETTER ALPHA WITH PERISPOMENI+  '\x1fb6'# -> unI64 1749025681+  -- GREEK SMALL LETTER ETA WITH PERISPOMENI+  '\x1fc6'# -> unI64 1749025687+  -- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA+  '\x1fd2'# -> unI64 3377701347918745+  -- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA+  '\x1fd3'# -> unI64 3382099394429849+  -- GREEK SMALL LETTER IOTA WITH PERISPOMENI+  '\x1fd6'# -> unI64 1749025689+  -- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI+  '\x1fd7'# -> unI64 3667972417651609+  -- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA+  '\x1fe2'# -> unI64 3377701347918757+  -- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA+  '\x1fe3'# -> unI64 3382099394429861+  -- GREEK SMALL LETTER RHO WITH PSILI+  '\x1fe4'# -> unI64 1650459553+  -- GREEK SMALL LETTER UPSILON WITH PERISPOMENI+  '\x1fe6'# -> unI64 1749025701+  -- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI+  '\x1fe7'# -> unI64 3667972417651621+  -- GREEK SMALL LETTER OMEGA WITH PERISPOMENI+  '\x1ff6'# -> unI64 1749025705+  -- GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI+  '\x1f80'# -> unI64 1931484936+  -- GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI+  '\x1f81'# -> unI64 1931484937+  -- GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI+  '\x1f82'# -> unI64 1931484938+  -- GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI+  '\x1f83'# -> unI64 1931484939+  -- GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI+  '\x1f84'# -> unI64 1931484940+  -- GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI+  '\x1f85'# -> unI64 1931484941+  -- GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI+  '\x1f86'# -> unI64 1931484942+  -- GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI+  '\x1f87'# -> unI64 1931484943+  -- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI+  '\x1f88'# -> unI64 1931484936+  -- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI+  '\x1f89'# -> unI64 1931484937+  -- GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI+  '\x1f8a'# -> unI64 1931484938+  -- GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI+  '\x1f8b'# -> unI64 1931484939+  -- GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI+  '\x1f8c'# -> unI64 1931484940+  -- GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI+  '\x1f8d'# -> unI64 1931484941+  -- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI+  '\x1f8e'# -> unI64 1931484942+  -- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI+  '\x1f8f'# -> unI64 1931484943+  -- GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI+  '\x1f90'# -> unI64 1931484968+  -- GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI+  '\x1f91'# -> unI64 1931484969+  -- GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI+  '\x1f92'# -> unI64 1931484970+  -- GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI+  '\x1f93'# -> unI64 1931484971+  -- GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI+  '\x1f94'# -> unI64 1931484972+  -- GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI+  '\x1f95'# -> unI64 1931484973+  -- GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI+  '\x1f96'# -> unI64 1931484974+  -- GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI+  '\x1f97'# -> unI64 1931484975+  -- GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI+  '\x1f98'# -> unI64 1931484968+  -- GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI+  '\x1f99'# -> unI64 1931484969+  -- GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI+  '\x1f9a'# -> unI64 1931484970+  -- GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI+  '\x1f9b'# -> unI64 1931484971+  -- GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI+  '\x1f9c'# -> unI64 1931484972+  -- GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI+  '\x1f9d'# -> unI64 1931484973+  -- GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI+  '\x1f9e'# -> unI64 1931484974+  -- GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI+  '\x1f9f'# -> unI64 1931484975+  -- GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI+  '\x1fa0'# -> unI64 1931485032+  -- GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI+  '\x1fa1'# -> unI64 1931485033+  -- GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI+  '\x1fa2'# -> unI64 1931485034+  -- GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI+  '\x1fa3'# -> unI64 1931485035+  -- GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI+  '\x1fa4'# -> unI64 1931485036+  -- GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI+  '\x1fa5'# -> unI64 1931485037+  -- GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI+  '\x1fa6'# -> unI64 1931485038+  -- GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI+  '\x1fa7'# -> unI64 1931485039+  -- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI+  '\x1fa8'# -> unI64 1931485032+  -- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI+  '\x1fa9'# -> unI64 1931485033+  -- GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI+  '\x1faa'# -> unI64 1931485034+  -- GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI+  '\x1fab'# -> unI64 1931485035+  -- GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI+  '\x1fac'# -> unI64 1931485036+  -- GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI+  '\x1fad'# -> unI64 1931485037+  -- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI+  '\x1fae'# -> unI64 1931485038+  -- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI+  '\x1faf'# -> unI64 1931485039+  -- GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI+  '\x1fb3'# -> unI64 1931477905+  -- GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI+  '\x1fbc'# -> unI64 1931477905+  -- GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI+  '\x1fc3'# -> unI64 1931477911+  -- GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI+  '\x1fcc'# -> unI64 1931477911+  -- GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI+  '\x1ff3'# -> unI64 1931477929+  -- GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI+  '\x1ffc'# -> unI64 1931477929+  -- GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI+  '\x1fb2'# -> unI64 1931485114+  -- GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI+  '\x1fb4'# -> unI64 1931477894+  -- GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI+  '\x1fc2'# -> unI64 1931485130+  -- GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI+  '\x1fc4'# -> unI64 1931477897+  -- GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI+  '\x1ff2'# -> unI64 1931485178+  -- GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI+  '\x1ff4'# -> unI64 1931477903+  -- GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI+  '\x1fb7'# -> unI64 4050602585752465+  -- GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI+  '\x1fc7'# -> unI64 4050602585752471+  -- GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI+  '\x1ff7'# -> unI64 4050602585752489+  '\x0061'# -> unI64 65+  '\x0062'# -> unI64 66+  '\x0063'# -> unI64 67+  '\x0064'# -> unI64 68+  '\x0065'# -> unI64 69+  '\x0066'# -> unI64 70+  '\x0067'# -> unI64 71+  '\x0068'# -> unI64 72+  '\x0069'# -> unI64 73+  '\x006a'# -> unI64 74+  '\x006b'# -> unI64 75+  '\x006c'# -> unI64 76+  '\x006d'# -> unI64 77+  '\x006e'# -> unI64 78+  '\x006f'# -> unI64 79+  '\x0070'# -> unI64 80+  '\x0071'# -> unI64 81+  '\x0072'# -> unI64 82+  '\x0073'# -> unI64 83+  '\x0074'# -> unI64 84+  '\x0075'# -> unI64 85+  '\x0076'# -> unI64 86+  '\x0077'# -> unI64 87+  '\x0078'# -> unI64 88+  '\x0079'# -> unI64 89+  '\x007a'# -> unI64 90+  '\x00b5'# -> unI64 924+  '\x00e0'# -> unI64 192+  '\x00e1'# -> unI64 193+  '\x00e2'# -> unI64 194+  '\x00e3'# -> unI64 195+  '\x00e4'# -> unI64 196+  '\x00e5'# -> unI64 197+  '\x00e6'# -> unI64 198+  '\x00e7'# -> unI64 199+  '\x00e8'# -> unI64 200+  '\x00e9'# -> unI64 201+  '\x00ea'# -> unI64 202+  '\x00eb'# -> unI64 203+  '\x00ec'# -> unI64 204+  '\x00ed'# -> unI64 205+  '\x00ee'# -> unI64 206+  '\x00ef'# -> unI64 207+  '\x00f0'# -> unI64 208+  '\x00f1'# -> unI64 209+  '\x00f2'# -> unI64 210+  '\x00f3'# -> unI64 211+  '\x00f4'# -> unI64 212+  '\x00f5'# -> unI64 213+  '\x00f6'# -> unI64 214+  '\x00f8'# -> unI64 216+  '\x00f9'# -> unI64 217+  '\x00fa'# -> unI64 218+  '\x00fb'# -> unI64 219+  '\x00fc'# -> unI64 220+  '\x00fd'# -> unI64 221+  '\x00fe'# -> unI64 222+  '\x00ff'# -> unI64 376+  '\x0101'# -> unI64 256+  '\x0103'# -> unI64 258+  '\x0105'# -> unI64 260+  '\x0107'# -> unI64 262+  '\x0109'# -> unI64 264+  '\x010b'# -> unI64 266+  '\x010d'# -> unI64 268+  '\x010f'# -> unI64 270+  '\x0111'# -> unI64 272+  '\x0113'# -> unI64 274+  '\x0115'# -> unI64 276+  '\x0117'# -> unI64 278+  '\x0119'# -> unI64 280+  '\x011b'# -> unI64 282+  '\x011d'# -> unI64 284+  '\x011f'# -> unI64 286+  '\x0121'# -> unI64 288+  '\x0123'# -> unI64 290+  '\x0125'# -> unI64 292+  '\x0127'# -> unI64 294+  '\x0129'# -> unI64 296+  '\x012b'# -> unI64 298+  '\x012d'# -> unI64 300+  '\x012f'# -> unI64 302+  '\x0131'# -> unI64 73+  '\x0133'# -> unI64 306+  '\x0135'# -> unI64 308+  '\x0137'# -> unI64 310+  '\x013a'# -> unI64 313+  '\x013c'# -> unI64 315+  '\x013e'# -> unI64 317+  '\x0140'# -> unI64 319+  '\x0142'# -> unI64 321+  '\x0144'# -> unI64 323+  '\x0146'# -> unI64 325+  '\x0148'# -> unI64 327+  '\x014b'# -> unI64 330+  '\x014d'# -> unI64 332+  '\x014f'# -> unI64 334+  '\x0151'# -> unI64 336+  '\x0153'# -> unI64 338+  '\x0155'# -> unI64 340+  '\x0157'# -> unI64 342+  '\x0159'# -> unI64 344+  '\x015b'# -> unI64 346+  '\x015d'# -> unI64 348+  '\x015f'# -> unI64 350+  '\x0161'# -> unI64 352+  '\x0163'# -> unI64 354+  '\x0165'# -> unI64 356+  '\x0167'# -> unI64 358+  '\x0169'# -> unI64 360+  '\x016b'# -> unI64 362+  '\x016d'# -> unI64 364+  '\x016f'# -> unI64 366+  '\x0171'# -> unI64 368+  '\x0173'# -> unI64 370+  '\x0175'# -> unI64 372+  '\x0177'# -> unI64 374+  '\x017a'# -> unI64 377+  '\x017c'# -> unI64 379+  '\x017e'# -> unI64 381+  '\x017f'# -> unI64 83+  '\x0180'# -> unI64 579+  '\x0183'# -> unI64 386+  '\x0185'# -> unI64 388+  '\x0188'# -> unI64 391+  '\x018c'# -> unI64 395+  '\x0192'# -> unI64 401+  '\x0195'# -> unI64 502+  '\x0199'# -> unI64 408+  '\x019a'# -> unI64 573+  '\x019e'# -> unI64 544+  '\x01a1'# -> unI64 416+  '\x01a3'# -> unI64 418+  '\x01a5'# -> unI64 420+  '\x01a8'# -> unI64 423+  '\x01ad'# -> unI64 428+  '\x01b0'# -> unI64 431+  '\x01b4'# -> unI64 435+  '\x01b6'# -> unI64 437+  '\x01b9'# -> unI64 440+  '\x01bd'# -> unI64 444+  '\x01bf'# -> unI64 503+  '\x01c5'# -> unI64 452+  '\x01c6'# -> unI64 452+  '\x01c8'# -> unI64 455+  '\x01c9'# -> unI64 455+  '\x01cb'# -> unI64 458+  '\x01cc'# -> unI64 458+  '\x01ce'# -> unI64 461+  '\x01d0'# -> unI64 463+  '\x01d2'# -> unI64 465+  '\x01d4'# -> unI64 467+  '\x01d6'# -> unI64 469+  '\x01d8'# -> unI64 471+  '\x01da'# -> unI64 473+  '\x01dc'# -> unI64 475+  '\x01dd'# -> unI64 398+  '\x01df'# -> unI64 478+  '\x01e1'# -> unI64 480+  '\x01e3'# -> unI64 482+  '\x01e5'# -> unI64 484+  '\x01e7'# -> unI64 486+  '\x01e9'# -> unI64 488+  '\x01eb'# -> unI64 490+  '\x01ed'# -> unI64 492+  '\x01ef'# -> unI64 494+  '\x01f2'# -> unI64 497+  '\x01f3'# -> unI64 497+  '\x01f5'# -> unI64 500+  '\x01f9'# -> unI64 504+  '\x01fb'# -> unI64 506+  '\x01fd'# -> unI64 508+  '\x01ff'# -> unI64 510+  '\x0201'# -> unI64 512+  '\x0203'# -> unI64 514+  '\x0205'# -> unI64 516+  '\x0207'# -> unI64 518+  '\x0209'# -> unI64 520+  '\x020b'# -> unI64 522+  '\x020d'# -> unI64 524+  '\x020f'# -> unI64 526+  '\x0211'# -> unI64 528+  '\x0213'# -> unI64 530+  '\x0215'# -> unI64 532+  '\x0217'# -> unI64 534+  '\x0219'# -> unI64 536+  '\x021b'# -> unI64 538+  '\x021d'# -> unI64 540+  '\x021f'# -> unI64 542+  '\x0223'# -> unI64 546+  '\x0225'# -> unI64 548+  '\x0227'# -> unI64 550+  '\x0229'# -> unI64 552+  '\x022b'# -> unI64 554+  '\x022d'# -> unI64 556+  '\x022f'# -> unI64 558+  '\x0231'# -> unI64 560+  '\x0233'# -> unI64 562+  '\x023c'# -> unI64 571+  '\x023f'# -> unI64 11390+  '\x0240'# -> unI64 11391+  '\x0242'# -> unI64 577+  '\x0247'# -> unI64 582+  '\x0249'# -> unI64 584+  '\x024b'# -> unI64 586+  '\x024d'# -> unI64 588+  '\x024f'# -> unI64 590+  '\x0250'# -> unI64 11375+  '\x0251'# -> unI64 11373+  '\x0252'# -> unI64 11376+  '\x0253'# -> unI64 385+  '\x0254'# -> unI64 390+  '\x0256'# -> unI64 393+  '\x0257'# -> unI64 394+  '\x0259'# -> unI64 399+  '\x025b'# -> unI64 400+  '\x025c'# -> unI64 42923+  '\x0260'# -> unI64 403+  '\x0261'# -> unI64 42924+  '\x0263'# -> unI64 404+  '\x0265'# -> unI64 42893+  '\x0266'# -> unI64 42922+  '\x0268'# -> unI64 407+  '\x0269'# -> unI64 406+  '\x026a'# -> unI64 42926+  '\x026b'# -> unI64 11362+  '\x026c'# -> unI64 42925+  '\x026f'# -> unI64 412+  '\x0271'# -> unI64 11374+  '\x0272'# -> unI64 413+  '\x0275'# -> unI64 415+  '\x027d'# -> unI64 11364+  '\x0280'# -> unI64 422+  '\x0282'# -> unI64 42949+  '\x0283'# -> unI64 425+  '\x0287'# -> unI64 42929+  '\x0288'# -> unI64 430+  '\x0289'# -> unI64 580+  '\x028a'# -> unI64 433+  '\x028b'# -> unI64 434+  '\x028c'# -> unI64 581+  '\x0292'# -> unI64 439+  '\x029d'# -> unI64 42930+  '\x029e'# -> unI64 42928+  '\x0345'# -> unI64 921+  '\x0371'# -> unI64 880+  '\x0373'# -> unI64 882+  '\x0377'# -> unI64 886+  '\x037b'# -> unI64 1021+  '\x037c'# -> unI64 1022+  '\x037d'# -> unI64 1023+  '\x03ac'# -> unI64 902+  '\x03ad'# -> unI64 904+  '\x03ae'# -> unI64 905+  '\x03af'# -> unI64 906+  '\x03b1'# -> unI64 913+  '\x03b2'# -> unI64 914+  '\x03b3'# -> unI64 915+  '\x03b4'# -> unI64 916+  '\x03b5'# -> unI64 917+  '\x03b6'# -> unI64 918+  '\x03b7'# -> unI64 919+  '\x03b8'# -> unI64 920+  '\x03b9'# -> unI64 921+  '\x03ba'# -> unI64 922+  '\x03bb'# -> unI64 923+  '\x03bc'# -> unI64 924+  '\x03bd'# -> unI64 925+  '\x03be'# -> unI64 926+  '\x03bf'# -> unI64 927+  '\x03c0'# -> unI64 928+  '\x03c1'# -> unI64 929+  '\x03c2'# -> unI64 931+  '\x03c3'# -> unI64 931+  '\x03c4'# -> unI64 932+  '\x03c5'# -> unI64 933+  '\x03c6'# -> unI64 934+  '\x03c7'# -> unI64 935+  '\x03c8'# -> unI64 936+  '\x03c9'# -> unI64 937+  '\x03ca'# -> unI64 938+  '\x03cb'# -> unI64 939+  '\x03cc'# -> unI64 908+  '\x03cd'# -> unI64 910+  '\x03ce'# -> unI64 911+  '\x03d0'# -> unI64 914+  '\x03d1'# -> unI64 920+  '\x03d5'# -> unI64 934+  '\x03d6'# -> unI64 928+  '\x03d7'# -> unI64 975+  '\x03d9'# -> unI64 984+  '\x03db'# -> unI64 986+  '\x03dd'# -> unI64 988+  '\x03df'# -> unI64 990+  '\x03e1'# -> unI64 992+  '\x03e3'# -> unI64 994+  '\x03e5'# -> unI64 996+  '\x03e7'# -> unI64 998+  '\x03e9'# -> unI64 1000+  '\x03eb'# -> unI64 1002+  '\x03ed'# -> unI64 1004+  '\x03ef'# -> unI64 1006+  '\x03f0'# -> unI64 922+  '\x03f1'# -> unI64 929+  '\x03f2'# -> unI64 1017+  '\x03f3'# -> unI64 895+  '\x03f5'# -> unI64 917+  '\x03f8'# -> unI64 1015+  '\x03fb'# -> unI64 1018+  '\x0430'# -> unI64 1040+  '\x0431'# -> unI64 1041+  '\x0432'# -> unI64 1042+  '\x0433'# -> unI64 1043+  '\x0434'# -> unI64 1044+  '\x0435'# -> unI64 1045+  '\x0436'# -> unI64 1046+  '\x0437'# -> unI64 1047+  '\x0438'# -> unI64 1048+  '\x0439'# -> unI64 1049+  '\x043a'# -> unI64 1050+  '\x043b'# -> unI64 1051+  '\x043c'# -> unI64 1052+  '\x043d'# -> unI64 1053+  '\x043e'# -> unI64 1054+  '\x043f'# -> unI64 1055+  '\x0440'# -> unI64 1056+  '\x0441'# -> unI64 1057+  '\x0442'# -> unI64 1058+  '\x0443'# -> unI64 1059+  '\x0444'# -> unI64 1060+  '\x0445'# -> unI64 1061+  '\x0446'# -> unI64 1062+  '\x0447'# -> unI64 1063+  '\x0448'# -> unI64 1064+  '\x0449'# -> unI64 1065+  '\x044a'# -> unI64 1066+  '\x044b'# -> unI64 1067+  '\x044c'# -> unI64 1068+  '\x044d'# -> unI64 1069+  '\x044e'# -> unI64 1070+  '\x044f'# -> unI64 1071+  '\x0450'# -> unI64 1024+  '\x0451'# -> unI64 1025+  '\x0452'# -> unI64 1026+  '\x0453'# -> unI64 1027+  '\x0454'# -> unI64 1028+  '\x0455'# -> unI64 1029+  '\x0456'# -> unI64 1030+  '\x0457'# -> unI64 1031+  '\x0458'# -> unI64 1032+  '\x0459'# -> unI64 1033+  '\x045a'# -> unI64 1034+  '\x045b'# -> unI64 1035+  '\x045c'# -> unI64 1036+  '\x045d'# -> unI64 1037+  '\x045e'# -> unI64 1038+  '\x045f'# -> unI64 1039+  '\x0461'# -> unI64 1120+  '\x0463'# -> unI64 1122+  '\x0465'# -> unI64 1124+  '\x0467'# -> unI64 1126+  '\x0469'# -> unI64 1128+  '\x046b'# -> unI64 1130+  '\x046d'# -> unI64 1132+  '\x046f'# -> unI64 1134+  '\x0471'# -> unI64 1136+  '\x0473'# -> unI64 1138+  '\x0475'# -> unI64 1140+  '\x0477'# -> unI64 1142+  '\x0479'# -> unI64 1144+  '\x047b'# -> unI64 1146+  '\x047d'# -> unI64 1148+  '\x047f'# -> unI64 1150+  '\x0481'# -> unI64 1152+  '\x048b'# -> unI64 1162+  '\x048d'# -> unI64 1164+  '\x048f'# -> unI64 1166+  '\x0491'# -> unI64 1168+  '\x0493'# -> unI64 1170+  '\x0495'# -> unI64 1172+  '\x0497'# -> unI64 1174+  '\x0499'# -> unI64 1176+  '\x049b'# -> unI64 1178+  '\x049d'# -> unI64 1180+  '\x049f'# -> unI64 1182+  '\x04a1'# -> unI64 1184+  '\x04a3'# -> unI64 1186+  '\x04a5'# -> unI64 1188+  '\x04a7'# -> unI64 1190+  '\x04a9'# -> unI64 1192+  '\x04ab'# -> unI64 1194+  '\x04ad'# -> unI64 1196+  '\x04af'# -> unI64 1198+  '\x04b1'# -> unI64 1200+  '\x04b3'# -> unI64 1202+  '\x04b5'# -> unI64 1204+  '\x04b7'# -> unI64 1206+  '\x04b9'# -> unI64 1208+  '\x04bb'# -> unI64 1210+  '\x04bd'# -> unI64 1212+  '\x04bf'# -> unI64 1214+  '\x04c2'# -> unI64 1217+  '\x04c4'# -> unI64 1219+  '\x04c6'# -> unI64 1221+  '\x04c8'# -> unI64 1223+  '\x04ca'# -> unI64 1225+  '\x04cc'# -> unI64 1227+  '\x04ce'# -> unI64 1229+  '\x04cf'# -> unI64 1216+  '\x04d1'# -> unI64 1232+  '\x04d3'# -> unI64 1234+  '\x04d5'# -> unI64 1236+  '\x04d7'# -> unI64 1238+  '\x04d9'# -> unI64 1240+  '\x04db'# -> unI64 1242+  '\x04dd'# -> unI64 1244+  '\x04df'# -> unI64 1246+  '\x04e1'# -> unI64 1248+  '\x04e3'# -> unI64 1250+  '\x04e5'# -> unI64 1252+  '\x04e7'# -> unI64 1254+  '\x04e9'# -> unI64 1256+  '\x04eb'# -> unI64 1258+  '\x04ed'# -> unI64 1260+  '\x04ef'# -> unI64 1262+  '\x04f1'# -> unI64 1264+  '\x04f3'# -> unI64 1266+  '\x04f5'# -> unI64 1268+  '\x04f7'# -> unI64 1270+  '\x04f9'# -> unI64 1272+  '\x04fb'# -> unI64 1274+  '\x04fd'# -> unI64 1276+  '\x04ff'# -> unI64 1278+  '\x0501'# -> unI64 1280+  '\x0503'# -> unI64 1282+  '\x0505'# -> unI64 1284+  '\x0507'# -> unI64 1286+  '\x0509'# -> unI64 1288+  '\x050b'# -> unI64 1290+  '\x050d'# -> unI64 1292+  '\x050f'# -> unI64 1294+  '\x0511'# -> unI64 1296+  '\x0513'# -> unI64 1298+  '\x0515'# -> unI64 1300+  '\x0517'# -> unI64 1302+  '\x0519'# -> unI64 1304+  '\x051b'# -> unI64 1306+  '\x051d'# -> unI64 1308+  '\x051f'# -> unI64 1310+  '\x0521'# -> unI64 1312+  '\x0523'# -> unI64 1314+  '\x0525'# -> unI64 1316+  '\x0527'# -> unI64 1318+  '\x0529'# -> unI64 1320+  '\x052b'# -> unI64 1322+  '\x052d'# -> unI64 1324+  '\x052f'# -> unI64 1326+  '\x0561'# -> unI64 1329+  '\x0562'# -> unI64 1330+  '\x0563'# -> unI64 1331+  '\x0564'# -> unI64 1332+  '\x0565'# -> unI64 1333+  '\x0566'# -> unI64 1334+  '\x0567'# -> unI64 1335+  '\x0568'# -> unI64 1336+  '\x0569'# -> unI64 1337+  '\x056a'# -> unI64 1338+  '\x056b'# -> unI64 1339+  '\x056c'# -> unI64 1340+  '\x056d'# -> unI64 1341+  '\x056e'# -> unI64 1342+  '\x056f'# -> unI64 1343+  '\x0570'# -> unI64 1344+  '\x0571'# -> unI64 1345+  '\x0572'# -> unI64 1346+  '\x0573'# -> unI64 1347+  '\x0574'# -> unI64 1348+  '\x0575'# -> unI64 1349+  '\x0576'# -> unI64 1350+  '\x0577'# -> unI64 1351+  '\x0578'# -> unI64 1352+  '\x0579'# -> unI64 1353+  '\x057a'# -> unI64 1354+  '\x057b'# -> unI64 1355+  '\x057c'# -> unI64 1356+  '\x057d'# -> unI64 1357+  '\x057e'# -> unI64 1358+  '\x057f'# -> unI64 1359+  '\x0580'# -> unI64 1360+  '\x0581'# -> unI64 1361+  '\x0582'# -> unI64 1362+  '\x0583'# -> unI64 1363+  '\x0584'# -> unI64 1364+  '\x0585'# -> unI64 1365+  '\x0586'# -> unI64 1366+  '\x10d0'# -> unI64 7312+  '\x10d1'# -> unI64 7313+  '\x10d2'# -> unI64 7314+  '\x10d3'# -> unI64 7315+  '\x10d4'# -> unI64 7316+  '\x10d5'# -> unI64 7317+  '\x10d6'# -> unI64 7318+  '\x10d7'# -> unI64 7319+  '\x10d8'# -> unI64 7320+  '\x10d9'# -> unI64 7321+  '\x10da'# -> unI64 7322+  '\x10db'# -> unI64 7323+  '\x10dc'# -> unI64 7324+  '\x10dd'# -> unI64 7325+  '\x10de'# -> unI64 7326+  '\x10df'# -> unI64 7327+  '\x10e0'# -> unI64 7328+  '\x10e1'# -> unI64 7329+  '\x10e2'# -> unI64 7330+  '\x10e3'# -> unI64 7331+  '\x10e4'# -> unI64 7332+  '\x10e5'# -> unI64 7333+  '\x10e6'# -> unI64 7334+  '\x10e7'# -> unI64 7335+  '\x10e8'# -> unI64 7336+  '\x10e9'# -> unI64 7337+  '\x10ea'# -> unI64 7338+  '\x10eb'# -> unI64 7339+  '\x10ec'# -> unI64 7340+  '\x10ed'# -> unI64 7341+  '\x10ee'# -> unI64 7342+  '\x10ef'# -> unI64 7343+  '\x10f0'# -> unI64 7344+  '\x10f1'# -> unI64 7345+  '\x10f2'# -> unI64 7346+  '\x10f3'# -> unI64 7347+  '\x10f4'# -> unI64 7348+  '\x10f5'# -> unI64 7349+  '\x10f6'# -> unI64 7350+  '\x10f7'# -> unI64 7351+  '\x10f8'# -> unI64 7352+  '\x10f9'# -> unI64 7353+  '\x10fa'# -> unI64 7354+  '\x10fd'# -> unI64 7357+  '\x10fe'# -> unI64 7358+  '\x10ff'# -> unI64 7359+  '\x13f8'# -> unI64 5104+  '\x13f9'# -> unI64 5105+  '\x13fa'# -> unI64 5106+  '\x13fb'# -> unI64 5107+  '\x13fc'# -> unI64 5108+  '\x13fd'# -> unI64 5109+  '\x1c80'# -> unI64 1042+  '\x1c81'# -> unI64 1044+  '\x1c82'# -> unI64 1054+  '\x1c83'# -> unI64 1057+  '\x1c84'# -> unI64 1058+  '\x1c85'# -> unI64 1058+  '\x1c86'# -> unI64 1066+  '\x1c87'# -> unI64 1122+  '\x1c88'# -> unI64 42570+  '\x1d79'# -> unI64 42877+  '\x1d7d'# -> unI64 11363+  '\x1d8e'# -> unI64 42950+  '\x1e01'# -> unI64 7680+  '\x1e03'# -> unI64 7682+  '\x1e05'# -> unI64 7684+  '\x1e07'# -> unI64 7686+  '\x1e09'# -> unI64 7688+  '\x1e0b'# -> unI64 7690+  '\x1e0d'# -> unI64 7692+  '\x1e0f'# -> unI64 7694+  '\x1e11'# -> unI64 7696+  '\x1e13'# -> unI64 7698+  '\x1e15'# -> unI64 7700+  '\x1e17'# -> unI64 7702+  '\x1e19'# -> unI64 7704+  '\x1e1b'# -> unI64 7706+  '\x1e1d'# -> unI64 7708+  '\x1e1f'# -> unI64 7710+  '\x1e21'# -> unI64 7712+  '\x1e23'# -> unI64 7714+  '\x1e25'# -> unI64 7716+  '\x1e27'# -> unI64 7718+  '\x1e29'# -> unI64 7720+  '\x1e2b'# -> unI64 7722+  '\x1e2d'# -> unI64 7724+  '\x1e2f'# -> unI64 7726+  '\x1e31'# -> unI64 7728+  '\x1e33'# -> unI64 7730+  '\x1e35'# -> unI64 7732+  '\x1e37'# -> unI64 7734+  '\x1e39'# -> unI64 7736+  '\x1e3b'# -> unI64 7738+  '\x1e3d'# -> unI64 7740+  '\x1e3f'# -> unI64 7742+  '\x1e41'# -> unI64 7744+  '\x1e43'# -> unI64 7746+  '\x1e45'# -> unI64 7748+  '\x1e47'# -> unI64 7750+  '\x1e49'# -> unI64 7752+  '\x1e4b'# -> unI64 7754+  '\x1e4d'# -> unI64 7756+  '\x1e4f'# -> unI64 7758+  '\x1e51'# -> unI64 7760+  '\x1e53'# -> unI64 7762+  '\x1e55'# -> unI64 7764+  '\x1e57'# -> unI64 7766+  '\x1e59'# -> unI64 7768+  '\x1e5b'# -> unI64 7770+  '\x1e5d'# -> unI64 7772+  '\x1e5f'# -> unI64 7774+  '\x1e61'# -> unI64 7776+  '\x1e63'# -> unI64 7778+  '\x1e65'# -> unI64 7780+  '\x1e67'# -> unI64 7782+  '\x1e69'# -> unI64 7784+  '\x1e6b'# -> unI64 7786+  '\x1e6d'# -> unI64 7788+  '\x1e6f'# -> unI64 7790+  '\x1e71'# -> unI64 7792+  '\x1e73'# -> unI64 7794+  '\x1e75'# -> unI64 7796+  '\x1e77'# -> unI64 7798+  '\x1e79'# -> unI64 7800+  '\x1e7b'# -> unI64 7802+  '\x1e7d'# -> unI64 7804+  '\x1e7f'# -> unI64 7806+  '\x1e81'# -> unI64 7808+  '\x1e83'# -> unI64 7810+  '\x1e85'# -> unI64 7812+  '\x1e87'# -> unI64 7814+  '\x1e89'# -> unI64 7816+  '\x1e8b'# -> unI64 7818+  '\x1e8d'# -> unI64 7820+  '\x1e8f'# -> unI64 7822+  '\x1e91'# -> unI64 7824+  '\x1e93'# -> unI64 7826+  '\x1e95'# -> unI64 7828+  '\x1e9b'# -> unI64 7776+  '\x1ea1'# -> unI64 7840+  '\x1ea3'# -> unI64 7842+  '\x1ea5'# -> unI64 7844+  '\x1ea7'# -> unI64 7846+  '\x1ea9'# -> unI64 7848+  '\x1eab'# -> unI64 7850+  '\x1ead'# -> unI64 7852+  '\x1eaf'# -> unI64 7854+  '\x1eb1'# -> unI64 7856+  '\x1eb3'# -> unI64 7858+  '\x1eb5'# -> unI64 7860+  '\x1eb7'# -> unI64 7862+  '\x1eb9'# -> unI64 7864+  '\x1ebb'# -> unI64 7866+  '\x1ebd'# -> unI64 7868+  '\x1ebf'# -> unI64 7870+  '\x1ec1'# -> unI64 7872+  '\x1ec3'# -> unI64 7874+  '\x1ec5'# -> unI64 7876+  '\x1ec7'# -> unI64 7878+  '\x1ec9'# -> unI64 7880+  '\x1ecb'# -> unI64 7882+  '\x1ecd'# -> unI64 7884+  '\x1ecf'# -> unI64 7886+  '\x1ed1'# -> unI64 7888+  '\x1ed3'# -> unI64 7890+  '\x1ed5'# -> unI64 7892+  '\x1ed7'# -> unI64 7894+  '\x1ed9'# -> unI64 7896+  '\x1edb'# -> unI64 7898+  '\x1edd'# -> unI64 7900+  '\x1edf'# -> unI64 7902+  '\x1ee1'# -> unI64 7904+  '\x1ee3'# -> unI64 7906+  '\x1ee5'# -> unI64 7908+  '\x1ee7'# -> unI64 7910+  '\x1ee9'# -> unI64 7912+  '\x1eeb'# -> unI64 7914+  '\x1eed'# -> unI64 7916+  '\x1eef'# -> unI64 7918+  '\x1ef1'# -> unI64 7920+  '\x1ef3'# -> unI64 7922+  '\x1ef5'# -> unI64 7924+  '\x1ef7'# -> unI64 7926+  '\x1ef9'# -> unI64 7928+  '\x1efb'# -> unI64 7930+  '\x1efd'# -> unI64 7932+  '\x1eff'# -> unI64 7934+  '\x1f00'# -> unI64 7944+  '\x1f01'# -> unI64 7945+  '\x1f02'# -> unI64 7946+  '\x1f03'# -> unI64 7947+  '\x1f04'# -> unI64 7948+  '\x1f05'# -> unI64 7949+  '\x1f06'# -> unI64 7950+  '\x1f07'# -> unI64 7951+  '\x1f10'# -> unI64 7960+  '\x1f11'# -> unI64 7961+  '\x1f12'# -> unI64 7962+  '\x1f13'# -> unI64 7963+  '\x1f14'# -> unI64 7964+  '\x1f15'# -> unI64 7965+  '\x1f20'# -> unI64 7976+  '\x1f21'# -> unI64 7977+  '\x1f22'# -> unI64 7978+  '\x1f23'# -> unI64 7979+  '\x1f24'# -> unI64 7980+  '\x1f25'# -> unI64 7981+  '\x1f26'# -> unI64 7982+  '\x1f27'# -> unI64 7983+  '\x1f30'# -> unI64 7992+  '\x1f31'# -> unI64 7993+  '\x1f32'# -> unI64 7994+  '\x1f33'# -> unI64 7995+  '\x1f34'# -> unI64 7996+  '\x1f35'# -> unI64 7997+  '\x1f36'# -> unI64 7998+  '\x1f37'# -> unI64 7999+  '\x1f40'# -> unI64 8008+  '\x1f41'# -> unI64 8009+  '\x1f42'# -> unI64 8010+  '\x1f43'# -> unI64 8011+  '\x1f44'# -> unI64 8012+  '\x1f45'# -> unI64 8013+  '\x1f51'# -> unI64 8025+  '\x1f53'# -> unI64 8027+  '\x1f55'# -> unI64 8029+  '\x1f57'# -> unI64 8031+  '\x1f60'# -> unI64 8040+  '\x1f61'# -> unI64 8041+  '\x1f62'# -> unI64 8042+  '\x1f63'# -> unI64 8043+  '\x1f64'# -> unI64 8044+  '\x1f65'# -> unI64 8045+  '\x1f66'# -> unI64 8046+  '\x1f67'# -> unI64 8047+  '\x1f70'# -> unI64 8122+  '\x1f71'# -> unI64 8123+  '\x1f72'# -> unI64 8136+  '\x1f73'# -> unI64 8137+  '\x1f74'# -> unI64 8138+  '\x1f75'# -> unI64 8139+  '\x1f76'# -> unI64 8154+  '\x1f77'# -> unI64 8155+  '\x1f78'# -> unI64 8184+  '\x1f79'# -> unI64 8185+  '\x1f7a'# -> unI64 8170+  '\x1f7b'# -> unI64 8171+  '\x1f7c'# -> unI64 8186+  '\x1f7d'# -> unI64 8187+  '\x1fb0'# -> unI64 8120+  '\x1fb1'# -> unI64 8121+  '\x1fbe'# -> unI64 921+  '\x1fd0'# -> unI64 8152+  '\x1fd1'# -> unI64 8153+  '\x1fe0'# -> unI64 8168+  '\x1fe1'# -> unI64 8169+  '\x1fe5'# -> unI64 8172+  '\x214e'# -> unI64 8498+  '\x2170'# -> unI64 8544+  '\x2171'# -> unI64 8545+  '\x2172'# -> unI64 8546+  '\x2173'# -> unI64 8547+  '\x2174'# -> unI64 8548+  '\x2175'# -> unI64 8549+  '\x2176'# -> unI64 8550+  '\x2177'# -> unI64 8551+  '\x2178'# -> unI64 8552+  '\x2179'# -> unI64 8553+  '\x217a'# -> unI64 8554+  '\x217b'# -> unI64 8555+  '\x217c'# -> unI64 8556+  '\x217d'# -> unI64 8557+  '\x217e'# -> unI64 8558+  '\x217f'# -> unI64 8559+  '\x2184'# -> unI64 8579+  '\x24d0'# -> unI64 9398+  '\x24d1'# -> unI64 9399+  '\x24d2'# -> unI64 9400+  '\x24d3'# -> unI64 9401+  '\x24d4'# -> unI64 9402+  '\x24d5'# -> unI64 9403+  '\x24d6'# -> unI64 9404+  '\x24d7'# -> unI64 9405+  '\x24d8'# -> unI64 9406+  '\x24d9'# -> unI64 9407+  '\x24da'# -> unI64 9408+  '\x24db'# -> unI64 9409+  '\x24dc'# -> unI64 9410+  '\x24dd'# -> unI64 9411+  '\x24de'# -> unI64 9412+  '\x24df'# -> unI64 9413+  '\x24e0'# -> unI64 9414+  '\x24e1'# -> unI64 9415+  '\x24e2'# -> unI64 9416+  '\x24e3'# -> unI64 9417+  '\x24e4'# -> unI64 9418+  '\x24e5'# -> unI64 9419+  '\x24e6'# -> unI64 9420+  '\x24e7'# -> unI64 9421+  '\x24e8'# -> unI64 9422+  '\x24e9'# -> unI64 9423+  '\x2c30'# -> unI64 11264+  '\x2c31'# -> unI64 11265+  '\x2c32'# -> unI64 11266+  '\x2c33'# -> unI64 11267+  '\x2c34'# -> unI64 11268+  '\x2c35'# -> unI64 11269+  '\x2c36'# -> unI64 11270+  '\x2c37'# -> unI64 11271+  '\x2c38'# -> unI64 11272+  '\x2c39'# -> unI64 11273+  '\x2c3a'# -> unI64 11274+  '\x2c3b'# -> unI64 11275+  '\x2c3c'# -> unI64 11276+  '\x2c3d'# -> unI64 11277+  '\x2c3e'# -> unI64 11278+  '\x2c3f'# -> unI64 11279+  '\x2c40'# -> unI64 11280+  '\x2c41'# -> unI64 11281+  '\x2c42'# -> unI64 11282+  '\x2c43'# -> unI64 11283+  '\x2c44'# -> unI64 11284+  '\x2c45'# -> unI64 11285+  '\x2c46'# -> unI64 11286+  '\x2c47'# -> unI64 11287+  '\x2c48'# -> unI64 11288+  '\x2c49'# -> unI64 11289+  '\x2c4a'# -> unI64 11290+  '\x2c4b'# -> unI64 11291+  '\x2c4c'# -> unI64 11292+  '\x2c4d'# -> unI64 11293+  '\x2c4e'# -> unI64 11294+  '\x2c4f'# -> unI64 11295+  '\x2c50'# -> unI64 11296+  '\x2c51'# -> unI64 11297+  '\x2c52'# -> unI64 11298+  '\x2c53'# -> unI64 11299+  '\x2c54'# -> unI64 11300+  '\x2c55'# -> unI64 11301+  '\x2c56'# -> unI64 11302+  '\x2c57'# -> unI64 11303+  '\x2c58'# -> unI64 11304+  '\x2c59'# -> unI64 11305+  '\x2c5a'# -> unI64 11306+  '\x2c5b'# -> unI64 11307+  '\x2c5c'# -> unI64 11308+  '\x2c5d'# -> unI64 11309+  '\x2c5e'# -> unI64 11310+  '\x2c5f'# -> unI64 11311+  '\x2c61'# -> unI64 11360+  '\x2c65'# -> unI64 570+  '\x2c66'# -> unI64 574+  '\x2c68'# -> unI64 11367+  '\x2c6a'# -> unI64 11369+  '\x2c6c'# -> unI64 11371+  '\x2c73'# -> unI64 11378+  '\x2c76'# -> unI64 11381+  '\x2c81'# -> unI64 11392+  '\x2c83'# -> unI64 11394+  '\x2c85'# -> unI64 11396+  '\x2c87'# -> unI64 11398+  '\x2c89'# -> unI64 11400+  '\x2c8b'# -> unI64 11402+  '\x2c8d'# -> unI64 11404+  '\x2c8f'# -> unI64 11406+  '\x2c91'# -> unI64 11408+  '\x2c93'# -> unI64 11410+  '\x2c95'# -> unI64 11412+  '\x2c97'# -> unI64 11414+  '\x2c99'# -> unI64 11416+  '\x2c9b'# -> unI64 11418+  '\x2c9d'# -> unI64 11420+  '\x2c9f'# -> unI64 11422+  '\x2ca1'# -> unI64 11424+  '\x2ca3'# -> unI64 11426+  '\x2ca5'# -> unI64 11428+  '\x2ca7'# -> unI64 11430+  '\x2ca9'# -> unI64 11432+  '\x2cab'# -> unI64 11434+  '\x2cad'# -> unI64 11436+  '\x2caf'# -> unI64 11438+  '\x2cb1'# -> unI64 11440+  '\x2cb3'# -> unI64 11442+  '\x2cb5'# -> unI64 11444+  '\x2cb7'# -> unI64 11446+  '\x2cb9'# -> unI64 11448+  '\x2cbb'# -> unI64 11450+  '\x2cbd'# -> unI64 11452+  '\x2cbf'# -> unI64 11454+  '\x2cc1'# -> unI64 11456+  '\x2cc3'# -> unI64 11458+  '\x2cc5'# -> unI64 11460+  '\x2cc7'# -> unI64 11462+  '\x2cc9'# -> unI64 11464+  '\x2ccb'# -> unI64 11466+  '\x2ccd'# -> unI64 11468+  '\x2ccf'# -> unI64 11470+  '\x2cd1'# -> unI64 11472+  '\x2cd3'# -> unI64 11474+  '\x2cd5'# -> unI64 11476+  '\x2cd7'# -> unI64 11478+  '\x2cd9'# -> unI64 11480+  '\x2cdb'# -> unI64 11482+  '\x2cdd'# -> unI64 11484+  '\x2cdf'# -> unI64 11486+  '\x2ce1'# -> unI64 11488+  '\x2ce3'# -> unI64 11490+  '\x2cec'# -> unI64 11499+  '\x2cee'# -> unI64 11501+  '\x2cf3'# -> unI64 11506+  '\x2d00'# -> unI64 4256+  '\x2d01'# -> unI64 4257+  '\x2d02'# -> unI64 4258+  '\x2d03'# -> unI64 4259+  '\x2d04'# -> unI64 4260+  '\x2d05'# -> unI64 4261+  '\x2d06'# -> unI64 4262+  '\x2d07'# -> unI64 4263+  '\x2d08'# -> unI64 4264+  '\x2d09'# -> unI64 4265+  '\x2d0a'# -> unI64 4266+  '\x2d0b'# -> unI64 4267+  '\x2d0c'# -> unI64 4268+  '\x2d0d'# -> unI64 4269+  '\x2d0e'# -> unI64 4270+  '\x2d0f'# -> unI64 4271+  '\x2d10'# -> unI64 4272+  '\x2d11'# -> unI64 4273+  '\x2d12'# -> unI64 4274+  '\x2d13'# -> unI64 4275+  '\x2d14'# -> unI64 4276+  '\x2d15'# -> unI64 4277+  '\x2d16'# -> unI64 4278+  '\x2d17'# -> unI64 4279+  '\x2d18'# -> unI64 4280+  '\x2d19'# -> unI64 4281+  '\x2d1a'# -> unI64 4282+  '\x2d1b'# -> unI64 4283+  '\x2d1c'# -> unI64 4284+  '\x2d1d'# -> unI64 4285+  '\x2d1e'# -> unI64 4286+  '\x2d1f'# -> unI64 4287+  '\x2d20'# -> unI64 4288+  '\x2d21'# -> unI64 4289+  '\x2d22'# -> unI64 4290+  '\x2d23'# -> unI64 4291+  '\x2d24'# -> unI64 4292+  '\x2d25'# -> unI64 4293+  '\x2d27'# -> unI64 4295+  '\x2d2d'# -> unI64 4301+  '\xa641'# -> unI64 42560+  '\xa643'# -> unI64 42562+  '\xa645'# -> unI64 42564+  '\xa647'# -> unI64 42566+  '\xa649'# -> unI64 42568+  '\xa64b'# -> unI64 42570+  '\xa64d'# -> unI64 42572+  '\xa64f'# -> unI64 42574+  '\xa651'# -> unI64 42576+  '\xa653'# -> unI64 42578+  '\xa655'# -> unI64 42580+  '\xa657'# -> unI64 42582+  '\xa659'# -> unI64 42584+  '\xa65b'# -> unI64 42586+  '\xa65d'# -> unI64 42588+  '\xa65f'# -> unI64 42590+  '\xa661'# -> unI64 42592+  '\xa663'# -> unI64 42594+  '\xa665'# -> unI64 42596+  '\xa667'# -> unI64 42598+  '\xa669'# -> unI64 42600+  '\xa66b'# -> unI64 42602+  '\xa66d'# -> unI64 42604+  '\xa681'# -> unI64 42624+  '\xa683'# -> unI64 42626+  '\xa685'# -> unI64 42628+  '\xa687'# -> unI64 42630+  '\xa689'# -> unI64 42632+  '\xa68b'# -> unI64 42634+  '\xa68d'# -> unI64 42636+  '\xa68f'# -> unI64 42638+  '\xa691'# -> unI64 42640+  '\xa693'# -> unI64 42642+  '\xa695'# -> unI64 42644+  '\xa697'# -> unI64 42646+  '\xa699'# -> unI64 42648+  '\xa69b'# -> unI64 42650+  '\xa723'# -> unI64 42786+  '\xa725'# -> unI64 42788+  '\xa727'# -> unI64 42790+  '\xa729'# -> unI64 42792+  '\xa72b'# -> unI64 42794+  '\xa72d'# -> unI64 42796+  '\xa72f'# -> unI64 42798+  '\xa733'# -> unI64 42802+  '\xa735'# -> unI64 42804+  '\xa737'# -> unI64 42806+  '\xa739'# -> unI64 42808+  '\xa73b'# -> unI64 42810+  '\xa73d'# -> unI64 42812+  '\xa73f'# -> unI64 42814+  '\xa741'# -> unI64 42816+  '\xa743'# -> unI64 42818+  '\xa745'# -> unI64 42820+  '\xa747'# -> unI64 42822+  '\xa749'# -> unI64 42824+  '\xa74b'# -> unI64 42826+  '\xa74d'# -> unI64 42828+  '\xa74f'# -> unI64 42830+  '\xa751'# -> unI64 42832+  '\xa753'# -> unI64 42834+  '\xa755'# -> unI64 42836+  '\xa757'# -> unI64 42838+  '\xa759'# -> unI64 42840+  '\xa75b'# -> unI64 42842+  '\xa75d'# -> unI64 42844+  '\xa75f'# -> unI64 42846+  '\xa761'# -> unI64 42848+  '\xa763'# -> unI64 42850+  '\xa765'# -> unI64 42852+  '\xa767'# -> unI64 42854+  '\xa769'# -> unI64 42856+  '\xa76b'# -> unI64 42858+  '\xa76d'# -> unI64 42860+  '\xa76f'# -> unI64 42862+  '\xa77a'# -> unI64 42873+  '\xa77c'# -> unI64 42875+  '\xa77f'# -> unI64 42878+  '\xa781'# -> unI64 42880+  '\xa783'# -> unI64 42882+  '\xa785'# -> unI64 42884+  '\xa787'# -> unI64 42886+  '\xa78c'# -> unI64 42891+  '\xa791'# -> unI64 42896+  '\xa793'# -> unI64 42898+  '\xa794'# -> unI64 42948+  '\xa797'# -> unI64 42902+  '\xa799'# -> unI64 42904+  '\xa79b'# -> unI64 42906+  '\xa79d'# -> unI64 42908+  '\xa79f'# -> unI64 42910+  '\xa7a1'# -> unI64 42912+  '\xa7a3'# -> unI64 42914+  '\xa7a5'# -> unI64 42916+  '\xa7a7'# -> unI64 42918+  '\xa7a9'# -> unI64 42920+  '\xa7b5'# -> unI64 42932+  '\xa7b7'# -> unI64 42934+  '\xa7b9'# -> unI64 42936+  '\xa7bb'# -> unI64 42938+  '\xa7bd'# -> unI64 42940+  '\xa7bf'# -> unI64 42942+  '\xa7c1'# -> unI64 42944+  '\xa7c3'# -> unI64 42946+  '\xa7c8'# -> unI64 42951+  '\xa7ca'# -> unI64 42953+  '\xa7d1'# -> unI64 42960+  '\xa7d7'# -> unI64 42966+  '\xa7d9'# -> unI64 42968+  '\xa7f6'# -> unI64 42997+  '\xab53'# -> unI64 42931+  '\xab70'# -> unI64 5024+  '\xab71'# -> unI64 5025+  '\xab72'# -> unI64 5026+  '\xab73'# -> unI64 5027+  '\xab74'# -> unI64 5028+  '\xab75'# -> unI64 5029+  '\xab76'# -> unI64 5030+  '\xab77'# -> unI64 5031+  '\xab78'# -> unI64 5032+  '\xab79'# -> unI64 5033+  '\xab7a'# -> unI64 5034+  '\xab7b'# -> unI64 5035+  '\xab7c'# -> unI64 5036+  '\xab7d'# -> unI64 5037+  '\xab7e'# -> unI64 5038+  '\xab7f'# -> unI64 5039+  '\xab80'# -> unI64 5040+  '\xab81'# -> unI64 5041+  '\xab82'# -> unI64 5042+  '\xab83'# -> unI64 5043+  '\xab84'# -> unI64 5044+  '\xab85'# -> unI64 5045+  '\xab86'# -> unI64 5046+  '\xab87'# -> unI64 5047+  '\xab88'# -> unI64 5048+  '\xab89'# -> unI64 5049+  '\xab8a'# -> unI64 5050+  '\xab8b'# -> unI64 5051+  '\xab8c'# -> unI64 5052+  '\xab8d'# -> unI64 5053+  '\xab8e'# -> unI64 5054+  '\xab8f'# -> unI64 5055+  '\xab90'# -> unI64 5056+  '\xab91'# -> unI64 5057+  '\xab92'# -> unI64 5058+  '\xab93'# -> unI64 5059+  '\xab94'# -> unI64 5060+  '\xab95'# -> unI64 5061+  '\xab96'# -> unI64 5062+  '\xab97'# -> unI64 5063+  '\xab98'# -> unI64 5064+  '\xab99'# -> unI64 5065+  '\xab9a'# -> unI64 5066+  '\xab9b'# -> unI64 5067+  '\xab9c'# -> unI64 5068+  '\xab9d'# -> unI64 5069+  '\xab9e'# -> unI64 5070+  '\xab9f'# -> unI64 5071+  '\xaba0'# -> unI64 5072+  '\xaba1'# -> unI64 5073+  '\xaba2'# -> unI64 5074+  '\xaba3'# -> unI64 5075+  '\xaba4'# -> unI64 5076+  '\xaba5'# -> unI64 5077+  '\xaba6'# -> unI64 5078+  '\xaba7'# -> unI64 5079+  '\xaba8'# -> unI64 5080+  '\xaba9'# -> unI64 5081+  '\xabaa'# -> unI64 5082+  '\xabab'# -> unI64 5083+  '\xabac'# -> unI64 5084+  '\xabad'# -> unI64 5085+  '\xabae'# -> unI64 5086+  '\xabaf'# -> unI64 5087+  '\xabb0'# -> unI64 5088+  '\xabb1'# -> unI64 5089+  '\xabb2'# -> unI64 5090+  '\xabb3'# -> unI64 5091+  '\xabb4'# -> unI64 5092+  '\xabb5'# -> unI64 5093+  '\xabb6'# -> unI64 5094+  '\xabb7'# -> unI64 5095+  '\xabb8'# -> unI64 5096+  '\xabb9'# -> unI64 5097+  '\xabba'# -> unI64 5098+  '\xabbb'# -> unI64 5099+  '\xabbc'# -> unI64 5100+  '\xabbd'# -> unI64 5101+  '\xabbe'# -> unI64 5102+  '\xabbf'# -> unI64 5103+  '\xff41'# -> unI64 65313+  '\xff42'# -> unI64 65314+  '\xff43'# -> unI64 65315+  '\xff44'# -> unI64 65316+  '\xff45'# -> unI64 65317+  '\xff46'# -> unI64 65318+  '\xff47'# -> unI64 65319+  '\xff48'# -> unI64 65320+  '\xff49'# -> unI64 65321+  '\xff4a'# -> unI64 65322+  '\xff4b'# -> unI64 65323+  '\xff4c'# -> unI64 65324+  '\xff4d'# -> unI64 65325+  '\xff4e'# -> unI64 65326+  '\xff4f'# -> unI64 65327+  '\xff50'# -> unI64 65328+  '\xff51'# -> unI64 65329+  '\xff52'# -> unI64 65330+  '\xff53'# -> unI64 65331+  '\xff54'# -> unI64 65332+  '\xff55'# -> unI64 65333+  '\xff56'# -> unI64 65334+  '\xff57'# -> unI64 65335+  '\xff58'# -> unI64 65336+  '\xff59'# -> unI64 65337+  '\xff5a'# -> unI64 65338+  '\x10428'# -> unI64 66560+  '\x10429'# -> unI64 66561+  '\x1042a'# -> unI64 66562+  '\x1042b'# -> unI64 66563+  '\x1042c'# -> unI64 66564+  '\x1042d'# -> unI64 66565+  '\x1042e'# -> unI64 66566+  '\x1042f'# -> unI64 66567+  '\x10430'# -> unI64 66568+  '\x10431'# -> unI64 66569+  '\x10432'# -> unI64 66570+  '\x10433'# -> unI64 66571+  '\x10434'# -> unI64 66572+  '\x10435'# -> unI64 66573+  '\x10436'# -> unI64 66574+  '\x10437'# -> unI64 66575+  '\x10438'# -> unI64 66576+  '\x10439'# -> unI64 66577+  '\x1043a'# -> unI64 66578+  '\x1043b'# -> unI64 66579+  '\x1043c'# -> unI64 66580+  '\x1043d'# -> unI64 66581+  '\x1043e'# -> unI64 66582+  '\x1043f'# -> unI64 66583+  '\x10440'# -> unI64 66584+  '\x10441'# -> unI64 66585+  '\x10442'# -> unI64 66586+  '\x10443'# -> unI64 66587+  '\x10444'# -> unI64 66588+  '\x10445'# -> unI64 66589+  '\x10446'# -> unI64 66590+  '\x10447'# -> unI64 66591+  '\x10448'# -> unI64 66592+  '\x10449'# -> unI64 66593+  '\x1044a'# -> unI64 66594+  '\x1044b'# -> unI64 66595+  '\x1044c'# -> unI64 66596+  '\x1044d'# -> unI64 66597+  '\x1044e'# -> unI64 66598+  '\x1044f'# -> unI64 66599+  '\x104d8'# -> unI64 66736+  '\x104d9'# -> unI64 66737+  '\x104da'# -> unI64 66738+  '\x104db'# -> unI64 66739+  '\x104dc'# -> unI64 66740+  '\x104dd'# -> unI64 66741+  '\x104de'# -> unI64 66742+  '\x104df'# -> unI64 66743+  '\x104e0'# -> unI64 66744+  '\x104e1'# -> unI64 66745+  '\x104e2'# -> unI64 66746+  '\x104e3'# -> unI64 66747+  '\x104e4'# -> unI64 66748+  '\x104e5'# -> unI64 66749+  '\x104e6'# -> unI64 66750+  '\x104e7'# -> unI64 66751+  '\x104e8'# -> unI64 66752+  '\x104e9'# -> unI64 66753+  '\x104ea'# -> unI64 66754+  '\x104eb'# -> unI64 66755+  '\x104ec'# -> unI64 66756+  '\x104ed'# -> unI64 66757+  '\x104ee'# -> unI64 66758+  '\x104ef'# -> unI64 66759+  '\x104f0'# -> unI64 66760+  '\x104f1'# -> unI64 66761+  '\x104f2'# -> unI64 66762+  '\x104f3'# -> unI64 66763+  '\x104f4'# -> unI64 66764+  '\x104f5'# -> unI64 66765+  '\x104f6'# -> unI64 66766+  '\x104f7'# -> unI64 66767+  '\x104f8'# -> unI64 66768+  '\x104f9'# -> unI64 66769+  '\x104fa'# -> unI64 66770+  '\x104fb'# -> unI64 66771+  '\x10597'# -> unI64 66928+  '\x10598'# -> unI64 66929+  '\x10599'# -> unI64 66930+  '\x1059a'# -> unI64 66931+  '\x1059b'# -> unI64 66932+  '\x1059c'# -> unI64 66933+  '\x1059d'# -> unI64 66934+  '\x1059e'# -> unI64 66935+  '\x1059f'# -> unI64 66936+  '\x105a0'# -> unI64 66937+  '\x105a1'# -> unI64 66938+  '\x105a3'# -> unI64 66940+  '\x105a4'# -> unI64 66941+  '\x105a5'# -> unI64 66942+  '\x105a6'# -> unI64 66943+  '\x105a7'# -> unI64 66944+  '\x105a8'# -> unI64 66945+  '\x105a9'# -> unI64 66946+  '\x105aa'# -> unI64 66947+  '\x105ab'# -> unI64 66948+  '\x105ac'# -> unI64 66949+  '\x105ad'# -> unI64 66950+  '\x105ae'# -> unI64 66951+  '\x105af'# -> unI64 66952+  '\x105b0'# -> unI64 66953+  '\x105b1'# -> unI64 66954+  '\x105b3'# -> unI64 66956+  '\x105b4'# -> unI64 66957+  '\x105b5'# -> unI64 66958+  '\x105b6'# -> unI64 66959+  '\x105b7'# -> unI64 66960+  '\x105b8'# -> unI64 66961+  '\x105b9'# -> unI64 66962+  '\x105bb'# -> unI64 66964+  '\x105bc'# -> unI64 66965+  '\x10cc0'# -> unI64 68736+  '\x10cc1'# -> unI64 68737+  '\x10cc2'# -> unI64 68738+  '\x10cc3'# -> unI64 68739+  '\x10cc4'# -> unI64 68740+  '\x10cc5'# -> unI64 68741+  '\x10cc6'# -> unI64 68742+  '\x10cc7'# -> unI64 68743+  '\x10cc8'# -> unI64 68744+  '\x10cc9'# -> unI64 68745+  '\x10cca'# -> unI64 68746+  '\x10ccb'# -> unI64 68747+  '\x10ccc'# -> unI64 68748+  '\x10ccd'# -> unI64 68749+  '\x10cce'# -> unI64 68750+  '\x10ccf'# -> unI64 68751+  '\x10cd0'# -> unI64 68752+  '\x10cd1'# -> unI64 68753+  '\x10cd2'# -> unI64 68754+  '\x10cd3'# -> unI64 68755+  '\x10cd4'# -> unI64 68756+  '\x10cd5'# -> unI64 68757+  '\x10cd6'# -> unI64 68758+  '\x10cd7'# -> unI64 68759+  '\x10cd8'# -> unI64 68760+  '\x10cd9'# -> unI64 68761+  '\x10cda'# -> unI64 68762+  '\x10cdb'# -> unI64 68763+  '\x10cdc'# -> unI64 68764+  '\x10cdd'# -> unI64 68765+  '\x10cde'# -> unI64 68766+  '\x10cdf'# -> unI64 68767+  '\x10ce0'# -> unI64 68768+  '\x10ce1'# -> unI64 68769+  '\x10ce2'# -> unI64 68770+  '\x10ce3'# -> unI64 68771+  '\x10ce4'# -> unI64 68772+  '\x10ce5'# -> unI64 68773+  '\x10ce6'# -> unI64 68774+  '\x10ce7'# -> unI64 68775+  '\x10ce8'# -> unI64 68776+  '\x10ce9'# -> unI64 68777+  '\x10cea'# -> unI64 68778+  '\x10ceb'# -> unI64 68779+  '\x10cec'# -> unI64 68780+  '\x10ced'# -> unI64 68781+  '\x10cee'# -> unI64 68782+  '\x10cef'# -> unI64 68783+  '\x10cf0'# -> unI64 68784+  '\x10cf1'# -> unI64 68785+  '\x10cf2'# -> unI64 68786+  '\x118c0'# -> unI64 71840+  '\x118c1'# -> unI64 71841+  '\x118c2'# -> unI64 71842+  '\x118c3'# -> unI64 71843+  '\x118c4'# -> unI64 71844+  '\x118c5'# -> unI64 71845+  '\x118c6'# -> unI64 71846+  '\x118c7'# -> unI64 71847+  '\x118c8'# -> unI64 71848+  '\x118c9'# -> unI64 71849+  '\x118ca'# -> unI64 71850+  '\x118cb'# -> unI64 71851+  '\x118cc'# -> unI64 71852+  '\x118cd'# -> unI64 71853+  '\x118ce'# -> unI64 71854+  '\x118cf'# -> unI64 71855+  '\x118d0'# -> unI64 71856+  '\x118d1'# -> unI64 71857+  '\x118d2'# -> unI64 71858+  '\x118d3'# -> unI64 71859+  '\x118d4'# -> unI64 71860+  '\x118d5'# -> unI64 71861+  '\x118d6'# -> unI64 71862+  '\x118d7'# -> unI64 71863+  '\x118d8'# -> unI64 71864+  '\x118d9'# -> unI64 71865+  '\x118da'# -> unI64 71866+  '\x118db'# -> unI64 71867+  '\x118dc'# -> unI64 71868+  '\x118dd'# -> unI64 71869+  '\x118de'# -> unI64 71870+  '\x118df'# -> unI64 71871+  '\x16e60'# -> unI64 93760+  '\x16e61'# -> unI64 93761+  '\x16e62'# -> unI64 93762+  '\x16e63'# -> unI64 93763+  '\x16e64'# -> unI64 93764+  '\x16e65'# -> unI64 93765+  '\x16e66'# -> unI64 93766+  '\x16e67'# -> unI64 93767+  '\x16e68'# -> unI64 93768+  '\x16e69'# -> unI64 93769+  '\x16e6a'# -> unI64 93770+  '\x16e6b'# -> unI64 93771+  '\x16e6c'# -> unI64 93772+  '\x16e6d'# -> unI64 93773+  '\x16e6e'# -> unI64 93774+  '\x16e6f'# -> unI64 93775+  '\x16e70'# -> unI64 93776+  '\x16e71'# -> unI64 93777+  '\x16e72'# -> unI64 93778+  '\x16e73'# -> unI64 93779+  '\x16e74'# -> unI64 93780+  '\x16e75'# -> unI64 93781+  '\x16e76'# -> unI64 93782+  '\x16e77'# -> unI64 93783+  '\x16e78'# -> unI64 93784+  '\x16e79'# -> unI64 93785+  '\x16e7a'# -> unI64 93786+  '\x16e7b'# -> unI64 93787+  '\x16e7c'# -> unI64 93788+  '\x16e7d'# -> unI64 93789+  '\x16e7e'# -> unI64 93790+  '\x16e7f'# -> unI64 93791+  '\x1e922'# -> unI64 125184+  '\x1e923'# -> unI64 125185+  '\x1e924'# -> unI64 125186+  '\x1e925'# -> unI64 125187+  '\x1e926'# -> unI64 125188+  '\x1e927'# -> unI64 125189+  '\x1e928'# -> unI64 125190+  '\x1e929'# -> unI64 125191+  '\x1e92a'# -> unI64 125192+  '\x1e92b'# -> unI64 125193+  '\x1e92c'# -> unI64 125194+  '\x1e92d'# -> unI64 125195+  '\x1e92e'# -> unI64 125196+  '\x1e92f'# -> unI64 125197+  '\x1e930'# -> unI64 125198+  '\x1e931'# -> unI64 125199+  '\x1e932'# -> unI64 125200+  '\x1e933'# -> unI64 125201+  '\x1e934'# -> unI64 125202+  '\x1e935'# -> unI64 125203+  '\x1e936'# -> unI64 125204+  '\x1e937'# -> unI64 125205+  '\x1e938'# -> unI64 125206+  '\x1e939'# -> unI64 125207+  '\x1e93a'# -> unI64 125208+  '\x1e93b'# -> unI64 125209+  '\x1e93c'# -> unI64 125210+  '\x1e93d'# -> unI64 125211+  '\x1e93e'# -> unI64 125212+  '\x1e93f'# -> unI64 125213+  '\x1e940'# -> unI64 125214+  '\x1e941'# -> unI64 125215+  '\x1e942'# -> unI64 125216+  '\x1e943'# -> unI64 125217+  _ -> unI64 0+lowerMapping :: Char# -> _ {- unboxed Int64 -}+{-# NOINLINE lowerMapping #-}+lowerMapping = \case+  -- LATIN CAPITAL LETTER I WITH DOT ABOVE+  '\x0130'# -> unI64 1625292905+  '\x0041'# -> unI64 97+  '\x0042'# -> unI64 98+  '\x0043'# -> unI64 99+  '\x0044'# -> unI64 100+  '\x0045'# -> unI64 101+  '\x0046'# -> unI64 102+  '\x0047'# -> unI64 103+  '\x0048'# -> unI64 104+  '\x0049'# -> unI64 105+  '\x004a'# -> unI64 106+  '\x004b'# -> unI64 107+  '\x004c'# -> unI64 108+  '\x004d'# -> unI64 109+  '\x004e'# -> unI64 110+  '\x004f'# -> unI64 111+  '\x0050'# -> unI64 112+  '\x0051'# -> unI64 113+  '\x0052'# -> unI64 114+  '\x0053'# -> unI64 115+  '\x0054'# -> unI64 116+  '\x0055'# -> unI64 117+  '\x0056'# -> unI64 118+  '\x0057'# -> unI64 119+  '\x0058'# -> unI64 120+  '\x0059'# -> unI64 121+  '\x005a'# -> unI64 122+  '\x00c0'# -> unI64 224+  '\x00c1'# -> unI64 225+  '\x00c2'# -> unI64 226+  '\x00c3'# -> unI64 227+  '\x00c4'# -> unI64 228+  '\x00c5'# -> unI64 229+  '\x00c6'# -> unI64 230+  '\x00c7'# -> unI64 231+  '\x00c8'# -> unI64 232+  '\x00c9'# -> unI64 233+  '\x00ca'# -> unI64 234+  '\x00cb'# -> unI64 235+  '\x00cc'# -> unI64 236+  '\x00cd'# -> unI64 237+  '\x00ce'# -> unI64 238+  '\x00cf'# -> unI64 239+  '\x00d0'# -> unI64 240+  '\x00d1'# -> unI64 241+  '\x00d2'# -> unI64 242+  '\x00d3'# -> unI64 243+  '\x00d4'# -> unI64 244+  '\x00d5'# -> unI64 245+  '\x00d6'# -> unI64 246+  '\x00d8'# -> unI64 248+  '\x00d9'# -> unI64 249+  '\x00da'# -> unI64 250+  '\x00db'# -> unI64 251+  '\x00dc'# -> unI64 252+  '\x00dd'# -> unI64 253+  '\x00de'# -> unI64 254+  '\x0100'# -> unI64 257+  '\x0102'# -> unI64 259+  '\x0104'# -> unI64 261+  '\x0106'# -> unI64 263+  '\x0108'# -> unI64 265+  '\x010a'# -> unI64 267+  '\x010c'# -> unI64 269+  '\x010e'# -> unI64 271+  '\x0110'# -> unI64 273+  '\x0112'# -> unI64 275+  '\x0114'# -> unI64 277+  '\x0116'# -> unI64 279+  '\x0118'# -> unI64 281+  '\x011a'# -> unI64 283+  '\x011c'# -> unI64 285+  '\x011e'# -> unI64 287+  '\x0120'# -> unI64 289+  '\x0122'# -> unI64 291+  '\x0124'# -> unI64 293+  '\x0126'# -> unI64 295+  '\x0128'# -> unI64 297+  '\x012a'# -> unI64 299+  '\x012c'# -> unI64 301+  '\x012e'# -> unI64 303+  '\x0132'# -> unI64 307+  '\x0134'# -> unI64 309+  '\x0136'# -> unI64 311+  '\x0139'# -> unI64 314+  '\x013b'# -> unI64 316+  '\x013d'# -> unI64 318+  '\x013f'# -> unI64 320+  '\x0141'# -> unI64 322+  '\x0143'# -> unI64 324+  '\x0145'# -> unI64 326+  '\x0147'# -> unI64 328+  '\x014a'# -> unI64 331+  '\x014c'# -> unI64 333+  '\x014e'# -> unI64 335+  '\x0150'# -> unI64 337+  '\x0152'# -> unI64 339+  '\x0154'# -> unI64 341+  '\x0156'# -> unI64 343+  '\x0158'# -> unI64 345+  '\x015a'# -> unI64 347+  '\x015c'# -> unI64 349+  '\x015e'# -> unI64 351+  '\x0160'# -> unI64 353+  '\x0162'# -> unI64 355+  '\x0164'# -> unI64 357+  '\x0166'# -> unI64 359+  '\x0168'# -> unI64 361+  '\x016a'# -> unI64 363+  '\x016c'# -> unI64 365+  '\x016e'# -> unI64 367+  '\x0170'# -> unI64 369+  '\x0172'# -> unI64 371+  '\x0174'# -> unI64 373+  '\x0176'# -> unI64 375+  '\x0178'# -> unI64 255+  '\x0179'# -> unI64 378+  '\x017b'# -> unI64 380+  '\x017d'# -> unI64 382+  '\x0181'# -> unI64 595+  '\x0182'# -> unI64 387+  '\x0184'# -> unI64 389+  '\x0186'# -> unI64 596+  '\x0187'# -> unI64 392+  '\x0189'# -> unI64 598+  '\x018a'# -> unI64 599+  '\x018b'# -> unI64 396+  '\x018e'# -> unI64 477+  '\x018f'# -> unI64 601+  '\x0190'# -> unI64 603+  '\x0191'# -> unI64 402+  '\x0193'# -> unI64 608+  '\x0194'# -> unI64 611+  '\x0196'# -> unI64 617+  '\x0197'# -> unI64 616+  '\x0198'# -> unI64 409+  '\x019c'# -> unI64 623+  '\x019d'# -> unI64 626+  '\x019f'# -> unI64 629+  '\x01a0'# -> unI64 417+  '\x01a2'# -> unI64 419+  '\x01a4'# -> unI64 421+  '\x01a6'# -> unI64 640+  '\x01a7'# -> unI64 424+  '\x01a9'# -> unI64 643+  '\x01ac'# -> unI64 429+  '\x01ae'# -> unI64 648+  '\x01af'# -> unI64 432+  '\x01b1'# -> unI64 650+  '\x01b2'# -> unI64 651+  '\x01b3'# -> unI64 436+  '\x01b5'# -> unI64 438+  '\x01b7'# -> unI64 658+  '\x01b8'# -> unI64 441+  '\x01bc'# -> unI64 445+  '\x01c4'# -> unI64 454+  '\x01c5'# -> unI64 454+  '\x01c7'# -> unI64 457+  '\x01c8'# -> unI64 457+  '\x01ca'# -> unI64 460+  '\x01cb'# -> unI64 460+  '\x01cd'# -> unI64 462+  '\x01cf'# -> unI64 464+  '\x01d1'# -> unI64 466+  '\x01d3'# -> unI64 468+  '\x01d5'# -> unI64 470+  '\x01d7'# -> unI64 472+  '\x01d9'# -> unI64 474+  '\x01db'# -> unI64 476+  '\x01de'# -> unI64 479+  '\x01e0'# -> unI64 481+  '\x01e2'# -> unI64 483+  '\x01e4'# -> unI64 485+  '\x01e6'# -> unI64 487+  '\x01e8'# -> unI64 489+  '\x01ea'# -> unI64 491+  '\x01ec'# -> unI64 493+  '\x01ee'# -> unI64 495+  '\x01f1'# -> unI64 499+  '\x01f2'# -> unI64 499+  '\x01f4'# -> unI64 501+  '\x01f6'# -> unI64 405+  '\x01f7'# -> unI64 447+  '\x01f8'# -> unI64 505+  '\x01fa'# -> unI64 507+  '\x01fc'# -> unI64 509+  '\x01fe'# -> unI64 511+  '\x0200'# -> unI64 513+  '\x0202'# -> unI64 515+  '\x0204'# -> unI64 517+  '\x0206'# -> unI64 519+  '\x0208'# -> unI64 521+  '\x020a'# -> unI64 523+  '\x020c'# -> unI64 525+  '\x020e'# -> unI64 527+  '\x0210'# -> unI64 529+  '\x0212'# -> unI64 531+  '\x0214'# -> unI64 533+  '\x0216'# -> unI64 535+  '\x0218'# -> unI64 537+  '\x021a'# -> unI64 539+  '\x021c'# -> unI64 541+  '\x021e'# -> unI64 543+  '\x0220'# -> unI64 414+  '\x0222'# -> unI64 547+  '\x0224'# -> unI64 549+  '\x0226'# -> unI64 551+  '\x0228'# -> unI64 553+  '\x022a'# -> unI64 555+  '\x022c'# -> unI64 557+  '\x022e'# -> unI64 559+  '\x0230'# -> unI64 561+  '\x0232'# -> unI64 563+  '\x023a'# -> unI64 11365+  '\x023b'# -> unI64 572+  '\x023d'# -> unI64 410+  '\x023e'# -> unI64 11366+  '\x0241'# -> unI64 578+  '\x0243'# -> unI64 384+  '\x0244'# -> unI64 649+  '\x0245'# -> unI64 652+  '\x0246'# -> unI64 583+  '\x0248'# -> unI64 585+  '\x024a'# -> unI64 587+  '\x024c'# -> unI64 589+  '\x024e'# -> unI64 591+  '\x0370'# -> unI64 881+  '\x0372'# -> unI64 883+  '\x0376'# -> unI64 887+  '\x037f'# -> unI64 1011+  '\x0386'# -> unI64 940+  '\x0388'# -> unI64 941+  '\x0389'# -> unI64 942+  '\x038a'# -> unI64 943+  '\x038c'# -> unI64 972+  '\x038e'# -> unI64 973+  '\x038f'# -> unI64 974+  '\x0391'# -> unI64 945+  '\x0392'# -> unI64 946+  '\x0393'# -> unI64 947+  '\x0394'# -> unI64 948+  '\x0395'# -> unI64 949+  '\x0396'# -> unI64 950+  '\x0397'# -> unI64 951+  '\x0398'# -> unI64 952+  '\x0399'# -> unI64 953+  '\x039a'# -> unI64 954+  '\x039b'# -> unI64 955+  '\x039c'# -> unI64 956+  '\x039d'# -> unI64 957+  '\x039e'# -> unI64 958+  '\x039f'# -> unI64 959+  '\x03a0'# -> unI64 960+  '\x03a1'# -> unI64 961+  '\x03a3'# -> unI64 963+  '\x03a4'# -> unI64 964+  '\x03a5'# -> unI64 965+  '\x03a6'# -> unI64 966+  '\x03a7'# -> unI64 967+  '\x03a8'# -> unI64 968+  '\x03a9'# -> unI64 969+  '\x03aa'# -> unI64 970+  '\x03ab'# -> unI64 971+  '\x03cf'# -> unI64 983+  '\x03d8'# -> unI64 985+  '\x03da'# -> unI64 987+  '\x03dc'# -> unI64 989+  '\x03de'# -> unI64 991+  '\x03e0'# -> unI64 993+  '\x03e2'# -> unI64 995+  '\x03e4'# -> unI64 997+  '\x03e6'# -> unI64 999+  '\x03e8'# -> unI64 1001+  '\x03ea'# -> unI64 1003+  '\x03ec'# -> unI64 1005+  '\x03ee'# -> unI64 1007+  '\x03f4'# -> unI64 952+  '\x03f7'# -> unI64 1016+  '\x03f9'# -> unI64 1010+  '\x03fa'# -> unI64 1019+  '\x03fd'# -> unI64 891+  '\x03fe'# -> unI64 892+  '\x03ff'# -> unI64 893+  '\x0400'# -> unI64 1104+  '\x0401'# -> unI64 1105+  '\x0402'# -> unI64 1106+  '\x0403'# -> unI64 1107+  '\x0404'# -> unI64 1108+  '\x0405'# -> unI64 1109+  '\x0406'# -> unI64 1110+  '\x0407'# -> unI64 1111+  '\x0408'# -> unI64 1112+  '\x0409'# -> unI64 1113+  '\x040a'# -> unI64 1114+  '\x040b'# -> unI64 1115+  '\x040c'# -> unI64 1116+  '\x040d'# -> unI64 1117+  '\x040e'# -> unI64 1118+  '\x040f'# -> unI64 1119+  '\x0410'# -> unI64 1072+  '\x0411'# -> unI64 1073+  '\x0412'# -> unI64 1074+  '\x0413'# -> unI64 1075+  '\x0414'# -> unI64 1076+  '\x0415'# -> unI64 1077+  '\x0416'# -> unI64 1078+  '\x0417'# -> unI64 1079+  '\x0418'# -> unI64 1080+  '\x0419'# -> unI64 1081+  '\x041a'# -> unI64 1082+  '\x041b'# -> unI64 1083+  '\x041c'# -> unI64 1084+  '\x041d'# -> unI64 1085+  '\x041e'# -> unI64 1086+  '\x041f'# -> unI64 1087+  '\x0420'# -> unI64 1088+  '\x0421'# -> unI64 1089+  '\x0422'# -> unI64 1090+  '\x0423'# -> unI64 1091+  '\x0424'# -> unI64 1092+  '\x0425'# -> unI64 1093+  '\x0426'# -> unI64 1094+  '\x0427'# -> unI64 1095+  '\x0428'# -> unI64 1096+  '\x0429'# -> unI64 1097+  '\x042a'# -> unI64 1098+  '\x042b'# -> unI64 1099+  '\x042c'# -> unI64 1100+  '\x042d'# -> unI64 1101+  '\x042e'# -> unI64 1102+  '\x042f'# -> unI64 1103+  '\x0460'# -> unI64 1121+  '\x0462'# -> unI64 1123+  '\x0464'# -> unI64 1125+  '\x0466'# -> unI64 1127+  '\x0468'# -> unI64 1129+  '\x046a'# -> unI64 1131+  '\x046c'# -> unI64 1133+  '\x046e'# -> unI64 1135+  '\x0470'# -> unI64 1137+  '\x0472'# -> unI64 1139+  '\x0474'# -> unI64 1141+  '\x0476'# -> unI64 1143+  '\x0478'# -> unI64 1145+  '\x047a'# -> unI64 1147+  '\x047c'# -> unI64 1149+  '\x047e'# -> unI64 1151+  '\x0480'# -> unI64 1153+  '\x048a'# -> unI64 1163+  '\x048c'# -> unI64 1165+  '\x048e'# -> unI64 1167+  '\x0490'# -> unI64 1169+  '\x0492'# -> unI64 1171+  '\x0494'# -> unI64 1173+  '\x0496'# -> unI64 1175+  '\x0498'# -> unI64 1177+  '\x049a'# -> unI64 1179+  '\x049c'# -> unI64 1181+  '\x049e'# -> unI64 1183+  '\x04a0'# -> unI64 1185+  '\x04a2'# -> unI64 1187+  '\x04a4'# -> unI64 1189+  '\x04a6'# -> unI64 1191+  '\x04a8'# -> unI64 1193+  '\x04aa'# -> unI64 1195+  '\x04ac'# -> unI64 1197+  '\x04ae'# -> unI64 1199+  '\x04b0'# -> unI64 1201+  '\x04b2'# -> unI64 1203+  '\x04b4'# -> unI64 1205+  '\x04b6'# -> unI64 1207+  '\x04b8'# -> unI64 1209+  '\x04ba'# -> unI64 1211+  '\x04bc'# -> unI64 1213+  '\x04be'# -> unI64 1215+  '\x04c0'# -> unI64 1231+  '\x04c1'# -> unI64 1218+  '\x04c3'# -> unI64 1220+  '\x04c5'# -> unI64 1222+  '\x04c7'# -> unI64 1224+  '\x04c9'# -> unI64 1226+  '\x04cb'# -> unI64 1228+  '\x04cd'# -> unI64 1230+  '\x04d0'# -> unI64 1233+  '\x04d2'# -> unI64 1235+  '\x04d4'# -> unI64 1237+  '\x04d6'# -> unI64 1239+  '\x04d8'# -> unI64 1241+  '\x04da'# -> unI64 1243+  '\x04dc'# -> unI64 1245+  '\x04de'# -> unI64 1247+  '\x04e0'# -> unI64 1249+  '\x04e2'# -> unI64 1251+  '\x04e4'# -> unI64 1253+  '\x04e6'# -> unI64 1255+  '\x04e8'# -> unI64 1257+  '\x04ea'# -> unI64 1259+  '\x04ec'# -> unI64 1261+  '\x04ee'# -> unI64 1263+  '\x04f0'# -> unI64 1265+  '\x04f2'# -> unI64 1267+  '\x04f4'# -> unI64 1269+  '\x04f6'# -> unI64 1271+  '\x04f8'# -> unI64 1273+  '\x04fa'# -> unI64 1275+  '\x04fc'# -> unI64 1277+  '\x04fe'# -> unI64 1279+  '\x0500'# -> unI64 1281+  '\x0502'# -> unI64 1283+  '\x0504'# -> unI64 1285+  '\x0506'# -> unI64 1287+  '\x0508'# -> unI64 1289+  '\x050a'# -> unI64 1291+  '\x050c'# -> unI64 1293+  '\x050e'# -> unI64 1295+  '\x0510'# -> unI64 1297+  '\x0512'# -> unI64 1299+  '\x0514'# -> unI64 1301+  '\x0516'# -> unI64 1303+  '\x0518'# -> unI64 1305+  '\x051a'# -> unI64 1307+  '\x051c'# -> unI64 1309+  '\x051e'# -> unI64 1311+  '\x0520'# -> unI64 1313+  '\x0522'# -> unI64 1315+  '\x0524'# -> unI64 1317+  '\x0526'# -> unI64 1319+  '\x0528'# -> unI64 1321+  '\x052a'# -> unI64 1323+  '\x052c'# -> unI64 1325+  '\x052e'# -> unI64 1327+  '\x0531'# -> unI64 1377+  '\x0532'# -> unI64 1378+  '\x0533'# -> unI64 1379+  '\x0534'# -> unI64 1380+  '\x0535'# -> unI64 1381+  '\x0536'# -> unI64 1382+  '\x0537'# -> unI64 1383+  '\x0538'# -> unI64 1384+  '\x0539'# -> unI64 1385+  '\x053a'# -> unI64 1386+  '\x053b'# -> unI64 1387+  '\x053c'# -> unI64 1388+  '\x053d'# -> unI64 1389+  '\x053e'# -> unI64 1390+  '\x053f'# -> unI64 1391+  '\x0540'# -> unI64 1392+  '\x0541'# -> unI64 1393+  '\x0542'# -> unI64 1394+  '\x0543'# -> unI64 1395+  '\x0544'# -> unI64 1396+  '\x0545'# -> unI64 1397+  '\x0546'# -> unI64 1398+  '\x0547'# -> unI64 1399+  '\x0548'# -> unI64 1400+  '\x0549'# -> unI64 1401+  '\x054a'# -> unI64 1402+  '\x054b'# -> unI64 1403+  '\x054c'# -> unI64 1404+  '\x054d'# -> unI64 1405+  '\x054e'# -> unI64 1406+  '\x054f'# -> unI64 1407+  '\x0550'# -> unI64 1408+  '\x0551'# -> unI64 1409+  '\x0552'# -> unI64 1410+  '\x0553'# -> unI64 1411+  '\x0554'# -> unI64 1412+  '\x0555'# -> unI64 1413+  '\x0556'# -> unI64 1414+  '\x10a0'# -> unI64 11520+  '\x10a1'# -> unI64 11521+  '\x10a2'# -> unI64 11522+  '\x10a3'# -> unI64 11523+  '\x10a4'# -> unI64 11524+  '\x10a5'# -> unI64 11525+  '\x10a6'# -> unI64 11526+  '\x10a7'# -> unI64 11527+  '\x10a8'# -> unI64 11528+  '\x10a9'# -> unI64 11529+  '\x10aa'# -> unI64 11530+  '\x10ab'# -> unI64 11531+  '\x10ac'# -> unI64 11532+  '\x10ad'# -> unI64 11533+  '\x10ae'# -> unI64 11534+  '\x10af'# -> unI64 11535+  '\x10b0'# -> unI64 11536+  '\x10b1'# -> unI64 11537+  '\x10b2'# -> unI64 11538+  '\x10b3'# -> unI64 11539+  '\x10b4'# -> unI64 11540+  '\x10b5'# -> unI64 11541+  '\x10b6'# -> unI64 11542+  '\x10b7'# -> unI64 11543+  '\x10b8'# -> unI64 11544+  '\x10b9'# -> unI64 11545+  '\x10ba'# -> unI64 11546+  '\x10bb'# -> unI64 11547+  '\x10bc'# -> unI64 11548+  '\x10bd'# -> unI64 11549+  '\x10be'# -> unI64 11550+  '\x10bf'# -> unI64 11551+  '\x10c0'# -> unI64 11552+  '\x10c1'# -> unI64 11553+  '\x10c2'# -> unI64 11554+  '\x10c3'# -> unI64 11555+  '\x10c4'# -> unI64 11556+  '\x10c5'# -> unI64 11557+  '\x10c7'# -> unI64 11559+  '\x10cd'# -> unI64 11565+  '\x13a0'# -> unI64 43888+  '\x13a1'# -> unI64 43889+  '\x13a2'# -> unI64 43890+  '\x13a3'# -> unI64 43891+  '\x13a4'# -> unI64 43892+  '\x13a5'# -> unI64 43893+  '\x13a6'# -> unI64 43894+  '\x13a7'# -> unI64 43895+  '\x13a8'# -> unI64 43896+  '\x13a9'# -> unI64 43897+  '\x13aa'# -> unI64 43898+  '\x13ab'# -> unI64 43899+  '\x13ac'# -> unI64 43900+  '\x13ad'# -> unI64 43901+  '\x13ae'# -> unI64 43902+  '\x13af'# -> unI64 43903+  '\x13b0'# -> unI64 43904+  '\x13b1'# -> unI64 43905+  '\x13b2'# -> unI64 43906+  '\x13b3'# -> unI64 43907+  '\x13b4'# -> unI64 43908+  '\x13b5'# -> unI64 43909+  '\x13b6'# -> unI64 43910+  '\x13b7'# -> unI64 43911+  '\x13b8'# -> unI64 43912+  '\x13b9'# -> unI64 43913+  '\x13ba'# -> unI64 43914+  '\x13bb'# -> unI64 43915+  '\x13bc'# -> unI64 43916+  '\x13bd'# -> unI64 43917+  '\x13be'# -> unI64 43918+  '\x13bf'# -> unI64 43919+  '\x13c0'# -> unI64 43920+  '\x13c1'# -> unI64 43921+  '\x13c2'# -> unI64 43922+  '\x13c3'# -> unI64 43923+  '\x13c4'# -> unI64 43924+  '\x13c5'# -> unI64 43925+  '\x13c6'# -> unI64 43926+  '\x13c7'# -> unI64 43927+  '\x13c8'# -> unI64 43928+  '\x13c9'# -> unI64 43929+  '\x13ca'# -> unI64 43930+  '\x13cb'# -> unI64 43931+  '\x13cc'# -> unI64 43932+  '\x13cd'# -> unI64 43933+  '\x13ce'# -> unI64 43934+  '\x13cf'# -> unI64 43935+  '\x13d0'# -> unI64 43936+  '\x13d1'# -> unI64 43937+  '\x13d2'# -> unI64 43938+  '\x13d3'# -> unI64 43939+  '\x13d4'# -> unI64 43940+  '\x13d5'# -> unI64 43941+  '\x13d6'# -> unI64 43942+  '\x13d7'# -> unI64 43943+  '\x13d8'# -> unI64 43944+  '\x13d9'# -> unI64 43945+  '\x13da'# -> unI64 43946+  '\x13db'# -> unI64 43947+  '\x13dc'# -> unI64 43948+  '\x13dd'# -> unI64 43949+  '\x13de'# -> unI64 43950+  '\x13df'# -> unI64 43951+  '\x13e0'# -> unI64 43952+  '\x13e1'# -> unI64 43953+  '\x13e2'# -> unI64 43954+  '\x13e3'# -> unI64 43955+  '\x13e4'# -> unI64 43956+  '\x13e5'# -> unI64 43957+  '\x13e6'# -> unI64 43958+  '\x13e7'# -> unI64 43959+  '\x13e8'# -> unI64 43960+  '\x13e9'# -> unI64 43961+  '\x13ea'# -> unI64 43962+  '\x13eb'# -> unI64 43963+  '\x13ec'# -> unI64 43964+  '\x13ed'# -> unI64 43965+  '\x13ee'# -> unI64 43966+  '\x13ef'# -> unI64 43967+  '\x13f0'# -> unI64 5112+  '\x13f1'# -> unI64 5113+  '\x13f2'# -> unI64 5114+  '\x13f3'# -> unI64 5115+  '\x13f4'# -> unI64 5116+  '\x13f5'# -> unI64 5117+  '\x1c90'# -> unI64 4304+  '\x1c91'# -> unI64 4305+  '\x1c92'# -> unI64 4306+  '\x1c93'# -> unI64 4307+  '\x1c94'# -> unI64 4308+  '\x1c95'# -> unI64 4309+  '\x1c96'# -> unI64 4310+  '\x1c97'# -> unI64 4311+  '\x1c98'# -> unI64 4312+  '\x1c99'# -> unI64 4313+  '\x1c9a'# -> unI64 4314+  '\x1c9b'# -> unI64 4315+  '\x1c9c'# -> unI64 4316+  '\x1c9d'# -> unI64 4317+  '\x1c9e'# -> unI64 4318+  '\x1c9f'# -> unI64 4319+  '\x1ca0'# -> unI64 4320+  '\x1ca1'# -> unI64 4321+  '\x1ca2'# -> unI64 4322+  '\x1ca3'# -> unI64 4323+  '\x1ca4'# -> unI64 4324+  '\x1ca5'# -> unI64 4325+  '\x1ca6'# -> unI64 4326+  '\x1ca7'# -> unI64 4327+  '\x1ca8'# -> unI64 4328+  '\x1ca9'# -> unI64 4329+  '\x1caa'# -> unI64 4330+  '\x1cab'# -> unI64 4331+  '\x1cac'# -> unI64 4332+  '\x1cad'# -> unI64 4333+  '\x1cae'# -> unI64 4334+  '\x1caf'# -> unI64 4335+  '\x1cb0'# -> unI64 4336+  '\x1cb1'# -> unI64 4337+  '\x1cb2'# -> unI64 4338+  '\x1cb3'# -> unI64 4339+  '\x1cb4'# -> unI64 4340+  '\x1cb5'# -> unI64 4341+  '\x1cb6'# -> unI64 4342+  '\x1cb7'# -> unI64 4343+  '\x1cb8'# -> unI64 4344+  '\x1cb9'# -> unI64 4345+  '\x1cba'# -> unI64 4346+  '\x1cbd'# -> unI64 4349+  '\x1cbe'# -> unI64 4350+  '\x1cbf'# -> unI64 4351+  '\x1e00'# -> unI64 7681+  '\x1e02'# -> unI64 7683+  '\x1e04'# -> unI64 7685+  '\x1e06'# -> unI64 7687+  '\x1e08'# -> unI64 7689+  '\x1e0a'# -> unI64 7691+  '\x1e0c'# -> unI64 7693+  '\x1e0e'# -> unI64 7695+  '\x1e10'# -> unI64 7697+  '\x1e12'# -> unI64 7699+  '\x1e14'# -> unI64 7701+  '\x1e16'# -> unI64 7703+  '\x1e18'# -> unI64 7705+  '\x1e1a'# -> unI64 7707+  '\x1e1c'# -> unI64 7709+  '\x1e1e'# -> unI64 7711+  '\x1e20'# -> unI64 7713+  '\x1e22'# -> unI64 7715+  '\x1e24'# -> unI64 7717+  '\x1e26'# -> unI64 7719+  '\x1e28'# -> unI64 7721+  '\x1e2a'# -> unI64 7723+  '\x1e2c'# -> unI64 7725+  '\x1e2e'# -> unI64 7727+  '\x1e30'# -> unI64 7729+  '\x1e32'# -> unI64 7731+  '\x1e34'# -> unI64 7733+  '\x1e36'# -> unI64 7735+  '\x1e38'# -> unI64 7737+  '\x1e3a'# -> unI64 7739+  '\x1e3c'# -> unI64 7741+  '\x1e3e'# -> unI64 7743+  '\x1e40'# -> unI64 7745+  '\x1e42'# -> unI64 7747+  '\x1e44'# -> unI64 7749+  '\x1e46'# -> unI64 7751+  '\x1e48'# -> unI64 7753+  '\x1e4a'# -> unI64 7755+  '\x1e4c'# -> unI64 7757+  '\x1e4e'# -> unI64 7759+  '\x1e50'# -> unI64 7761+  '\x1e52'# -> unI64 7763+  '\x1e54'# -> unI64 7765+  '\x1e56'# -> unI64 7767+  '\x1e58'# -> unI64 7769+  '\x1e5a'# -> unI64 7771+  '\x1e5c'# -> unI64 7773+  '\x1e5e'# -> unI64 7775+  '\x1e60'# -> unI64 7777+  '\x1e62'# -> unI64 7779+  '\x1e64'# -> unI64 7781+  '\x1e66'# -> unI64 7783+  '\x1e68'# -> unI64 7785+  '\x1e6a'# -> unI64 7787+  '\x1e6c'# -> unI64 7789+  '\x1e6e'# -> unI64 7791+  '\x1e70'# -> unI64 7793+  '\x1e72'# -> unI64 7795+  '\x1e74'# -> unI64 7797+  '\x1e76'# -> unI64 7799+  '\x1e78'# -> unI64 7801+  '\x1e7a'# -> unI64 7803+  '\x1e7c'# -> unI64 7805+  '\x1e7e'# -> unI64 7807+  '\x1e80'# -> unI64 7809+  '\x1e82'# -> unI64 7811+  '\x1e84'# -> unI64 7813+  '\x1e86'# -> unI64 7815+  '\x1e88'# -> unI64 7817+  '\x1e8a'# -> unI64 7819+  '\x1e8c'# -> unI64 7821+  '\x1e8e'# -> unI64 7823+  '\x1e90'# -> unI64 7825+  '\x1e92'# -> unI64 7827+  '\x1e94'# -> unI64 7829+  '\x1e9e'# -> unI64 223+  '\x1ea0'# -> unI64 7841+  '\x1ea2'# -> unI64 7843+  '\x1ea4'# -> unI64 7845+  '\x1ea6'# -> unI64 7847+  '\x1ea8'# -> unI64 7849+  '\x1eaa'# -> unI64 7851+  '\x1eac'# -> unI64 7853+  '\x1eae'# -> unI64 7855+  '\x1eb0'# -> unI64 7857+  '\x1eb2'# -> unI64 7859+  '\x1eb4'# -> unI64 7861+  '\x1eb6'# -> unI64 7863+  '\x1eb8'# -> unI64 7865+  '\x1eba'# -> unI64 7867+  '\x1ebc'# -> unI64 7869+  '\x1ebe'# -> unI64 7871+  '\x1ec0'# -> unI64 7873+  '\x1ec2'# -> unI64 7875+  '\x1ec4'# -> unI64 7877+  '\x1ec6'# -> unI64 7879+  '\x1ec8'# -> unI64 7881+  '\x1eca'# -> unI64 7883+  '\x1ecc'# -> unI64 7885+  '\x1ece'# -> unI64 7887+  '\x1ed0'# -> unI64 7889+  '\x1ed2'# -> unI64 7891+  '\x1ed4'# -> unI64 7893+  '\x1ed6'# -> unI64 7895+  '\x1ed8'# -> unI64 7897+  '\x1eda'# -> unI64 7899+  '\x1edc'# -> unI64 7901+  '\x1ede'# -> unI64 7903+  '\x1ee0'# -> unI64 7905+  '\x1ee2'# -> unI64 7907+  '\x1ee4'# -> unI64 7909+  '\x1ee6'# -> unI64 7911+  '\x1ee8'# -> unI64 7913+  '\x1eea'# -> unI64 7915+  '\x1eec'# -> unI64 7917+  '\x1eee'# -> unI64 7919+  '\x1ef0'# -> unI64 7921+  '\x1ef2'# -> unI64 7923+  '\x1ef4'# -> unI64 7925+  '\x1ef6'# -> unI64 7927+  '\x1ef8'# -> unI64 7929+  '\x1efa'# -> unI64 7931+  '\x1efc'# -> unI64 7933+  '\x1efe'# -> unI64 7935+  '\x1f08'# -> unI64 7936+  '\x1f09'# -> unI64 7937+  '\x1f0a'# -> unI64 7938+  '\x1f0b'# -> unI64 7939+  '\x1f0c'# -> unI64 7940+  '\x1f0d'# -> unI64 7941+  '\x1f0e'# -> unI64 7942+  '\x1f0f'# -> unI64 7943+  '\x1f18'# -> unI64 7952+  '\x1f19'# -> unI64 7953+  '\x1f1a'# -> unI64 7954+  '\x1f1b'# -> unI64 7955+  '\x1f1c'# -> unI64 7956+  '\x1f1d'# -> unI64 7957+  '\x1f28'# -> unI64 7968+  '\x1f29'# -> unI64 7969+  '\x1f2a'# -> unI64 7970+  '\x1f2b'# -> unI64 7971+  '\x1f2c'# -> unI64 7972+  '\x1f2d'# -> unI64 7973+  '\x1f2e'# -> unI64 7974+  '\x1f2f'# -> unI64 7975+  '\x1f38'# -> unI64 7984+  '\x1f39'# -> unI64 7985+  '\x1f3a'# -> unI64 7986+  '\x1f3b'# -> unI64 7987+  '\x1f3c'# -> unI64 7988+  '\x1f3d'# -> unI64 7989+  '\x1f3e'# -> unI64 7990+  '\x1f3f'# -> unI64 7991+  '\x1f48'# -> unI64 8000+  '\x1f49'# -> unI64 8001+  '\x1f4a'# -> unI64 8002+  '\x1f4b'# -> unI64 8003+  '\x1f4c'# -> unI64 8004+  '\x1f4d'# -> unI64 8005+  '\x1f59'# -> unI64 8017+  '\x1f5b'# -> unI64 8019+  '\x1f5d'# -> unI64 8021+  '\x1f5f'# -> unI64 8023+  '\x1f68'# -> unI64 8032+  '\x1f69'# -> unI64 8033+  '\x1f6a'# -> unI64 8034+  '\x1f6b'# -> unI64 8035+  '\x1f6c'# -> unI64 8036+  '\x1f6d'# -> unI64 8037+  '\x1f6e'# -> unI64 8038+  '\x1f6f'# -> unI64 8039+  '\x1f88'# -> unI64 8064+  '\x1f89'# -> unI64 8065+  '\x1f8a'# -> unI64 8066+  '\x1f8b'# -> unI64 8067+  '\x1f8c'# -> unI64 8068+  '\x1f8d'# -> unI64 8069+  '\x1f8e'# -> unI64 8070+  '\x1f8f'# -> unI64 8071+  '\x1f98'# -> unI64 8080+  '\x1f99'# -> unI64 8081+  '\x1f9a'# -> unI64 8082+  '\x1f9b'# -> unI64 8083+  '\x1f9c'# -> unI64 8084+  '\x1f9d'# -> unI64 8085+  '\x1f9e'# -> unI64 8086+  '\x1f9f'# -> unI64 8087+  '\x1fa8'# -> unI64 8096+  '\x1fa9'# -> unI64 8097+  '\x1faa'# -> unI64 8098+  '\x1fab'# -> unI64 8099+  '\x1fac'# -> unI64 8100+  '\x1fad'# -> unI64 8101+  '\x1fae'# -> unI64 8102+  '\x1faf'# -> unI64 8103+  '\x1fb8'# -> unI64 8112+  '\x1fb9'# -> unI64 8113+  '\x1fba'# -> unI64 8048+  '\x1fbb'# -> unI64 8049+  '\x1fbc'# -> unI64 8115+  '\x1fc8'# -> unI64 8050+  '\x1fc9'# -> unI64 8051+  '\x1fca'# -> unI64 8052+  '\x1fcb'# -> unI64 8053+  '\x1fcc'# -> unI64 8131+  '\x1fd8'# -> unI64 8144+  '\x1fd9'# -> unI64 8145+  '\x1fda'# -> unI64 8054+  '\x1fdb'# -> unI64 8055+  '\x1fe8'# -> unI64 8160+  '\x1fe9'# -> unI64 8161+  '\x1fea'# -> unI64 8058+  '\x1feb'# -> unI64 8059+  '\x1fec'# -> unI64 8165+  '\x1ff8'# -> unI64 8056+  '\x1ff9'# -> unI64 8057+  '\x1ffa'# -> unI64 8060+  '\x1ffb'# -> unI64 8061+  '\x1ffc'# -> unI64 8179+  '\x2126'# -> unI64 969+  '\x212a'# -> unI64 107+  '\x212b'# -> unI64 229+  '\x2132'# -> unI64 8526+  '\x2160'# -> unI64 8560+  '\x2161'# -> unI64 8561+  '\x2162'# -> unI64 8562+  '\x2163'# -> unI64 8563+  '\x2164'# -> unI64 8564+  '\x2165'# -> unI64 8565+  '\x2166'# -> unI64 8566+  '\x2167'# -> unI64 8567+  '\x2168'# -> unI64 8568+  '\x2169'# -> unI64 8569+  '\x216a'# -> unI64 8570+  '\x216b'# -> unI64 8571+  '\x216c'# -> unI64 8572+  '\x216d'# -> unI64 8573+  '\x216e'# -> unI64 8574+  '\x216f'# -> unI64 8575+  '\x2183'# -> unI64 8580+  '\x24b6'# -> unI64 9424+  '\x24b7'# -> unI64 9425+  '\x24b8'# -> unI64 9426+  '\x24b9'# -> unI64 9427+  '\x24ba'# -> unI64 9428+  '\x24bb'# -> unI64 9429+  '\x24bc'# -> unI64 9430+  '\x24bd'# -> unI64 9431+  '\x24be'# -> unI64 9432+  '\x24bf'# -> unI64 9433+  '\x24c0'# -> unI64 9434+  '\x24c1'# -> unI64 9435+  '\x24c2'# -> unI64 9436+  '\x24c3'# -> unI64 9437+  '\x24c4'# -> unI64 9438+  '\x24c5'# -> unI64 9439+  '\x24c6'# -> unI64 9440+  '\x24c7'# -> unI64 9441+  '\x24c8'# -> unI64 9442+  '\x24c9'# -> unI64 9443+  '\x24ca'# -> unI64 9444+  '\x24cb'# -> unI64 9445+  '\x24cc'# -> unI64 9446+  '\x24cd'# -> unI64 9447+  '\x24ce'# -> unI64 9448+  '\x24cf'# -> unI64 9449+  '\x2c00'# -> unI64 11312+  '\x2c01'# -> unI64 11313+  '\x2c02'# -> unI64 11314+  '\x2c03'# -> unI64 11315+  '\x2c04'# -> unI64 11316+  '\x2c05'# -> unI64 11317+  '\x2c06'# -> unI64 11318+  '\x2c07'# -> unI64 11319+  '\x2c08'# -> unI64 11320+  '\x2c09'# -> unI64 11321+  '\x2c0a'# -> unI64 11322+  '\x2c0b'# -> unI64 11323+  '\x2c0c'# -> unI64 11324+  '\x2c0d'# -> unI64 11325+  '\x2c0e'# -> unI64 11326+  '\x2c0f'# -> unI64 11327+  '\x2c10'# -> unI64 11328+  '\x2c11'# -> unI64 11329+  '\x2c12'# -> unI64 11330+  '\x2c13'# -> unI64 11331+  '\x2c14'# -> unI64 11332+  '\x2c15'# -> unI64 11333+  '\x2c16'# -> unI64 11334+  '\x2c17'# -> unI64 11335+  '\x2c18'# -> unI64 11336+  '\x2c19'# -> unI64 11337+  '\x2c1a'# -> unI64 11338+  '\x2c1b'# -> unI64 11339+  '\x2c1c'# -> unI64 11340+  '\x2c1d'# -> unI64 11341+  '\x2c1e'# -> unI64 11342+  '\x2c1f'# -> unI64 11343+  '\x2c20'# -> unI64 11344+  '\x2c21'# -> unI64 11345+  '\x2c22'# -> unI64 11346+  '\x2c23'# -> unI64 11347+  '\x2c24'# -> unI64 11348+  '\x2c25'# -> unI64 11349+  '\x2c26'# -> unI64 11350+  '\x2c27'# -> unI64 11351+  '\x2c28'# -> unI64 11352+  '\x2c29'# -> unI64 11353+  '\x2c2a'# -> unI64 11354+  '\x2c2b'# -> unI64 11355+  '\x2c2c'# -> unI64 11356+  '\x2c2d'# -> unI64 11357+  '\x2c2e'# -> unI64 11358+  '\x2c2f'# -> unI64 11359+  '\x2c60'# -> unI64 11361+  '\x2c62'# -> unI64 619+  '\x2c63'# -> unI64 7549+  '\x2c64'# -> unI64 637+  '\x2c67'# -> unI64 11368+  '\x2c69'# -> unI64 11370+  '\x2c6b'# -> unI64 11372+  '\x2c6d'# -> unI64 593+  '\x2c6e'# -> unI64 625+  '\x2c6f'# -> unI64 592+  '\x2c70'# -> unI64 594+  '\x2c72'# -> unI64 11379+  '\x2c75'# -> unI64 11382+  '\x2c7e'# -> unI64 575+  '\x2c7f'# -> unI64 576+  '\x2c80'# -> unI64 11393+  '\x2c82'# -> unI64 11395+  '\x2c84'# -> unI64 11397+  '\x2c86'# -> unI64 11399+  '\x2c88'# -> unI64 11401+  '\x2c8a'# -> unI64 11403+  '\x2c8c'# -> unI64 11405+  '\x2c8e'# -> unI64 11407+  '\x2c90'# -> unI64 11409+  '\x2c92'# -> unI64 11411+  '\x2c94'# -> unI64 11413+  '\x2c96'# -> unI64 11415+  '\x2c98'# -> unI64 11417+  '\x2c9a'# -> unI64 11419+  '\x2c9c'# -> unI64 11421+  '\x2c9e'# -> unI64 11423+  '\x2ca0'# -> unI64 11425+  '\x2ca2'# -> unI64 11427+  '\x2ca4'# -> unI64 11429+  '\x2ca6'# -> unI64 11431+  '\x2ca8'# -> unI64 11433+  '\x2caa'# -> unI64 11435+  '\x2cac'# -> unI64 11437+  '\x2cae'# -> unI64 11439+  '\x2cb0'# -> unI64 11441+  '\x2cb2'# -> unI64 11443+  '\x2cb4'# -> unI64 11445+  '\x2cb6'# -> unI64 11447+  '\x2cb8'# -> unI64 11449+  '\x2cba'# -> unI64 11451+  '\x2cbc'# -> unI64 11453+  '\x2cbe'# -> unI64 11455+  '\x2cc0'# -> unI64 11457+  '\x2cc2'# -> unI64 11459+  '\x2cc4'# -> unI64 11461+  '\x2cc6'# -> unI64 11463+  '\x2cc8'# -> unI64 11465+  '\x2cca'# -> unI64 11467+  '\x2ccc'# -> unI64 11469+  '\x2cce'# -> unI64 11471+  '\x2cd0'# -> unI64 11473+  '\x2cd2'# -> unI64 11475+  '\x2cd4'# -> unI64 11477+  '\x2cd6'# -> unI64 11479+  '\x2cd8'# -> unI64 11481+  '\x2cda'# -> unI64 11483+  '\x2cdc'# -> unI64 11485+  '\x2cde'# -> unI64 11487+  '\x2ce0'# -> unI64 11489+  '\x2ce2'# -> unI64 11491+  '\x2ceb'# -> unI64 11500+  '\x2ced'# -> unI64 11502+  '\x2cf2'# -> unI64 11507+  '\xa640'# -> unI64 42561+  '\xa642'# -> unI64 42563+  '\xa644'# -> unI64 42565+  '\xa646'# -> unI64 42567+  '\xa648'# -> unI64 42569+  '\xa64a'# -> unI64 42571+  '\xa64c'# -> unI64 42573+  '\xa64e'# -> unI64 42575+  '\xa650'# -> unI64 42577+  '\xa652'# -> unI64 42579+  '\xa654'# -> unI64 42581+  '\xa656'# -> unI64 42583+  '\xa658'# -> unI64 42585+  '\xa65a'# -> unI64 42587+  '\xa65c'# -> unI64 42589+  '\xa65e'# -> unI64 42591+  '\xa660'# -> unI64 42593+  '\xa662'# -> unI64 42595+  '\xa664'# -> unI64 42597+  '\xa666'# -> unI64 42599+  '\xa668'# -> unI64 42601+  '\xa66a'# -> unI64 42603+  '\xa66c'# -> unI64 42605+  '\xa680'# -> unI64 42625+  '\xa682'# -> unI64 42627+  '\xa684'# -> unI64 42629+  '\xa686'# -> unI64 42631+  '\xa688'# -> unI64 42633+  '\xa68a'# -> unI64 42635+  '\xa68c'# -> unI64 42637+  '\xa68e'# -> unI64 42639+  '\xa690'# -> unI64 42641+  '\xa692'# -> unI64 42643+  '\xa694'# -> unI64 42645+  '\xa696'# -> unI64 42647+  '\xa698'# -> unI64 42649+  '\xa69a'# -> unI64 42651+  '\xa722'# -> unI64 42787+  '\xa724'# -> unI64 42789+  '\xa726'# -> unI64 42791+  '\xa728'# -> unI64 42793+  '\xa72a'# -> unI64 42795+  '\xa72c'# -> unI64 42797+  '\xa72e'# -> unI64 42799+  '\xa732'# -> unI64 42803+  '\xa734'# -> unI64 42805+  '\xa736'# -> unI64 42807+  '\xa738'# -> unI64 42809+  '\xa73a'# -> unI64 42811+  '\xa73c'# -> unI64 42813+  '\xa73e'# -> unI64 42815+  '\xa740'# -> unI64 42817+  '\xa742'# -> unI64 42819+  '\xa744'# -> unI64 42821+  '\xa746'# -> unI64 42823+  '\xa748'# -> unI64 42825+  '\xa74a'# -> unI64 42827+  '\xa74c'# -> unI64 42829+  '\xa74e'# -> unI64 42831+  '\xa750'# -> unI64 42833+  '\xa752'# -> unI64 42835+  '\xa754'# -> unI64 42837+  '\xa756'# -> unI64 42839+  '\xa758'# -> unI64 42841+  '\xa75a'# -> unI64 42843+  '\xa75c'# -> unI64 42845+  '\xa75e'# -> unI64 42847+  '\xa760'# -> unI64 42849+  '\xa762'# -> unI64 42851+  '\xa764'# -> unI64 42853+  '\xa766'# -> unI64 42855+  '\xa768'# -> unI64 42857+  '\xa76a'# -> unI64 42859+  '\xa76c'# -> unI64 42861+  '\xa76e'# -> unI64 42863+  '\xa779'# -> unI64 42874+  '\xa77b'# -> unI64 42876+  '\xa77d'# -> unI64 7545+  '\xa77e'# -> unI64 42879+  '\xa780'# -> unI64 42881+  '\xa782'# -> unI64 42883+  '\xa784'# -> unI64 42885+  '\xa786'# -> unI64 42887+  '\xa78b'# -> unI64 42892+  '\xa78d'# -> unI64 613+  '\xa790'# -> unI64 42897+  '\xa792'# -> unI64 42899+  '\xa796'# -> unI64 42903+  '\xa798'# -> unI64 42905+  '\xa79a'# -> unI64 42907+  '\xa79c'# -> unI64 42909+  '\xa79e'# -> unI64 42911+  '\xa7a0'# -> unI64 42913+  '\xa7a2'# -> unI64 42915+  '\xa7a4'# -> unI64 42917+  '\xa7a6'# -> unI64 42919+  '\xa7a8'# -> unI64 42921+  '\xa7aa'# -> unI64 614+  '\xa7ab'# -> unI64 604+  '\xa7ac'# -> unI64 609+  '\xa7ad'# -> unI64 620+  '\xa7ae'# -> unI64 618+  '\xa7b0'# -> unI64 670+  '\xa7b1'# -> unI64 647+  '\xa7b2'# -> unI64 669+  '\xa7b3'# -> unI64 43859+  '\xa7b4'# -> unI64 42933+  '\xa7b6'# -> unI64 42935+  '\xa7b8'# -> unI64 42937+  '\xa7ba'# -> unI64 42939+  '\xa7bc'# -> unI64 42941+  '\xa7be'# -> unI64 42943+  '\xa7c0'# -> unI64 42945+  '\xa7c2'# -> unI64 42947+  '\xa7c4'# -> unI64 42900+  '\xa7c5'# -> unI64 642+  '\xa7c6'# -> unI64 7566+  '\xa7c7'# -> unI64 42952+  '\xa7c9'# -> unI64 42954+  '\xa7d0'# -> unI64 42961+  '\xa7d6'# -> unI64 42967+  '\xa7d8'# -> unI64 42969+  '\xa7f5'# -> unI64 42998+  '\xff21'# -> unI64 65345+  '\xff22'# -> unI64 65346+  '\xff23'# -> unI64 65347+  '\xff24'# -> unI64 65348+  '\xff25'# -> unI64 65349+  '\xff26'# -> unI64 65350+  '\xff27'# -> unI64 65351+  '\xff28'# -> unI64 65352+  '\xff29'# -> unI64 65353+  '\xff2a'# -> unI64 65354+  '\xff2b'# -> unI64 65355+  '\xff2c'# -> unI64 65356+  '\xff2d'# -> unI64 65357+  '\xff2e'# -> unI64 65358+  '\xff2f'# -> unI64 65359+  '\xff30'# -> unI64 65360+  '\xff31'# -> unI64 65361+  '\xff32'# -> unI64 65362+  '\xff33'# -> unI64 65363+  '\xff34'# -> unI64 65364+  '\xff35'# -> unI64 65365+  '\xff36'# -> unI64 65366+  '\xff37'# -> unI64 65367+  '\xff38'# -> unI64 65368+  '\xff39'# -> unI64 65369+  '\xff3a'# -> unI64 65370+  '\x10400'# -> unI64 66600+  '\x10401'# -> unI64 66601+  '\x10402'# -> unI64 66602+  '\x10403'# -> unI64 66603+  '\x10404'# -> unI64 66604+  '\x10405'# -> unI64 66605+  '\x10406'# -> unI64 66606+  '\x10407'# -> unI64 66607+  '\x10408'# -> unI64 66608+  '\x10409'# -> unI64 66609+  '\x1040a'# -> unI64 66610+  '\x1040b'# -> unI64 66611+  '\x1040c'# -> unI64 66612+  '\x1040d'# -> unI64 66613+  '\x1040e'# -> unI64 66614+  '\x1040f'# -> unI64 66615+  '\x10410'# -> unI64 66616+  '\x10411'# -> unI64 66617+  '\x10412'# -> unI64 66618+  '\x10413'# -> unI64 66619+  '\x10414'# -> unI64 66620+  '\x10415'# -> unI64 66621+  '\x10416'# -> unI64 66622+  '\x10417'# -> unI64 66623+  '\x10418'# -> unI64 66624+  '\x10419'# -> unI64 66625+  '\x1041a'# -> unI64 66626+  '\x1041b'# -> unI64 66627+  '\x1041c'# -> unI64 66628+  '\x1041d'# -> unI64 66629+  '\x1041e'# -> unI64 66630+  '\x1041f'# -> unI64 66631+  '\x10420'# -> unI64 66632+  '\x10421'# -> unI64 66633+  '\x10422'# -> unI64 66634+  '\x10423'# -> unI64 66635+  '\x10424'# -> unI64 66636+  '\x10425'# -> unI64 66637+  '\x10426'# -> unI64 66638+  '\x10427'# -> unI64 66639+  '\x104b0'# -> unI64 66776+  '\x104b1'# -> unI64 66777+  '\x104b2'# -> unI64 66778+  '\x104b3'# -> unI64 66779+  '\x104b4'# -> unI64 66780+  '\x104b5'# -> unI64 66781+  '\x104b6'# -> unI64 66782+  '\x104b7'# -> unI64 66783+  '\x104b8'# -> unI64 66784+  '\x104b9'# -> unI64 66785+  '\x104ba'# -> unI64 66786+  '\x104bb'# -> unI64 66787+  '\x104bc'# -> unI64 66788+  '\x104bd'# -> unI64 66789+  '\x104be'# -> unI64 66790+  '\x104bf'# -> unI64 66791+  '\x104c0'# -> unI64 66792+  '\x104c1'# -> unI64 66793+  '\x104c2'# -> unI64 66794+  '\x104c3'# -> unI64 66795+  '\x104c4'# -> unI64 66796+  '\x104c5'# -> unI64 66797+  '\x104c6'# -> unI64 66798+  '\x104c7'# -> unI64 66799+  '\x104c8'# -> unI64 66800+  '\x104c9'# -> unI64 66801+  '\x104ca'# -> unI64 66802+  '\x104cb'# -> unI64 66803+  '\x104cc'# -> unI64 66804+  '\x104cd'# -> unI64 66805+  '\x104ce'# -> unI64 66806+  '\x104cf'# -> unI64 66807+  '\x104d0'# -> unI64 66808+  '\x104d1'# -> unI64 66809+  '\x104d2'# -> unI64 66810+  '\x104d3'# -> unI64 66811+  '\x10570'# -> unI64 66967+  '\x10571'# -> unI64 66968+  '\x10572'# -> unI64 66969+  '\x10573'# -> unI64 66970+  '\x10574'# -> unI64 66971+  '\x10575'# -> unI64 66972+  '\x10576'# -> unI64 66973+  '\x10577'# -> unI64 66974+  '\x10578'# -> unI64 66975+  '\x10579'# -> unI64 66976+  '\x1057a'# -> unI64 66977+  '\x1057c'# -> unI64 66979+  '\x1057d'# -> unI64 66980+  '\x1057e'# -> unI64 66981+  '\x1057f'# -> unI64 66982+  '\x10580'# -> unI64 66983+  '\x10581'# -> unI64 66984+  '\x10582'# -> unI64 66985+  '\x10583'# -> unI64 66986+  '\x10584'# -> unI64 66987+  '\x10585'# -> unI64 66988+  '\x10586'# -> unI64 66989+  '\x10587'# -> unI64 66990+  '\x10588'# -> unI64 66991+  '\x10589'# -> unI64 66992+  '\x1058a'# -> unI64 66993+  '\x1058c'# -> unI64 66995+  '\x1058d'# -> unI64 66996+  '\x1058e'# -> unI64 66997+  '\x1058f'# -> unI64 66998+  '\x10590'# -> unI64 66999+  '\x10591'# -> unI64 67000+  '\x10592'# -> unI64 67001+  '\x10594'# -> unI64 67003+  '\x10595'# -> unI64 67004+  '\x10c80'# -> unI64 68800+  '\x10c81'# -> unI64 68801+  '\x10c82'# -> unI64 68802+  '\x10c83'# -> unI64 68803+  '\x10c84'# -> unI64 68804+  '\x10c85'# -> unI64 68805+  '\x10c86'# -> unI64 68806+  '\x10c87'# -> unI64 68807+  '\x10c88'# -> unI64 68808+  '\x10c89'# -> unI64 68809+  '\x10c8a'# -> unI64 68810+  '\x10c8b'# -> unI64 68811+  '\x10c8c'# -> unI64 68812+  '\x10c8d'# -> unI64 68813+  '\x10c8e'# -> unI64 68814+  '\x10c8f'# -> unI64 68815+  '\x10c90'# -> unI64 68816+  '\x10c91'# -> unI64 68817+  '\x10c92'# -> unI64 68818+  '\x10c93'# -> unI64 68819+  '\x10c94'# -> unI64 68820+  '\x10c95'# -> unI64 68821+  '\x10c96'# -> unI64 68822+  '\x10c97'# -> unI64 68823+  '\x10c98'# -> unI64 68824+  '\x10c99'# -> unI64 68825+  '\x10c9a'# -> unI64 68826+  '\x10c9b'# -> unI64 68827+  '\x10c9c'# -> unI64 68828+  '\x10c9d'# -> unI64 68829+  '\x10c9e'# -> unI64 68830+  '\x10c9f'# -> unI64 68831+  '\x10ca0'# -> unI64 68832+  '\x10ca1'# -> unI64 68833+  '\x10ca2'# -> unI64 68834+  '\x10ca3'# -> unI64 68835+  '\x10ca4'# -> unI64 68836+  '\x10ca5'# -> unI64 68837+  '\x10ca6'# -> unI64 68838+  '\x10ca7'# -> unI64 68839+  '\x10ca8'# -> unI64 68840+  '\x10ca9'# -> unI64 68841+  '\x10caa'# -> unI64 68842+  '\x10cab'# -> unI64 68843+  '\x10cac'# -> unI64 68844+  '\x10cad'# -> unI64 68845+  '\x10cae'# -> unI64 68846+  '\x10caf'# -> unI64 68847+  '\x10cb0'# -> unI64 68848+  '\x10cb1'# -> unI64 68849+  '\x10cb2'# -> unI64 68850+  '\x118a0'# -> unI64 71872+  '\x118a1'# -> unI64 71873+  '\x118a2'# -> unI64 71874+  '\x118a3'# -> unI64 71875+  '\x118a4'# -> unI64 71876+  '\x118a5'# -> unI64 71877+  '\x118a6'# -> unI64 71878+  '\x118a7'# -> unI64 71879+  '\x118a8'# -> unI64 71880+  '\x118a9'# -> unI64 71881+  '\x118aa'# -> unI64 71882+  '\x118ab'# -> unI64 71883+  '\x118ac'# -> unI64 71884+  '\x118ad'# -> unI64 71885+  '\x118ae'# -> unI64 71886+  '\x118af'# -> unI64 71887+  '\x118b0'# -> unI64 71888+  '\x118b1'# -> unI64 71889+  '\x118b2'# -> unI64 71890+  '\x118b3'# -> unI64 71891+  '\x118b4'# -> unI64 71892+  '\x118b5'# -> unI64 71893+  '\x118b6'# -> unI64 71894+  '\x118b7'# -> unI64 71895+  '\x118b8'# -> unI64 71896+  '\x118b9'# -> unI64 71897+  '\x118ba'# -> unI64 71898+  '\x118bb'# -> unI64 71899+  '\x118bc'# -> unI64 71900+  '\x118bd'# -> unI64 71901+  '\x118be'# -> unI64 71902+  '\x118bf'# -> unI64 71903+  '\x16e40'# -> unI64 93792+  '\x16e41'# -> unI64 93793+  '\x16e42'# -> unI64 93794+  '\x16e43'# -> unI64 93795+  '\x16e44'# -> unI64 93796+  '\x16e45'# -> unI64 93797+  '\x16e46'# -> unI64 93798+  '\x16e47'# -> unI64 93799+  '\x16e48'# -> unI64 93800+  '\x16e49'# -> unI64 93801+  '\x16e4a'# -> unI64 93802+  '\x16e4b'# -> unI64 93803+  '\x16e4c'# -> unI64 93804+  '\x16e4d'# -> unI64 93805+  '\x16e4e'# -> unI64 93806+  '\x16e4f'# -> unI64 93807+  '\x16e50'# -> unI64 93808+  '\x16e51'# -> unI64 93809+  '\x16e52'# -> unI64 93810+  '\x16e53'# -> unI64 93811+  '\x16e54'# -> unI64 93812+  '\x16e55'# -> unI64 93813+  '\x16e56'# -> unI64 93814+  '\x16e57'# -> unI64 93815+  '\x16e58'# -> unI64 93816+  '\x16e59'# -> unI64 93817+  '\x16e5a'# -> unI64 93818+  '\x16e5b'# -> unI64 93819+  '\x16e5c'# -> unI64 93820+  '\x16e5d'# -> unI64 93821+  '\x16e5e'# -> unI64 93822+  '\x16e5f'# -> unI64 93823+  '\x1e900'# -> unI64 125218+  '\x1e901'# -> unI64 125219+  '\x1e902'# -> unI64 125220+  '\x1e903'# -> unI64 125221+  '\x1e904'# -> unI64 125222+  '\x1e905'# -> unI64 125223+  '\x1e906'# -> unI64 125224+  '\x1e907'# -> unI64 125225+  '\x1e908'# -> unI64 125226+  '\x1e909'# -> unI64 125227+  '\x1e90a'# -> unI64 125228+  '\x1e90b'# -> unI64 125229+  '\x1e90c'# -> unI64 125230+  '\x1e90d'# -> unI64 125231+  '\x1e90e'# -> unI64 125232+  '\x1e90f'# -> unI64 125233+  '\x1e910'# -> unI64 125234+  '\x1e911'# -> unI64 125235+  '\x1e912'# -> unI64 125236+  '\x1e913'# -> unI64 125237+  '\x1e914'# -> unI64 125238+  '\x1e915'# -> unI64 125239+  '\x1e916'# -> unI64 125240+  '\x1e917'# -> unI64 125241+  '\x1e918'# -> unI64 125242+  '\x1e919'# -> unI64 125243+  '\x1e91a'# -> unI64 125244+  '\x1e91b'# -> unI64 125245+  '\x1e91c'# -> unI64 125246+  '\x1e91d'# -> unI64 125247+  '\x1e91e'# -> unI64 125248+  '\x1e91f'# -> unI64 125249+  '\x1e920'# -> unI64 125250+  '\x1e921'# -> unI64 125251+  _ -> unI64 0+titleMapping :: Char# -> _ {- unboxed Int64 -}+{-# NOINLINE titleMapping #-}+titleMapping = \case+  -- LATIN SMALL LETTER SHARP S+  '\x00df'# -> unI64 241172563+  -- LATIN SMALL LIGATURE FF+  '\xfb00'# -> unI64 213909574+  -- LATIN SMALL LIGATURE FI+  '\xfb01'# -> unI64 220201030+  -- LATIN SMALL LIGATURE FL+  '\xfb02'# -> unI64 226492486+  -- LATIN SMALL LIGATURE FFI+  '\xfb03'# -> unI64 461795097575494+  -- LATIN SMALL LIGATURE FFL+  '\xfb04'# -> unI64 474989237108806+  -- LATIN SMALL LIGATURE LONG S T+  '\xfb05'# -> unI64 243269715+  -- LATIN SMALL LIGATURE ST+  '\xfb06'# -> unI64 243269715+  -- ARMENIAN SMALL LIGATURE ECH YIWN+  '\x0587'# -> unI64 2956985653+  -- ARMENIAN SMALL LIGATURE MEN NOW+  '\xfb13'# -> unI64 2931819844+  -- ARMENIAN SMALL LIGATURE MEN ECH+  '\xfb14'# -> unI64 2896168260+  -- ARMENIAN SMALL LIGATURE MEN INI+  '\xfb15'# -> unI64 2908751172+  -- ARMENIAN SMALL LIGATURE VEW NOW+  '\xfb16'# -> unI64 2931819854+  -- ARMENIAN SMALL LIGATURE MEN XEH+  '\xfb17'# -> unI64 2912945476+  -- LATIN SMALL LETTER N PRECEDED BY APOSTROPHE+  '\x0149'# -> unI64 163578556+  -- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS+  '\x0390'# -> unI64 3382099394429849+  -- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS+  '\x03b0'# -> unI64 3382099394429861+  -- LATIN SMALL LETTER J WITH CARON+  '\x01f0'# -> unI64 1635778634+  -- LATIN SMALL LETTER H WITH LINE BELOW+  '\x1e96'# -> unI64 1713373256+  -- LATIN SMALL LETTER T WITH DIAERESIS+  '\x1e97'# -> unI64 1627390036+  -- LATIN SMALL LETTER W WITH RING ABOVE+  '\x1e98'# -> unI64 1631584343+  -- LATIN SMALL LETTER Y WITH RING ABOVE+  '\x1e99'# -> unI64 1631584345+  -- LATIN SMALL LETTER A WITH RIGHT HALF RING+  '\x1e9a'# -> unI64 1472200769+  -- GREEK SMALL LETTER UPSILON WITH PSILI+  '\x1f50'# -> unI64 1650459557+  -- GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA+  '\x1f52'# -> unI64 3377701370987429+  -- GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA+  '\x1f54'# -> unI64 3382099417498533+  -- GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI+  '\x1f56'# -> unI64 3667972440720293+  -- GREEK SMALL LETTER ALPHA WITH PERISPOMENI+  '\x1fb6'# -> unI64 1749025681+  -- GREEK SMALL LETTER ETA WITH PERISPOMENI+  '\x1fc6'# -> unI64 1749025687+  -- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA+  '\x1fd2'# -> unI64 3377701347918745+  -- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA+  '\x1fd3'# -> unI64 3382099394429849+  -- GREEK SMALL LETTER IOTA WITH PERISPOMENI+  '\x1fd6'# -> unI64 1749025689+  -- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI+  '\x1fd7'# -> unI64 3667972417651609+  -- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA+  '\x1fe2'# -> unI64 3377701347918757+  -- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA+  '\x1fe3'# -> unI64 3382099394429861+  -- GREEK SMALL LETTER RHO WITH PSILI+  '\x1fe4'# -> unI64 1650459553+  -- GREEK SMALL LETTER UPSILON WITH PERISPOMENI+  '\x1fe6'# -> unI64 1749025701+  -- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI+  '\x1fe7'# -> unI64 3667972417651621+  -- GREEK SMALL LETTER OMEGA WITH PERISPOMENI+  '\x1ff6'# -> unI64 1749025705+  -- GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI+  '\x1fb2'# -> unI64 1755324346+  -- GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI+  '\x1fb4'# -> unI64 1755317126+  -- GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI+  '\x1fc2'# -> unI64 1755324362+  -- GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI+  '\x1fc4'# -> unI64 1755317129+  -- GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI+  '\x1ff2'# -> unI64 1755324410+  -- GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI+  '\x1ff4'# -> unI64 1755317135+  -- GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI+  '\x1fb7'# -> unI64 3681166678819729+  -- GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI+  '\x1fc7'# -> unI64 3681166678819735+  -- GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI+  '\x1ff7'# -> unI64 3681166678819753+  '\x0061'# -> unI64 65+  '\x0062'# -> unI64 66+  '\x0063'# -> unI64 67+  '\x0064'# -> unI64 68+  '\x0065'# -> unI64 69+  '\x0066'# -> unI64 70+  '\x0067'# -> unI64 71+  '\x0068'# -> unI64 72+  '\x0069'# -> unI64 73+  '\x006a'# -> unI64 74+  '\x006b'# -> unI64 75+  '\x006c'# -> unI64 76+  '\x006d'# -> unI64 77+  '\x006e'# -> unI64 78+  '\x006f'# -> unI64 79+  '\x0070'# -> unI64 80+  '\x0071'# -> unI64 81+  '\x0072'# -> unI64 82+  '\x0073'# -> unI64 83+  '\x0074'# -> unI64 84+  '\x0075'# -> unI64 85+  '\x0076'# -> unI64 86+  '\x0077'# -> unI64 87+  '\x0078'# -> unI64 88+  '\x0079'# -> unI64 89+  '\x007a'# -> unI64 90+  '\x00b5'# -> unI64 924+  '\x00e0'# -> unI64 192+  '\x00e1'# -> unI64 193+  '\x00e2'# -> unI64 194+  '\x00e3'# -> unI64 195+  '\x00e4'# -> unI64 196+  '\x00e5'# -> unI64 197+  '\x00e6'# -> unI64 198+  '\x00e7'# -> unI64 199+  '\x00e8'# -> unI64 200+  '\x00e9'# -> unI64 201+  '\x00ea'# -> unI64 202+  '\x00eb'# -> unI64 203+  '\x00ec'# -> unI64 204+  '\x00ed'# -> unI64 205+  '\x00ee'# -> unI64 206+  '\x00ef'# -> unI64 207+  '\x00f0'# -> unI64 208+  '\x00f1'# -> unI64 209+  '\x00f2'# -> unI64 210+  '\x00f3'# -> unI64 211+  '\x00f4'# -> unI64 212+  '\x00f5'# -> unI64 213+  '\x00f6'# -> unI64 214+  '\x00f8'# -> unI64 216+  '\x00f9'# -> unI64 217+  '\x00fa'# -> unI64 218+  '\x00fb'# -> unI64 219+  '\x00fc'# -> unI64 220+  '\x00fd'# -> unI64 221+  '\x00fe'# -> unI64 222+  '\x00ff'# -> unI64 376+  '\x0101'# -> unI64 256+  '\x0103'# -> unI64 258+  '\x0105'# -> unI64 260+  '\x0107'# -> unI64 262+  '\x0109'# -> unI64 264+  '\x010b'# -> unI64 266+  '\x010d'# -> unI64 268+  '\x010f'# -> unI64 270+  '\x0111'# -> unI64 272+  '\x0113'# -> unI64 274+  '\x0115'# -> unI64 276+  '\x0117'# -> unI64 278+  '\x0119'# -> unI64 280+  '\x011b'# -> unI64 282+  '\x011d'# -> unI64 284+  '\x011f'# -> unI64 286+  '\x0121'# -> unI64 288+  '\x0123'# -> unI64 290+  '\x0125'# -> unI64 292+  '\x0127'# -> unI64 294+  '\x0129'# -> unI64 296+  '\x012b'# -> unI64 298+  '\x012d'# -> unI64 300+  '\x012f'# -> unI64 302+  '\x0131'# -> unI64 73+  '\x0133'# -> unI64 306+  '\x0135'# -> unI64 308+  '\x0137'# -> unI64 310+  '\x013a'# -> unI64 313+  '\x013c'# -> unI64 315+  '\x013e'# -> unI64 317+  '\x0140'# -> unI64 319+  '\x0142'# -> unI64 321+  '\x0144'# -> unI64 323+  '\x0146'# -> unI64 325+  '\x0148'# -> unI64 327+  '\x014b'# -> unI64 330+  '\x014d'# -> unI64 332+  '\x014f'# -> unI64 334+  '\x0151'# -> unI64 336+  '\x0153'# -> unI64 338+  '\x0155'# -> unI64 340+  '\x0157'# -> unI64 342+  '\x0159'# -> unI64 344+  '\x015b'# -> unI64 346+  '\x015d'# -> unI64 348+  '\x015f'# -> unI64 350+  '\x0161'# -> unI64 352+  '\x0163'# -> unI64 354+  '\x0165'# -> unI64 356+  '\x0167'# -> unI64 358+  '\x0169'# -> unI64 360+  '\x016b'# -> unI64 362+  '\x016d'# -> unI64 364+  '\x016f'# -> unI64 366+  '\x0171'# -> unI64 368+  '\x0173'# -> unI64 370+  '\x0175'# -> unI64 372+  '\x0177'# -> unI64 374+  '\x017a'# -> unI64 377+  '\x017c'# -> unI64 379+  '\x017e'# -> unI64 381+  '\x017f'# -> unI64 83+  '\x0180'# -> unI64 579+  '\x0183'# -> unI64 386+  '\x0185'# -> unI64 388+  '\x0188'# -> unI64 391+  '\x018c'# -> unI64 395+  '\x0192'# -> unI64 401+  '\x0195'# -> unI64 502+  '\x0199'# -> unI64 408+  '\x019a'# -> unI64 573+  '\x019e'# -> unI64 544+  '\x01a1'# -> unI64 416+  '\x01a3'# -> unI64 418+  '\x01a5'# -> unI64 420+  '\x01a8'# -> unI64 423+  '\x01ad'# -> unI64 428+  '\x01b0'# -> unI64 431+  '\x01b4'# -> unI64 435+  '\x01b6'# -> unI64 437+  '\x01b9'# -> unI64 440+  '\x01bd'# -> unI64 444+  '\x01bf'# -> unI64 503+  '\x01c4'# -> unI64 453+  '\x01c6'# -> unI64 453+  '\x01c7'# -> unI64 456+  '\x01c9'# -> unI64 456+  '\x01ca'# -> unI64 459+  '\x01cc'# -> unI64 459+  '\x01ce'# -> unI64 461+  '\x01d0'# -> unI64 463+  '\x01d2'# -> unI64 465+  '\x01d4'# -> unI64 467+  '\x01d6'# -> unI64 469+  '\x01d8'# -> unI64 471+  '\x01da'# -> unI64 473+  '\x01dc'# -> unI64 475+  '\x01dd'# -> unI64 398+  '\x01df'# -> unI64 478+  '\x01e1'# -> unI64 480+  '\x01e3'# -> unI64 482+  '\x01e5'# -> unI64 484+  '\x01e7'# -> unI64 486+  '\x01e9'# -> unI64 488+  '\x01eb'# -> unI64 490+  '\x01ed'# -> unI64 492+  '\x01ef'# -> unI64 494+  '\x01f1'# -> unI64 498+  '\x01f3'# -> unI64 498+  '\x01f5'# -> unI64 500+  '\x01f9'# -> unI64 504+  '\x01fb'# -> unI64 506+  '\x01fd'# -> unI64 508+  '\x01ff'# -> unI64 510+  '\x0201'# -> unI64 512+  '\x0203'# -> unI64 514+  '\x0205'# -> unI64 516+  '\x0207'# -> unI64 518+  '\x0209'# -> unI64 520+  '\x020b'# -> unI64 522+  '\x020d'# -> unI64 524+  '\x020f'# -> unI64 526+  '\x0211'# -> unI64 528+  '\x0213'# -> unI64 530+  '\x0215'# -> unI64 532+  '\x0217'# -> unI64 534+  '\x0219'# -> unI64 536+  '\x021b'# -> unI64 538+  '\x021d'# -> unI64 540+  '\x021f'# -> unI64 542+  '\x0223'# -> unI64 546+  '\x0225'# -> unI64 548+  '\x0227'# -> unI64 550+  '\x0229'# -> unI64 552+  '\x022b'# -> unI64 554+  '\x022d'# -> unI64 556+  '\x022f'# -> unI64 558+  '\x0231'# -> unI64 560+  '\x0233'# -> unI64 562+  '\x023c'# -> unI64 571+  '\x023f'# -> unI64 11390+  '\x0240'# -> unI64 11391+  '\x0242'# -> unI64 577+  '\x0247'# -> unI64 582+  '\x0249'# -> unI64 584+  '\x024b'# -> unI64 586+  '\x024d'# -> unI64 588+  '\x024f'# -> unI64 590+  '\x0250'# -> unI64 11375+  '\x0251'# -> unI64 11373+  '\x0252'# -> unI64 11376+  '\x0253'# -> unI64 385+  '\x0254'# -> unI64 390+  '\x0256'# -> unI64 393+  '\x0257'# -> unI64 394+  '\x0259'# -> unI64 399+  '\x025b'# -> unI64 400+  '\x025c'# -> unI64 42923+  '\x0260'# -> unI64 403+  '\x0261'# -> unI64 42924+  '\x0263'# -> unI64 404+  '\x0265'# -> unI64 42893+  '\x0266'# -> unI64 42922+  '\x0268'# -> unI64 407+  '\x0269'# -> unI64 406+  '\x026a'# -> unI64 42926+  '\x026b'# -> unI64 11362+  '\x026c'# -> unI64 42925+  '\x026f'# -> unI64 412+  '\x0271'# -> unI64 11374+  '\x0272'# -> unI64 413+  '\x0275'# -> unI64 415+  '\x027d'# -> unI64 11364+  '\x0280'# -> unI64 422+  '\x0282'# -> unI64 42949+  '\x0283'# -> unI64 425+  '\x0287'# -> unI64 42929+  '\x0288'# -> unI64 430+  '\x0289'# -> unI64 580+  '\x028a'# -> unI64 433+  '\x028b'# -> unI64 434+  '\x028c'# -> unI64 581+  '\x0292'# -> unI64 439+  '\x029d'# -> unI64 42930+  '\x029e'# -> unI64 42928+  '\x0345'# -> unI64 921+  '\x0371'# -> unI64 880+  '\x0373'# -> unI64 882+  '\x0377'# -> unI64 886+  '\x037b'# -> unI64 1021+  '\x037c'# -> unI64 1022+  '\x037d'# -> unI64 1023+  '\x03ac'# -> unI64 902+  '\x03ad'# -> unI64 904+  '\x03ae'# -> unI64 905+  '\x03af'# -> unI64 906+  '\x03b1'# -> unI64 913+  '\x03b2'# -> unI64 914+  '\x03b3'# -> unI64 915+  '\x03b4'# -> unI64 916+  '\x03b5'# -> unI64 917+  '\x03b6'# -> unI64 918+  '\x03b7'# -> unI64 919+  '\x03b8'# -> unI64 920+  '\x03b9'# -> unI64 921+  '\x03ba'# -> unI64 922+  '\x03bb'# -> unI64 923+  '\x03bc'# -> unI64 924+  '\x03bd'# -> unI64 925+  '\x03be'# -> unI64 926+  '\x03bf'# -> unI64 927+  '\x03c0'# -> unI64 928+  '\x03c1'# -> unI64 929+  '\x03c2'# -> unI64 931+  '\x03c3'# -> unI64 931+  '\x03c4'# -> unI64 932+  '\x03c5'# -> unI64 933+  '\x03c6'# -> unI64 934+  '\x03c7'# -> unI64 935+  '\x03c8'# -> unI64 936+  '\x03c9'# -> unI64 937+  '\x03ca'# -> unI64 938+  '\x03cb'# -> unI64 939+  '\x03cc'# -> unI64 908+  '\x03cd'# -> unI64 910+  '\x03ce'# -> unI64 911+  '\x03d0'# -> unI64 914+  '\x03d1'# -> unI64 920+  '\x03d5'# -> unI64 934+  '\x03d6'# -> unI64 928+  '\x03d7'# -> unI64 975+  '\x03d9'# -> unI64 984+  '\x03db'# -> unI64 986+  '\x03dd'# -> unI64 988+  '\x03df'# -> unI64 990+  '\x03e1'# -> unI64 992+  '\x03e3'# -> unI64 994+  '\x03e5'# -> unI64 996+  '\x03e7'# -> unI64 998+  '\x03e9'# -> unI64 1000+  '\x03eb'# -> unI64 1002+  '\x03ed'# -> unI64 1004+  '\x03ef'# -> unI64 1006+  '\x03f0'# -> unI64 922+  '\x03f1'# -> unI64 929+  '\x03f2'# -> unI64 1017+  '\x03f3'# -> unI64 895+  '\x03f5'# -> unI64 917+  '\x03f8'# -> unI64 1015+  '\x03fb'# -> unI64 1018+  '\x0430'# -> unI64 1040+  '\x0431'# -> unI64 1041+  '\x0432'# -> unI64 1042+  '\x0433'# -> unI64 1043+  '\x0434'# -> unI64 1044+  '\x0435'# -> unI64 1045+  '\x0436'# -> unI64 1046+  '\x0437'# -> unI64 1047+  '\x0438'# -> unI64 1048+  '\x0439'# -> unI64 1049+  '\x043a'# -> unI64 1050+  '\x043b'# -> unI64 1051+  '\x043c'# -> unI64 1052+  '\x043d'# -> unI64 1053+  '\x043e'# -> unI64 1054+  '\x043f'# -> unI64 1055+  '\x0440'# -> unI64 1056+  '\x0441'# -> unI64 1057+  '\x0442'# -> unI64 1058+  '\x0443'# -> unI64 1059+  '\x0444'# -> unI64 1060+  '\x0445'# -> unI64 1061+  '\x0446'# -> unI64 1062+  '\x0447'# -> unI64 1063+  '\x0448'# -> unI64 1064+  '\x0449'# -> unI64 1065+  '\x044a'# -> unI64 1066+  '\x044b'# -> unI64 1067+  '\x044c'# -> unI64 1068+  '\x044d'# -> unI64 1069+  '\x044e'# -> unI64 1070+  '\x044f'# -> unI64 1071+  '\x0450'# -> unI64 1024+  '\x0451'# -> unI64 1025+  '\x0452'# -> unI64 1026+  '\x0453'# -> unI64 1027+  '\x0454'# -> unI64 1028+  '\x0455'# -> unI64 1029+  '\x0456'# -> unI64 1030+  '\x0457'# -> unI64 1031+  '\x0458'# -> unI64 1032+  '\x0459'# -> unI64 1033+  '\x045a'# -> unI64 1034+  '\x045b'# -> unI64 1035+  '\x045c'# -> unI64 1036+  '\x045d'# -> unI64 1037+  '\x045e'# -> unI64 1038+  '\x045f'# -> unI64 1039+  '\x0461'# -> unI64 1120+  '\x0463'# -> unI64 1122+  '\x0465'# -> unI64 1124+  '\x0467'# -> unI64 1126+  '\x0469'# -> unI64 1128+  '\x046b'# -> unI64 1130+  '\x046d'# -> unI64 1132+  '\x046f'# -> unI64 1134+  '\x0471'# -> unI64 1136+  '\x0473'# -> unI64 1138+  '\x0475'# -> unI64 1140+  '\x0477'# -> unI64 1142+  '\x0479'# -> unI64 1144+  '\x047b'# -> unI64 1146+  '\x047d'# -> unI64 1148+  '\x047f'# -> unI64 1150+  '\x0481'# -> unI64 1152+  '\x048b'# -> unI64 1162+  '\x048d'# -> unI64 1164+  '\x048f'# -> unI64 1166+  '\x0491'# -> unI64 1168+  '\x0493'# -> unI64 1170+  '\x0495'# -> unI64 1172+  '\x0497'# -> unI64 1174+  '\x0499'# -> unI64 1176+  '\x049b'# -> unI64 1178+  '\x049d'# -> unI64 1180+  '\x049f'# -> unI64 1182+  '\x04a1'# -> unI64 1184+  '\x04a3'# -> unI64 1186+  '\x04a5'# -> unI64 1188+  '\x04a7'# -> unI64 1190+  '\x04a9'# -> unI64 1192+  '\x04ab'# -> unI64 1194+  '\x04ad'# -> unI64 1196+  '\x04af'# -> unI64 1198+  '\x04b1'# -> unI64 1200+  '\x04b3'# -> unI64 1202+  '\x04b5'# -> unI64 1204+  '\x04b7'# -> unI64 1206+  '\x04b9'# -> unI64 1208+  '\x04bb'# -> unI64 1210+  '\x04bd'# -> unI64 1212+  '\x04bf'# -> unI64 1214+  '\x04c2'# -> unI64 1217+  '\x04c4'# -> unI64 1219+  '\x04c6'# -> unI64 1221+  '\x04c8'# -> unI64 1223+  '\x04ca'# -> unI64 1225+  '\x04cc'# -> unI64 1227+  '\x04ce'# -> unI64 1229+  '\x04cf'# -> unI64 1216+  '\x04d1'# -> unI64 1232+  '\x04d3'# -> unI64 1234+  '\x04d5'# -> unI64 1236+  '\x04d7'# -> unI64 1238+  '\x04d9'# -> unI64 1240+  '\x04db'# -> unI64 1242+  '\x04dd'# -> unI64 1244+  '\x04df'# -> unI64 1246+  '\x04e1'# -> unI64 1248+  '\x04e3'# -> unI64 1250+  '\x04e5'# -> unI64 1252+  '\x04e7'# -> unI64 1254+  '\x04e9'# -> unI64 1256+  '\x04eb'# -> unI64 1258+  '\x04ed'# -> unI64 1260+  '\x04ef'# -> unI64 1262+  '\x04f1'# -> unI64 1264+  '\x04f3'# -> unI64 1266+  '\x04f5'# -> unI64 1268+  '\x04f7'# -> unI64 1270+  '\x04f9'# -> unI64 1272+  '\x04fb'# -> unI64 1274+  '\x04fd'# -> unI64 1276+  '\x04ff'# -> unI64 1278+  '\x0501'# -> unI64 1280+  '\x0503'# -> unI64 1282+  '\x0505'# -> unI64 1284+  '\x0507'# -> unI64 1286+  '\x0509'# -> unI64 1288+  '\x050b'# -> unI64 1290+  '\x050d'# -> unI64 1292+  '\x050f'# -> unI64 1294+  '\x0511'# -> unI64 1296+  '\x0513'# -> unI64 1298+  '\x0515'# -> unI64 1300+  '\x0517'# -> unI64 1302+  '\x0519'# -> unI64 1304+  '\x051b'# -> unI64 1306+  '\x051d'# -> unI64 1308+  '\x051f'# -> unI64 1310+  '\x0521'# -> unI64 1312+  '\x0523'# -> unI64 1314+  '\x0525'# -> unI64 1316+  '\x0527'# -> unI64 1318+  '\x0529'# -> unI64 1320+  '\x052b'# -> unI64 1322+  '\x052d'# -> unI64 1324+  '\x052f'# -> unI64 1326+  '\x0561'# -> unI64 1329+  '\x0562'# -> unI64 1330+  '\x0563'# -> unI64 1331+  '\x0564'# -> unI64 1332+  '\x0565'# -> unI64 1333+  '\x0566'# -> unI64 1334+  '\x0567'# -> unI64 1335+  '\x0568'# -> unI64 1336+  '\x0569'# -> unI64 1337+  '\x056a'# -> unI64 1338+  '\x056b'# -> unI64 1339+  '\x056c'# -> unI64 1340+  '\x056d'# -> unI64 1341+  '\x056e'# -> unI64 1342+  '\x056f'# -> unI64 1343+  '\x0570'# -> unI64 1344+  '\x0571'# -> unI64 1345+  '\x0572'# -> unI64 1346+  '\x0573'# -> unI64 1347+  '\x0574'# -> unI64 1348+  '\x0575'# -> unI64 1349+  '\x0576'# -> unI64 1350+  '\x0577'# -> unI64 1351+  '\x0578'# -> unI64 1352+  '\x0579'# -> unI64 1353+  '\x057a'# -> unI64 1354+  '\x057b'# -> unI64 1355+  '\x057c'# -> unI64 1356+  '\x057d'# -> unI64 1357+  '\x057e'# -> unI64 1358+  '\x057f'# -> unI64 1359+  '\x0580'# -> unI64 1360+  '\x0581'# -> unI64 1361+  '\x0582'# -> unI64 1362+  '\x0583'# -> unI64 1363+  '\x0584'# -> unI64 1364+  '\x0585'# -> unI64 1365+  '\x0586'# -> unI64 1366+  '\x13f8'# -> unI64 5104+  '\x13f9'# -> unI64 5105+  '\x13fa'# -> unI64 5106+  '\x13fb'# -> unI64 5107+  '\x13fc'# -> unI64 5108+  '\x13fd'# -> unI64 5109+  '\x1c80'# -> unI64 1042+  '\x1c81'# -> unI64 1044+  '\x1c82'# -> unI64 1054+  '\x1c83'# -> unI64 1057+  '\x1c84'# -> unI64 1058+  '\x1c85'# -> unI64 1058+  '\x1c86'# -> unI64 1066+  '\x1c87'# -> unI64 1122+  '\x1c88'# -> unI64 42570+  '\x1d79'# -> unI64 42877+  '\x1d7d'# -> unI64 11363+  '\x1d8e'# -> unI64 42950+  '\x1e01'# -> unI64 7680+  '\x1e03'# -> unI64 7682+  '\x1e05'# -> unI64 7684+  '\x1e07'# -> unI64 7686+  '\x1e09'# -> unI64 7688+  '\x1e0b'# -> unI64 7690+  '\x1e0d'# -> unI64 7692+  '\x1e0f'# -> unI64 7694+  '\x1e11'# -> unI64 7696+  '\x1e13'# -> unI64 7698+  '\x1e15'# -> unI64 7700+  '\x1e17'# -> unI64 7702+  '\x1e19'# -> unI64 7704+  '\x1e1b'# -> unI64 7706+  '\x1e1d'# -> unI64 7708+  '\x1e1f'# -> unI64 7710+  '\x1e21'# -> unI64 7712+  '\x1e23'# -> unI64 7714+  '\x1e25'# -> unI64 7716+  '\x1e27'# -> unI64 7718+  '\x1e29'# -> unI64 7720+  '\x1e2b'# -> unI64 7722+  '\x1e2d'# -> unI64 7724+  '\x1e2f'# -> unI64 7726+  '\x1e31'# -> unI64 7728+  '\x1e33'# -> unI64 7730+  '\x1e35'# -> unI64 7732+  '\x1e37'# -> unI64 7734+  '\x1e39'# -> unI64 7736+  '\x1e3b'# -> unI64 7738+  '\x1e3d'# -> unI64 7740+  '\x1e3f'# -> unI64 7742+  '\x1e41'# -> unI64 7744+  '\x1e43'# -> unI64 7746+  '\x1e45'# -> unI64 7748+  '\x1e47'# -> unI64 7750+  '\x1e49'# -> unI64 7752+  '\x1e4b'# -> unI64 7754+  '\x1e4d'# -> unI64 7756+  '\x1e4f'# -> unI64 7758+  '\x1e51'# -> unI64 7760+  '\x1e53'# -> unI64 7762+  '\x1e55'# -> unI64 7764+  '\x1e57'# -> unI64 7766+  '\x1e59'# -> unI64 7768+  '\x1e5b'# -> unI64 7770+  '\x1e5d'# -> unI64 7772+  '\x1e5f'# -> unI64 7774+  '\x1e61'# -> unI64 7776+  '\x1e63'# -> unI64 7778+  '\x1e65'# -> unI64 7780+  '\x1e67'# -> unI64 7782+  '\x1e69'# -> unI64 7784+  '\x1e6b'# -> unI64 7786+  '\x1e6d'# -> unI64 7788+  '\x1e6f'# -> unI64 7790+  '\x1e71'# -> unI64 7792+  '\x1e73'# -> unI64 7794+  '\x1e75'# -> unI64 7796+  '\x1e77'# -> unI64 7798+  '\x1e79'# -> unI64 7800+  '\x1e7b'# -> unI64 7802+  '\x1e7d'# -> unI64 7804+  '\x1e7f'# -> unI64 7806+  '\x1e81'# -> unI64 7808+  '\x1e83'# -> unI64 7810+  '\x1e85'# -> unI64 7812+  '\x1e87'# -> unI64 7814+  '\x1e89'# -> unI64 7816+  '\x1e8b'# -> unI64 7818+  '\x1e8d'# -> unI64 7820+  '\x1e8f'# -> unI64 7822+  '\x1e91'# -> unI64 7824+  '\x1e93'# -> unI64 7826+  '\x1e95'# -> unI64 7828+  '\x1e9b'# -> unI64 7776+  '\x1ea1'# -> unI64 7840+  '\x1ea3'# -> unI64 7842+  '\x1ea5'# -> unI64 7844+  '\x1ea7'# -> unI64 7846+  '\x1ea9'# -> unI64 7848+  '\x1eab'# -> unI64 7850+  '\x1ead'# -> unI64 7852+  '\x1eaf'# -> unI64 7854+  '\x1eb1'# -> unI64 7856+  '\x1eb3'# -> unI64 7858+  '\x1eb5'# -> unI64 7860+  '\x1eb7'# -> unI64 7862+  '\x1eb9'# -> unI64 7864+  '\x1ebb'# -> unI64 7866+  '\x1ebd'# -> unI64 7868+  '\x1ebf'# -> unI64 7870+  '\x1ec1'# -> unI64 7872+  '\x1ec3'# -> unI64 7874+  '\x1ec5'# -> unI64 7876+  '\x1ec7'# -> unI64 7878+  '\x1ec9'# -> unI64 7880+  '\x1ecb'# -> unI64 7882+  '\x1ecd'# -> unI64 7884+  '\x1ecf'# -> unI64 7886+  '\x1ed1'# -> unI64 7888+  '\x1ed3'# -> unI64 7890+  '\x1ed5'# -> unI64 7892+  '\x1ed7'# -> unI64 7894+  '\x1ed9'# -> unI64 7896+  '\x1edb'# -> unI64 7898+  '\x1edd'# -> unI64 7900+  '\x1edf'# -> unI64 7902+  '\x1ee1'# -> unI64 7904+  '\x1ee3'# -> unI64 7906+  '\x1ee5'# -> unI64 7908+  '\x1ee7'# -> unI64 7910+  '\x1ee9'# -> unI64 7912+  '\x1eeb'# -> unI64 7914+  '\x1eed'# -> unI64 7916+  '\x1eef'# -> unI64 7918+  '\x1ef1'# -> unI64 7920+  '\x1ef3'# -> unI64 7922+  '\x1ef5'# -> unI64 7924+  '\x1ef7'# -> unI64 7926+  '\x1ef9'# -> unI64 7928+  '\x1efb'# -> unI64 7930+  '\x1efd'# -> unI64 7932+  '\x1eff'# -> unI64 7934+  '\x1f00'# -> unI64 7944+  '\x1f01'# -> unI64 7945+  '\x1f02'# -> unI64 7946+  '\x1f03'# -> unI64 7947+  '\x1f04'# -> unI64 7948+  '\x1f05'# -> unI64 7949+  '\x1f06'# -> unI64 7950+  '\x1f07'# -> unI64 7951+  '\x1f10'# -> unI64 7960+  '\x1f11'# -> unI64 7961+  '\x1f12'# -> unI64 7962+  '\x1f13'# -> unI64 7963+  '\x1f14'# -> unI64 7964+  '\x1f15'# -> unI64 7965+  '\x1f20'# -> unI64 7976+  '\x1f21'# -> unI64 7977+  '\x1f22'# -> unI64 7978+  '\x1f23'# -> unI64 7979+  '\x1f24'# -> unI64 7980+  '\x1f25'# -> unI64 7981+  '\x1f26'# -> unI64 7982+  '\x1f27'# -> unI64 7983+  '\x1f30'# -> unI64 7992+  '\x1f31'# -> unI64 7993+  '\x1f32'# -> unI64 7994+  '\x1f33'# -> unI64 7995+  '\x1f34'# -> unI64 7996+  '\x1f35'# -> unI64 7997+  '\x1f36'# -> unI64 7998+  '\x1f37'# -> unI64 7999+  '\x1f40'# -> unI64 8008+  '\x1f41'# -> unI64 8009+  '\x1f42'# -> unI64 8010+  '\x1f43'# -> unI64 8011+  '\x1f44'# -> unI64 8012+  '\x1f45'# -> unI64 8013+  '\x1f51'# -> unI64 8025+  '\x1f53'# -> unI64 8027+  '\x1f55'# -> unI64 8029+  '\x1f57'# -> unI64 8031+  '\x1f60'# -> unI64 8040+  '\x1f61'# -> unI64 8041+  '\x1f62'# -> unI64 8042+  '\x1f63'# -> unI64 8043+  '\x1f64'# -> unI64 8044+  '\x1f65'# -> unI64 8045+  '\x1f66'# -> unI64 8046+  '\x1f67'# -> unI64 8047+  '\x1f70'# -> unI64 8122+  '\x1f71'# -> unI64 8123+  '\x1f72'# -> unI64 8136+  '\x1f73'# -> unI64 8137+  '\x1f74'# -> unI64 8138+  '\x1f75'# -> unI64 8139+  '\x1f76'# -> unI64 8154+  '\x1f77'# -> unI64 8155+  '\x1f78'# -> unI64 8184+  '\x1f79'# -> unI64 8185+  '\x1f7a'# -> unI64 8170+  '\x1f7b'# -> unI64 8171+  '\x1f7c'# -> unI64 8186+  '\x1f7d'# -> unI64 8187+  '\x1f80'# -> unI64 8072+  '\x1f81'# -> unI64 8073+  '\x1f82'# -> unI64 8074+  '\x1f83'# -> unI64 8075+  '\x1f84'# -> unI64 8076+  '\x1f85'# -> unI64 8077+  '\x1f86'# -> unI64 8078+  '\x1f87'# -> unI64 8079+  '\x1f90'# -> unI64 8088+  '\x1f91'# -> unI64 8089+  '\x1f92'# -> unI64 8090+  '\x1f93'# -> unI64 8091+  '\x1f94'# -> unI64 8092+  '\x1f95'# -> unI64 8093+  '\x1f96'# -> unI64 8094+  '\x1f97'# -> unI64 8095+  '\x1fa0'# -> unI64 8104+  '\x1fa1'# -> unI64 8105+  '\x1fa2'# -> unI64 8106+  '\x1fa3'# -> unI64 8107+  '\x1fa4'# -> unI64 8108+  '\x1fa5'# -> unI64 8109+  '\x1fa6'# -> unI64 8110+  '\x1fa7'# -> unI64 8111+  '\x1fb0'# -> unI64 8120+  '\x1fb1'# -> unI64 8121+  '\x1fb3'# -> unI64 8124+  '\x1fbe'# -> unI64 921+  '\x1fc3'# -> unI64 8140+  '\x1fd0'# -> unI64 8152+  '\x1fd1'# -> unI64 8153+  '\x1fe0'# -> unI64 8168+  '\x1fe1'# -> unI64 8169+  '\x1fe5'# -> unI64 8172+  '\x1ff3'# -> unI64 8188+  '\x214e'# -> unI64 8498+  '\x2170'# -> unI64 8544+  '\x2171'# -> unI64 8545+  '\x2172'# -> unI64 8546+  '\x2173'# -> unI64 8547+  '\x2174'# -> unI64 8548+  '\x2175'# -> unI64 8549+  '\x2176'# -> unI64 8550+  '\x2177'# -> unI64 8551+  '\x2178'# -> unI64 8552+  '\x2179'# -> unI64 8553+  '\x217a'# -> unI64 8554+  '\x217b'# -> unI64 8555+  '\x217c'# -> unI64 8556+  '\x217d'# -> unI64 8557+  '\x217e'# -> unI64 8558+  '\x217f'# -> unI64 8559+  '\x2184'# -> unI64 8579+  '\x24d0'# -> unI64 9398+  '\x24d1'# -> unI64 9399+  '\x24d2'# -> unI64 9400+  '\x24d3'# -> unI64 9401+  '\x24d4'# -> unI64 9402+  '\x24d5'# -> unI64 9403+  '\x24d6'# -> unI64 9404+  '\x24d7'# -> unI64 9405+  '\x24d8'# -> unI64 9406+  '\x24d9'# -> unI64 9407+  '\x24da'# -> unI64 9408+  '\x24db'# -> unI64 9409+  '\x24dc'# -> unI64 9410+  '\x24dd'# -> unI64 9411+  '\x24de'# -> unI64 9412+  '\x24df'# -> unI64 9413+  '\x24e0'# -> unI64 9414+  '\x24e1'# -> unI64 9415+  '\x24e2'# -> unI64 9416+  '\x24e3'# -> unI64 9417+  '\x24e4'# -> unI64 9418+  '\x24e5'# -> unI64 9419+  '\x24e6'# -> unI64 9420+  '\x24e7'# -> unI64 9421+  '\x24e8'# -> unI64 9422+  '\x24e9'# -> unI64 9423+  '\x2c30'# -> unI64 11264+  '\x2c31'# -> unI64 11265+  '\x2c32'# -> unI64 11266+  '\x2c33'# -> unI64 11267+  '\x2c34'# -> unI64 11268+  '\x2c35'# -> unI64 11269+  '\x2c36'# -> unI64 11270+  '\x2c37'# -> unI64 11271+  '\x2c38'# -> unI64 11272+  '\x2c39'# -> unI64 11273+  '\x2c3a'# -> unI64 11274+  '\x2c3b'# -> unI64 11275+  '\x2c3c'# -> unI64 11276+  '\x2c3d'# -> unI64 11277+  '\x2c3e'# -> unI64 11278+  '\x2c3f'# -> unI64 11279+  '\x2c40'# -> unI64 11280+  '\x2c41'# -> unI64 11281+  '\x2c42'# -> unI64 11282+  '\x2c43'# -> unI64 11283+  '\x2c44'# -> unI64 11284+  '\x2c45'# -> unI64 11285+  '\x2c46'# -> unI64 11286+  '\x2c47'# -> unI64 11287+  '\x2c48'# -> unI64 11288+  '\x2c49'# -> unI64 11289+  '\x2c4a'# -> unI64 11290+  '\x2c4b'# -> unI64 11291+  '\x2c4c'# -> unI64 11292+  '\x2c4d'# -> unI64 11293+  '\x2c4e'# -> unI64 11294+  '\x2c4f'# -> unI64 11295+  '\x2c50'# -> unI64 11296+  '\x2c51'# -> unI64 11297+  '\x2c52'# -> unI64 11298+  '\x2c53'# -> unI64 11299+  '\x2c54'# -> unI64 11300+  '\x2c55'# -> unI64 11301+  '\x2c56'# -> unI64 11302+  '\x2c57'# -> unI64 11303+  '\x2c58'# -> unI64 11304+  '\x2c59'# -> unI64 11305+  '\x2c5a'# -> unI64 11306+  '\x2c5b'# -> unI64 11307+  '\x2c5c'# -> unI64 11308+  '\x2c5d'# -> unI64 11309+  '\x2c5e'# -> unI64 11310+  '\x2c5f'# -> unI64 11311+  '\x2c61'# -> unI64 11360+  '\x2c65'# -> unI64 570+  '\x2c66'# -> unI64 574+  '\x2c68'# -> unI64 11367+  '\x2c6a'# -> unI64 11369+  '\x2c6c'# -> unI64 11371+  '\x2c73'# -> unI64 11378+  '\x2c76'# -> unI64 11381+  '\x2c81'# -> unI64 11392+  '\x2c83'# -> unI64 11394+  '\x2c85'# -> unI64 11396+  '\x2c87'# -> unI64 11398+  '\x2c89'# -> unI64 11400+  '\x2c8b'# -> unI64 11402+  '\x2c8d'# -> unI64 11404+  '\x2c8f'# -> unI64 11406+  '\x2c91'# -> unI64 11408+  '\x2c93'# -> unI64 11410+  '\x2c95'# -> unI64 11412+  '\x2c97'# -> unI64 11414+  '\x2c99'# -> unI64 11416+  '\x2c9b'# -> unI64 11418+  '\x2c9d'# -> unI64 11420+  '\x2c9f'# -> unI64 11422+  '\x2ca1'# -> unI64 11424+  '\x2ca3'# -> unI64 11426+  '\x2ca5'# -> unI64 11428+  '\x2ca7'# -> unI64 11430+  '\x2ca9'# -> unI64 11432+  '\x2cab'# -> unI64 11434+  '\x2cad'# -> unI64 11436+  '\x2caf'# -> unI64 11438+  '\x2cb1'# -> unI64 11440+  '\x2cb3'# -> unI64 11442+  '\x2cb5'# -> unI64 11444+  '\x2cb7'# -> unI64 11446+  '\x2cb9'# -> unI64 11448+  '\x2cbb'# -> unI64 11450+  '\x2cbd'# -> unI64 11452+  '\x2cbf'# -> unI64 11454+  '\x2cc1'# -> unI64 11456+  '\x2cc3'# -> unI64 11458+  '\x2cc5'# -> unI64 11460+  '\x2cc7'# -> unI64 11462+  '\x2cc9'# -> unI64 11464+  '\x2ccb'# -> unI64 11466+  '\x2ccd'# -> unI64 11468+  '\x2ccf'# -> unI64 11470+  '\x2cd1'# -> unI64 11472+  '\x2cd3'# -> unI64 11474+  '\x2cd5'# -> unI64 11476+  '\x2cd7'# -> unI64 11478+  '\x2cd9'# -> unI64 11480+  '\x2cdb'# -> unI64 11482+  '\x2cdd'# -> unI64 11484+  '\x2cdf'# -> unI64 11486+  '\x2ce1'# -> unI64 11488+  '\x2ce3'# -> unI64 11490+  '\x2cec'# -> unI64 11499+  '\x2cee'# -> unI64 11501+  '\x2cf3'# -> unI64 11506+  '\x2d00'# -> unI64 4256+  '\x2d01'# -> unI64 4257+  '\x2d02'# -> unI64 4258+  '\x2d03'# -> unI64 4259+  '\x2d04'# -> unI64 4260+  '\x2d05'# -> unI64 4261+  '\x2d06'# -> unI64 4262+  '\x2d07'# -> unI64 4263+  '\x2d08'# -> unI64 4264+  '\x2d09'# -> unI64 4265+  '\x2d0a'# -> unI64 4266+  '\x2d0b'# -> unI64 4267+  '\x2d0c'# -> unI64 4268+  '\x2d0d'# -> unI64 4269+  '\x2d0e'# -> unI64 4270+  '\x2d0f'# -> unI64 4271+  '\x2d10'# -> unI64 4272+  '\x2d11'# -> unI64 4273+  '\x2d12'# -> unI64 4274+  '\x2d13'# -> unI64 4275+  '\x2d14'# -> unI64 4276+  '\x2d15'# -> unI64 4277+  '\x2d16'# -> unI64 4278+  '\x2d17'# -> unI64 4279+  '\x2d18'# -> unI64 4280+  '\x2d19'# -> unI64 4281+  '\x2d1a'# -> unI64 4282+  '\x2d1b'# -> unI64 4283+  '\x2d1c'# -> unI64 4284+  '\x2d1d'# -> unI64 4285+  '\x2d1e'# -> unI64 4286+  '\x2d1f'# -> unI64 4287+  '\x2d20'# -> unI64 4288+  '\x2d21'# -> unI64 4289+  '\x2d22'# -> unI64 4290+  '\x2d23'# -> unI64 4291+  '\x2d24'# -> unI64 4292+  '\x2d25'# -> unI64 4293+  '\x2d27'# -> unI64 4295+  '\x2d2d'# -> unI64 4301+  '\xa641'# -> unI64 42560+  '\xa643'# -> unI64 42562+  '\xa645'# -> unI64 42564+  '\xa647'# -> unI64 42566+  '\xa649'# -> unI64 42568+  '\xa64b'# -> unI64 42570+  '\xa64d'# -> unI64 42572+  '\xa64f'# -> unI64 42574+  '\xa651'# -> unI64 42576+  '\xa653'# -> unI64 42578+  '\xa655'# -> unI64 42580+  '\xa657'# -> unI64 42582+  '\xa659'# -> unI64 42584+  '\xa65b'# -> unI64 42586+  '\xa65d'# -> unI64 42588+  '\xa65f'# -> unI64 42590+  '\xa661'# -> unI64 42592+  '\xa663'# -> unI64 42594+  '\xa665'# -> unI64 42596+  '\xa667'# -> unI64 42598+  '\xa669'# -> unI64 42600+  '\xa66b'# -> unI64 42602+  '\xa66d'# -> unI64 42604+  '\xa681'# -> unI64 42624+  '\xa683'# -> unI64 42626+  '\xa685'# -> unI64 42628+  '\xa687'# -> unI64 42630+  '\xa689'# -> unI64 42632+  '\xa68b'# -> unI64 42634+  '\xa68d'# -> unI64 42636+  '\xa68f'# -> unI64 42638+  '\xa691'# -> unI64 42640+  '\xa693'# -> unI64 42642+  '\xa695'# -> unI64 42644+  '\xa697'# -> unI64 42646+  '\xa699'# -> unI64 42648+  '\xa69b'# -> unI64 42650+  '\xa723'# -> unI64 42786+  '\xa725'# -> unI64 42788+  '\xa727'# -> unI64 42790+  '\xa729'# -> unI64 42792+  '\xa72b'# -> unI64 42794+  '\xa72d'# -> unI64 42796+  '\xa72f'# -> unI64 42798+  '\xa733'# -> unI64 42802+  '\xa735'# -> unI64 42804+  '\xa737'# -> unI64 42806+  '\xa739'# -> unI64 42808+  '\xa73b'# -> unI64 42810+  '\xa73d'# -> unI64 42812+  '\xa73f'# -> unI64 42814+  '\xa741'# -> unI64 42816+  '\xa743'# -> unI64 42818+  '\xa745'# -> unI64 42820+  '\xa747'# -> unI64 42822+  '\xa749'# -> unI64 42824+  '\xa74b'# -> unI64 42826+  '\xa74d'# -> unI64 42828+  '\xa74f'# -> unI64 42830+  '\xa751'# -> unI64 42832+  '\xa753'# -> unI64 42834+  '\xa755'# -> unI64 42836+  '\xa757'# -> unI64 42838+  '\xa759'# -> unI64 42840+  '\xa75b'# -> unI64 42842+  '\xa75d'# -> unI64 42844+  '\xa75f'# -> unI64 42846+  '\xa761'# -> unI64 42848+  '\xa763'# -> unI64 42850+  '\xa765'# -> unI64 42852+  '\xa767'# -> unI64 42854+  '\xa769'# -> unI64 42856+  '\xa76b'# -> unI64 42858+  '\xa76d'# -> unI64 42860+  '\xa76f'# -> unI64 42862+  '\xa77a'# -> unI64 42873+  '\xa77c'# -> unI64 42875+  '\xa77f'# -> unI64 42878+  '\xa781'# -> unI64 42880+  '\xa783'# -> unI64 42882+  '\xa785'# -> unI64 42884+  '\xa787'# -> unI64 42886+  '\xa78c'# -> unI64 42891+  '\xa791'# -> unI64 42896+  '\xa793'# -> unI64 42898+  '\xa794'# -> unI64 42948+  '\xa797'# -> unI64 42902+  '\xa799'# -> unI64 42904+  '\xa79b'# -> unI64 42906+  '\xa79d'# -> unI64 42908+  '\xa79f'# -> unI64 42910+  '\xa7a1'# -> unI64 42912+  '\xa7a3'# -> unI64 42914+  '\xa7a5'# -> unI64 42916+  '\xa7a7'# -> unI64 42918+  '\xa7a9'# -> unI64 42920+  '\xa7b5'# -> unI64 42932+  '\xa7b7'# -> unI64 42934+  '\xa7b9'# -> unI64 42936+  '\xa7bb'# -> unI64 42938+  '\xa7bd'# -> unI64 42940+  '\xa7bf'# -> unI64 42942+  '\xa7c1'# -> unI64 42944+  '\xa7c3'# -> unI64 42946+  '\xa7c8'# -> unI64 42951+  '\xa7ca'# -> unI64 42953+  '\xa7d1'# -> unI64 42960+  '\xa7d7'# -> unI64 42966+  '\xa7d9'# -> unI64 42968+  '\xa7f6'# -> unI64 42997+  '\xab53'# -> unI64 42931+  '\xab70'# -> unI64 5024+  '\xab71'# -> unI64 5025+  '\xab72'# -> unI64 5026+  '\xab73'# -> unI64 5027+  '\xab74'# -> unI64 5028+  '\xab75'# -> unI64 5029+  '\xab76'# -> unI64 5030+  '\xab77'# -> unI64 5031+  '\xab78'# -> unI64 5032+  '\xab79'# -> unI64 5033+  '\xab7a'# -> unI64 5034+  '\xab7b'# -> unI64 5035+  '\xab7c'# -> unI64 5036+  '\xab7d'# -> unI64 5037+  '\xab7e'# -> unI64 5038+  '\xab7f'# -> unI64 5039+  '\xab80'# -> unI64 5040+  '\xab81'# -> unI64 5041+  '\xab82'# -> unI64 5042+  '\xab83'# -> unI64 5043+  '\xab84'# -> unI64 5044+  '\xab85'# -> unI64 5045+  '\xab86'# -> unI64 5046+  '\xab87'# -> unI64 5047+  '\xab88'# -> unI64 5048+  '\xab89'# -> unI64 5049+  '\xab8a'# -> unI64 5050+  '\xab8b'# -> unI64 5051+  '\xab8c'# -> unI64 5052+  '\xab8d'# -> unI64 5053+  '\xab8e'# -> unI64 5054+  '\xab8f'# -> unI64 5055+  '\xab90'# -> unI64 5056+  '\xab91'# -> unI64 5057+  '\xab92'# -> unI64 5058+  '\xab93'# -> unI64 5059+  '\xab94'# -> unI64 5060+  '\xab95'# -> unI64 5061+  '\xab96'# -> unI64 5062+  '\xab97'# -> unI64 5063+  '\xab98'# -> unI64 5064+  '\xab99'# -> unI64 5065+  '\xab9a'# -> unI64 5066+  '\xab9b'# -> unI64 5067+  '\xab9c'# -> unI64 5068+  '\xab9d'# -> unI64 5069+  '\xab9e'# -> unI64 5070+  '\xab9f'# -> unI64 5071+  '\xaba0'# -> unI64 5072+  '\xaba1'# -> unI64 5073+  '\xaba2'# -> unI64 5074+  '\xaba3'# -> unI64 5075+  '\xaba4'# -> unI64 5076+  '\xaba5'# -> unI64 5077+  '\xaba6'# -> unI64 5078+  '\xaba7'# -> unI64 5079+  '\xaba8'# -> unI64 5080+  '\xaba9'# -> unI64 5081+  '\xabaa'# -> unI64 5082+  '\xabab'# -> unI64 5083+  '\xabac'# -> unI64 5084+  '\xabad'# -> unI64 5085+  '\xabae'# -> unI64 5086+  '\xabaf'# -> unI64 5087+  '\xabb0'# -> unI64 5088+  '\xabb1'# -> unI64 5089+  '\xabb2'# -> unI64 5090+  '\xabb3'# -> unI64 5091+  '\xabb4'# -> unI64 5092+  '\xabb5'# -> unI64 5093+  '\xabb6'# -> unI64 5094+  '\xabb7'# -> unI64 5095+  '\xabb8'# -> unI64 5096+  '\xabb9'# -> unI64 5097+  '\xabba'# -> unI64 5098+  '\xabbb'# -> unI64 5099+  '\xabbc'# -> unI64 5100+  '\xabbd'# -> unI64 5101+  '\xabbe'# -> unI64 5102+  '\xabbf'# -> unI64 5103+  '\xff41'# -> unI64 65313+  '\xff42'# -> unI64 65314+  '\xff43'# -> unI64 65315+  '\xff44'# -> unI64 65316+  '\xff45'# -> unI64 65317+  '\xff46'# -> unI64 65318+  '\xff47'# -> unI64 65319+  '\xff48'# -> unI64 65320+  '\xff49'# -> unI64 65321+  '\xff4a'# -> unI64 65322+  '\xff4b'# -> unI64 65323+  '\xff4c'# -> unI64 65324+  '\xff4d'# -> unI64 65325+  '\xff4e'# -> unI64 65326+  '\xff4f'# -> unI64 65327+  '\xff50'# -> unI64 65328+  '\xff51'# -> unI64 65329+  '\xff52'# -> unI64 65330+  '\xff53'# -> unI64 65331+  '\xff54'# -> unI64 65332+  '\xff55'# -> unI64 65333+  '\xff56'# -> unI64 65334+  '\xff57'# -> unI64 65335+  '\xff58'# -> unI64 65336+  '\xff59'# -> unI64 65337+  '\xff5a'# -> unI64 65338+  '\x10428'# -> unI64 66560+  '\x10429'# -> unI64 66561+  '\x1042a'# -> unI64 66562+  '\x1042b'# -> unI64 66563+  '\x1042c'# -> unI64 66564+  '\x1042d'# -> unI64 66565+  '\x1042e'# -> unI64 66566+  '\x1042f'# -> unI64 66567+  '\x10430'# -> unI64 66568+  '\x10431'# -> unI64 66569+  '\x10432'# -> unI64 66570+  '\x10433'# -> unI64 66571+  '\x10434'# -> unI64 66572+  '\x10435'# -> unI64 66573+  '\x10436'# -> unI64 66574+  '\x10437'# -> unI64 66575+  '\x10438'# -> unI64 66576+  '\x10439'# -> unI64 66577+  '\x1043a'# -> unI64 66578+  '\x1043b'# -> unI64 66579+  '\x1043c'# -> unI64 66580+  '\x1043d'# -> unI64 66581+  '\x1043e'# -> unI64 66582+  '\x1043f'# -> unI64 66583+  '\x10440'# -> unI64 66584+  '\x10441'# -> unI64 66585+  '\x10442'# -> unI64 66586+  '\x10443'# -> unI64 66587+  '\x10444'# -> unI64 66588+  '\x10445'# -> unI64 66589+  '\x10446'# -> unI64 66590+  '\x10447'# -> unI64 66591+  '\x10448'# -> unI64 66592+  '\x10449'# -> unI64 66593+  '\x1044a'# -> unI64 66594+  '\x1044b'# -> unI64 66595+  '\x1044c'# -> unI64 66596+  '\x1044d'# -> unI64 66597+  '\x1044e'# -> unI64 66598+  '\x1044f'# -> unI64 66599+  '\x104d8'# -> unI64 66736+  '\x104d9'# -> unI64 66737+  '\x104da'# -> unI64 66738+  '\x104db'# -> unI64 66739+  '\x104dc'# -> unI64 66740+  '\x104dd'# -> unI64 66741+  '\x104de'# -> unI64 66742+  '\x104df'# -> unI64 66743+  '\x104e0'# -> unI64 66744+  '\x104e1'# -> unI64 66745+  '\x104e2'# -> unI64 66746+  '\x104e3'# -> unI64 66747+  '\x104e4'# -> unI64 66748+  '\x104e5'# -> unI64 66749+  '\x104e6'# -> unI64 66750+  '\x104e7'# -> unI64 66751+  '\x104e8'# -> unI64 66752+  '\x104e9'# -> unI64 66753+  '\x104ea'# -> unI64 66754+  '\x104eb'# -> unI64 66755+  '\x104ec'# -> unI64 66756+  '\x104ed'# -> unI64 66757+  '\x104ee'# -> unI64 66758+  '\x104ef'# -> unI64 66759+  '\x104f0'# -> unI64 66760+  '\x104f1'# -> unI64 66761+  '\x104f2'# -> unI64 66762+  '\x104f3'# -> unI64 66763+  '\x104f4'# -> unI64 66764+  '\x104f5'# -> unI64 66765+  '\x104f6'# -> unI64 66766+  '\x104f7'# -> unI64 66767+  '\x104f8'# -> unI64 66768+  '\x104f9'# -> unI64 66769+  '\x104fa'# -> unI64 66770+  '\x104fb'# -> unI64 66771+  '\x10597'# -> unI64 66928+  '\x10598'# -> unI64 66929+  '\x10599'# -> unI64 66930+  '\x1059a'# -> unI64 66931+  '\x1059b'# -> unI64 66932+  '\x1059c'# -> unI64 66933+  '\x1059d'# -> unI64 66934+  '\x1059e'# -> unI64 66935+  '\x1059f'# -> unI64 66936+  '\x105a0'# -> unI64 66937+  '\x105a1'# -> unI64 66938+  '\x105a3'# -> unI64 66940+  '\x105a4'# -> unI64 66941+  '\x105a5'# -> unI64 66942+  '\x105a6'# -> unI64 66943+  '\x105a7'# -> unI64 66944+  '\x105a8'# -> unI64 66945+  '\x105a9'# -> unI64 66946+  '\x105aa'# -> unI64 66947+  '\x105ab'# -> unI64 66948+  '\x105ac'# -> unI64 66949+  '\x105ad'# -> unI64 66950+  '\x105ae'# -> unI64 66951+  '\x105af'# -> unI64 66952+  '\x105b0'# -> unI64 66953+  '\x105b1'# -> unI64 66954+  '\x105b3'# -> unI64 66956+  '\x105b4'# -> unI64 66957+  '\x105b5'# -> unI64 66958+  '\x105b6'# -> unI64 66959+  '\x105b7'# -> unI64 66960+  '\x105b8'# -> unI64 66961+  '\x105b9'# -> unI64 66962+  '\x105bb'# -> unI64 66964+  '\x105bc'# -> unI64 66965+  '\x10cc0'# -> unI64 68736+  '\x10cc1'# -> unI64 68737+  '\x10cc2'# -> unI64 68738+  '\x10cc3'# -> unI64 68739+  '\x10cc4'# -> unI64 68740+  '\x10cc5'# -> unI64 68741+  '\x10cc6'# -> unI64 68742+  '\x10cc7'# -> unI64 68743+  '\x10cc8'# -> unI64 68744+  '\x10cc9'# -> unI64 68745+  '\x10cca'# -> unI64 68746+  '\x10ccb'# -> unI64 68747+  '\x10ccc'# -> unI64 68748+  '\x10ccd'# -> unI64 68749+  '\x10cce'# -> unI64 68750+  '\x10ccf'# -> unI64 68751+  '\x10cd0'# -> unI64 68752+  '\x10cd1'# -> unI64 68753+  '\x10cd2'# -> unI64 68754+  '\x10cd3'# -> unI64 68755+  '\x10cd4'# -> unI64 68756+  '\x10cd5'# -> unI64 68757+  '\x10cd6'# -> unI64 68758+  '\x10cd7'# -> unI64 68759+  '\x10cd8'# -> unI64 68760+  '\x10cd9'# -> unI64 68761+  '\x10cda'# -> unI64 68762+  '\x10cdb'# -> unI64 68763+  '\x10cdc'# -> unI64 68764+  '\x10cdd'# -> unI64 68765+  '\x10cde'# -> unI64 68766+  '\x10cdf'# -> unI64 68767+  '\x10ce0'# -> unI64 68768+  '\x10ce1'# -> unI64 68769+  '\x10ce2'# -> unI64 68770+  '\x10ce3'# -> unI64 68771+  '\x10ce4'# -> unI64 68772+  '\x10ce5'# -> unI64 68773+  '\x10ce6'# -> unI64 68774+  '\x10ce7'# -> unI64 68775+  '\x10ce8'# -> unI64 68776+  '\x10ce9'# -> unI64 68777+  '\x10cea'# -> unI64 68778+  '\x10ceb'# -> unI64 68779+  '\x10cec'# -> unI64 68780+  '\x10ced'# -> unI64 68781+  '\x10cee'# -> unI64 68782+  '\x10cef'# -> unI64 68783+  '\x10cf0'# -> unI64 68784+  '\x10cf1'# -> unI64 68785+  '\x10cf2'# -> unI64 68786+  '\x118c0'# -> unI64 71840+  '\x118c1'# -> unI64 71841+  '\x118c2'# -> unI64 71842+  '\x118c3'# -> unI64 71843+  '\x118c4'# -> unI64 71844+  '\x118c5'# -> unI64 71845+  '\x118c6'# -> unI64 71846+  '\x118c7'# -> unI64 71847+  '\x118c8'# -> unI64 71848+  '\x118c9'# -> unI64 71849+  '\x118ca'# -> unI64 71850+  '\x118cb'# -> unI64 71851+  '\x118cc'# -> unI64 71852+  '\x118cd'# -> unI64 71853+  '\x118ce'# -> unI64 71854+  '\x118cf'# -> unI64 71855+  '\x118d0'# -> unI64 71856+  '\x118d1'# -> unI64 71857+  '\x118d2'# -> unI64 71858+  '\x118d3'# -> unI64 71859+  '\x118d4'# -> unI64 71860+  '\x118d5'# -> unI64 71861+  '\x118d6'# -> unI64 71862+  '\x118d7'# -> unI64 71863+  '\x118d8'# -> unI64 71864+  '\x118d9'# -> unI64 71865+  '\x118da'# -> unI64 71866+  '\x118db'# -> unI64 71867+  '\x118dc'# -> unI64 71868+  '\x118dd'# -> unI64 71869+  '\x118de'# -> unI64 71870+  '\x118df'# -> unI64 71871+  '\x16e60'# -> unI64 93760+  '\x16e61'# -> unI64 93761+  '\x16e62'# -> unI64 93762+  '\x16e63'# -> unI64 93763+  '\x16e64'# -> unI64 93764+  '\x16e65'# -> unI64 93765+  '\x16e66'# -> unI64 93766+  '\x16e67'# -> unI64 93767+  '\x16e68'# -> unI64 93768+  '\x16e69'# -> unI64 93769+  '\x16e6a'# -> unI64 93770+  '\x16e6b'# -> unI64 93771+  '\x16e6c'# -> unI64 93772+  '\x16e6d'# -> unI64 93773+  '\x16e6e'# -> unI64 93774+  '\x16e6f'# -> unI64 93775+  '\x16e70'# -> unI64 93776+  '\x16e71'# -> unI64 93777+  '\x16e72'# -> unI64 93778+  '\x16e73'# -> unI64 93779+  '\x16e74'# -> unI64 93780+  '\x16e75'# -> unI64 93781+  '\x16e76'# -> unI64 93782+  '\x16e77'# -> unI64 93783+  '\x16e78'# -> unI64 93784+  '\x16e79'# -> unI64 93785+  '\x16e7a'# -> unI64 93786+  '\x16e7b'# -> unI64 93787+  '\x16e7c'# -> unI64 93788+  '\x16e7d'# -> unI64 93789+  '\x16e7e'# -> unI64 93790+  '\x16e7f'# -> unI64 93791+  '\x1e922'# -> unI64 125184+  '\x1e923'# -> unI64 125185+  '\x1e924'# -> unI64 125186+  '\x1e925'# -> unI64 125187+  '\x1e926'# -> unI64 125188+  '\x1e927'# -> unI64 125189+  '\x1e928'# -> unI64 125190+  '\x1e929'# -> unI64 125191+  '\x1e92a'# -> unI64 125192+  '\x1e92b'# -> unI64 125193+  '\x1e92c'# -> unI64 125194+  '\x1e92d'# -> unI64 125195+  '\x1e92e'# -> unI64 125196+  '\x1e92f'# -> unI64 125197+  '\x1e930'# -> unI64 125198+  '\x1e931'# -> unI64 125199+  '\x1e932'# -> unI64 125200+  '\x1e933'# -> unI64 125201+  '\x1e934'# -> unI64 125202+  '\x1e935'# -> unI64 125203+  '\x1e936'# -> unI64 125204+  '\x1e937'# -> unI64 125205+  '\x1e938'# -> unI64 125206+  '\x1e939'# -> unI64 125207+  '\x1e93a'# -> unI64 125208+  '\x1e93b'# -> unI64 125209+  '\x1e93c'# -> unI64 125210+  '\x1e93d'# -> unI64 125211+  '\x1e93e'# -> unI64 125212+  '\x1e93f'# -> unI64 125213+  '\x1e940'# -> unI64 125214+  '\x1e941'# -> unI64 125215+  '\x1e942'# -> unI64 125216+  '\x1e943'# -> unI64 125217+  _ -> unI64 0+foldMapping :: Char# -> _ {- unboxed Int64 -}+{-# NOINLINE foldMapping #-}+foldMapping = \case+  -- LATIN CAPITAL LETTER A+  '\x0041'# -> unI64 97+  -- LATIN CAPITAL LETTER B+  '\x0042'# -> unI64 98+  -- LATIN CAPITAL LETTER C+  '\x0043'# -> unI64 99+  -- LATIN CAPITAL LETTER D+  '\x0044'# -> unI64 100+  -- LATIN CAPITAL LETTER E+  '\x0045'# -> unI64 101+  -- LATIN CAPITAL LETTER F+  '\x0046'# -> unI64 102+  -- LATIN CAPITAL LETTER G+  '\x0047'# -> unI64 103+  -- LATIN CAPITAL LETTER H+  '\x0048'# -> unI64 104+  -- LATIN CAPITAL LETTER I+  '\x0049'# -> unI64 105+  -- LATIN CAPITAL LETTER J+  '\x004a'# -> unI64 106+  -- LATIN CAPITAL LETTER K+  '\x004b'# -> unI64 107+  -- LATIN CAPITAL LETTER L+  '\x004c'# -> unI64 108+  -- LATIN CAPITAL LETTER M+  '\x004d'# -> unI64 109+  -- LATIN CAPITAL LETTER N+  '\x004e'# -> unI64 110+  -- LATIN CAPITAL LETTER O+  '\x004f'# -> unI64 111+  -- LATIN CAPITAL LETTER P+  '\x0050'# -> unI64 112+  -- LATIN CAPITAL LETTER Q+  '\x0051'# -> unI64 113+  -- LATIN CAPITAL LETTER R+  '\x0052'# -> unI64 114+  -- LATIN CAPITAL LETTER S+  '\x0053'# -> unI64 115+  -- LATIN CAPITAL LETTER T+  '\x0054'# -> unI64 116+  -- LATIN CAPITAL LETTER U+  '\x0055'# -> unI64 117+  -- LATIN CAPITAL LETTER V+  '\x0056'# -> unI64 118+  -- LATIN CAPITAL LETTER W+  '\x0057'# -> unI64 119+  -- LATIN CAPITAL LETTER X+  '\x0058'# -> unI64 120+  -- LATIN CAPITAL LETTER Y+  '\x0059'# -> unI64 121+  -- LATIN CAPITAL LETTER Z+  '\x005a'# -> unI64 122+  -- MICRO SIGN+  '\x00b5'# -> unI64 956+  -- LATIN CAPITAL LETTER A WITH GRAVE+  '\x00c0'# -> unI64 224+  -- LATIN CAPITAL LETTER A WITH ACUTE+  '\x00c1'# -> unI64 225+  -- LATIN CAPITAL LETTER A WITH CIRCUMFLEX+  '\x00c2'# -> unI64 226+  -- LATIN CAPITAL LETTER A WITH TILDE+  '\x00c3'# -> unI64 227+  -- LATIN CAPITAL LETTER A WITH DIAERESIS+  '\x00c4'# -> unI64 228+  -- LATIN CAPITAL LETTER A WITH RING ABOVE+  '\x00c5'# -> unI64 229+  -- LATIN CAPITAL LETTER AE+  '\x00c6'# -> unI64 230+  -- LATIN CAPITAL LETTER C WITH CEDILLA+  '\x00c7'# -> unI64 231+  -- LATIN CAPITAL LETTER E WITH GRAVE+  '\x00c8'# -> unI64 232+  -- LATIN CAPITAL LETTER E WITH ACUTE+  '\x00c9'# -> unI64 233+  -- LATIN CAPITAL LETTER E WITH CIRCUMFLEX+  '\x00ca'# -> unI64 234+  -- LATIN CAPITAL LETTER E WITH DIAERESIS+  '\x00cb'# -> unI64 235+  -- LATIN CAPITAL LETTER I WITH GRAVE+  '\x00cc'# -> unI64 236+  -- LATIN CAPITAL LETTER I WITH ACUTE+  '\x00cd'# -> unI64 237+  -- LATIN CAPITAL LETTER I WITH CIRCUMFLEX+  '\x00ce'# -> unI64 238+  -- LATIN CAPITAL LETTER I WITH DIAERESIS+  '\x00cf'# -> unI64 239+  -- LATIN CAPITAL LETTER ETH+  '\x00d0'# -> unI64 240+  -- LATIN CAPITAL LETTER N WITH TILDE+  '\x00d1'# -> unI64 241+  -- LATIN CAPITAL LETTER O WITH GRAVE+  '\x00d2'# -> unI64 242+  -- LATIN CAPITAL LETTER O WITH ACUTE+  '\x00d3'# -> unI64 243+  -- LATIN CAPITAL LETTER O WITH CIRCUMFLEX+  '\x00d4'# -> unI64 244+  -- LATIN CAPITAL LETTER O WITH TILDE+  '\x00d5'# -> unI64 245+  -- LATIN CAPITAL LETTER O WITH DIAERESIS+  '\x00d6'# -> unI64 246+  -- LATIN CAPITAL LETTER O WITH STROKE+  '\x00d8'# -> unI64 248+  -- LATIN CAPITAL LETTER U WITH GRAVE+  '\x00d9'# -> unI64 249+  -- LATIN CAPITAL LETTER U WITH ACUTE+  '\x00da'# -> unI64 250+  -- LATIN CAPITAL LETTER U WITH CIRCUMFLEX+  '\x00db'# -> unI64 251+  -- LATIN CAPITAL LETTER U WITH DIAERESIS+  '\x00dc'# -> unI64 252+  -- LATIN CAPITAL LETTER Y WITH ACUTE+  '\x00dd'# -> unI64 253+  -- LATIN CAPITAL LETTER THORN+  '\x00de'# -> unI64 254+  -- LATIN SMALL LETTER SHARP S+  '\x00df'# -> unI64 241172595+  -- LATIN CAPITAL LETTER A WITH MACRON+  '\x0100'# -> unI64 257+  -- LATIN CAPITAL LETTER A WITH BREVE+  '\x0102'# -> unI64 259+  -- LATIN CAPITAL LETTER A WITH OGONEK+  '\x0104'# -> unI64 261+  -- LATIN CAPITAL LETTER C WITH ACUTE+  '\x0106'# -> unI64 263+  -- LATIN CAPITAL LETTER C WITH CIRCUMFLEX+  '\x0108'# -> unI64 265+  -- LATIN CAPITAL LETTER C WITH DOT ABOVE+  '\x010a'# -> unI64 267+  -- LATIN CAPITAL LETTER C WITH CARON+  '\x010c'# -> unI64 269+  -- LATIN CAPITAL LETTER D WITH CARON+  '\x010e'# -> unI64 271+  -- LATIN CAPITAL LETTER D WITH STROKE+  '\x0110'# -> unI64 273+  -- LATIN CAPITAL LETTER E WITH MACRON+  '\x0112'# -> unI64 275+  -- LATIN CAPITAL LETTER E WITH BREVE+  '\x0114'# -> unI64 277+  -- LATIN CAPITAL LETTER E WITH DOT ABOVE+  '\x0116'# -> unI64 279+  -- LATIN CAPITAL LETTER E WITH OGONEK+  '\x0118'# -> unI64 281+  -- LATIN CAPITAL LETTER E WITH CARON+  '\x011a'# -> unI64 283+  -- LATIN CAPITAL LETTER G WITH CIRCUMFLEX+  '\x011c'# -> unI64 285+  -- LATIN CAPITAL LETTER G WITH BREVE+  '\x011e'# -> unI64 287+  -- LATIN CAPITAL LETTER G WITH DOT ABOVE+  '\x0120'# -> unI64 289+  -- LATIN CAPITAL LETTER G WITH CEDILLA+  '\x0122'# -> unI64 291+  -- LATIN CAPITAL LETTER H WITH CIRCUMFLEX+  '\x0124'# -> unI64 293+  -- LATIN CAPITAL LETTER H WITH STROKE+  '\x0126'# -> unI64 295+  -- LATIN CAPITAL LETTER I WITH TILDE+  '\x0128'# -> unI64 297+  -- LATIN CAPITAL LETTER I WITH MACRON+  '\x012a'# -> unI64 299+  -- LATIN CAPITAL LETTER I WITH BREVE+  '\x012c'# -> unI64 301+  -- LATIN CAPITAL LETTER I WITH OGONEK+  '\x012e'# -> unI64 303+  -- LATIN CAPITAL LETTER I WITH DOT ABOVE+  '\x0130'# -> unI64 1625292905+  -- LATIN CAPITAL LIGATURE IJ+  '\x0132'# -> unI64 307+  -- LATIN CAPITAL LETTER J WITH CIRCUMFLEX+  '\x0134'# -> unI64 309+  -- LATIN CAPITAL LETTER K WITH CEDILLA+  '\x0136'# -> unI64 311+  -- LATIN CAPITAL LETTER L WITH ACUTE+  '\x0139'# -> unI64 314+  -- LATIN CAPITAL LETTER L WITH CEDILLA+  '\x013b'# -> unI64 316+  -- LATIN CAPITAL LETTER L WITH CARON+  '\x013d'# -> unI64 318+  -- LATIN CAPITAL LETTER L WITH MIDDLE DOT+  '\x013f'# -> unI64 320+  -- LATIN CAPITAL LETTER L WITH STROKE+  '\x0141'# -> unI64 322+  -- LATIN CAPITAL LETTER N WITH ACUTE+  '\x0143'# -> unI64 324+  -- LATIN CAPITAL LETTER N WITH CEDILLA+  '\x0145'# -> unI64 326+  -- LATIN CAPITAL LETTER N WITH CARON+  '\x0147'# -> unI64 328+  -- LATIN SMALL LETTER N PRECEDED BY APOSTROPHE+  '\x0149'# -> unI64 230687420+  -- LATIN CAPITAL LETTER ENG+  '\x014a'# -> unI64 331+  -- LATIN CAPITAL LETTER O WITH MACRON+  '\x014c'# -> unI64 333+  -- LATIN CAPITAL LETTER O WITH BREVE+  '\x014e'# -> unI64 335+  -- LATIN CAPITAL LETTER O WITH DOUBLE ACUTE+  '\x0150'# -> unI64 337+  -- LATIN CAPITAL LIGATURE OE+  '\x0152'# -> unI64 339+  -- LATIN CAPITAL LETTER R WITH ACUTE+  '\x0154'# -> unI64 341+  -- LATIN CAPITAL LETTER R WITH CEDILLA+  '\x0156'# -> unI64 343+  -- LATIN CAPITAL LETTER R WITH CARON+  '\x0158'# -> unI64 345+  -- LATIN CAPITAL LETTER S WITH ACUTE+  '\x015a'# -> unI64 347+  -- LATIN CAPITAL LETTER S WITH CIRCUMFLEX+  '\x015c'# -> unI64 349+  -- LATIN CAPITAL LETTER S WITH CEDILLA+  '\x015e'# -> unI64 351+  -- LATIN CAPITAL LETTER S WITH CARON+  '\x0160'# -> unI64 353+  -- LATIN CAPITAL LETTER T WITH CEDILLA+  '\x0162'# -> unI64 355+  -- LATIN CAPITAL LETTER T WITH CARON+  '\x0164'# -> unI64 357+  -- LATIN CAPITAL LETTER T WITH STROKE+  '\x0166'# -> unI64 359+  -- LATIN CAPITAL LETTER U WITH TILDE+  '\x0168'# -> unI64 361+  -- LATIN CAPITAL LETTER U WITH MACRON+  '\x016a'# -> unI64 363+  -- LATIN CAPITAL LETTER U WITH BREVE+  '\x016c'# -> unI64 365+  -- LATIN CAPITAL LETTER U WITH RING ABOVE+  '\x016e'# -> unI64 367+  -- LATIN CAPITAL LETTER U WITH DOUBLE ACUTE+  '\x0170'# -> unI64 369+  -- LATIN CAPITAL LETTER U WITH OGONEK+  '\x0172'# -> unI64 371+  -- LATIN CAPITAL LETTER W WITH CIRCUMFLEX+  '\x0174'# -> unI64 373+  -- LATIN CAPITAL LETTER Y WITH CIRCUMFLEX+  '\x0176'# -> unI64 375+  -- LATIN CAPITAL LETTER Y WITH DIAERESIS+  '\x0178'# -> unI64 255+  -- LATIN CAPITAL LETTER Z WITH ACUTE+  '\x0179'# -> unI64 378+  -- LATIN CAPITAL LETTER Z WITH DOT ABOVE+  '\x017b'# -> unI64 380+  -- LATIN CAPITAL LETTER Z WITH CARON+  '\x017d'# -> unI64 382+  -- LATIN SMALL LETTER LONG S+  '\x017f'# -> unI64 115+  -- LATIN CAPITAL LETTER B WITH HOOK+  '\x0181'# -> unI64 595+  -- LATIN CAPITAL LETTER B WITH TOPBAR+  '\x0182'# -> unI64 387+  -- LATIN CAPITAL LETTER TONE SIX+  '\x0184'# -> unI64 389+  -- LATIN CAPITAL LETTER OPEN O+  '\x0186'# -> unI64 596+  -- LATIN CAPITAL LETTER C WITH HOOK+  '\x0187'# -> unI64 392+  -- LATIN CAPITAL LETTER AFRICAN D+  '\x0189'# -> unI64 598+  -- LATIN CAPITAL LETTER D WITH HOOK+  '\x018a'# -> unI64 599+  -- LATIN CAPITAL LETTER D WITH TOPBAR+  '\x018b'# -> unI64 396+  -- LATIN CAPITAL LETTER REVERSED E+  '\x018e'# -> unI64 477+  -- LATIN CAPITAL LETTER SCHWA+  '\x018f'# -> unI64 601+  -- LATIN CAPITAL LETTER OPEN E+  '\x0190'# -> unI64 603+  -- LATIN CAPITAL LETTER F WITH HOOK+  '\x0191'# -> unI64 402+  -- LATIN CAPITAL LETTER G WITH HOOK+  '\x0193'# -> unI64 608+  -- LATIN CAPITAL LETTER GAMMA+  '\x0194'# -> unI64 611+  -- LATIN CAPITAL LETTER IOTA+  '\x0196'# -> unI64 617+  -- LATIN CAPITAL LETTER I WITH STROKE+  '\x0197'# -> unI64 616+  -- LATIN CAPITAL LETTER K WITH HOOK+  '\x0198'# -> unI64 409+  -- LATIN CAPITAL LETTER TURNED M+  '\x019c'# -> unI64 623+  -- LATIN CAPITAL LETTER N WITH LEFT HOOK+  '\x019d'# -> unI64 626+  -- LATIN CAPITAL LETTER O WITH MIDDLE TILDE+  '\x019f'# -> unI64 629+  -- LATIN CAPITAL LETTER O WITH HORN+  '\x01a0'# -> unI64 417+  -- LATIN CAPITAL LETTER OI+  '\x01a2'# -> unI64 419+  -- LATIN CAPITAL LETTER P WITH HOOK+  '\x01a4'# -> unI64 421+  -- LATIN LETTER YR+  '\x01a6'# -> unI64 640+  -- LATIN CAPITAL LETTER TONE TWO+  '\x01a7'# -> unI64 424+  -- LATIN CAPITAL LETTER ESH+  '\x01a9'# -> unI64 643+  -- LATIN CAPITAL LETTER T WITH HOOK+  '\x01ac'# -> unI64 429+  -- LATIN CAPITAL LETTER T WITH RETROFLEX HOOK+  '\x01ae'# -> unI64 648+  -- LATIN CAPITAL LETTER U WITH HORN+  '\x01af'# -> unI64 432+  -- LATIN CAPITAL LETTER UPSILON+  '\x01b1'# -> unI64 650+  -- LATIN CAPITAL LETTER V WITH HOOK+  '\x01b2'# -> unI64 651+  -- LATIN CAPITAL LETTER Y WITH HOOK+  '\x01b3'# -> unI64 436+  -- LATIN CAPITAL LETTER Z WITH STROKE+  '\x01b5'# -> unI64 438+  -- LATIN CAPITAL LETTER EZH+  '\x01b7'# -> unI64 658+  -- LATIN CAPITAL LETTER EZH REVERSED+  '\x01b8'# -> unI64 441+  -- LATIN CAPITAL LETTER TONE FIVE+  '\x01bc'# -> unI64 445+  -- LATIN CAPITAL LETTER DZ WITH CARON+  '\x01c4'# -> unI64 454+  -- LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON+  '\x01c5'# -> unI64 454+  -- LATIN CAPITAL LETTER LJ+  '\x01c7'# -> unI64 457+  -- LATIN CAPITAL LETTER L WITH SMALL LETTER J+  '\x01c8'# -> unI64 457+  -- LATIN CAPITAL LETTER NJ+  '\x01ca'# -> unI64 460+  -- LATIN CAPITAL LETTER N WITH SMALL LETTER J+  '\x01cb'# -> unI64 460+  -- LATIN CAPITAL LETTER A WITH CARON+  '\x01cd'# -> unI64 462+  -- LATIN CAPITAL LETTER I WITH CARON+  '\x01cf'# -> unI64 464+  -- LATIN CAPITAL LETTER O WITH CARON+  '\x01d1'# -> unI64 466+  -- LATIN CAPITAL LETTER U WITH CARON+  '\x01d3'# -> unI64 468+  -- LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON+  '\x01d5'# -> unI64 470+  -- LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE+  '\x01d7'# -> unI64 472+  -- LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON+  '\x01d9'# -> unI64 474+  -- LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE+  '\x01db'# -> unI64 476+  -- LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON+  '\x01de'# -> unI64 479+  -- LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON+  '\x01e0'# -> unI64 481+  -- LATIN CAPITAL LETTER AE WITH MACRON+  '\x01e2'# -> unI64 483+  -- LATIN CAPITAL LETTER G WITH STROKE+  '\x01e4'# -> unI64 485+  -- LATIN CAPITAL LETTER G WITH CARON+  '\x01e6'# -> unI64 487+  -- LATIN CAPITAL LETTER K WITH CARON+  '\x01e8'# -> unI64 489+  -- LATIN CAPITAL LETTER O WITH OGONEK+  '\x01ea'# -> unI64 491+  -- LATIN CAPITAL LETTER O WITH OGONEK AND MACRON+  '\x01ec'# -> unI64 493+  -- LATIN CAPITAL LETTER EZH WITH CARON+  '\x01ee'# -> unI64 495+  -- LATIN SMALL LETTER J WITH CARON+  '\x01f0'# -> unI64 1635778666+  -- LATIN CAPITAL LETTER DZ+  '\x01f1'# -> unI64 499+  -- LATIN CAPITAL LETTER D WITH SMALL LETTER Z+  '\x01f2'# -> unI64 499+  -- LATIN CAPITAL LETTER G WITH ACUTE+  '\x01f4'# -> unI64 501+  -- LATIN CAPITAL LETTER HWAIR+  '\x01f6'# -> unI64 405+  -- LATIN CAPITAL LETTER WYNN+  '\x01f7'# -> unI64 447+  -- LATIN CAPITAL LETTER N WITH GRAVE+  '\x01f8'# -> unI64 505+  -- LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE+  '\x01fa'# -> unI64 507+  -- LATIN CAPITAL LETTER AE WITH ACUTE+  '\x01fc'# -> unI64 509+  -- LATIN CAPITAL LETTER O WITH STROKE AND ACUTE+  '\x01fe'# -> unI64 511+  -- LATIN CAPITAL LETTER A WITH DOUBLE GRAVE+  '\x0200'# -> unI64 513+  -- LATIN CAPITAL LETTER A WITH INVERTED BREVE+  '\x0202'# -> unI64 515+  -- LATIN CAPITAL LETTER E WITH DOUBLE GRAVE+  '\x0204'# -> unI64 517+  -- LATIN CAPITAL LETTER E WITH INVERTED BREVE+  '\x0206'# -> unI64 519+  -- LATIN CAPITAL LETTER I WITH DOUBLE GRAVE+  '\x0208'# -> unI64 521+  -- LATIN CAPITAL LETTER I WITH INVERTED BREVE+  '\x020a'# -> unI64 523+  -- LATIN CAPITAL LETTER O WITH DOUBLE GRAVE+  '\x020c'# -> unI64 525+  -- LATIN CAPITAL LETTER O WITH INVERTED BREVE+  '\x020e'# -> unI64 527+  -- LATIN CAPITAL LETTER R WITH DOUBLE GRAVE+  '\x0210'# -> unI64 529+  -- LATIN CAPITAL LETTER R WITH INVERTED BREVE+  '\x0212'# -> unI64 531+  -- LATIN CAPITAL LETTER U WITH DOUBLE GRAVE+  '\x0214'# -> unI64 533+  -- LATIN CAPITAL LETTER U WITH INVERTED BREVE+  '\x0216'# -> unI64 535+  -- LATIN CAPITAL LETTER S WITH COMMA BELOW+  '\x0218'# -> unI64 537+  -- LATIN CAPITAL LETTER T WITH COMMA BELOW+  '\x021a'# -> unI64 539+  -- LATIN CAPITAL LETTER YOGH+  '\x021c'# -> unI64 541+  -- LATIN CAPITAL LETTER H WITH CARON+  '\x021e'# -> unI64 543+  -- LATIN CAPITAL LETTER N WITH LONG RIGHT LEG+  '\x0220'# -> unI64 414+  -- LATIN CAPITAL LETTER OU+  '\x0222'# -> unI64 547+  -- LATIN CAPITAL LETTER Z WITH HOOK+  '\x0224'# -> unI64 549+  -- LATIN CAPITAL LETTER A WITH DOT ABOVE+  '\x0226'# -> unI64 551+  -- LATIN CAPITAL LETTER E WITH CEDILLA+  '\x0228'# -> unI64 553+  -- LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON+  '\x022a'# -> unI64 555+  -- LATIN CAPITAL LETTER O WITH TILDE AND MACRON+  '\x022c'# -> unI64 557+  -- LATIN CAPITAL LETTER O WITH DOT ABOVE+  '\x022e'# -> unI64 559+  -- LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON+  '\x0230'# -> unI64 561+  -- LATIN CAPITAL LETTER Y WITH MACRON+  '\x0232'# -> unI64 563+  -- LATIN CAPITAL LETTER A WITH STROKE+  '\x023a'# -> unI64 11365+  -- LATIN CAPITAL LETTER C WITH STROKE+  '\x023b'# -> unI64 572+  -- LATIN CAPITAL LETTER L WITH BAR+  '\x023d'# -> unI64 410+  -- LATIN CAPITAL LETTER T WITH DIAGONAL STROKE+  '\x023e'# -> unI64 11366+  -- LATIN CAPITAL LETTER GLOTTAL STOP+  '\x0241'# -> unI64 578+  -- LATIN CAPITAL LETTER B WITH STROKE+  '\x0243'# -> unI64 384+  -- LATIN CAPITAL LETTER U BAR+  '\x0244'# -> unI64 649+  -- LATIN CAPITAL LETTER TURNED V+  '\x0245'# -> unI64 652+  -- LATIN CAPITAL LETTER E WITH STROKE+  '\x0246'# -> unI64 583+  -- LATIN CAPITAL LETTER J WITH STROKE+  '\x0248'# -> unI64 585+  -- LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL+  '\x024a'# -> unI64 587+  -- LATIN CAPITAL LETTER R WITH STROKE+  '\x024c'# -> unI64 589+  -- LATIN CAPITAL LETTER Y WITH STROKE+  '\x024e'# -> unI64 591+  -- COMBINING GREEK YPOGEGRAMMENI+  '\x0345'# -> unI64 953+  -- GREEK CAPITAL LETTER HETA+  '\x0370'# -> unI64 881+  -- GREEK CAPITAL LETTER ARCHAIC SAMPI+  '\x0372'# -> unI64 883+  -- GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA+  '\x0376'# -> unI64 887+  -- GREEK CAPITAL LETTER YOT+  '\x037f'# -> unI64 1011+  -- GREEK CAPITAL LETTER ALPHA WITH TONOS+  '\x0386'# -> unI64 940+  -- GREEK CAPITAL LETTER EPSILON WITH TONOS+  '\x0388'# -> unI64 941+  -- GREEK CAPITAL LETTER ETA WITH TONOS+  '\x0389'# -> unI64 942+  -- GREEK CAPITAL LETTER IOTA WITH TONOS+  '\x038a'# -> unI64 943+  -- GREEK CAPITAL LETTER OMICRON WITH TONOS+  '\x038c'# -> unI64 972+  -- GREEK CAPITAL LETTER UPSILON WITH TONOS+  '\x038e'# -> unI64 973+  -- GREEK CAPITAL LETTER OMEGA WITH TONOS+  '\x038f'# -> unI64 974+  -- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS+  '\x0390'# -> unI64 3382099394429881+  -- GREEK CAPITAL LETTER ALPHA+  '\x0391'# -> unI64 945+  -- GREEK CAPITAL LETTER BETA+  '\x0392'# -> unI64 946+  -- GREEK CAPITAL LETTER GAMMA+  '\x0393'# -> unI64 947+  -- GREEK CAPITAL LETTER DELTA+  '\x0394'# -> unI64 948+  -- GREEK CAPITAL LETTER EPSILON+  '\x0395'# -> unI64 949+  -- GREEK CAPITAL LETTER ZETA+  '\x0396'# -> unI64 950+  -- GREEK CAPITAL LETTER ETA+  '\x0397'# -> unI64 951+  -- GREEK CAPITAL LETTER THETA+  '\x0398'# -> unI64 952+  -- GREEK CAPITAL LETTER IOTA+  '\x0399'# -> unI64 953+  -- GREEK CAPITAL LETTER KAPPA+  '\x039a'# -> unI64 954+  -- GREEK CAPITAL LETTER LAMDA+  '\x039b'# -> unI64 955+  -- GREEK CAPITAL LETTER MU+  '\x039c'# -> unI64 956+  -- GREEK CAPITAL LETTER NU+  '\x039d'# -> unI64 957+  -- GREEK CAPITAL LETTER XI+  '\x039e'# -> unI64 958+  -- GREEK CAPITAL LETTER OMICRON+  '\x039f'# -> unI64 959+  -- GREEK CAPITAL LETTER PI+  '\x03a0'# -> unI64 960+  -- GREEK CAPITAL LETTER RHO+  '\x03a1'# -> unI64 961+  -- GREEK CAPITAL LETTER SIGMA+  '\x03a3'# -> unI64 963+  -- GREEK CAPITAL LETTER TAU+  '\x03a4'# -> unI64 964+  -- GREEK CAPITAL LETTER UPSILON+  '\x03a5'# -> unI64 965+  -- GREEK CAPITAL LETTER PHI+  '\x03a6'# -> unI64 966+  -- GREEK CAPITAL LETTER CHI+  '\x03a7'# -> unI64 967+  -- GREEK CAPITAL LETTER PSI+  '\x03a8'# -> unI64 968+  -- GREEK CAPITAL LETTER OMEGA+  '\x03a9'# -> unI64 969+  -- GREEK CAPITAL LETTER IOTA WITH DIALYTIKA+  '\x03aa'# -> unI64 970+  -- GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA+  '\x03ab'# -> unI64 971+  -- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS+  '\x03b0'# -> unI64 3382099394429893+  -- GREEK SMALL LETTER FINAL SIGMA+  '\x03c2'# -> unI64 963+  -- GREEK CAPITAL KAI SYMBOL+  '\x03cf'# -> unI64 983+  -- GREEK BETA SYMBOL+  '\x03d0'# -> unI64 946+  -- GREEK THETA SYMBOL+  '\x03d1'# -> unI64 952+  -- GREEK PHI SYMBOL+  '\x03d5'# -> unI64 966+  -- GREEK PI SYMBOL+  '\x03d6'# -> unI64 960+  -- GREEK LETTER ARCHAIC KOPPA+  '\x03d8'# -> unI64 985+  -- GREEK LETTER STIGMA+  '\x03da'# -> unI64 987+  -- GREEK LETTER DIGAMMA+  '\x03dc'# -> unI64 989+  -- GREEK LETTER KOPPA+  '\x03de'# -> unI64 991+  -- GREEK LETTER SAMPI+  '\x03e0'# -> unI64 993+  -- COPTIC CAPITAL LETTER SHEI+  '\x03e2'# -> unI64 995+  -- COPTIC CAPITAL LETTER FEI+  '\x03e4'# -> unI64 997+  -- COPTIC CAPITAL LETTER KHEI+  '\x03e6'# -> unI64 999+  -- COPTIC CAPITAL LETTER HORI+  '\x03e8'# -> unI64 1001+  -- COPTIC CAPITAL LETTER GANGIA+  '\x03ea'# -> unI64 1003+  -- COPTIC CAPITAL LETTER SHIMA+  '\x03ec'# -> unI64 1005+  -- COPTIC CAPITAL LETTER DEI+  '\x03ee'# -> unI64 1007+  -- GREEK KAPPA SYMBOL+  '\x03f0'# -> unI64 954+  -- GREEK RHO SYMBOL+  '\x03f1'# -> unI64 961+  -- GREEK CAPITAL THETA SYMBOL+  '\x03f4'# -> unI64 952+  -- GREEK LUNATE EPSILON SYMBOL+  '\x03f5'# -> unI64 949+  -- GREEK CAPITAL LETTER SHO+  '\x03f7'# -> unI64 1016+  -- GREEK CAPITAL LUNATE SIGMA SYMBOL+  '\x03f9'# -> unI64 1010+  -- GREEK CAPITAL LETTER SAN+  '\x03fa'# -> unI64 1019+  -- GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL+  '\x03fd'# -> unI64 891+  -- GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL+  '\x03fe'# -> unI64 892+  -- GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL+  '\x03ff'# -> unI64 893+  -- CYRILLIC CAPITAL LETTER IE WITH GRAVE+  '\x0400'# -> unI64 1104+  -- CYRILLIC CAPITAL LETTER IO+  '\x0401'# -> unI64 1105+  -- CYRILLIC CAPITAL LETTER DJE+  '\x0402'# -> unI64 1106+  -- CYRILLIC CAPITAL LETTER GJE+  '\x0403'# -> unI64 1107+  -- CYRILLIC CAPITAL LETTER UKRAINIAN IE+  '\x0404'# -> unI64 1108+  -- CYRILLIC CAPITAL LETTER DZE+  '\x0405'# -> unI64 1109+  -- CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I+  '\x0406'# -> unI64 1110+  -- CYRILLIC CAPITAL LETTER YI+  '\x0407'# -> unI64 1111+  -- CYRILLIC CAPITAL LETTER JE+  '\x0408'# -> unI64 1112+  -- CYRILLIC CAPITAL LETTER LJE+  '\x0409'# -> unI64 1113+  -- CYRILLIC CAPITAL LETTER NJE+  '\x040a'# -> unI64 1114+  -- CYRILLIC CAPITAL LETTER TSHE+  '\x040b'# -> unI64 1115+  -- CYRILLIC CAPITAL LETTER KJE+  '\x040c'# -> unI64 1116+  -- CYRILLIC CAPITAL LETTER I WITH GRAVE+  '\x040d'# -> unI64 1117+  -- CYRILLIC CAPITAL LETTER SHORT U+  '\x040e'# -> unI64 1118+  -- CYRILLIC CAPITAL LETTER DZHE+  '\x040f'# -> unI64 1119+  -- CYRILLIC CAPITAL LETTER A+  '\x0410'# -> unI64 1072+  -- CYRILLIC CAPITAL LETTER BE+  '\x0411'# -> unI64 1073+  -- CYRILLIC CAPITAL LETTER VE+  '\x0412'# -> unI64 1074+  -- CYRILLIC CAPITAL LETTER GHE+  '\x0413'# -> unI64 1075+  -- CYRILLIC CAPITAL LETTER DE+  '\x0414'# -> unI64 1076+  -- CYRILLIC CAPITAL LETTER IE+  '\x0415'# -> unI64 1077+  -- CYRILLIC CAPITAL LETTER ZHE+  '\x0416'# -> unI64 1078+  -- CYRILLIC CAPITAL LETTER ZE+  '\x0417'# -> unI64 1079+  -- CYRILLIC CAPITAL LETTER I+  '\x0418'# -> unI64 1080+  -- CYRILLIC CAPITAL LETTER SHORT I+  '\x0419'# -> unI64 1081+  -- CYRILLIC CAPITAL LETTER KA+  '\x041a'# -> unI64 1082+  -- CYRILLIC CAPITAL LETTER EL+  '\x041b'# -> unI64 1083+  -- CYRILLIC CAPITAL LETTER EM+  '\x041c'# -> unI64 1084+  -- CYRILLIC CAPITAL LETTER EN+  '\x041d'# -> unI64 1085+  -- CYRILLIC CAPITAL LETTER O+  '\x041e'# -> unI64 1086+  -- CYRILLIC CAPITAL LETTER PE+  '\x041f'# -> unI64 1087+  -- CYRILLIC CAPITAL LETTER ER+  '\x0420'# -> unI64 1088+  -- CYRILLIC CAPITAL LETTER ES+  '\x0421'# -> unI64 1089+  -- CYRILLIC CAPITAL LETTER TE+  '\x0422'# -> unI64 1090+  -- CYRILLIC CAPITAL LETTER U+  '\x0423'# -> unI64 1091+  -- CYRILLIC CAPITAL LETTER EF+  '\x0424'# -> unI64 1092+  -- CYRILLIC CAPITAL LETTER HA+  '\x0425'# -> unI64 1093+  -- CYRILLIC CAPITAL LETTER TSE+  '\x0426'# -> unI64 1094+  -- CYRILLIC CAPITAL LETTER CHE+  '\x0427'# -> unI64 1095+  -- CYRILLIC CAPITAL LETTER SHA+  '\x0428'# -> unI64 1096+  -- CYRILLIC CAPITAL LETTER SHCHA+  '\x0429'# -> unI64 1097+  -- CYRILLIC CAPITAL LETTER HARD SIGN+  '\x042a'# -> unI64 1098+  -- CYRILLIC CAPITAL LETTER YERU+  '\x042b'# -> unI64 1099+  -- CYRILLIC CAPITAL LETTER SOFT SIGN+  '\x042c'# -> unI64 1100+  -- CYRILLIC CAPITAL LETTER E+  '\x042d'# -> unI64 1101+  -- CYRILLIC CAPITAL LETTER YU+  '\x042e'# -> unI64 1102+  -- CYRILLIC CAPITAL LETTER YA+  '\x042f'# -> unI64 1103+  -- CYRILLIC CAPITAL LETTER OMEGA+  '\x0460'# -> unI64 1121+  -- CYRILLIC CAPITAL LETTER YAT+  '\x0462'# -> unI64 1123+  -- CYRILLIC CAPITAL LETTER IOTIFIED E+  '\x0464'# -> unI64 1125+  -- CYRILLIC CAPITAL LETTER LITTLE YUS+  '\x0466'# -> unI64 1127+  -- CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS+  '\x0468'# -> unI64 1129+  -- CYRILLIC CAPITAL LETTER BIG YUS+  '\x046a'# -> unI64 1131+  -- CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS+  '\x046c'# -> unI64 1133+  -- CYRILLIC CAPITAL LETTER KSI+  '\x046e'# -> unI64 1135+  -- CYRILLIC CAPITAL LETTER PSI+  '\x0470'# -> unI64 1137+  -- CYRILLIC CAPITAL LETTER FITA+  '\x0472'# -> unI64 1139+  -- CYRILLIC CAPITAL LETTER IZHITSA+  '\x0474'# -> unI64 1141+  -- CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT+  '\x0476'# -> unI64 1143+  -- CYRILLIC CAPITAL LETTER UK+  '\x0478'# -> unI64 1145+  -- CYRILLIC CAPITAL LETTER ROUND OMEGA+  '\x047a'# -> unI64 1147+  -- CYRILLIC CAPITAL LETTER OMEGA WITH TITLO+  '\x047c'# -> unI64 1149+  -- CYRILLIC CAPITAL LETTER OT+  '\x047e'# -> unI64 1151+  -- CYRILLIC CAPITAL LETTER KOPPA+  '\x0480'# -> unI64 1153+  -- CYRILLIC CAPITAL LETTER SHORT I WITH TAIL+  '\x048a'# -> unI64 1163+  -- CYRILLIC CAPITAL LETTER SEMISOFT SIGN+  '\x048c'# -> unI64 1165+  -- CYRILLIC CAPITAL LETTER ER WITH TICK+  '\x048e'# -> unI64 1167+  -- CYRILLIC CAPITAL LETTER GHE WITH UPTURN+  '\x0490'# -> unI64 1169+  -- CYRILLIC CAPITAL LETTER GHE WITH STROKE+  '\x0492'# -> unI64 1171+  -- CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK+  '\x0494'# -> unI64 1173+  -- CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER+  '\x0496'# -> unI64 1175+  -- CYRILLIC CAPITAL LETTER ZE WITH DESCENDER+  '\x0498'# -> unI64 1177+  -- CYRILLIC CAPITAL LETTER KA WITH DESCENDER+  '\x049a'# -> unI64 1179+  -- CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE+  '\x049c'# -> unI64 1181+  -- CYRILLIC CAPITAL LETTER KA WITH STROKE+  '\x049e'# -> unI64 1183+  -- CYRILLIC CAPITAL LETTER BASHKIR KA+  '\x04a0'# -> unI64 1185+  -- CYRILLIC CAPITAL LETTER EN WITH DESCENDER+  '\x04a2'# -> unI64 1187+  -- CYRILLIC CAPITAL LIGATURE EN GHE+  '\x04a4'# -> unI64 1189+  -- CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK+  '\x04a6'# -> unI64 1191+  -- CYRILLIC CAPITAL LETTER ABKHASIAN HA+  '\x04a8'# -> unI64 1193+  -- CYRILLIC CAPITAL LETTER ES WITH DESCENDER+  '\x04aa'# -> unI64 1195+  -- CYRILLIC CAPITAL LETTER TE WITH DESCENDER+  '\x04ac'# -> unI64 1197+  -- CYRILLIC CAPITAL LETTER STRAIGHT U+  '\x04ae'# -> unI64 1199+  -- CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE+  '\x04b0'# -> unI64 1201+  -- CYRILLIC CAPITAL LETTER HA WITH DESCENDER+  '\x04b2'# -> unI64 1203+  -- CYRILLIC CAPITAL LIGATURE TE TSE+  '\x04b4'# -> unI64 1205+  -- CYRILLIC CAPITAL LETTER CHE WITH DESCENDER+  '\x04b6'# -> unI64 1207+  -- CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE+  '\x04b8'# -> unI64 1209+  -- CYRILLIC CAPITAL LETTER SHHA+  '\x04ba'# -> unI64 1211+  -- CYRILLIC CAPITAL LETTER ABKHASIAN CHE+  '\x04bc'# -> unI64 1213+  -- CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER+  '\x04be'# -> unI64 1215+  -- CYRILLIC LETTER PALOCHKA+  '\x04c0'# -> unI64 1231+  -- CYRILLIC CAPITAL LETTER ZHE WITH BREVE+  '\x04c1'# -> unI64 1218+  -- CYRILLIC CAPITAL LETTER KA WITH HOOK+  '\x04c3'# -> unI64 1220+  -- CYRILLIC CAPITAL LETTER EL WITH TAIL+  '\x04c5'# -> unI64 1222+  -- CYRILLIC CAPITAL LETTER EN WITH HOOK+  '\x04c7'# -> unI64 1224+  -- CYRILLIC CAPITAL LETTER EN WITH TAIL+  '\x04c9'# -> unI64 1226+  -- CYRILLIC CAPITAL LETTER KHAKASSIAN CHE+  '\x04cb'# -> unI64 1228+  -- CYRILLIC CAPITAL LETTER EM WITH TAIL+  '\x04cd'# -> unI64 1230+  -- CYRILLIC CAPITAL LETTER A WITH BREVE+  '\x04d0'# -> unI64 1233+  -- CYRILLIC CAPITAL LETTER A WITH DIAERESIS+  '\x04d2'# -> unI64 1235+  -- CYRILLIC CAPITAL LIGATURE A IE+  '\x04d4'# -> unI64 1237+  -- CYRILLIC CAPITAL LETTER IE WITH BREVE+  '\x04d6'# -> unI64 1239+  -- CYRILLIC CAPITAL LETTER SCHWA+  '\x04d8'# -> unI64 1241+  -- CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS+  '\x04da'# -> unI64 1243+  -- CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS+  '\x04dc'# -> unI64 1245+  -- CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS+  '\x04de'# -> unI64 1247+  -- CYRILLIC CAPITAL LETTER ABKHASIAN DZE+  '\x04e0'# -> unI64 1249+  -- CYRILLIC CAPITAL LETTER I WITH MACRON+  '\x04e2'# -> unI64 1251+  -- CYRILLIC CAPITAL LETTER I WITH DIAERESIS+  '\x04e4'# -> unI64 1253+  -- CYRILLIC CAPITAL LETTER O WITH DIAERESIS+  '\x04e6'# -> unI64 1255+  -- CYRILLIC CAPITAL LETTER BARRED O+  '\x04e8'# -> unI64 1257+  -- CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS+  '\x04ea'# -> unI64 1259+  -- CYRILLIC CAPITAL LETTER E WITH DIAERESIS+  '\x04ec'# -> unI64 1261+  -- CYRILLIC CAPITAL LETTER U WITH MACRON+  '\x04ee'# -> unI64 1263+  -- CYRILLIC CAPITAL LETTER U WITH DIAERESIS+  '\x04f0'# -> unI64 1265+  -- CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE+  '\x04f2'# -> unI64 1267+  -- CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS+  '\x04f4'# -> unI64 1269+  -- CYRILLIC CAPITAL LETTER GHE WITH DESCENDER+  '\x04f6'# -> unI64 1271+  -- CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS+  '\x04f8'# -> unI64 1273+  -- CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK+  '\x04fa'# -> unI64 1275+  -- CYRILLIC CAPITAL LETTER HA WITH HOOK+  '\x04fc'# -> unI64 1277+  -- CYRILLIC CAPITAL LETTER HA WITH STROKE+  '\x04fe'# -> unI64 1279+  -- CYRILLIC CAPITAL LETTER KOMI DE+  '\x0500'# -> unI64 1281+  -- CYRILLIC CAPITAL LETTER KOMI DJE+  '\x0502'# -> unI64 1283+  -- CYRILLIC CAPITAL LETTER KOMI ZJE+  '\x0504'# -> unI64 1285+  -- CYRILLIC CAPITAL LETTER KOMI DZJE+  '\x0506'# -> unI64 1287+  -- CYRILLIC CAPITAL LETTER KOMI LJE+  '\x0508'# -> unI64 1289+  -- CYRILLIC CAPITAL LETTER KOMI NJE+  '\x050a'# -> unI64 1291+  -- CYRILLIC CAPITAL LETTER KOMI SJE+  '\x050c'# -> unI64 1293+  -- CYRILLIC CAPITAL LETTER KOMI TJE+  '\x050e'# -> unI64 1295+  -- CYRILLIC CAPITAL LETTER REVERSED ZE+  '\x0510'# -> unI64 1297+  -- CYRILLIC CAPITAL LETTER EL WITH HOOK+  '\x0512'# -> unI64 1299+  -- CYRILLIC CAPITAL LETTER LHA+  '\x0514'# -> unI64 1301+  -- CYRILLIC CAPITAL LETTER RHA+  '\x0516'# -> unI64 1303+  -- CYRILLIC CAPITAL LETTER YAE+  '\x0518'# -> unI64 1305+  -- CYRILLIC CAPITAL LETTER QA+  '\x051a'# -> unI64 1307+  -- CYRILLIC CAPITAL LETTER WE+  '\x051c'# -> unI64 1309+  -- CYRILLIC CAPITAL LETTER ALEUT KA+  '\x051e'# -> unI64 1311+  -- CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK+  '\x0520'# -> unI64 1313+  -- CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK+  '\x0522'# -> unI64 1315+  -- CYRILLIC CAPITAL LETTER PE WITH DESCENDER+  '\x0524'# -> unI64 1317+  -- CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER+  '\x0526'# -> unI64 1319+  -- CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK+  '\x0528'# -> unI64 1321+  -- CYRILLIC CAPITAL LETTER DZZHE+  '\x052a'# -> unI64 1323+  -- CYRILLIC CAPITAL LETTER DCHE+  '\x052c'# -> unI64 1325+  -- CYRILLIC CAPITAL LETTER EL WITH DESCENDER+  '\x052e'# -> unI64 1327+  -- ARMENIAN CAPITAL LETTER AYB+  '\x0531'# -> unI64 1377+  -- ARMENIAN CAPITAL LETTER BEN+  '\x0532'# -> unI64 1378+  -- ARMENIAN CAPITAL LETTER GIM+  '\x0533'# -> unI64 1379+  -- ARMENIAN CAPITAL LETTER DA+  '\x0534'# -> unI64 1380+  -- ARMENIAN CAPITAL LETTER ECH+  '\x0535'# -> unI64 1381+  -- ARMENIAN CAPITAL LETTER ZA+  '\x0536'# -> unI64 1382+  -- ARMENIAN CAPITAL LETTER EH+  '\x0537'# -> unI64 1383+  -- ARMENIAN CAPITAL LETTER ET+  '\x0538'# -> unI64 1384+  -- ARMENIAN CAPITAL LETTER TO+  '\x0539'# -> unI64 1385+  -- ARMENIAN CAPITAL LETTER ZHE+  '\x053a'# -> unI64 1386+  -- ARMENIAN CAPITAL LETTER INI+  '\x053b'# -> unI64 1387+  -- ARMENIAN CAPITAL LETTER LIWN+  '\x053c'# -> unI64 1388+  -- ARMENIAN CAPITAL LETTER XEH+  '\x053d'# -> unI64 1389+  -- ARMENIAN CAPITAL LETTER CA+  '\x053e'# -> unI64 1390+  -- ARMENIAN CAPITAL LETTER KEN+  '\x053f'# -> unI64 1391+  -- ARMENIAN CAPITAL LETTER HO+  '\x0540'# -> unI64 1392+  -- ARMENIAN CAPITAL LETTER JA+  '\x0541'# -> unI64 1393+  -- ARMENIAN CAPITAL LETTER GHAD+  '\x0542'# -> unI64 1394+  -- ARMENIAN CAPITAL LETTER CHEH+  '\x0543'# -> unI64 1395+  -- ARMENIAN CAPITAL LETTER MEN+  '\x0544'# -> unI64 1396+  -- ARMENIAN CAPITAL LETTER YI+  '\x0545'# -> unI64 1397+  -- ARMENIAN CAPITAL LETTER NOW+  '\x0546'# -> unI64 1398+  -- ARMENIAN CAPITAL LETTER SHA+  '\x0547'# -> unI64 1399+  -- ARMENIAN CAPITAL LETTER VO+  '\x0548'# -> unI64 1400+  -- ARMENIAN CAPITAL LETTER CHA+  '\x0549'# -> unI64 1401+  -- ARMENIAN CAPITAL LETTER PEH+  '\x054a'# -> unI64 1402+  -- ARMENIAN CAPITAL LETTER JHEH+  '\x054b'# -> unI64 1403+  -- ARMENIAN CAPITAL LETTER RA+  '\x054c'# -> unI64 1404+  -- ARMENIAN CAPITAL LETTER SEH+  '\x054d'# -> unI64 1405+  -- ARMENIAN CAPITAL LETTER VEW+  '\x054e'# -> unI64 1406+  -- ARMENIAN CAPITAL LETTER TIWN+  '\x054f'# -> unI64 1407+  -- ARMENIAN CAPITAL LETTER REH+  '\x0550'# -> unI64 1408+  -- ARMENIAN CAPITAL LETTER CO+  '\x0551'# -> unI64 1409+  -- ARMENIAN CAPITAL LETTER YIWN+  '\x0552'# -> unI64 1410+  -- ARMENIAN CAPITAL LETTER PIWR+  '\x0553'# -> unI64 1411+  -- ARMENIAN CAPITAL LETTER KEH+  '\x0554'# -> unI64 1412+  -- ARMENIAN CAPITAL LETTER OH+  '\x0555'# -> unI64 1413+  -- ARMENIAN CAPITAL LETTER FEH+  '\x0556'# -> unI64 1414+  -- ARMENIAN SMALL LIGATURE ECH YIWN+  '\x0587'# -> unI64 2956985701+  -- GEORGIAN CAPITAL LETTER AN+  '\x10a0'# -> unI64 11520+  -- GEORGIAN CAPITAL LETTER BAN+  '\x10a1'# -> unI64 11521+  -- GEORGIAN CAPITAL LETTER GAN+  '\x10a2'# -> unI64 11522+  -- GEORGIAN CAPITAL LETTER DON+  '\x10a3'# -> unI64 11523+  -- GEORGIAN CAPITAL LETTER EN+  '\x10a4'# -> unI64 11524+  -- GEORGIAN CAPITAL LETTER VIN+  '\x10a5'# -> unI64 11525+  -- GEORGIAN CAPITAL LETTER ZEN+  '\x10a6'# -> unI64 11526+  -- GEORGIAN CAPITAL LETTER TAN+  '\x10a7'# -> unI64 11527+  -- GEORGIAN CAPITAL LETTER IN+  '\x10a8'# -> unI64 11528+  -- GEORGIAN CAPITAL LETTER KAN+  '\x10a9'# -> unI64 11529+  -- GEORGIAN CAPITAL LETTER LAS+  '\x10aa'# -> unI64 11530+  -- GEORGIAN CAPITAL LETTER MAN+  '\x10ab'# -> unI64 11531+  -- GEORGIAN CAPITAL LETTER NAR+  '\x10ac'# -> unI64 11532+  -- GEORGIAN CAPITAL LETTER ON+  '\x10ad'# -> unI64 11533+  -- GEORGIAN CAPITAL LETTER PAR+  '\x10ae'# -> unI64 11534+  -- GEORGIAN CAPITAL LETTER ZHAR+  '\x10af'# -> unI64 11535+  -- GEORGIAN CAPITAL LETTER RAE+  '\x10b0'# -> unI64 11536+  -- GEORGIAN CAPITAL LETTER SAN+  '\x10b1'# -> unI64 11537+  -- GEORGIAN CAPITAL LETTER TAR+  '\x10b2'# -> unI64 11538+  -- GEORGIAN CAPITAL LETTER UN+  '\x10b3'# -> unI64 11539+  -- GEORGIAN CAPITAL LETTER PHAR+  '\x10b4'# -> unI64 11540+  -- GEORGIAN CAPITAL LETTER KHAR+  '\x10b5'# -> unI64 11541+  -- GEORGIAN CAPITAL LETTER GHAN+  '\x10b6'# -> unI64 11542+  -- GEORGIAN CAPITAL LETTER QAR+  '\x10b7'# -> unI64 11543+  -- GEORGIAN CAPITAL LETTER SHIN+  '\x10b8'# -> unI64 11544+  -- GEORGIAN CAPITAL LETTER CHIN+  '\x10b9'# -> unI64 11545+  -- GEORGIAN CAPITAL LETTER CAN+  '\x10ba'# -> unI64 11546+  -- GEORGIAN CAPITAL LETTER JIL+  '\x10bb'# -> unI64 11547+  -- GEORGIAN CAPITAL LETTER CIL+  '\x10bc'# -> unI64 11548+  -- GEORGIAN CAPITAL LETTER CHAR+  '\x10bd'# -> unI64 11549+  -- GEORGIAN CAPITAL LETTER XAN+  '\x10be'# -> unI64 11550+  -- GEORGIAN CAPITAL LETTER JHAN+  '\x10bf'# -> unI64 11551+  -- GEORGIAN CAPITAL LETTER HAE+  '\x10c0'# -> unI64 11552+  -- GEORGIAN CAPITAL LETTER HE+  '\x10c1'# -> unI64 11553+  -- GEORGIAN CAPITAL LETTER HIE+  '\x10c2'# -> unI64 11554+  -- GEORGIAN CAPITAL LETTER WE+  '\x10c3'# -> unI64 11555+  -- GEORGIAN CAPITAL LETTER HAR+  '\x10c4'# -> unI64 11556+  -- GEORGIAN CAPITAL LETTER HOE+  '\x10c5'# -> unI64 11557+  -- GEORGIAN CAPITAL LETTER YN+  '\x10c7'# -> unI64 11559+  -- GEORGIAN CAPITAL LETTER AEN+  '\x10cd'# -> unI64 11565+  -- CHEROKEE SMALL LETTER YE+  '\x13f8'# -> unI64 5104+  -- CHEROKEE SMALL LETTER YI+  '\x13f9'# -> unI64 5105+  -- CHEROKEE SMALL LETTER YO+  '\x13fa'# -> unI64 5106+  -- CHEROKEE SMALL LETTER YU+  '\x13fb'# -> unI64 5107+  -- CHEROKEE SMALL LETTER YV+  '\x13fc'# -> unI64 5108+  -- CHEROKEE SMALL LETTER MV+  '\x13fd'# -> unI64 5109+  -- CYRILLIC SMALL LETTER ROUNDED VE+  '\x1c80'# -> unI64 1074+  -- CYRILLIC SMALL LETTER LONG-LEGGED DE+  '\x1c81'# -> unI64 1076+  -- CYRILLIC SMALL LETTER NARROW O+  '\x1c82'# -> unI64 1086+  -- CYRILLIC SMALL LETTER WIDE ES+  '\x1c83'# -> unI64 1089+  -- CYRILLIC SMALL LETTER TALL TE+  '\x1c84'# -> unI64 1090+  -- CYRILLIC SMALL LETTER THREE-LEGGED TE+  '\x1c85'# -> unI64 1090+  -- CYRILLIC SMALL LETTER TALL HARD SIGN+  '\x1c86'# -> unI64 1098+  -- CYRILLIC SMALL LETTER TALL YAT+  '\x1c87'# -> unI64 1123+  -- CYRILLIC SMALL LETTER UNBLENDED UK+  '\x1c88'# -> unI64 42571+  -- GEORGIAN MTAVRULI CAPITAL LETTER AN+  '\x1c90'# -> unI64 4304+  -- GEORGIAN MTAVRULI CAPITAL LETTER BAN+  '\x1c91'# -> unI64 4305+  -- GEORGIAN MTAVRULI CAPITAL LETTER GAN+  '\x1c92'# -> unI64 4306+  -- GEORGIAN MTAVRULI CAPITAL LETTER DON+  '\x1c93'# -> unI64 4307+  -- GEORGIAN MTAVRULI CAPITAL LETTER EN+  '\x1c94'# -> unI64 4308+  -- GEORGIAN MTAVRULI CAPITAL LETTER VIN+  '\x1c95'# -> unI64 4309+  -- GEORGIAN MTAVRULI CAPITAL LETTER ZEN+  '\x1c96'# -> unI64 4310+  -- GEORGIAN MTAVRULI CAPITAL LETTER TAN+  '\x1c97'# -> unI64 4311+  -- GEORGIAN MTAVRULI CAPITAL LETTER IN+  '\x1c98'# -> unI64 4312+  -- GEORGIAN MTAVRULI CAPITAL LETTER KAN+  '\x1c99'# -> unI64 4313+  -- GEORGIAN MTAVRULI CAPITAL LETTER LAS+  '\x1c9a'# -> unI64 4314+  -- GEORGIAN MTAVRULI CAPITAL LETTER MAN+  '\x1c9b'# -> unI64 4315+  -- GEORGIAN MTAVRULI CAPITAL LETTER NAR+  '\x1c9c'# -> unI64 4316+  -- GEORGIAN MTAVRULI CAPITAL LETTER ON+  '\x1c9d'# -> unI64 4317+  -- GEORGIAN MTAVRULI CAPITAL LETTER PAR+  '\x1c9e'# -> unI64 4318+  -- GEORGIAN MTAVRULI CAPITAL LETTER ZHAR+  '\x1c9f'# -> unI64 4319+  -- GEORGIAN MTAVRULI CAPITAL LETTER RAE+  '\x1ca0'# -> unI64 4320+  -- GEORGIAN MTAVRULI CAPITAL LETTER SAN+  '\x1ca1'# -> unI64 4321+  -- GEORGIAN MTAVRULI CAPITAL LETTER TAR+  '\x1ca2'# -> unI64 4322+  -- GEORGIAN MTAVRULI CAPITAL LETTER UN+  '\x1ca3'# -> unI64 4323+  -- GEORGIAN MTAVRULI CAPITAL LETTER PHAR+  '\x1ca4'# -> unI64 4324+  -- GEORGIAN MTAVRULI CAPITAL LETTER KHAR+  '\x1ca5'# -> unI64 4325+  -- GEORGIAN MTAVRULI CAPITAL LETTER GHAN+  '\x1ca6'# -> unI64 4326+  -- GEORGIAN MTAVRULI CAPITAL LETTER QAR+  '\x1ca7'# -> unI64 4327+  -- GEORGIAN MTAVRULI CAPITAL LETTER SHIN+  '\x1ca8'# -> unI64 4328+  -- GEORGIAN MTAVRULI CAPITAL LETTER CHIN+  '\x1ca9'# -> unI64 4329+  -- GEORGIAN MTAVRULI CAPITAL LETTER CAN+  '\x1caa'# -> unI64 4330+  -- GEORGIAN MTAVRULI CAPITAL LETTER JIL+  '\x1cab'# -> unI64 4331+  -- GEORGIAN MTAVRULI CAPITAL LETTER CIL+  '\x1cac'# -> unI64 4332+  -- GEORGIAN MTAVRULI CAPITAL LETTER CHAR+  '\x1cad'# -> unI64 4333+  -- GEORGIAN MTAVRULI CAPITAL LETTER XAN+  '\x1cae'# -> unI64 4334+  -- GEORGIAN MTAVRULI CAPITAL LETTER JHAN+  '\x1caf'# -> unI64 4335+  -- GEORGIAN MTAVRULI CAPITAL LETTER HAE+  '\x1cb0'# -> unI64 4336+  -- GEORGIAN MTAVRULI CAPITAL LETTER HE+  '\x1cb1'# -> unI64 4337+  -- GEORGIAN MTAVRULI CAPITAL LETTER HIE+  '\x1cb2'# -> unI64 4338+  -- GEORGIAN MTAVRULI CAPITAL LETTER WE+  '\x1cb3'# -> unI64 4339+  -- GEORGIAN MTAVRULI CAPITAL LETTER HAR+  '\x1cb4'# -> unI64 4340+  -- GEORGIAN MTAVRULI CAPITAL LETTER HOE+  '\x1cb5'# -> unI64 4341+  -- GEORGIAN MTAVRULI CAPITAL LETTER FI+  '\x1cb6'# -> unI64 4342+  -- GEORGIAN MTAVRULI CAPITAL LETTER YN+  '\x1cb7'# -> unI64 4343+  -- GEORGIAN MTAVRULI CAPITAL LETTER ELIFI+  '\x1cb8'# -> unI64 4344+  -- GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN+  '\x1cb9'# -> unI64 4345+  -- GEORGIAN MTAVRULI CAPITAL LETTER AIN+  '\x1cba'# -> unI64 4346+  -- GEORGIAN MTAVRULI CAPITAL LETTER AEN+  '\x1cbd'# -> unI64 4349+  -- GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN+  '\x1cbe'# -> unI64 4350+  -- GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN+  '\x1cbf'# -> unI64 4351+  -- LATIN CAPITAL LETTER A WITH RING BELOW+  '\x1e00'# -> unI64 7681+  -- LATIN CAPITAL LETTER B WITH DOT ABOVE+  '\x1e02'# -> unI64 7683+  -- LATIN CAPITAL LETTER B WITH DOT BELOW+  '\x1e04'# -> unI64 7685+  -- LATIN CAPITAL LETTER B WITH LINE BELOW+  '\x1e06'# -> unI64 7687+  -- LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE+  '\x1e08'# -> unI64 7689+  -- LATIN CAPITAL LETTER D WITH DOT ABOVE+  '\x1e0a'# -> unI64 7691+  -- LATIN CAPITAL LETTER D WITH DOT BELOW+  '\x1e0c'# -> unI64 7693+  -- LATIN CAPITAL LETTER D WITH LINE BELOW+  '\x1e0e'# -> unI64 7695+  -- LATIN CAPITAL LETTER D WITH CEDILLA+  '\x1e10'# -> unI64 7697+  -- LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW+  '\x1e12'# -> unI64 7699+  -- LATIN CAPITAL LETTER E WITH MACRON AND GRAVE+  '\x1e14'# -> unI64 7701+  -- LATIN CAPITAL LETTER E WITH MACRON AND ACUTE+  '\x1e16'# -> unI64 7703+  -- LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW+  '\x1e18'# -> unI64 7705+  -- LATIN CAPITAL LETTER E WITH TILDE BELOW+  '\x1e1a'# -> unI64 7707+  -- LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE+  '\x1e1c'# -> unI64 7709+  -- LATIN CAPITAL LETTER F WITH DOT ABOVE+  '\x1e1e'# -> unI64 7711+  -- LATIN CAPITAL LETTER G WITH MACRON+  '\x1e20'# -> unI64 7713+  -- LATIN CAPITAL LETTER H WITH DOT ABOVE+  '\x1e22'# -> unI64 7715+  -- LATIN CAPITAL LETTER H WITH DOT BELOW+  '\x1e24'# -> unI64 7717+  -- LATIN CAPITAL LETTER H WITH DIAERESIS+  '\x1e26'# -> unI64 7719+  -- LATIN CAPITAL LETTER H WITH CEDILLA+  '\x1e28'# -> unI64 7721+  -- LATIN CAPITAL LETTER H WITH BREVE BELOW+  '\x1e2a'# -> unI64 7723+  -- LATIN CAPITAL LETTER I WITH TILDE BELOW+  '\x1e2c'# -> unI64 7725+  -- LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE+  '\x1e2e'# -> unI64 7727+  -- LATIN CAPITAL LETTER K WITH ACUTE+  '\x1e30'# -> unI64 7729+  -- LATIN CAPITAL LETTER K WITH DOT BELOW+  '\x1e32'# -> unI64 7731+  -- LATIN CAPITAL LETTER K WITH LINE BELOW+  '\x1e34'# -> unI64 7733+  -- LATIN CAPITAL LETTER L WITH DOT BELOW+  '\x1e36'# -> unI64 7735+  -- LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON+  '\x1e38'# -> unI64 7737+  -- LATIN CAPITAL LETTER L WITH LINE BELOW+  '\x1e3a'# -> unI64 7739+  -- LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW+  '\x1e3c'# -> unI64 7741+  -- LATIN CAPITAL LETTER M WITH ACUTE+  '\x1e3e'# -> unI64 7743+  -- LATIN CAPITAL LETTER M WITH DOT ABOVE+  '\x1e40'# -> unI64 7745+  -- LATIN CAPITAL LETTER M WITH DOT BELOW+  '\x1e42'# -> unI64 7747+  -- LATIN CAPITAL LETTER N WITH DOT ABOVE+  '\x1e44'# -> unI64 7749+  -- LATIN CAPITAL LETTER N WITH DOT BELOW+  '\x1e46'# -> unI64 7751+  -- LATIN CAPITAL LETTER N WITH LINE BELOW+  '\x1e48'# -> unI64 7753+  -- LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW+  '\x1e4a'# -> unI64 7755+  -- LATIN CAPITAL LETTER O WITH TILDE AND ACUTE+  '\x1e4c'# -> unI64 7757+  -- LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS+  '\x1e4e'# -> unI64 7759+  -- LATIN CAPITAL LETTER O WITH MACRON AND GRAVE+  '\x1e50'# -> unI64 7761+  -- LATIN CAPITAL LETTER O WITH MACRON AND ACUTE+  '\x1e52'# -> unI64 7763+  -- LATIN CAPITAL LETTER P WITH ACUTE+  '\x1e54'# -> unI64 7765+  -- LATIN CAPITAL LETTER P WITH DOT ABOVE+  '\x1e56'# -> unI64 7767+  -- LATIN CAPITAL LETTER R WITH DOT ABOVE+  '\x1e58'# -> unI64 7769+  -- LATIN CAPITAL LETTER R WITH DOT BELOW+  '\x1e5a'# -> unI64 7771+  -- LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON+  '\x1e5c'# -> unI64 7773+  -- LATIN CAPITAL LETTER R WITH LINE BELOW+  '\x1e5e'# -> unI64 7775+  -- LATIN CAPITAL LETTER S WITH DOT ABOVE+  '\x1e60'# -> unI64 7777+  -- LATIN CAPITAL LETTER S WITH DOT BELOW+  '\x1e62'# -> unI64 7779+  -- LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE+  '\x1e64'# -> unI64 7781+  -- LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE+  '\x1e66'# -> unI64 7783+  -- LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE+  '\x1e68'# -> unI64 7785+  -- LATIN CAPITAL LETTER T WITH DOT ABOVE+  '\x1e6a'# -> unI64 7787+  -- LATIN CAPITAL LETTER T WITH DOT BELOW+  '\x1e6c'# -> unI64 7789+  -- LATIN CAPITAL LETTER T WITH LINE BELOW+  '\x1e6e'# -> unI64 7791+  -- LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW+  '\x1e70'# -> unI64 7793+  -- LATIN CAPITAL LETTER U WITH DIAERESIS BELOW+  '\x1e72'# -> unI64 7795+  -- LATIN CAPITAL LETTER U WITH TILDE BELOW+  '\x1e74'# -> unI64 7797+  -- LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW+  '\x1e76'# -> unI64 7799+  -- LATIN CAPITAL LETTER U WITH TILDE AND ACUTE+  '\x1e78'# -> unI64 7801+  -- LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS+  '\x1e7a'# -> unI64 7803+  -- LATIN CAPITAL LETTER V WITH TILDE+  '\x1e7c'# -> unI64 7805+  -- LATIN CAPITAL LETTER V WITH DOT BELOW+  '\x1e7e'# -> unI64 7807+  -- LATIN CAPITAL LETTER W WITH GRAVE+  '\x1e80'# -> unI64 7809+  -- LATIN CAPITAL LETTER W WITH ACUTE+  '\x1e82'# -> unI64 7811+  -- LATIN CAPITAL LETTER W WITH DIAERESIS+  '\x1e84'# -> unI64 7813+  -- LATIN CAPITAL LETTER W WITH DOT ABOVE+  '\x1e86'# -> unI64 7815+  -- LATIN CAPITAL LETTER W WITH DOT BELOW+  '\x1e88'# -> unI64 7817+  -- LATIN CAPITAL LETTER X WITH DOT ABOVE+  '\x1e8a'# -> unI64 7819+  -- LATIN CAPITAL LETTER X WITH DIAERESIS+  '\x1e8c'# -> unI64 7821+  -- LATIN CAPITAL LETTER Y WITH DOT ABOVE+  '\x1e8e'# -> unI64 7823+  -- LATIN CAPITAL LETTER Z WITH CIRCUMFLEX+  '\x1e90'# -> unI64 7825+  -- LATIN CAPITAL LETTER Z WITH DOT BELOW+  '\x1e92'# -> unI64 7827+  -- LATIN CAPITAL LETTER Z WITH LINE BELOW+  '\x1e94'# -> unI64 7829+  -- LATIN SMALL LETTER H WITH LINE BELOW+  '\x1e96'# -> unI64 1713373288+  -- LATIN SMALL LETTER T WITH DIAERESIS+  '\x1e97'# -> unI64 1627390068+  -- LATIN SMALL LETTER W WITH RING ABOVE+  '\x1e98'# -> unI64 1631584375+  -- LATIN SMALL LETTER Y WITH RING ABOVE+  '\x1e99'# -> unI64 1631584377+  -- LATIN SMALL LETTER A WITH RIGHT HALF RING+  '\x1e9a'# -> unI64 1472200801+  -- LATIN SMALL LETTER LONG S WITH DOT ABOVE+  '\x1e9b'# -> unI64 7777+  -- LATIN CAPITAL LETTER SHARP S+  '\x1e9e'# -> unI64 241172595+  -- LATIN CAPITAL LETTER A WITH DOT BELOW+  '\x1ea0'# -> unI64 7841+  -- LATIN CAPITAL LETTER A WITH HOOK ABOVE+  '\x1ea2'# -> unI64 7843+  -- LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE+  '\x1ea4'# -> unI64 7845+  -- LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE+  '\x1ea6'# -> unI64 7847+  -- LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE+  '\x1ea8'# -> unI64 7849+  -- LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE+  '\x1eaa'# -> unI64 7851+  -- LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW+  '\x1eac'# -> unI64 7853+  -- LATIN CAPITAL LETTER A WITH BREVE AND ACUTE+  '\x1eae'# -> unI64 7855+  -- LATIN CAPITAL LETTER A WITH BREVE AND GRAVE+  '\x1eb0'# -> unI64 7857+  -- LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE+  '\x1eb2'# -> unI64 7859+  -- LATIN CAPITAL LETTER A WITH BREVE AND TILDE+  '\x1eb4'# -> unI64 7861+  -- LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW+  '\x1eb6'# -> unI64 7863+  -- LATIN CAPITAL LETTER E WITH DOT BELOW+  '\x1eb8'# -> unI64 7865+  -- LATIN CAPITAL LETTER E WITH HOOK ABOVE+  '\x1eba'# -> unI64 7867+  -- LATIN CAPITAL LETTER E WITH TILDE+  '\x1ebc'# -> unI64 7869+  -- LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE+  '\x1ebe'# -> unI64 7871+  -- LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE+  '\x1ec0'# -> unI64 7873+  -- LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE+  '\x1ec2'# -> unI64 7875+  -- LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE+  '\x1ec4'# -> unI64 7877+  -- LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW+  '\x1ec6'# -> unI64 7879+  -- LATIN CAPITAL LETTER I WITH HOOK ABOVE+  '\x1ec8'# -> unI64 7881+  -- LATIN CAPITAL LETTER I WITH DOT BELOW+  '\x1eca'# -> unI64 7883+  -- LATIN CAPITAL LETTER O WITH DOT BELOW+  '\x1ecc'# -> unI64 7885+  -- LATIN CAPITAL LETTER O WITH HOOK ABOVE+  '\x1ece'# -> unI64 7887+  -- LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE+  '\x1ed0'# -> unI64 7889+  -- LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE+  '\x1ed2'# -> unI64 7891+  -- LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE+  '\x1ed4'# -> unI64 7893+  -- LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE+  '\x1ed6'# -> unI64 7895+  -- LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW+  '\x1ed8'# -> unI64 7897+  -- LATIN CAPITAL LETTER O WITH HORN AND ACUTE+  '\x1eda'# -> unI64 7899+  -- LATIN CAPITAL LETTER O WITH HORN AND GRAVE+  '\x1edc'# -> unI64 7901+  -- LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE+  '\x1ede'# -> unI64 7903+  -- LATIN CAPITAL LETTER O WITH HORN AND TILDE+  '\x1ee0'# -> unI64 7905+  -- LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW+  '\x1ee2'# -> unI64 7907+  -- LATIN CAPITAL LETTER U WITH DOT BELOW+  '\x1ee4'# -> unI64 7909+  -- LATIN CAPITAL LETTER U WITH HOOK ABOVE+  '\x1ee6'# -> unI64 7911+  -- LATIN CAPITAL LETTER U WITH HORN AND ACUTE+  '\x1ee8'# -> unI64 7913+  -- LATIN CAPITAL LETTER U WITH HORN AND GRAVE+  '\x1eea'# -> unI64 7915+  -- LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE+  '\x1eec'# -> unI64 7917+  -- LATIN CAPITAL LETTER U WITH HORN AND TILDE+  '\x1eee'# -> unI64 7919+  -- LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW+  '\x1ef0'# -> unI64 7921+  -- LATIN CAPITAL LETTER Y WITH GRAVE+  '\x1ef2'# -> unI64 7923+  -- LATIN CAPITAL LETTER Y WITH DOT BELOW+  '\x1ef4'# -> unI64 7925+  -- LATIN CAPITAL LETTER Y WITH HOOK ABOVE+  '\x1ef6'# -> unI64 7927+  -- LATIN CAPITAL LETTER Y WITH TILDE+  '\x1ef8'# -> unI64 7929+  -- LATIN CAPITAL LETTER MIDDLE-WELSH LL+  '\x1efa'# -> unI64 7931+  -- LATIN CAPITAL LETTER MIDDLE-WELSH V+  '\x1efc'# -> unI64 7933+  -- LATIN CAPITAL LETTER Y WITH LOOP+  '\x1efe'# -> unI64 7935+  -- GREEK CAPITAL LETTER ALPHA WITH PSILI+  '\x1f08'# -> unI64 7936+  -- GREEK CAPITAL LETTER ALPHA WITH DASIA+  '\x1f09'# -> unI64 7937+  -- GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA+  '\x1f0a'# -> unI64 7938+  -- GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA+  '\x1f0b'# -> unI64 7939+  -- GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA+  '\x1f0c'# -> unI64 7940+  -- GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA+  '\x1f0d'# -> unI64 7941+  -- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI+  '\x1f0e'# -> unI64 7942+  -- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI+  '\x1f0f'# -> unI64 7943+  -- GREEK CAPITAL LETTER EPSILON WITH PSILI+  '\x1f18'# -> unI64 7952+  -- GREEK CAPITAL LETTER EPSILON WITH DASIA+  '\x1f19'# -> unI64 7953+  -- GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA+  '\x1f1a'# -> unI64 7954+  -- GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA+  '\x1f1b'# -> unI64 7955+  -- GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA+  '\x1f1c'# -> unI64 7956+  -- GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA+  '\x1f1d'# -> unI64 7957+  -- GREEK CAPITAL LETTER ETA WITH PSILI+  '\x1f28'# -> unI64 7968+  -- GREEK CAPITAL LETTER ETA WITH DASIA+  '\x1f29'# -> unI64 7969+  -- GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA+  '\x1f2a'# -> unI64 7970+  -- GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA+  '\x1f2b'# -> unI64 7971+  -- GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA+  '\x1f2c'# -> unI64 7972+  -- GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA+  '\x1f2d'# -> unI64 7973+  -- GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI+  '\x1f2e'# -> unI64 7974+  -- GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI+  '\x1f2f'# -> unI64 7975+  -- GREEK CAPITAL LETTER IOTA WITH PSILI+  '\x1f38'# -> unI64 7984+  -- GREEK CAPITAL LETTER IOTA WITH DASIA+  '\x1f39'# -> unI64 7985+  -- GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA+  '\x1f3a'# -> unI64 7986+  -- GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA+  '\x1f3b'# -> unI64 7987+  -- GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA+  '\x1f3c'# -> unI64 7988+  -- GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA+  '\x1f3d'# -> unI64 7989+  -- GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI+  '\x1f3e'# -> unI64 7990+  -- GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI+  '\x1f3f'# -> unI64 7991+  -- GREEK CAPITAL LETTER OMICRON WITH PSILI+  '\x1f48'# -> unI64 8000+  -- GREEK CAPITAL LETTER OMICRON WITH DASIA+  '\x1f49'# -> unI64 8001+  -- GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA+  '\x1f4a'# -> unI64 8002+  -- GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA+  '\x1f4b'# -> unI64 8003+  -- GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA+  '\x1f4c'# -> unI64 8004+  -- GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA+  '\x1f4d'# -> unI64 8005+  -- GREEK SMALL LETTER UPSILON WITH PSILI+  '\x1f50'# -> unI64 1650459589+  -- GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA+  '\x1f52'# -> unI64 3377701370987461+  -- GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA+  '\x1f54'# -> unI64 3382099417498565+  -- GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI+  '\x1f56'# -> unI64 3667972440720325+  -- GREEK CAPITAL LETTER UPSILON WITH DASIA+  '\x1f59'# -> unI64 8017+  -- GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA+  '\x1f5b'# -> unI64 8019+  -- GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA+  '\x1f5d'# -> unI64 8021+  -- GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI+  '\x1f5f'# -> unI64 8023+  -- GREEK CAPITAL LETTER OMEGA WITH PSILI+  '\x1f68'# -> unI64 8032+  -- GREEK CAPITAL LETTER OMEGA WITH DASIA+  '\x1f69'# -> unI64 8033+  -- GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA+  '\x1f6a'# -> unI64 8034+  -- GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA+  '\x1f6b'# -> unI64 8035+  -- GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA+  '\x1f6c'# -> unI64 8036+  -- GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA+  '\x1f6d'# -> unI64 8037+  -- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI+  '\x1f6e'# -> unI64 8038+  -- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI+  '\x1f6f'# -> unI64 8039+  -- GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI+  '\x1f80'# -> unI64 1998593792+  -- GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI+  '\x1f81'# -> unI64 1998593793+  -- GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI+  '\x1f82'# -> unI64 1998593794+  -- GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI+  '\x1f83'# -> unI64 1998593795+  -- GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI+  '\x1f84'# -> unI64 1998593796+  -- GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI+  '\x1f85'# -> unI64 1998593797+  -- GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI+  '\x1f86'# -> unI64 1998593798+  -- GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI+  '\x1f87'# -> unI64 1998593799+  -- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI+  '\x1f88'# -> unI64 1998593792+  -- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI+  '\x1f89'# -> unI64 1998593793+  -- GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI+  '\x1f8a'# -> unI64 1998593794+  -- GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI+  '\x1f8b'# -> unI64 1998593795+  -- GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI+  '\x1f8c'# -> unI64 1998593796+  -- GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI+  '\x1f8d'# -> unI64 1998593797+  -- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI+  '\x1f8e'# -> unI64 1998593798+  -- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI+  '\x1f8f'# -> unI64 1998593799+  -- GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI+  '\x1f90'# -> unI64 1998593824+  -- GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI+  '\x1f91'# -> unI64 1998593825+  -- GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI+  '\x1f92'# -> unI64 1998593826+  -- GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI+  '\x1f93'# -> unI64 1998593827+  -- GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI+  '\x1f94'# -> unI64 1998593828+  -- GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI+  '\x1f95'# -> unI64 1998593829+  -- GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI+  '\x1f96'# -> unI64 1998593830+  -- GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI+  '\x1f97'# -> unI64 1998593831+  -- GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI+  '\x1f98'# -> unI64 1998593824+  -- GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI+  '\x1f99'# -> unI64 1998593825+  -- GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI+  '\x1f9a'# -> unI64 1998593826+  -- GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI+  '\x1f9b'# -> unI64 1998593827+  -- GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI+  '\x1f9c'# -> unI64 1998593828+  -- GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI+  '\x1f9d'# -> unI64 1998593829+  -- GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI+  '\x1f9e'# -> unI64 1998593830+  -- GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI+  '\x1f9f'# -> unI64 1998593831+  -- GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI+  '\x1fa0'# -> unI64 1998593888+  -- GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI+  '\x1fa1'# -> unI64 1998593889+  -- GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI+  '\x1fa2'# -> unI64 1998593890+  -- GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI+  '\x1fa3'# -> unI64 1998593891+  -- GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI+  '\x1fa4'# -> unI64 1998593892+  -- GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI+  '\x1fa5'# -> unI64 1998593893+  -- GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI+  '\x1fa6'# -> unI64 1998593894+  -- GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI+  '\x1fa7'# -> unI64 1998593895+  -- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI+  '\x1fa8'# -> unI64 1998593888+  -- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI+  '\x1fa9'# -> unI64 1998593889+  -- GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI+  '\x1faa'# -> unI64 1998593890+  -- GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI+  '\x1fab'# -> unI64 1998593891+  -- GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI+  '\x1fac'# -> unI64 1998593892+  -- GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI+  '\x1fad'# -> unI64 1998593893+  -- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI+  '\x1fae'# -> unI64 1998593894+  -- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI+  '\x1faf'# -> unI64 1998593895+  -- GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI+  '\x1fb2'# -> unI64 1998593904+  -- GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI+  '\x1fb3'# -> unI64 1998586801+  -- GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI+  '\x1fb4'# -> unI64 1998586796+  -- GREEK SMALL LETTER ALPHA WITH PERISPOMENI+  '\x1fb6'# -> unI64 1749025713+  -- GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI+  '\x1fb7'# -> unI64 4191340074107825+  -- GREEK CAPITAL LETTER ALPHA WITH VRACHY+  '\x1fb8'# -> unI64 8112+  -- GREEK CAPITAL LETTER ALPHA WITH MACRON+  '\x1fb9'# -> unI64 8113+  -- GREEK CAPITAL LETTER ALPHA WITH VARIA+  '\x1fba'# -> unI64 8048+  -- GREEK CAPITAL LETTER ALPHA WITH OXIA+  '\x1fbb'# -> unI64 8049+  -- GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI+  '\x1fbc'# -> unI64 1998586801+  -- GREEK PROSGEGRAMMENI+  '\x1fbe'# -> unI64 953+  -- GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI+  '\x1fc2'# -> unI64 1998593908+  -- GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI+  '\x1fc3'# -> unI64 1998586807+  -- GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI+  '\x1fc4'# -> unI64 1998586798+  -- GREEK SMALL LETTER ETA WITH PERISPOMENI+  '\x1fc6'# -> unI64 1749025719+  -- GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI+  '\x1fc7'# -> unI64 4191340074107831+  -- GREEK CAPITAL LETTER EPSILON WITH VARIA+  '\x1fc8'# -> unI64 8050+  -- GREEK CAPITAL LETTER EPSILON WITH OXIA+  '\x1fc9'# -> unI64 8051+  -- GREEK CAPITAL LETTER ETA WITH VARIA+  '\x1fca'# -> unI64 8052+  -- GREEK CAPITAL LETTER ETA WITH OXIA+  '\x1fcb'# -> unI64 8053+  -- GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI+  '\x1fcc'# -> unI64 1998586807+  -- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA+  '\x1fd2'# -> unI64 3377701347918777+  -- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA+  '\x1fd3'# -> unI64 3382099394429881+  -- GREEK SMALL LETTER IOTA WITH PERISPOMENI+  '\x1fd6'# -> unI64 1749025721+  -- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI+  '\x1fd7'# -> unI64 3667972417651641+  -- GREEK CAPITAL LETTER IOTA WITH VRACHY+  '\x1fd8'# -> unI64 8144+  -- GREEK CAPITAL LETTER IOTA WITH MACRON+  '\x1fd9'# -> unI64 8145+  -- GREEK CAPITAL LETTER IOTA WITH VARIA+  '\x1fda'# -> unI64 8054+  -- GREEK CAPITAL LETTER IOTA WITH OXIA+  '\x1fdb'# -> unI64 8055+  -- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA+  '\x1fe2'# -> unI64 3377701347918789+  -- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA+  '\x1fe3'# -> unI64 3382099394429893+  -- GREEK SMALL LETTER RHO WITH PSILI+  '\x1fe4'# -> unI64 1650459585+  -- GREEK SMALL LETTER UPSILON WITH PERISPOMENI+  '\x1fe6'# -> unI64 1749025733+  -- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI+  '\x1fe7'# -> unI64 3667972417651653+  -- GREEK CAPITAL LETTER UPSILON WITH VRACHY+  '\x1fe8'# -> unI64 8160+  -- GREEK CAPITAL LETTER UPSILON WITH MACRON+  '\x1fe9'# -> unI64 8161+  -- GREEK CAPITAL LETTER UPSILON WITH VARIA+  '\x1fea'# -> unI64 8058+  -- GREEK CAPITAL LETTER UPSILON WITH OXIA+  '\x1feb'# -> unI64 8059+  -- GREEK CAPITAL LETTER RHO WITH DASIA+  '\x1fec'# -> unI64 8165+  -- GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI+  '\x1ff2'# -> unI64 1998593916+  -- GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI+  '\x1ff3'# -> unI64 1998586825+  -- GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI+  '\x1ff4'# -> unI64 1998586830+  -- GREEK SMALL LETTER OMEGA WITH PERISPOMENI+  '\x1ff6'# -> unI64 1749025737+  -- GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI+  '\x1ff7'# -> unI64 4191340074107849+  -- GREEK CAPITAL LETTER OMICRON WITH VARIA+  '\x1ff8'# -> unI64 8056+  -- GREEK CAPITAL LETTER OMICRON WITH OXIA+  '\x1ff9'# -> unI64 8057+  -- GREEK CAPITAL LETTER OMEGA WITH VARIA+  '\x1ffa'# -> unI64 8060+  -- GREEK CAPITAL LETTER OMEGA WITH OXIA+  '\x1ffb'# -> unI64 8061+  -- GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI+  '\x1ffc'# -> unI64 1998586825+  -- OHM SIGN+  '\x2126'# -> unI64 969+  -- KELVIN SIGN+  '\x212a'# -> unI64 107+  -- ANGSTROM SIGN+  '\x212b'# -> unI64 229+  -- TURNED CAPITAL F+  '\x2132'# -> unI64 8526+  -- ROMAN NUMERAL ONE+  '\x2160'# -> unI64 8560+  -- ROMAN NUMERAL TWO+  '\x2161'# -> unI64 8561+  -- ROMAN NUMERAL THREE+  '\x2162'# -> unI64 8562+  -- ROMAN NUMERAL FOUR+  '\x2163'# -> unI64 8563+  -- ROMAN NUMERAL FIVE+  '\x2164'# -> unI64 8564+  -- ROMAN NUMERAL SIX+  '\x2165'# -> unI64 8565+  -- ROMAN NUMERAL SEVEN+  '\x2166'# -> unI64 8566+  -- ROMAN NUMERAL EIGHT+  '\x2167'# -> unI64 8567+  -- ROMAN NUMERAL NINE+  '\x2168'# -> unI64 8568+  -- ROMAN NUMERAL TEN+  '\x2169'# -> unI64 8569+  -- ROMAN NUMERAL ELEVEN+  '\x216a'# -> unI64 8570+  -- ROMAN NUMERAL TWELVE+  '\x216b'# -> unI64 8571+  -- ROMAN NUMERAL FIFTY+  '\x216c'# -> unI64 8572+  -- ROMAN NUMERAL ONE HUNDRED+  '\x216d'# -> unI64 8573+  -- ROMAN NUMERAL FIVE HUNDRED+  '\x216e'# -> unI64 8574+  -- ROMAN NUMERAL ONE THOUSAND+  '\x216f'# -> unI64 8575+  -- ROMAN NUMERAL REVERSED ONE HUNDRED+  '\x2183'# -> unI64 8580+  -- CIRCLED LATIN CAPITAL LETTER A+  '\x24b6'# -> unI64 9424+  -- CIRCLED LATIN CAPITAL LETTER B+  '\x24b7'# -> unI64 9425+  -- CIRCLED LATIN CAPITAL LETTER C+  '\x24b8'# -> unI64 9426+  -- CIRCLED LATIN CAPITAL LETTER D+  '\x24b9'# -> unI64 9427+  -- CIRCLED LATIN CAPITAL LETTER E+  '\x24ba'# -> unI64 9428+  -- CIRCLED LATIN CAPITAL LETTER F+  '\x24bb'# -> unI64 9429+  -- CIRCLED LATIN CAPITAL LETTER G+  '\x24bc'# -> unI64 9430+  -- CIRCLED LATIN CAPITAL LETTER H+  '\x24bd'# -> unI64 9431+  -- CIRCLED LATIN CAPITAL LETTER I+  '\x24be'# -> unI64 9432+  -- CIRCLED LATIN CAPITAL LETTER J+  '\x24bf'# -> unI64 9433+  -- CIRCLED LATIN CAPITAL LETTER K+  '\x24c0'# -> unI64 9434+  -- CIRCLED LATIN CAPITAL LETTER L+  '\x24c1'# -> unI64 9435+  -- CIRCLED LATIN CAPITAL LETTER M+  '\x24c2'# -> unI64 9436+  -- CIRCLED LATIN CAPITAL LETTER N+  '\x24c3'# -> unI64 9437+  -- CIRCLED LATIN CAPITAL LETTER O+  '\x24c4'# -> unI64 9438+  -- CIRCLED LATIN CAPITAL LETTER P+  '\x24c5'# -> unI64 9439+  -- CIRCLED LATIN CAPITAL LETTER Q+  '\x24c6'# -> unI64 9440+  -- CIRCLED LATIN CAPITAL LETTER R+  '\x24c7'# -> unI64 9441+  -- CIRCLED LATIN CAPITAL LETTER S+  '\x24c8'# -> unI64 9442+  -- CIRCLED LATIN CAPITAL LETTER T+  '\x24c9'# -> unI64 9443+  -- CIRCLED LATIN CAPITAL LETTER U+  '\x24ca'# -> unI64 9444+  -- CIRCLED LATIN CAPITAL LETTER V+  '\x24cb'# -> unI64 9445+  -- CIRCLED LATIN CAPITAL LETTER W+  '\x24cc'# -> unI64 9446+  -- CIRCLED LATIN CAPITAL LETTER X+  '\x24cd'# -> unI64 9447+  -- CIRCLED LATIN CAPITAL LETTER Y+  '\x24ce'# -> unI64 9448+  -- CIRCLED LATIN CAPITAL LETTER Z+  '\x24cf'# -> unI64 9449+  -- GLAGOLITIC CAPITAL LETTER AZU+  '\x2c00'# -> unI64 11312+  -- GLAGOLITIC CAPITAL LETTER BUKY+  '\x2c01'# -> unI64 11313+  -- GLAGOLITIC CAPITAL LETTER VEDE+  '\x2c02'# -> unI64 11314+  -- GLAGOLITIC CAPITAL LETTER GLAGOLI+  '\x2c03'# -> unI64 11315+  -- GLAGOLITIC CAPITAL LETTER DOBRO+  '\x2c04'# -> unI64 11316+  -- GLAGOLITIC CAPITAL LETTER YESTU+  '\x2c05'# -> unI64 11317+  -- GLAGOLITIC CAPITAL LETTER ZHIVETE+  '\x2c06'# -> unI64 11318+  -- GLAGOLITIC CAPITAL LETTER DZELO+  '\x2c07'# -> unI64 11319+  -- GLAGOLITIC CAPITAL LETTER ZEMLJA+  '\x2c08'# -> unI64 11320+  -- GLAGOLITIC CAPITAL LETTER IZHE+  '\x2c09'# -> unI64 11321+  -- GLAGOLITIC CAPITAL LETTER INITIAL IZHE+  '\x2c0a'# -> unI64 11322+  -- GLAGOLITIC CAPITAL LETTER I+  '\x2c0b'# -> unI64 11323+  -- GLAGOLITIC CAPITAL LETTER DJERVI+  '\x2c0c'# -> unI64 11324+  -- GLAGOLITIC CAPITAL LETTER KAKO+  '\x2c0d'# -> unI64 11325+  -- GLAGOLITIC CAPITAL LETTER LJUDIJE+  '\x2c0e'# -> unI64 11326+  -- GLAGOLITIC CAPITAL LETTER MYSLITE+  '\x2c0f'# -> unI64 11327+  -- GLAGOLITIC CAPITAL LETTER NASHI+  '\x2c10'# -> unI64 11328+  -- GLAGOLITIC CAPITAL LETTER ONU+  '\x2c11'# -> unI64 11329+  -- GLAGOLITIC CAPITAL LETTER POKOJI+  '\x2c12'# -> unI64 11330+  -- GLAGOLITIC CAPITAL LETTER RITSI+  '\x2c13'# -> unI64 11331+  -- GLAGOLITIC CAPITAL LETTER SLOVO+  '\x2c14'# -> unI64 11332+  -- GLAGOLITIC CAPITAL LETTER TVRIDO+  '\x2c15'# -> unI64 11333+  -- GLAGOLITIC CAPITAL LETTER UKU+  '\x2c16'# -> unI64 11334+  -- GLAGOLITIC CAPITAL LETTER FRITU+  '\x2c17'# -> unI64 11335+  -- GLAGOLITIC CAPITAL LETTER HERU+  '\x2c18'# -> unI64 11336+  -- GLAGOLITIC CAPITAL LETTER OTU+  '\x2c19'# -> unI64 11337+  -- GLAGOLITIC CAPITAL LETTER PE+  '\x2c1a'# -> unI64 11338+  -- GLAGOLITIC CAPITAL LETTER SHTA+  '\x2c1b'# -> unI64 11339+  -- GLAGOLITIC CAPITAL LETTER TSI+  '\x2c1c'# -> unI64 11340+  -- GLAGOLITIC CAPITAL LETTER CHRIVI+  '\x2c1d'# -> unI64 11341+  -- GLAGOLITIC CAPITAL LETTER SHA+  '\x2c1e'# -> unI64 11342+  -- GLAGOLITIC CAPITAL LETTER YERU+  '\x2c1f'# -> unI64 11343+  -- GLAGOLITIC CAPITAL LETTER YERI+  '\x2c20'# -> unI64 11344+  -- GLAGOLITIC CAPITAL LETTER YATI+  '\x2c21'# -> unI64 11345+  -- GLAGOLITIC CAPITAL LETTER SPIDERY HA+  '\x2c22'# -> unI64 11346+  -- GLAGOLITIC CAPITAL LETTER YU+  '\x2c23'# -> unI64 11347+  -- GLAGOLITIC CAPITAL LETTER SMALL YUS+  '\x2c24'# -> unI64 11348+  -- GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL+  '\x2c25'# -> unI64 11349+  -- GLAGOLITIC CAPITAL LETTER YO+  '\x2c26'# -> unI64 11350+  -- GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS+  '\x2c27'# -> unI64 11351+  -- GLAGOLITIC CAPITAL LETTER BIG YUS+  '\x2c28'# -> unI64 11352+  -- GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS+  '\x2c29'# -> unI64 11353+  -- GLAGOLITIC CAPITAL LETTER FITA+  '\x2c2a'# -> unI64 11354+  -- GLAGOLITIC CAPITAL LETTER IZHITSA+  '\x2c2b'# -> unI64 11355+  -- GLAGOLITIC CAPITAL LETTER SHTAPIC+  '\x2c2c'# -> unI64 11356+  -- GLAGOLITIC CAPITAL LETTER TROKUTASTI A+  '\x2c2d'# -> unI64 11357+  -- GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE+  '\x2c2e'# -> unI64 11358+  -- GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI+  '\x2c2f'# -> unI64 11359+  -- LATIN CAPITAL LETTER L WITH DOUBLE BAR+  '\x2c60'# -> unI64 11361+  -- LATIN CAPITAL LETTER L WITH MIDDLE TILDE+  '\x2c62'# -> unI64 619+  -- LATIN CAPITAL LETTER P WITH STROKE+  '\x2c63'# -> unI64 7549+  -- LATIN CAPITAL LETTER R WITH TAIL+  '\x2c64'# -> unI64 637+  -- LATIN CAPITAL LETTER H WITH DESCENDER+  '\x2c67'# -> unI64 11368+  -- LATIN CAPITAL LETTER K WITH DESCENDER+  '\x2c69'# -> unI64 11370+  -- LATIN CAPITAL LETTER Z WITH DESCENDER+  '\x2c6b'# -> unI64 11372+  -- LATIN CAPITAL LETTER ALPHA+  '\x2c6d'# -> unI64 593+  -- LATIN CAPITAL LETTER M WITH HOOK+  '\x2c6e'# -> unI64 625+  -- LATIN CAPITAL LETTER TURNED A+  '\x2c6f'# -> unI64 592+  -- LATIN CAPITAL LETTER TURNED ALPHA+  '\x2c70'# -> unI64 594+  -- LATIN CAPITAL LETTER W WITH HOOK+  '\x2c72'# -> unI64 11379+  -- LATIN CAPITAL LETTER HALF H+  '\x2c75'# -> unI64 11382+  -- LATIN CAPITAL LETTER S WITH SWASH TAIL+  '\x2c7e'# -> unI64 575+  -- LATIN CAPITAL LETTER Z WITH SWASH TAIL+  '\x2c7f'# -> unI64 576+  -- COPTIC CAPITAL LETTER ALFA+  '\x2c80'# -> unI64 11393+  -- COPTIC CAPITAL LETTER VIDA+  '\x2c82'# -> unI64 11395+  -- COPTIC CAPITAL LETTER GAMMA+  '\x2c84'# -> unI64 11397+  -- COPTIC CAPITAL LETTER DALDA+  '\x2c86'# -> unI64 11399+  -- COPTIC CAPITAL LETTER EIE+  '\x2c88'# -> unI64 11401+  -- COPTIC CAPITAL LETTER SOU+  '\x2c8a'# -> unI64 11403+  -- COPTIC CAPITAL LETTER ZATA+  '\x2c8c'# -> unI64 11405+  -- COPTIC CAPITAL LETTER HATE+  '\x2c8e'# -> unI64 11407+  -- COPTIC CAPITAL LETTER THETHE+  '\x2c90'# -> unI64 11409+  -- COPTIC CAPITAL LETTER IAUDA+  '\x2c92'# -> unI64 11411+  -- COPTIC CAPITAL LETTER KAPA+  '\x2c94'# -> unI64 11413+  -- COPTIC CAPITAL LETTER LAULA+  '\x2c96'# -> unI64 11415+  -- COPTIC CAPITAL LETTER MI+  '\x2c98'# -> unI64 11417+  -- COPTIC CAPITAL LETTER NI+  '\x2c9a'# -> unI64 11419+  -- COPTIC CAPITAL LETTER KSI+  '\x2c9c'# -> unI64 11421+  -- COPTIC CAPITAL LETTER O+  '\x2c9e'# -> unI64 11423+  -- COPTIC CAPITAL LETTER PI+  '\x2ca0'# -> unI64 11425+  -- COPTIC CAPITAL LETTER RO+  '\x2ca2'# -> unI64 11427+  -- COPTIC CAPITAL LETTER SIMA+  '\x2ca4'# -> unI64 11429+  -- COPTIC CAPITAL LETTER TAU+  '\x2ca6'# -> unI64 11431+  -- COPTIC CAPITAL LETTER UA+  '\x2ca8'# -> unI64 11433+  -- COPTIC CAPITAL LETTER FI+  '\x2caa'# -> unI64 11435+  -- COPTIC CAPITAL LETTER KHI+  '\x2cac'# -> unI64 11437+  -- COPTIC CAPITAL LETTER PSI+  '\x2cae'# -> unI64 11439+  -- COPTIC CAPITAL LETTER OOU+  '\x2cb0'# -> unI64 11441+  -- COPTIC CAPITAL LETTER DIALECT-P ALEF+  '\x2cb2'# -> unI64 11443+  -- COPTIC CAPITAL LETTER OLD COPTIC AIN+  '\x2cb4'# -> unI64 11445+  -- COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE+  '\x2cb6'# -> unI64 11447+  -- COPTIC CAPITAL LETTER DIALECT-P KAPA+  '\x2cb8'# -> unI64 11449+  -- COPTIC CAPITAL LETTER DIALECT-P NI+  '\x2cba'# -> unI64 11451+  -- COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI+  '\x2cbc'# -> unI64 11453+  -- COPTIC CAPITAL LETTER OLD COPTIC OOU+  '\x2cbe'# -> unI64 11455+  -- COPTIC CAPITAL LETTER SAMPI+  '\x2cc0'# -> unI64 11457+  -- COPTIC CAPITAL LETTER CROSSED SHEI+  '\x2cc2'# -> unI64 11459+  -- COPTIC CAPITAL LETTER OLD COPTIC SHEI+  '\x2cc4'# -> unI64 11461+  -- COPTIC CAPITAL LETTER OLD COPTIC ESH+  '\x2cc6'# -> unI64 11463+  -- COPTIC CAPITAL LETTER AKHMIMIC KHEI+  '\x2cc8'# -> unI64 11465+  -- COPTIC CAPITAL LETTER DIALECT-P HORI+  '\x2cca'# -> unI64 11467+  -- COPTIC CAPITAL LETTER OLD COPTIC HORI+  '\x2ccc'# -> unI64 11469+  -- COPTIC CAPITAL LETTER OLD COPTIC HA+  '\x2cce'# -> unI64 11471+  -- COPTIC CAPITAL LETTER L-SHAPED HA+  '\x2cd0'# -> unI64 11473+  -- COPTIC CAPITAL LETTER OLD COPTIC HEI+  '\x2cd2'# -> unI64 11475+  -- COPTIC CAPITAL LETTER OLD COPTIC HAT+  '\x2cd4'# -> unI64 11477+  -- COPTIC CAPITAL LETTER OLD COPTIC GANGIA+  '\x2cd6'# -> unI64 11479+  -- COPTIC CAPITAL LETTER OLD COPTIC DJA+  '\x2cd8'# -> unI64 11481+  -- COPTIC CAPITAL LETTER OLD COPTIC SHIMA+  '\x2cda'# -> unI64 11483+  -- COPTIC CAPITAL LETTER OLD NUBIAN SHIMA+  '\x2cdc'# -> unI64 11485+  -- COPTIC CAPITAL LETTER OLD NUBIAN NGI+  '\x2cde'# -> unI64 11487+  -- COPTIC CAPITAL LETTER OLD NUBIAN NYI+  '\x2ce0'# -> unI64 11489+  -- COPTIC CAPITAL LETTER OLD NUBIAN WAU+  '\x2ce2'# -> unI64 11491+  -- COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI+  '\x2ceb'# -> unI64 11500+  -- COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA+  '\x2ced'# -> unI64 11502+  -- COPTIC CAPITAL LETTER BOHAIRIC KHEI+  '\x2cf2'# -> unI64 11507+  -- CYRILLIC CAPITAL LETTER ZEMLYA+  '\xa640'# -> unI64 42561+  -- CYRILLIC CAPITAL LETTER DZELO+  '\xa642'# -> unI64 42563+  -- CYRILLIC CAPITAL LETTER REVERSED DZE+  '\xa644'# -> unI64 42565+  -- CYRILLIC CAPITAL LETTER IOTA+  '\xa646'# -> unI64 42567+  -- CYRILLIC CAPITAL LETTER DJERV+  '\xa648'# -> unI64 42569+  -- CYRILLIC CAPITAL LETTER MONOGRAPH UK+  '\xa64a'# -> unI64 42571+  -- CYRILLIC CAPITAL LETTER BROAD OMEGA+  '\xa64c'# -> unI64 42573+  -- CYRILLIC CAPITAL LETTER NEUTRAL YER+  '\xa64e'# -> unI64 42575+  -- CYRILLIC CAPITAL LETTER YERU WITH BACK YER+  '\xa650'# -> unI64 42577+  -- CYRILLIC CAPITAL LETTER IOTIFIED YAT+  '\xa652'# -> unI64 42579+  -- CYRILLIC CAPITAL LETTER REVERSED YU+  '\xa654'# -> unI64 42581+  -- CYRILLIC CAPITAL LETTER IOTIFIED A+  '\xa656'# -> unI64 42583+  -- CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS+  '\xa658'# -> unI64 42585+  -- CYRILLIC CAPITAL LETTER BLENDED YUS+  '\xa65a'# -> unI64 42587+  -- CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS+  '\xa65c'# -> unI64 42589+  -- CYRILLIC CAPITAL LETTER YN+  '\xa65e'# -> unI64 42591+  -- CYRILLIC CAPITAL LETTER REVERSED TSE+  '\xa660'# -> unI64 42593+  -- CYRILLIC CAPITAL LETTER SOFT DE+  '\xa662'# -> unI64 42595+  -- CYRILLIC CAPITAL LETTER SOFT EL+  '\xa664'# -> unI64 42597+  -- CYRILLIC CAPITAL LETTER SOFT EM+  '\xa666'# -> unI64 42599+  -- CYRILLIC CAPITAL LETTER MONOCULAR O+  '\xa668'# -> unI64 42601+  -- CYRILLIC CAPITAL LETTER BINOCULAR O+  '\xa66a'# -> unI64 42603+  -- CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O+  '\xa66c'# -> unI64 42605+  -- CYRILLIC CAPITAL LETTER DWE+  '\xa680'# -> unI64 42625+  -- CYRILLIC CAPITAL LETTER DZWE+  '\xa682'# -> unI64 42627+  -- CYRILLIC CAPITAL LETTER ZHWE+  '\xa684'# -> unI64 42629+  -- CYRILLIC CAPITAL LETTER CCHE+  '\xa686'# -> unI64 42631+  -- CYRILLIC CAPITAL LETTER DZZE+  '\xa688'# -> unI64 42633+  -- CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK+  '\xa68a'# -> unI64 42635+  -- CYRILLIC CAPITAL LETTER TWE+  '\xa68c'# -> unI64 42637+  -- CYRILLIC CAPITAL LETTER TSWE+  '\xa68e'# -> unI64 42639+  -- CYRILLIC CAPITAL LETTER TSSE+  '\xa690'# -> unI64 42641+  -- CYRILLIC CAPITAL LETTER TCHE+  '\xa692'# -> unI64 42643+  -- CYRILLIC CAPITAL LETTER HWE+  '\xa694'# -> unI64 42645+  -- CYRILLIC CAPITAL LETTER SHWE+  '\xa696'# -> unI64 42647+  -- CYRILLIC CAPITAL LETTER DOUBLE O+  '\xa698'# -> unI64 42649+  -- CYRILLIC CAPITAL LETTER CROSSED O+  '\xa69a'# -> unI64 42651+  -- LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF+  '\xa722'# -> unI64 42787+  -- LATIN CAPITAL LETTER EGYPTOLOGICAL AIN+  '\xa724'# -> unI64 42789+  -- LATIN CAPITAL LETTER HENG+  '\xa726'# -> unI64 42791+  -- LATIN CAPITAL LETTER TZ+  '\xa728'# -> unI64 42793+  -- LATIN CAPITAL LETTER TRESILLO+  '\xa72a'# -> unI64 42795+  -- LATIN CAPITAL LETTER CUATRILLO+  '\xa72c'# -> unI64 42797+  -- LATIN CAPITAL LETTER CUATRILLO WITH COMMA+  '\xa72e'# -> unI64 42799+  -- LATIN CAPITAL LETTER AA+  '\xa732'# -> unI64 42803+  -- LATIN CAPITAL LETTER AO+  '\xa734'# -> unI64 42805+  -- LATIN CAPITAL LETTER AU+  '\xa736'# -> unI64 42807+  -- LATIN CAPITAL LETTER AV+  '\xa738'# -> unI64 42809+  -- LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR+  '\xa73a'# -> unI64 42811+  -- LATIN CAPITAL LETTER AY+  '\xa73c'# -> unI64 42813+  -- LATIN CAPITAL LETTER REVERSED C WITH DOT+  '\xa73e'# -> unI64 42815+  -- LATIN CAPITAL LETTER K WITH STROKE+  '\xa740'# -> unI64 42817+  -- LATIN CAPITAL LETTER K WITH DIAGONAL STROKE+  '\xa742'# -> unI64 42819+  -- LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE+  '\xa744'# -> unI64 42821+  -- LATIN CAPITAL LETTER BROKEN L+  '\xa746'# -> unI64 42823+  -- LATIN CAPITAL LETTER L WITH HIGH STROKE+  '\xa748'# -> unI64 42825+  -- LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY+  '\xa74a'# -> unI64 42827+  -- LATIN CAPITAL LETTER O WITH LOOP+  '\xa74c'# -> unI64 42829+  -- LATIN CAPITAL LETTER OO+  '\xa74e'# -> unI64 42831+  -- LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER+  '\xa750'# -> unI64 42833+  -- LATIN CAPITAL LETTER P WITH FLOURISH+  '\xa752'# -> unI64 42835+  -- LATIN CAPITAL LETTER P WITH SQUIRREL TAIL+  '\xa754'# -> unI64 42837+  -- LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER+  '\xa756'# -> unI64 42839+  -- LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE+  '\xa758'# -> unI64 42841+  -- LATIN CAPITAL LETTER R ROTUNDA+  '\xa75a'# -> unI64 42843+  -- LATIN CAPITAL LETTER RUM ROTUNDA+  '\xa75c'# -> unI64 42845+  -- LATIN CAPITAL LETTER V WITH DIAGONAL STROKE+  '\xa75e'# -> unI64 42847+  -- LATIN CAPITAL LETTER VY+  '\xa760'# -> unI64 42849+  -- LATIN CAPITAL LETTER VISIGOTHIC Z+  '\xa762'# -> unI64 42851+  -- LATIN CAPITAL LETTER THORN WITH STROKE+  '\xa764'# -> unI64 42853+  -- LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER+  '\xa766'# -> unI64 42855+  -- LATIN CAPITAL LETTER VEND+  '\xa768'# -> unI64 42857+  -- LATIN CAPITAL LETTER ET+  '\xa76a'# -> unI64 42859+  -- LATIN CAPITAL LETTER IS+  '\xa76c'# -> unI64 42861+  -- LATIN CAPITAL LETTER CON+  '\xa76e'# -> unI64 42863+  -- LATIN CAPITAL LETTER INSULAR D+  '\xa779'# -> unI64 42874+  -- LATIN CAPITAL LETTER INSULAR F+  '\xa77b'# -> unI64 42876+  -- LATIN CAPITAL LETTER INSULAR G+  '\xa77d'# -> unI64 7545+  -- LATIN CAPITAL LETTER TURNED INSULAR G+  '\xa77e'# -> unI64 42879+  -- LATIN CAPITAL LETTER TURNED L+  '\xa780'# -> unI64 42881+  -- LATIN CAPITAL LETTER INSULAR R+  '\xa782'# -> unI64 42883+  -- LATIN CAPITAL LETTER INSULAR S+  '\xa784'# -> unI64 42885+  -- LATIN CAPITAL LETTER INSULAR T+  '\xa786'# -> unI64 42887+  -- LATIN CAPITAL LETTER SALTILLO+  '\xa78b'# -> unI64 42892+  -- LATIN CAPITAL LETTER TURNED H+  '\xa78d'# -> unI64 613+  -- LATIN CAPITAL LETTER N WITH DESCENDER+  '\xa790'# -> unI64 42897+  -- LATIN CAPITAL LETTER C WITH BAR+  '\xa792'# -> unI64 42899+  -- LATIN CAPITAL LETTER B WITH FLOURISH+  '\xa796'# -> unI64 42903+  -- LATIN CAPITAL LETTER F WITH STROKE+  '\xa798'# -> unI64 42905+  -- LATIN CAPITAL LETTER VOLAPUK AE+  '\xa79a'# -> unI64 42907+  -- LATIN CAPITAL LETTER VOLAPUK OE+  '\xa79c'# -> unI64 42909+  -- LATIN CAPITAL LETTER VOLAPUK UE+  '\xa79e'# -> unI64 42911+  -- LATIN CAPITAL LETTER G WITH OBLIQUE STROKE+  '\xa7a0'# -> unI64 42913+  -- LATIN CAPITAL LETTER K WITH OBLIQUE STROKE+  '\xa7a2'# -> unI64 42915+  -- LATIN CAPITAL LETTER N WITH OBLIQUE STROKE+  '\xa7a4'# -> unI64 42917+  -- LATIN CAPITAL LETTER R WITH OBLIQUE STROKE+  '\xa7a6'# -> unI64 42919+  -- LATIN CAPITAL LETTER S WITH OBLIQUE STROKE+  '\xa7a8'# -> unI64 42921+  -- LATIN CAPITAL LETTER H WITH HOOK+  '\xa7aa'# -> unI64 614+  -- LATIN CAPITAL LETTER REVERSED OPEN E+  '\xa7ab'# -> unI64 604+  -- LATIN CAPITAL LETTER SCRIPT G+  '\xa7ac'# -> unI64 609+  -- LATIN CAPITAL LETTER L WITH BELT+  '\xa7ad'# -> unI64 620+  -- LATIN CAPITAL LETTER SMALL CAPITAL I+  '\xa7ae'# -> unI64 618+  -- LATIN CAPITAL LETTER TURNED K+  '\xa7b0'# -> unI64 670+  -- LATIN CAPITAL LETTER TURNED T+  '\xa7b1'# -> unI64 647+  -- LATIN CAPITAL LETTER J WITH CROSSED-TAIL+  '\xa7b2'# -> unI64 669+  -- LATIN CAPITAL LETTER CHI+  '\xa7b3'# -> unI64 43859+  -- LATIN CAPITAL LETTER BETA+  '\xa7b4'# -> unI64 42933+  -- LATIN CAPITAL LETTER OMEGA+  '\xa7b6'# -> unI64 42935+  -- LATIN CAPITAL LETTER U WITH STROKE+  '\xa7b8'# -> unI64 42937+  -- LATIN CAPITAL LETTER GLOTTAL A+  '\xa7ba'# -> unI64 42939+  -- LATIN CAPITAL LETTER GLOTTAL I+  '\xa7bc'# -> unI64 42941+  -- LATIN CAPITAL LETTER GLOTTAL U+  '\xa7be'# -> unI64 42943+  -- LATIN CAPITAL LETTER OLD POLISH O+  '\xa7c0'# -> unI64 42945+  -- LATIN CAPITAL LETTER ANGLICANA W+  '\xa7c2'# -> unI64 42947+  -- LATIN CAPITAL LETTER C WITH PALATAL HOOK+  '\xa7c4'# -> unI64 42900+  -- LATIN CAPITAL LETTER S WITH HOOK+  '\xa7c5'# -> unI64 642+  -- LATIN CAPITAL LETTER Z WITH PALATAL HOOK+  '\xa7c6'# -> unI64 7566+  -- LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY+  '\xa7c7'# -> unI64 42952+  -- LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY+  '\xa7c9'# -> unI64 42954+  -- LATIN CAPITAL LETTER CLOSED INSULAR G+  '\xa7d0'# -> unI64 42961+  -- LATIN CAPITAL LETTER MIDDLE SCOTS S+  '\xa7d6'# -> unI64 42967+  -- LATIN CAPITAL LETTER SIGMOID S+  '\xa7d8'# -> unI64 42969+  -- LATIN CAPITAL LETTER REVERSED HALF H+  '\xa7f5'# -> unI64 42998+  -- CHEROKEE SMALL LETTER A+  '\xab70'# -> unI64 5024+  -- CHEROKEE SMALL LETTER E+  '\xab71'# -> unI64 5025+  -- CHEROKEE SMALL LETTER I+  '\xab72'# -> unI64 5026+  -- CHEROKEE SMALL LETTER O+  '\xab73'# -> unI64 5027+  -- CHEROKEE SMALL LETTER U+  '\xab74'# -> unI64 5028+  -- CHEROKEE SMALL LETTER V+  '\xab75'# -> unI64 5029+  -- CHEROKEE SMALL LETTER GA+  '\xab76'# -> unI64 5030+  -- CHEROKEE SMALL LETTER KA+  '\xab77'# -> unI64 5031+  -- CHEROKEE SMALL LETTER GE+  '\xab78'# -> unI64 5032+  -- CHEROKEE SMALL LETTER GI+  '\xab79'# -> unI64 5033+  -- CHEROKEE SMALL LETTER GO+  '\xab7a'# -> unI64 5034+  -- CHEROKEE SMALL LETTER GU+  '\xab7b'# -> unI64 5035+  -- CHEROKEE SMALL LETTER GV+  '\xab7c'# -> unI64 5036+  -- CHEROKEE SMALL LETTER HA+  '\xab7d'# -> unI64 5037+  -- CHEROKEE SMALL LETTER HE+  '\xab7e'# -> unI64 5038+  -- CHEROKEE SMALL LETTER HI+  '\xab7f'# -> unI64 5039+  -- CHEROKEE SMALL LETTER HO+  '\xab80'# -> unI64 5040+  -- CHEROKEE SMALL LETTER HU+  '\xab81'# -> unI64 5041+  -- CHEROKEE SMALL LETTER HV+  '\xab82'# -> unI64 5042+  -- CHEROKEE SMALL LETTER LA+  '\xab83'# -> unI64 5043+  -- CHEROKEE SMALL LETTER LE+  '\xab84'# -> unI64 5044+  -- CHEROKEE SMALL LETTER LI+  '\xab85'# -> unI64 5045+  -- CHEROKEE SMALL LETTER LO+  '\xab86'# -> unI64 5046+  -- CHEROKEE SMALL LETTER LU+  '\xab87'# -> unI64 5047+  -- CHEROKEE SMALL LETTER LV+  '\xab88'# -> unI64 5048+  -- CHEROKEE SMALL LETTER MA+  '\xab89'# -> unI64 5049+  -- CHEROKEE SMALL LETTER ME+  '\xab8a'# -> unI64 5050+  -- CHEROKEE SMALL LETTER MI+  '\xab8b'# -> unI64 5051+  -- CHEROKEE SMALL LETTER MO+  '\xab8c'# -> unI64 5052+  -- CHEROKEE SMALL LETTER MU+  '\xab8d'# -> unI64 5053+  -- CHEROKEE SMALL LETTER NA+  '\xab8e'# -> unI64 5054+  -- CHEROKEE SMALL LETTER HNA+  '\xab8f'# -> unI64 5055+  -- CHEROKEE SMALL LETTER NAH+  '\xab90'# -> unI64 5056+  -- CHEROKEE SMALL LETTER NE+  '\xab91'# -> unI64 5057+  -- CHEROKEE SMALL LETTER NI+  '\xab92'# -> unI64 5058+  -- CHEROKEE SMALL LETTER NO+  '\xab93'# -> unI64 5059+  -- CHEROKEE SMALL LETTER NU+  '\xab94'# -> unI64 5060+  -- CHEROKEE SMALL LETTER NV+  '\xab95'# -> unI64 5061+  -- CHEROKEE SMALL LETTER QUA+  '\xab96'# -> unI64 5062+  -- CHEROKEE SMALL LETTER QUE+  '\xab97'# -> unI64 5063+  -- CHEROKEE SMALL LETTER QUI+  '\xab98'# -> unI64 5064+  -- CHEROKEE SMALL LETTER QUO+  '\xab99'# -> unI64 5065+  -- CHEROKEE SMALL LETTER QUU+  '\xab9a'# -> unI64 5066+  -- CHEROKEE SMALL LETTER QUV+  '\xab9b'# -> unI64 5067+  -- CHEROKEE SMALL LETTER SA+  '\xab9c'# -> unI64 5068+  -- CHEROKEE SMALL LETTER S+  '\xab9d'# -> unI64 5069+  -- CHEROKEE SMALL LETTER SE+  '\xab9e'# -> unI64 5070+  -- CHEROKEE SMALL LETTER SI+  '\xab9f'# -> unI64 5071+  -- CHEROKEE SMALL LETTER SO+  '\xaba0'# -> unI64 5072+  -- CHEROKEE SMALL LETTER SU+  '\xaba1'# -> unI64 5073+  -- CHEROKEE SMALL LETTER SV+  '\xaba2'# -> unI64 5074+  -- CHEROKEE SMALL LETTER DA+  '\xaba3'# -> unI64 5075+  -- CHEROKEE SMALL LETTER TA+  '\xaba4'# -> unI64 5076+  -- CHEROKEE SMALL LETTER DE+  '\xaba5'# -> unI64 5077+  -- CHEROKEE SMALL LETTER TE+  '\xaba6'# -> unI64 5078+  -- CHEROKEE SMALL LETTER DI+  '\xaba7'# -> unI64 5079+  -- CHEROKEE SMALL LETTER TI+  '\xaba8'# -> unI64 5080+  -- CHEROKEE SMALL LETTER DO+  '\xaba9'# -> unI64 5081+  -- CHEROKEE SMALL LETTER DU+  '\xabaa'# -> unI64 5082+  -- CHEROKEE SMALL LETTER DV+  '\xabab'# -> unI64 5083+  -- CHEROKEE SMALL LETTER DLA+  '\xabac'# -> unI64 5084+  -- CHEROKEE SMALL LETTER TLA+  '\xabad'# -> unI64 5085+  -- CHEROKEE SMALL LETTER TLE+  '\xabae'# -> unI64 5086+  -- CHEROKEE SMALL LETTER TLI+  '\xabaf'# -> unI64 5087+  -- CHEROKEE SMALL LETTER TLO+  '\xabb0'# -> unI64 5088+  -- CHEROKEE SMALL LETTER TLU+  '\xabb1'# -> unI64 5089+  -- CHEROKEE SMALL LETTER TLV+  '\xabb2'# -> unI64 5090+  -- CHEROKEE SMALL LETTER TSA+  '\xabb3'# -> unI64 5091+  -- CHEROKEE SMALL LETTER TSE+  '\xabb4'# -> unI64 5092+  -- CHEROKEE SMALL LETTER TSI+  '\xabb5'# -> unI64 5093+  -- CHEROKEE SMALL LETTER TSO+  '\xabb6'# -> unI64 5094+  -- CHEROKEE SMALL LETTER TSU+  '\xabb7'# -> unI64 5095+  -- CHEROKEE SMALL LETTER TSV+  '\xabb8'# -> unI64 5096+  -- CHEROKEE SMALL LETTER WA+  '\xabb9'# -> unI64 5097+  -- CHEROKEE SMALL LETTER WE+  '\xabba'# -> unI64 5098+  -- CHEROKEE SMALL LETTER WI+  '\xabbb'# -> unI64 5099+  -- CHEROKEE SMALL LETTER WO+  '\xabbc'# -> unI64 5100+  -- CHEROKEE SMALL LETTER WU+  '\xabbd'# -> unI64 5101+  -- CHEROKEE SMALL LETTER WV+  '\xabbe'# -> unI64 5102+  -- CHEROKEE SMALL LETTER YA+  '\xabbf'# -> unI64 5103+  -- LATIN SMALL LIGATURE FF+  '\xfb00'# -> unI64 213909606+  -- LATIN SMALL LIGATURE FI+  '\xfb01'# -> unI64 220201062+  -- LATIN SMALL LIGATURE FL+  '\xfb02'# -> unI64 226492518+  -- LATIN SMALL LIGATURE FFI+  '\xfb03'# -> unI64 461795097575526+  -- LATIN SMALL LIGATURE FFL+  '\xfb04'# -> unI64 474989237108838+  -- LATIN SMALL LIGATURE LONG S T+  '\xfb05'# -> unI64 243269747+  -- LATIN SMALL LIGATURE ST+  '\xfb06'# -> unI64 243269747+  -- ARMENIAN SMALL LIGATURE MEN NOW+  '\xfb13'# -> unI64 2931819892+  -- ARMENIAN SMALL LIGATURE MEN ECH+  '\xfb14'# -> unI64 2896168308+  -- ARMENIAN SMALL LIGATURE MEN INI+  '\xfb15'# -> unI64 2908751220+  -- ARMENIAN SMALL LIGATURE VEW NOW+  '\xfb16'# -> unI64 2931819902+  -- ARMENIAN SMALL LIGATURE MEN XEH+  '\xfb17'# -> unI64 2912945524+  -- FULLWIDTH LATIN CAPITAL LETTER A+  '\xff21'# -> unI64 65345+  -- FULLWIDTH LATIN CAPITAL LETTER B+  '\xff22'# -> unI64 65346+  -- FULLWIDTH LATIN CAPITAL LETTER C+  '\xff23'# -> unI64 65347+  -- FULLWIDTH LATIN CAPITAL LETTER D+  '\xff24'# -> unI64 65348+  -- FULLWIDTH LATIN CAPITAL LETTER E+  '\xff25'# -> unI64 65349+  -- FULLWIDTH LATIN CAPITAL LETTER F+  '\xff26'# -> unI64 65350+  -- FULLWIDTH LATIN CAPITAL LETTER G+  '\xff27'# -> unI64 65351+  -- FULLWIDTH LATIN CAPITAL LETTER H+  '\xff28'# -> unI64 65352+  -- FULLWIDTH LATIN CAPITAL LETTER I+  '\xff29'# -> unI64 65353+  -- FULLWIDTH LATIN CAPITAL LETTER J+  '\xff2a'# -> unI64 65354+  -- FULLWIDTH LATIN CAPITAL LETTER K+  '\xff2b'# -> unI64 65355+  -- FULLWIDTH LATIN CAPITAL LETTER L+  '\xff2c'# -> unI64 65356+  -- FULLWIDTH LATIN CAPITAL LETTER M+  '\xff2d'# -> unI64 65357+  -- FULLWIDTH LATIN CAPITAL LETTER N+  '\xff2e'# -> unI64 65358+  -- FULLWIDTH LATIN CAPITAL LETTER O+  '\xff2f'# -> unI64 65359+  -- FULLWIDTH LATIN CAPITAL LETTER P+  '\xff30'# -> unI64 65360+  -- FULLWIDTH LATIN CAPITAL LETTER Q+  '\xff31'# -> unI64 65361+  -- FULLWIDTH LATIN CAPITAL LETTER R+  '\xff32'# -> unI64 65362+  -- FULLWIDTH LATIN CAPITAL LETTER S+  '\xff33'# -> unI64 65363+  -- FULLWIDTH LATIN CAPITAL LETTER T+  '\xff34'# -> unI64 65364+  -- FULLWIDTH LATIN CAPITAL LETTER U+  '\xff35'# -> unI64 65365+  -- FULLWIDTH LATIN CAPITAL LETTER V+  '\xff36'# -> unI64 65366+  -- FULLWIDTH LATIN CAPITAL LETTER W+  '\xff37'# -> unI64 65367+  -- FULLWIDTH LATIN CAPITAL LETTER X+  '\xff38'# -> unI64 65368+  -- FULLWIDTH LATIN CAPITAL LETTER Y+  '\xff39'# -> unI64 65369+  -- FULLWIDTH LATIN CAPITAL LETTER Z+  '\xff3a'# -> unI64 65370+  -- DESERET CAPITAL LETTER LONG I+  '\x10400'# -> unI64 66600+  -- DESERET CAPITAL LETTER LONG E+  '\x10401'# -> unI64 66601+  -- DESERET CAPITAL LETTER LONG A+  '\x10402'# -> unI64 66602+  -- DESERET CAPITAL LETTER LONG AH+  '\x10403'# -> unI64 66603+  -- DESERET CAPITAL LETTER LONG O+  '\x10404'# -> unI64 66604+  -- DESERET CAPITAL LETTER LONG OO+  '\x10405'# -> unI64 66605+  -- DESERET CAPITAL LETTER SHORT I+  '\x10406'# -> unI64 66606+  -- DESERET CAPITAL LETTER SHORT E+  '\x10407'# -> unI64 66607+  -- DESERET CAPITAL LETTER SHORT A+  '\x10408'# -> unI64 66608+  -- DESERET CAPITAL LETTER SHORT AH+  '\x10409'# -> unI64 66609+  -- DESERET CAPITAL LETTER SHORT O+  '\x1040a'# -> unI64 66610+  -- DESERET CAPITAL LETTER SHORT OO+  '\x1040b'# -> unI64 66611+  -- DESERET CAPITAL LETTER AY+  '\x1040c'# -> unI64 66612+  -- DESERET CAPITAL LETTER OW+  '\x1040d'# -> unI64 66613+  -- DESERET CAPITAL LETTER WU+  '\x1040e'# -> unI64 66614+  -- DESERET CAPITAL LETTER YEE+  '\x1040f'# -> unI64 66615+  -- DESERET CAPITAL LETTER H+  '\x10410'# -> unI64 66616+  -- DESERET CAPITAL LETTER PEE+  '\x10411'# -> unI64 66617+  -- DESERET CAPITAL LETTER BEE+  '\x10412'# -> unI64 66618+  -- DESERET CAPITAL LETTER TEE+  '\x10413'# -> unI64 66619+  -- DESERET CAPITAL LETTER DEE+  '\x10414'# -> unI64 66620+  -- DESERET CAPITAL LETTER CHEE+  '\x10415'# -> unI64 66621+  -- DESERET CAPITAL LETTER JEE+  '\x10416'# -> unI64 66622+  -- DESERET CAPITAL LETTER KAY+  '\x10417'# -> unI64 66623+  -- DESERET CAPITAL LETTER GAY+  '\x10418'# -> unI64 66624+  -- DESERET CAPITAL LETTER EF+  '\x10419'# -> unI64 66625+  -- DESERET CAPITAL LETTER VEE+  '\x1041a'# -> unI64 66626+  -- DESERET CAPITAL LETTER ETH+  '\x1041b'# -> unI64 66627+  -- DESERET CAPITAL LETTER THEE+  '\x1041c'# -> unI64 66628+  -- DESERET CAPITAL LETTER ES+  '\x1041d'# -> unI64 66629+  -- DESERET CAPITAL LETTER ZEE+  '\x1041e'# -> unI64 66630+  -- DESERET CAPITAL LETTER ESH+  '\x1041f'# -> unI64 66631+  -- DESERET CAPITAL LETTER ZHEE+  '\x10420'# -> unI64 66632+  -- DESERET CAPITAL LETTER ER+  '\x10421'# -> unI64 66633+  -- DESERET CAPITAL LETTER EL+  '\x10422'# -> unI64 66634+  -- DESERET CAPITAL LETTER EM+  '\x10423'# -> unI64 66635+  -- DESERET CAPITAL LETTER EN+  '\x10424'# -> unI64 66636+  -- DESERET CAPITAL LETTER ENG+  '\x10425'# -> unI64 66637+  -- DESERET CAPITAL LETTER OI+  '\x10426'# -> unI64 66638+  -- DESERET CAPITAL LETTER EW+  '\x10427'# -> unI64 66639+  -- OSAGE CAPITAL LETTER A+  '\x104b0'# -> unI64 66776+  -- OSAGE CAPITAL LETTER AI+  '\x104b1'# -> unI64 66777+  -- OSAGE CAPITAL LETTER AIN+  '\x104b2'# -> unI64 66778+  -- OSAGE CAPITAL LETTER AH+  '\x104b3'# -> unI64 66779+  -- OSAGE CAPITAL LETTER BRA+  '\x104b4'# -> unI64 66780+  -- OSAGE CAPITAL LETTER CHA+  '\x104b5'# -> unI64 66781+  -- OSAGE CAPITAL LETTER EHCHA+  '\x104b6'# -> unI64 66782+  -- OSAGE CAPITAL LETTER E+  '\x104b7'# -> unI64 66783+  -- OSAGE CAPITAL LETTER EIN+  '\x104b8'# -> unI64 66784+  -- OSAGE CAPITAL LETTER HA+  '\x104b9'# -> unI64 66785+  -- OSAGE CAPITAL LETTER HYA+  '\x104ba'# -> unI64 66786+  -- OSAGE CAPITAL LETTER I+  '\x104bb'# -> unI64 66787+  -- OSAGE CAPITAL LETTER KA+  '\x104bc'# -> unI64 66788+  -- OSAGE CAPITAL LETTER EHKA+  '\x104bd'# -> unI64 66789+  -- OSAGE CAPITAL LETTER KYA+  '\x104be'# -> unI64 66790+  -- OSAGE CAPITAL LETTER LA+  '\x104bf'# -> unI64 66791+  -- OSAGE CAPITAL LETTER MA+  '\x104c0'# -> unI64 66792+  -- OSAGE CAPITAL LETTER NA+  '\x104c1'# -> unI64 66793+  -- OSAGE CAPITAL LETTER O+  '\x104c2'# -> unI64 66794+  -- OSAGE CAPITAL LETTER OIN+  '\x104c3'# -> unI64 66795+  -- OSAGE CAPITAL LETTER PA+  '\x104c4'# -> unI64 66796+  -- OSAGE CAPITAL LETTER EHPA+  '\x104c5'# -> unI64 66797+  -- OSAGE CAPITAL LETTER SA+  '\x104c6'# -> unI64 66798+  -- OSAGE CAPITAL LETTER SHA+  '\x104c7'# -> unI64 66799+  -- OSAGE CAPITAL LETTER TA+  '\x104c8'# -> unI64 66800+  -- OSAGE CAPITAL LETTER EHTA+  '\x104c9'# -> unI64 66801+  -- OSAGE CAPITAL LETTER TSA+  '\x104ca'# -> unI64 66802+  -- OSAGE CAPITAL LETTER EHTSA+  '\x104cb'# -> unI64 66803+  -- OSAGE CAPITAL LETTER TSHA+  '\x104cc'# -> unI64 66804+  -- OSAGE CAPITAL LETTER DHA+  '\x104cd'# -> unI64 66805+  -- OSAGE CAPITAL LETTER U+  '\x104ce'# -> unI64 66806+  -- OSAGE CAPITAL LETTER WA+  '\x104cf'# -> unI64 66807+  -- OSAGE CAPITAL LETTER KHA+  '\x104d0'# -> unI64 66808+  -- OSAGE CAPITAL LETTER GHA+  '\x104d1'# -> unI64 66809+  -- OSAGE CAPITAL LETTER ZA+  '\x104d2'# -> unI64 66810+  -- OSAGE CAPITAL LETTER ZHA+  '\x104d3'# -> unI64 66811+  -- VITHKUQI CAPITAL LETTER A+  '\x10570'# -> unI64 66967+  -- VITHKUQI CAPITAL LETTER BBE+  '\x10571'# -> unI64 66968+  -- VITHKUQI CAPITAL LETTER BE+  '\x10572'# -> unI64 66969+  -- VITHKUQI CAPITAL LETTER CE+  '\x10573'# -> unI64 66970+  -- VITHKUQI CAPITAL LETTER CHE+  '\x10574'# -> unI64 66971+  -- VITHKUQI CAPITAL LETTER DE+  '\x10575'# -> unI64 66972+  -- VITHKUQI CAPITAL LETTER DHE+  '\x10576'# -> unI64 66973+  -- VITHKUQI CAPITAL LETTER EI+  '\x10577'# -> unI64 66974+  -- VITHKUQI CAPITAL LETTER E+  '\x10578'# -> unI64 66975+  -- VITHKUQI CAPITAL LETTER FE+  '\x10579'# -> unI64 66976+  -- VITHKUQI CAPITAL LETTER GA+  '\x1057a'# -> unI64 66977+  -- VITHKUQI CAPITAL LETTER HA+  '\x1057c'# -> unI64 66979+  -- VITHKUQI CAPITAL LETTER HHA+  '\x1057d'# -> unI64 66980+  -- VITHKUQI CAPITAL LETTER I+  '\x1057e'# -> unI64 66981+  -- VITHKUQI CAPITAL LETTER IJE+  '\x1057f'# -> unI64 66982+  -- VITHKUQI CAPITAL LETTER JE+  '\x10580'# -> unI64 66983+  -- VITHKUQI CAPITAL LETTER KA+  '\x10581'# -> unI64 66984+  -- VITHKUQI CAPITAL LETTER LA+  '\x10582'# -> unI64 66985+  -- VITHKUQI CAPITAL LETTER LLA+  '\x10583'# -> unI64 66986+  -- VITHKUQI CAPITAL LETTER ME+  '\x10584'# -> unI64 66987+  -- VITHKUQI CAPITAL LETTER NE+  '\x10585'# -> unI64 66988+  -- VITHKUQI CAPITAL LETTER NJE+  '\x10586'# -> unI64 66989+  -- VITHKUQI CAPITAL LETTER O+  '\x10587'# -> unI64 66990+  -- VITHKUQI CAPITAL LETTER PE+  '\x10588'# -> unI64 66991+  -- VITHKUQI CAPITAL LETTER QA+  '\x10589'# -> unI64 66992+  -- VITHKUQI CAPITAL LETTER RE+  '\x1058a'# -> unI64 66993+  -- VITHKUQI CAPITAL LETTER SE+  '\x1058c'# -> unI64 66995+  -- VITHKUQI CAPITAL LETTER SHE+  '\x1058d'# -> unI64 66996+  -- VITHKUQI CAPITAL LETTER TE+  '\x1058e'# -> unI64 66997+  -- VITHKUQI CAPITAL LETTER THE+  '\x1058f'# -> unI64 66998+  -- VITHKUQI CAPITAL LETTER U+  '\x10590'# -> unI64 66999+  -- VITHKUQI CAPITAL LETTER VE+  '\x10591'# -> unI64 67000+  -- VITHKUQI CAPITAL LETTER XE+  '\x10592'# -> unI64 67001+  -- VITHKUQI CAPITAL LETTER Y+  '\x10594'# -> unI64 67003+  -- VITHKUQI CAPITAL LETTER ZE+  '\x10595'# -> unI64 67004+  -- OLD HUNGARIAN CAPITAL LETTER A+  '\x10c80'# -> unI64 68800+  -- OLD HUNGARIAN CAPITAL LETTER AA+  '\x10c81'# -> unI64 68801+  -- OLD HUNGARIAN CAPITAL LETTER EB+  '\x10c82'# -> unI64 68802+  -- OLD HUNGARIAN CAPITAL LETTER AMB+  '\x10c83'# -> unI64 68803+  -- OLD HUNGARIAN CAPITAL LETTER EC+  '\x10c84'# -> unI64 68804+  -- OLD HUNGARIAN CAPITAL LETTER ENC+  '\x10c85'# -> unI64 68805+  -- OLD HUNGARIAN CAPITAL LETTER ECS+  '\x10c86'# -> unI64 68806+  -- OLD HUNGARIAN CAPITAL LETTER ED+  '\x10c87'# -> unI64 68807+  -- OLD HUNGARIAN CAPITAL LETTER AND+  '\x10c88'# -> unI64 68808+  -- OLD HUNGARIAN CAPITAL LETTER E+  '\x10c89'# -> unI64 68809+  -- OLD HUNGARIAN CAPITAL LETTER CLOSE E+  '\x10c8a'# -> unI64 68810+  -- OLD HUNGARIAN CAPITAL LETTER EE+  '\x10c8b'# -> unI64 68811+  -- OLD HUNGARIAN CAPITAL LETTER EF+  '\x10c8c'# -> unI64 68812+  -- OLD HUNGARIAN CAPITAL LETTER EG+  '\x10c8d'# -> unI64 68813+  -- OLD HUNGARIAN CAPITAL LETTER EGY+  '\x10c8e'# -> unI64 68814+  -- OLD HUNGARIAN CAPITAL LETTER EH+  '\x10c8f'# -> unI64 68815+  -- OLD HUNGARIAN CAPITAL LETTER I+  '\x10c90'# -> unI64 68816+  -- OLD HUNGARIAN CAPITAL LETTER II+  '\x10c91'# -> unI64 68817+  -- OLD HUNGARIAN CAPITAL LETTER EJ+  '\x10c92'# -> unI64 68818+  -- OLD HUNGARIAN CAPITAL LETTER EK+  '\x10c93'# -> unI64 68819+  -- OLD HUNGARIAN CAPITAL LETTER AK+  '\x10c94'# -> unI64 68820+  -- OLD HUNGARIAN CAPITAL LETTER UNK+  '\x10c95'# -> unI64 68821+  -- OLD HUNGARIAN CAPITAL LETTER EL+  '\x10c96'# -> unI64 68822+  -- OLD HUNGARIAN CAPITAL LETTER ELY+  '\x10c97'# -> unI64 68823+  -- OLD HUNGARIAN CAPITAL LETTER EM+  '\x10c98'# -> unI64 68824+  -- OLD HUNGARIAN CAPITAL LETTER EN+  '\x10c99'# -> unI64 68825+  -- OLD HUNGARIAN CAPITAL LETTER ENY+  '\x10c9a'# -> unI64 68826+  -- OLD HUNGARIAN CAPITAL LETTER O+  '\x10c9b'# -> unI64 68827+  -- OLD HUNGARIAN CAPITAL LETTER OO+  '\x10c9c'# -> unI64 68828+  -- OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE+  '\x10c9d'# -> unI64 68829+  -- OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE+  '\x10c9e'# -> unI64 68830+  -- OLD HUNGARIAN CAPITAL LETTER OEE+  '\x10c9f'# -> unI64 68831+  -- OLD HUNGARIAN CAPITAL LETTER EP+  '\x10ca0'# -> unI64 68832+  -- OLD HUNGARIAN CAPITAL LETTER EMP+  '\x10ca1'# -> unI64 68833+  -- OLD HUNGARIAN CAPITAL LETTER ER+  '\x10ca2'# -> unI64 68834+  -- OLD HUNGARIAN CAPITAL LETTER SHORT ER+  '\x10ca3'# -> unI64 68835+  -- OLD HUNGARIAN CAPITAL LETTER ES+  '\x10ca4'# -> unI64 68836+  -- OLD HUNGARIAN CAPITAL LETTER ESZ+  '\x10ca5'# -> unI64 68837+  -- OLD HUNGARIAN CAPITAL LETTER ET+  '\x10ca6'# -> unI64 68838+  -- OLD HUNGARIAN CAPITAL LETTER ENT+  '\x10ca7'# -> unI64 68839+  -- OLD HUNGARIAN CAPITAL LETTER ETY+  '\x10ca8'# -> unI64 68840+  -- OLD HUNGARIAN CAPITAL LETTER ECH+  '\x10ca9'# -> unI64 68841+  -- OLD HUNGARIAN CAPITAL LETTER U+  '\x10caa'# -> unI64 68842+  -- OLD HUNGARIAN CAPITAL LETTER UU+  '\x10cab'# -> unI64 68843+  -- OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE+  '\x10cac'# -> unI64 68844+  -- OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE+  '\x10cad'# -> unI64 68845+  -- OLD HUNGARIAN CAPITAL LETTER EV+  '\x10cae'# -> unI64 68846+  -- OLD HUNGARIAN CAPITAL LETTER EZ+  '\x10caf'# -> unI64 68847+  -- OLD HUNGARIAN CAPITAL LETTER EZS+  '\x10cb0'# -> unI64 68848+  -- OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN+  '\x10cb1'# -> unI64 68849+  -- OLD HUNGARIAN CAPITAL LETTER US+  '\x10cb2'# -> unI64 68850+  -- WARANG CITI CAPITAL LETTER NGAA+  '\x118a0'# -> unI64 71872+  -- WARANG CITI CAPITAL LETTER A+  '\x118a1'# -> unI64 71873+  -- WARANG CITI CAPITAL LETTER WI+  '\x118a2'# -> unI64 71874+  -- WARANG CITI CAPITAL LETTER YU+  '\x118a3'# -> unI64 71875+  -- WARANG CITI CAPITAL LETTER YA+  '\x118a4'# -> unI64 71876+  -- WARANG CITI CAPITAL LETTER YO+  '\x118a5'# -> unI64 71877+  -- WARANG CITI CAPITAL LETTER II+  '\x118a6'# -> unI64 71878+  -- WARANG CITI CAPITAL LETTER UU+  '\x118a7'# -> unI64 71879+  -- WARANG CITI CAPITAL LETTER E+  '\x118a8'# -> unI64 71880+  -- WARANG CITI CAPITAL LETTER O+  '\x118a9'# -> unI64 71881+  -- WARANG CITI CAPITAL LETTER ANG+  '\x118aa'# -> unI64 71882+  -- WARANG CITI CAPITAL LETTER GA+  '\x118ab'# -> unI64 71883+  -- WARANG CITI CAPITAL LETTER KO+  '\x118ac'# -> unI64 71884+  -- WARANG CITI CAPITAL LETTER ENY+  '\x118ad'# -> unI64 71885+  -- WARANG CITI CAPITAL LETTER YUJ+  '\x118ae'# -> unI64 71886+  -- WARANG CITI CAPITAL LETTER UC+  '\x118af'# -> unI64 71887+  -- WARANG CITI CAPITAL LETTER ENN+  '\x118b0'# -> unI64 71888+  -- WARANG CITI CAPITAL LETTER ODD+  '\x118b1'# -> unI64 71889+  -- WARANG CITI CAPITAL LETTER TTE+  '\x118b2'# -> unI64 71890+  -- WARANG CITI CAPITAL LETTER NUNG+  '\x118b3'# -> unI64 71891+  -- WARANG CITI CAPITAL LETTER DA+  '\x118b4'# -> unI64 71892+  -- WARANG CITI CAPITAL LETTER AT+  '\x118b5'# -> unI64 71893+  -- WARANG CITI CAPITAL LETTER AM+  '\x118b6'# -> unI64 71894+  -- WARANG CITI CAPITAL LETTER BU+  '\x118b7'# -> unI64 71895+  -- WARANG CITI CAPITAL LETTER PU+  '\x118b8'# -> unI64 71896+  -- WARANG CITI CAPITAL LETTER HIYO+  '\x118b9'# -> unI64 71897+  -- WARANG CITI CAPITAL LETTER HOLO+  '\x118ba'# -> unI64 71898+  -- WARANG CITI CAPITAL LETTER HORR+  '\x118bb'# -> unI64 71899+  -- WARANG CITI CAPITAL LETTER HAR+  '\x118bc'# -> unI64 71900+  -- WARANG CITI CAPITAL LETTER SSUU+  '\x118bd'# -> unI64 71901+  -- WARANG CITI CAPITAL LETTER SII+  '\x118be'# -> unI64 71902+  -- WARANG CITI CAPITAL LETTER VIYO+  '\x118bf'# -> unI64 71903+  -- MEDEFAIDRIN CAPITAL LETTER M+  '\x16e40'# -> unI64 93792+  -- MEDEFAIDRIN CAPITAL LETTER S+  '\x16e41'# -> unI64 93793+  -- MEDEFAIDRIN CAPITAL LETTER V+  '\x16e42'# -> unI64 93794+  -- MEDEFAIDRIN CAPITAL LETTER W+  '\x16e43'# -> unI64 93795+  -- MEDEFAIDRIN CAPITAL LETTER ATIU+  '\x16e44'# -> unI64 93796+  -- MEDEFAIDRIN CAPITAL LETTER Z+  '\x16e45'# -> unI64 93797+  -- MEDEFAIDRIN CAPITAL LETTER KP+  '\x16e46'# -> unI64 93798+  -- MEDEFAIDRIN CAPITAL LETTER P+  '\x16e47'# -> unI64 93799+  -- MEDEFAIDRIN CAPITAL LETTER T+  '\x16e48'# -> unI64 93800+  -- MEDEFAIDRIN CAPITAL LETTER G+  '\x16e49'# -> unI64 93801+  -- MEDEFAIDRIN CAPITAL LETTER F+  '\x16e4a'# -> unI64 93802+  -- MEDEFAIDRIN CAPITAL LETTER I+  '\x16e4b'# -> unI64 93803+  -- MEDEFAIDRIN CAPITAL LETTER K+  '\x16e4c'# -> unI64 93804+  -- MEDEFAIDRIN CAPITAL LETTER A+  '\x16e4d'# -> unI64 93805+  -- MEDEFAIDRIN CAPITAL LETTER J+  '\x16e4e'# -> unI64 93806+  -- MEDEFAIDRIN CAPITAL LETTER E+  '\x16e4f'# -> unI64 93807+  -- MEDEFAIDRIN CAPITAL LETTER B+  '\x16e50'# -> unI64 93808+  -- MEDEFAIDRIN CAPITAL LETTER C+  '\x16e51'# -> unI64 93809+  -- MEDEFAIDRIN CAPITAL LETTER U+  '\x16e52'# -> unI64 93810+  -- MEDEFAIDRIN CAPITAL LETTER YU+  '\x16e53'# -> unI64 93811+  -- MEDEFAIDRIN CAPITAL LETTER L+  '\x16e54'# -> unI64 93812+  -- MEDEFAIDRIN CAPITAL LETTER Q+  '\x16e55'# -> unI64 93813+  -- MEDEFAIDRIN CAPITAL LETTER HP+  '\x16e56'# -> unI64 93814+  -- MEDEFAIDRIN CAPITAL LETTER NY+  '\x16e57'# -> unI64 93815+  -- MEDEFAIDRIN CAPITAL LETTER X+  '\x16e58'# -> unI64 93816+  -- MEDEFAIDRIN CAPITAL LETTER D+  '\x16e59'# -> unI64 93817+  -- MEDEFAIDRIN CAPITAL LETTER OE+  '\x16e5a'# -> unI64 93818+  -- MEDEFAIDRIN CAPITAL LETTER N+  '\x16e5b'# -> unI64 93819+  -- MEDEFAIDRIN CAPITAL LETTER R+  '\x16e5c'# -> unI64 93820+  -- MEDEFAIDRIN CAPITAL LETTER O+  '\x16e5d'# -> unI64 93821+  -- MEDEFAIDRIN CAPITAL LETTER AI+  '\x16e5e'# -> unI64 93822+  -- MEDEFAIDRIN CAPITAL LETTER Y+  '\x16e5f'# -> unI64 93823+  -- ADLAM CAPITAL LETTER ALIF+  '\x1e900'# -> unI64 125218+  -- ADLAM CAPITAL LETTER DAALI+  '\x1e901'# -> unI64 125219+  -- ADLAM CAPITAL LETTER LAAM+  '\x1e902'# -> unI64 125220+  -- ADLAM CAPITAL LETTER MIIM+  '\x1e903'# -> unI64 125221+  -- ADLAM CAPITAL LETTER BA+  '\x1e904'# -> unI64 125222+  -- ADLAM CAPITAL LETTER SINNYIIYHE+  '\x1e905'# -> unI64 125223+  -- ADLAM CAPITAL LETTER PE+  '\x1e906'# -> unI64 125224+  -- ADLAM CAPITAL LETTER BHE+  '\x1e907'# -> unI64 125225+  -- ADLAM CAPITAL LETTER RA+  '\x1e908'# -> unI64 125226+  -- ADLAM CAPITAL LETTER E+  '\x1e909'# -> unI64 125227+  -- ADLAM CAPITAL LETTER FA+  '\x1e90a'# -> unI64 125228+  -- ADLAM CAPITAL LETTER I+  '\x1e90b'# -> unI64 125229+  -- ADLAM CAPITAL LETTER O+  '\x1e90c'# -> unI64 125230+  -- ADLAM CAPITAL LETTER DHA+  '\x1e90d'# -> unI64 125231+  -- ADLAM CAPITAL LETTER YHE+  '\x1e90e'# -> unI64 125232+  -- ADLAM CAPITAL LETTER WAW+  '\x1e90f'# -> unI64 125233+  -- ADLAM CAPITAL LETTER NUN+  '\x1e910'# -> unI64 125234+  -- ADLAM CAPITAL LETTER KAF+  '\x1e911'# -> unI64 125235+  -- ADLAM CAPITAL LETTER YA+  '\x1e912'# -> unI64 125236+  -- ADLAM CAPITAL LETTER U+  '\x1e913'# -> unI64 125237+  -- ADLAM CAPITAL LETTER JIIM+  '\x1e914'# -> unI64 125238+  -- ADLAM CAPITAL LETTER CHI+  '\x1e915'# -> unI64 125239+  -- ADLAM CAPITAL LETTER HA+  '\x1e916'# -> unI64 125240+  -- ADLAM CAPITAL LETTER QAAF+  '\x1e917'# -> unI64 125241+  -- ADLAM CAPITAL LETTER GA+  '\x1e918'# -> unI64 125242+  -- ADLAM CAPITAL LETTER NYA+  '\x1e919'# -> unI64 125243+  -- ADLAM CAPITAL LETTER TU+  '\x1e91a'# -> unI64 125244+  -- ADLAM CAPITAL LETTER NHA+  '\x1e91b'# -> unI64 125245+  -- ADLAM CAPITAL LETTER VA+  '\x1e91c'# -> unI64 125246+  -- ADLAM CAPITAL LETTER KHA+  '\x1e91d'# -> unI64 125247+  -- ADLAM CAPITAL LETTER GBE+  '\x1e91e'# -> unI64 125248+  -- ADLAM CAPITAL LETTER ZAL+  '\x1e91f'# -> unI64 125249+  -- ADLAM CAPITAL LETTER KPO+  '\x1e920'# -> unI64 125250+  -- ADLAM CAPITAL LETTER SHA+  '\x1e921'# -> unI64 125251+  _ -> unI64 0
+ src-ghc/Data/JSString/Internal/Fusion/Common.hs view
@@ -0,0 +1,92 @@+{-# LANGUAGE BangPatterns, MagicHash, RankNTypes #-}++module Data.JSString.Internal.Fusion.Common ( -- * Creation and elimination+                                              singleton+                                            , streamList+                                            , unstreamList+                                            , streamCString#++                                              -- * Basic interface+                                            , cons+                                            , snoc+                                            , append+                                            , head+                                            , uncons+                                            , last+                                            , tail+                                            , init+                                            , null+                                            , lengthI+                                            , compareLengthI+                                            , isSingleton++                                              -- * Transformations+                                            , map+                                            , intercalate+                                            , intersperse++                                              -- ** Case conversion+                                              -- $case+                                            , toCaseFold+                                            , toLower+                                            , toTitle+                                            , toUpper++                                              -- ** Justification+                                            , justifyLeftI++                                              -- * Folds+                                            , foldl+                                            , foldl'+                                            , foldl1+                                            , foldl1'+                                            , foldr+                                            , foldr1++                                              -- ** Special folds+                                            , concat+                                            , concatMap+                                            , any+                                            , all+                                            , maximum+                                            , minimum++                                              -- * Construction+                                              -- ** Scans+                                            , scanl++                                              -- ** Accumulating maps+                                              -- , mapAccumL++                                              -- ** Generation and unfolding+                                            , replicateCharI+                                            , replicateI+                                            , unfoldr+                                            , unfoldrNI++                                              -- * Substrings+                                              -- ** Breaking strings+                                            , take+                                            , drop+                                            , takeWhile+                                            , dropWhile++                                              -- * Predicates+                                            , isPrefixOf++                                              -- * Searching+                                            , elem+                                            , filter++                                              -- * Indexing+                                            , findBy+                                            , indexI+                                            , findIndexI+                                            , countCharI++                                              -- * Zipping and unzipping+                                            , zipWith+                                            ) where++import Data.Text.Internal.Fusion.Common+import Prelude ()
+ src-ghc/Data/JSString/Internal/Fusion/Types.hs view
@@ -0,0 +1,122 @@+{-# LANGUAGE BangPatterns, ExistentialQuantification #-}+-- |+-- Module      : Data.Text.Internal.Fusion.Types+-- Copyright   : (c) Tom Harper 2008-2009,+--               (c) Bryan O'Sullivan 2009,+--               (c) Duncan Coutts 2009,+--               (c) Jasper Van der Jeugt 2011+--+-- License     : BSD-style+-- Maintainer  : bos@serpentine.com+-- Stability   : experimental+-- Portability : GHC+--+-- /Warning/: this is an internal module, and does not have a stable+-- API or name. Functions in this module may not check or enforce+-- preconditions expected by public modules. Use at your own risk!+--+-- Core stream fusion functionality for text.++module Data.JSString.Internal.Fusion.Types+    (+      CC(..)+--    , M(..)+--    , M8+    , PairS(..)+    , RS(..)+    , Step(..)+    , Stream(..)+--    , Switch(..)+    , empty+    ) where++import Data.Text.Internal.Fusion.Types+-- import Data.Text.Internal.Fusion.Size+-- import Data.Word (Word8)++---- | Specialised tuple for case conversion.+--data CC s = CC !s {-# UNPACK #-} !Char {-# UNPACK #-} !Char+--+---- | Specialised, strict Maybe-like type.+--data M a = N+--         | J !a+--+--type M8 = M Word8+--+---- Restreaming state.+--data RS s+--    = RS0 !s+--    | RS1 !s {-# UNPACK #-} !Word8+--    | RS2 !s {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8+--    | RS3 !s {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8+--+--infixl 2 :*:+--data PairS a b = !a :*: !b+--                 -- deriving (Eq, Ord, Show)+--+---- | Allow a function over a stream to switch between two states.+--data Switch = S1 | S2+--+--data Step s a = Done+--              | Skip !s+--              | Yield !a !s+--+--{-+--instance (Show a) => Show (Step s a)+--    where show Done        = "Done"+--          show (Skip _)    = "Skip"+--          show (Yield x _) = "Yield " ++ show x+---}+--+--instance (Eq a) => Eq (Stream a) where+--    (==) = eq+--+--instance (Ord a) => Ord (Stream a) where+--    compare = cmp+--+---- The length hint in a Stream has two roles.  If its value is zero,+---- we trust it, and treat the stream as empty.  Otherwise, we treat it+---- as a hint: it should usually be accurate, so we use it when+---- unstreaming to decide what size array to allocate.  However, the+---- unstreaming functions must be able to cope with the hint being too+---- small or too large.+--+--data Stream a =+--    forall s. Stream+--    (s -> Step s a)             -- stepper function+--    !s                          -- current state+--+---- | /O(n)/ Determines if two streams are equal.+--eq :: (Eq a) => Stream a -> Stream a -> Bool+--eq (Stream next1 s1) (Stream next2 s2) = loop (next1 s1) (next2 s2)+--    where+--      loop Done Done                     = True+--      loop (Skip s1')     (Skip s2')     = loop (next1 s1') (next2 s2')+--      loop (Skip s1')     x2             = loop (next1 s1') x2+--      loop x1             (Skip s2')     = loop x1          (next2 s2')+--      loop Done _                        = False+--      loop _    Done                     = False+--      loop (Yield x1 s1') (Yield x2 s2') = x1 == x2 &&+--                                           loop (next1 s1') (next2 s2')+--{-# INLINE [0] eq #-}+--+--cmp :: (Ord a) => Stream a -> Stream a -> Ordering+--cmp (Stream next1 s1) (Stream next2 s2) = loop (next1 s1) (next2 s2)+--    where+--      loop Done Done                     = EQ+--      loop (Skip s1')     (Skip s2')     = loop (next1 s1') (next2 s2')+--      loop (Skip s1')     x2             = loop (next1 s1') x2+--      loop x1             (Skip s2')     = loop x1          (next2 s2')+--      loop Done _                        = LT+--      loop _    Done                     = GT+--      loop (Yield x1 s1') (Yield x2 s2') =+--          case compare x1 x2 of+--            EQ    -> loop (next1 s1') (next2 s2')+--            other -> other+--{-# INLINE [0] cmp #-}+--+---- | The empty stream.+--empty :: Stream a+--empty = Stream next ()+--    where next _ = Done+--{-# INLINE [0] empty #-}
+ src-ghc/Data/JSString/Internal/Search.hs view
@@ -0,0 +1,11 @@+module Data.JSString.Internal.Search ( indices+                                     ) where++import Data.Coerce (coerce)++import Data.JSString.Internal.Type (JSString(..))++import qualified Data.Text.Internal.Search as T++indices :: JSString -> JSString -> [Int]+indices = coerce T.indices
+ src-ghc/Data/JSString/Internal/Type.hs view
@@ -0,0 +1,119 @@+{-# LANGUAGE DeriveDataTypeable, UnboxedTuples, MagicHash,+             BangPatterns, GeneralizedNewtypeDeriving #-}+{-# OPTIONS_HADDOCK not-home #-}+module Data.JSString.Internal.Type ( JSString(..)+                                   , empty+                                   , empty_+                                   , safe+                                   , firstf+                                   ) where++                                     {-+    -- * Construction+    , text+    , textP+    -- * Safety+    , safe+    -- * Code that must be here for accessibility+    , empty+    , empty_+    -- * Utilities+    , firstf+    -- * Checked multiplication+    , mul+    , mul32+    , mul64+    -- * Debugging+    , showText++                                   ) where+-}++import Prelude ()+import Prelude.Compat++import Control.DeepSeq++import Data.Coerce                    (coerce)+import Data.Text                      (Text)+import qualified Data.Text as T       (empty)+import Data.String                    (IsString)+import Data.Aeson                     (ToJSON(..), FromJSON(..))+import Data.Data                      (Data)+-- import Data.Text.Internal.Unsafe.Char (ord)+import Data.Typeable                  (Typeable)+import GHC.Exts                       (Char(..), ord#, andI#, (/=#), isTrue#)++-- | A wrapper around a JavaScript string+newtype JSString = JSString Text deriving(Show, Read, IsString, Semigroup, Monoid, Ord, Eq, Data, ToJSON, FromJSON, Typeable)++instance NFData JSString where rnf !_ = ()++-- | /O(1)/ The empty 'JSString'.+empty :: JSString+empty = coerce T.empty+{-# INLINE [1] empty #-}++-- | A non-inlined version of 'empty'.+empty_ :: JSString+empty_ = coerce T.empty+{-# NOINLINE empty_ #-}++safe :: Char -> Char+safe c@(C# cc)+    | isTrue# (andI# (ord# cc) 0x1ff800# /=# 0xd800#) = c+    | otherwise                    = '\xfffd'+{-# INLINE [0] safe #-}+++-- | Apply a function to the first element of an optional pair.+firstf :: (a -> c) -> Maybe (a,b) -> Maybe (c,b)+firstf f (Just (a, b)) = Just (f a, b)+firstf _  Nothing      = Nothing++{-+-- | Checked multiplication.  Calls 'error' if the result would+-- overflow.+mul :: Int -> Int -> Int+#if WORD_SIZE_IN_BITS == 64+mul a b = fromIntegral $ fromIntegral a `mul64` fromIntegral b+#else+mul a b = fromIntegral $ fromIntegral a `mul32` fromIntegral b+#endif+{-# INLINE mul #-}+infixl 7 `mul`++-- | Checked multiplication.  Calls 'error' if the result would+-- overflow.+mul64 :: Int64 -> Int64 -> Int64+mul64 a b+  | a >= 0 && b >= 0 =  mul64_ a b+  | a >= 0           = -mul64_ a (-b)+  | b >= 0           = -mul64_ (-a) b+  | otherwise        =  mul64_ (-a) (-b)+{-# INLINE mul64 #-}+infixl 7 `mul64`++mul64_ :: Int64 -> Int64 -> Int64+mul64_ a b+  | ahi > 0 && bhi > 0 = error "overflow"+  | top > 0x7fffffff   = error "overflow"+  | total < 0          = error "overflow"+  | otherwise          = total+  where (# ahi, alo #) = (# a `shiftR` 32, a .&. 0xffffffff #)+        (# bhi, blo #) = (# b `shiftR` 32, b .&. 0xffffffff #)+        top            = ahi * blo + alo * bhi+        total          = (top `shiftL` 32) + alo * blo+{-# INLINE mul64_ #-}++-- | Checked multiplication.  Calls 'error' if the result would+-- overflow.+mul32 :: Int32 -> Int32 -> Int32+mul32 a b = case fromIntegral a * fromIntegral b of+              ab | ab < min32 || ab > max32 -> error "overflow"+                 | otherwise                -> fromIntegral ab+  where min32 = -0x80000000 :: Int64+        max32 =  0x7fffffff+{-# INLINE mul32 #-}+infixl 7 `mul32`+-}
+ src-ghc/Data/JSString/Text.hs view
@@ -0,0 +1,52 @@+{- | Conversion between 'Data.Text.Text' and 'Data.JSString.JSString'  -}++module Data.JSString.Text+    ( textToJSString+    , textFromJSString+    , lazyTextToJSString+    , lazyTextFromJSString+    , textFromJSVal+    , lazyTextFromJSVal+    ) where++import GHCJS.Prim.Internal (JSVal)++import Data.Coerce (coerce)+import qualified Data.Text as T+import qualified Data.Text.Lazy as TL++import Data.JSString.Internal.Type++import Language.Javascript.JSaddle.Types (JSM, GHCJSPure(..))+import Language.Javascript.JSaddle.Native.Internal+       (valueToString)++textToJSString :: T.Text -> JSString+textToJSString = coerce+{-# INLINE textToJSString #-}++textFromJSString :: JSString -> T.Text+textFromJSString = coerce+{-# INLINE  textFromJSString #-}++lazyTextToJSString :: TL.Text -> JSString+lazyTextToJSString = coerce . TL.toStrict+{-# INLINE lazyTextToJSString #-}++lazyTextFromJSString :: JSString -> TL.Text+lazyTextFromJSString = TL.fromStrict . coerce+{-# INLINE lazyTextFromJSString #-}++-- | returns the empty Text if not a string+textFromJSVal :: JSVal -> GHCJSPure T.Text+textFromJSVal j = GHCJSPure $ textFromJSString <$> valToJSString j+{-# INLINE textFromJSVal #-}++-- | returns the empty Text if not a string+lazyTextFromJSVal :: JSVal -> GHCJSPure TL.Text+lazyTextFromJSVal j = GHCJSPure $ lazyTextFromJSString <$> valToJSString j+{-# INLINE lazyTextFromJSVal #-}++valToJSString :: JSVal -> JSM JSString+valToJSString = valueToString+{-# INLINE valToJSString #-}
+ src-ghc/GHCJS/Buffer.hs view
@@ -0,0 +1,117 @@+module GHCJS.Buffer+    ( Buffer+    , MutableBuffer+    , create+    , createFromArrayBuffer+    , thaw, freeze, clone+      -- * JavaScript properties+    , byteLength+    , getArrayBuffer+    , getUint8Array+    , getUint16Array+    , getInt32Array+    , getDataView+    , getFloat32Array+    , getFloat64Array+      -- * bytestring+    , toByteString, fromByteString+    ) where++import GHCJS.Buffer.Types++import Control.Lens.Operators ((^.))++import Data.ByteString (ByteString)+import qualified Data.ByteString as BS+import qualified Data.ByteString.Base64 as B64 (encode, decode)+import Data.Text.Encoding (encodeUtf8, decodeUtf8)++import qualified JavaScript.TypedArray.Internal.Types as I+import           JavaScript.TypedArray.ArrayBuffer.Internal (SomeArrayBuffer(..))+import           JavaScript.TypedArray.DataView.Internal    (SomeDataView(..))++import GHCJS.Marshal (FromJSVal(..))+import Language.Javascript.JSaddle.Types (JSM, GHCJSPure(..), ghcjsPure)+import Language.Javascript.JSaddle.Object (js, js2, jsg1, jsg3)++create :: Int -> JSM MutableBuffer+create n | n >= 0    = SomeBuffer <$> jsg1 "h$newByteArray" n+         | otherwise = error "create: negative size"+{-# INLINE create #-}++createFromArrayBuffer :: SomeArrayBuffer any -> GHCJSPure (SomeBuffer any)+createFromArrayBuffer (SomeArrayBuffer buf) = GHCJSPure $ SomeBuffer <$> jsg1 "h$wrapBuffer" buf+{-# INLINE createFromArrayBuffer #-}++getArrayBuffer :: SomeBuffer any -> GHCJSPure (SomeArrayBuffer any)+getArrayBuffer (SomeBuffer buf) = GHCJSPure $ SomeArrayBuffer <$> buf ^. js "buf"+{-# INLINE getArrayBuffer #-}++getInt32Array :: SomeBuffer any -> GHCJSPure (I.SomeInt32Array any)+getInt32Array (SomeBuffer buf) = GHCJSPure $ I.SomeTypedArray <$> buf ^. js "i3"+{-# INLINE getInt32Array #-}++getUint8Array :: SomeBuffer any -> GHCJSPure (I.SomeUint8Array any)+getUint8Array (SomeBuffer buf) = GHCJSPure $ I.SomeTypedArray <$> buf ^. js "u8"+{-# INLINE getUint8Array #-}++getUint16Array :: SomeBuffer any -> GHCJSPure (I.SomeUint16Array any)+getUint16Array (SomeBuffer buf) = GHCJSPure $ I.SomeTypedArray <$> buf ^. js "u1"+{-# INLINE getUint16Array #-}++getFloat32Array :: SomeBuffer any -> GHCJSPure (I.SomeFloat32Array any)+getFloat32Array (SomeBuffer buf) = GHCJSPure $ I.SomeTypedArray <$> buf ^. js "f3"+{-# INLINE getFloat32Array #-}++getFloat64Array :: SomeBuffer any -> GHCJSPure (I.SomeFloat64Array any)+getFloat64Array (SomeBuffer buf) = GHCJSPure $ I.SomeTypedArray <$> buf ^. js "f6"+{-# INLINE getFloat64Array #-}++getDataView :: SomeBuffer any -> GHCJSPure (SomeDataView any)+getDataView (SomeBuffer buf) = GHCJSPure $ SomeDataView  <$> buf ^. js "dv"+{-# INLINE getDataView #-}++freeze :: MutableBuffer -> JSM Buffer+freeze = js_clone+{-# INLINE freeze #-}++thaw :: Buffer -> JSM MutableBuffer+thaw  = js_clone+{-# INLINE thaw #-}++clone :: MutableBuffer -> JSM (SomeBuffer any2)+clone = js_clone+{-# INLINE clone #-}++fromByteString :: ByteString -> GHCJSPure (Buffer, Int, Int)+fromByteString bs = GHCJSPure $ do+  buffer <- SomeBuffer <$> jsg1 "h$newByteArrayFromBase64String" (decodeUtf8 $ B64.encode bs)+  return (buffer, 0, BS.length bs)+{-# INLINE fromByteString #-}++-- | Wrap a 'Buffer' into a 'ByteString' using the given offset+-- and length.+toByteString :: Int -> Maybe Int -> Buffer -> GHCJSPure ByteString+toByteString off mbLen buf = GHCJSPure $ do+  bufLen <- ghcjsPure $ byteLength buf+  case mbLen of+    _        | off < 0            -> error "toByteString: negative offset"+             | off > bufLen       -> error "toByteString: offset past end of buffer"+    Just len | len < 0            -> error "toByteString: negative length"+             | len > bufLen - off -> error "toByteString: length past end of buffer"+             | otherwise          -> ghcjsPure $ unsafeToByteString off len buf+    Nothing                       -> ghcjsPure $ unsafeToByteString off (bufLen - off) buf++unsafeToByteString :: Int -> Int -> Buffer -> GHCJSPure ByteString+unsafeToByteString off len (SomeBuffer buf) = GHCJSPure $ do+  b64 <- jsg3 "h$byteArrayToBase64String" off len buf >>= fromJSValUnchecked+  return $ case B64.decode (encodeUtf8 b64) of+            Left err -> error $ "unsafeToByteString base 64 decode error :" ++ err+            Right bs -> bs++byteLength :: SomeBuffer any -> GHCJSPure Int+byteLength (SomeBuffer buf) = GHCJSPure $ buf ^. js "len" >>= fromJSValUnchecked+{-# INLINE byteLength #-}++js_clone :: SomeBuffer any1 -> JSM (SomeBuffer any2)+js_clone (SomeBuffer buf) = SomeBuffer <$> jsg1 "h$wrapBuffer" (buf ^. js "buf" ^. js2 "slice" (buf ^. js "u8" ^. js "byteOffset") (buf ^. js "len"))
+ src-ghc/GHCJS/Buffer/Types.hs view
@@ -0,0 +1,11 @@+{-# LANGUAGE DataKinds, KindSignatures, PolyKinds #-}++module GHCJS.Buffer.Types where++import GHCJS.Types+import GHCJS.Internal.Types++newtype SomeBuffer (a :: MutabilityType s) = SomeBuffer JSVal++type    Buffer         = SomeBuffer Immutable+type    MutableBuffer  = SomeBuffer Mutable
+ src-ghc/GHCJS/Concurrent.hs view
@@ -0,0 +1,22 @@+{-# LANGUAGE DeriveDataTypeable #-}++module GHCJS.Concurrent ( OnBlocked(..)+                        , WouldBlockException(..)+                        ) where++import           GHCJS.Prim++import           Data.Data++{- |+     The runtime tries to run synchronous threads to completion. Sometimes it's+     not possible to continue running a thread, for example when the thread+     tries to take an empty 'MVar'. The runtime can then either throw a+     'WouldBlockException', aborting the blocking action, or continue the+     thread asynchronously.+ -}++data OnBlocked = ContinueAsync -- ^ continue the thread asynchronously if blocked+               | ThrowWouldBlock -- ^ throw 'WouldBlockException' if blocked+               deriving (Data, Typeable, Enum, Show, Eq, Ord)+
+ src-ghc/GHCJS/Foreign.hs view
@@ -0,0 +1,64 @@+{-# LANGUAGE CPP #-}+-----------------------------------------------------------------------------+--+-- Module      :  Language.Javascript.JSaddle.Value+-- Copyright   :  (c) Hamish Mackenzie+-- License     :  MIT+--+-- Maintainer  :  Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>+--+-- |+--+-----------------------------------------------------------------------------+module GHCJS.Foreign (+    jsTrue+  , jsFalse+  , jsNull+  , toJSBool+--  , fromJSBool+  , jsUndefined+  , isTruthy+  , isNull+  , isUndefined+  , isObject+  , isFunction+  , isString+  , isBoolean+  , isSymbol+  , isNumber+  , JSType(..)+  , jsTypeOf+) where++import GHCJS.Foreign.Internal+import Language.Javascript.JSaddle.Types (JSVal(..), GHCJSPure(..))+import Language.Javascript.JSaddle.Object (jsg1)+import GHCJS.Marshal (FromJSVal(..))++isObject :: JSVal -> GHCJSPure Bool+isObject v = GHCJSPure $ jsg1 "h$isObject" v >>= fromJSValUnchecked+{-# INLINE isObject #-}++isFunction :: JSVal -> GHCJSPure Bool+isFunction v = GHCJSPure $ jsg1 "h$isFunction" v >>= fromJSValUnchecked+{-# INLINE isFunction #-}++isString :: JSVal -> GHCJSPure Bool+isString v = GHCJSPure $ jsg1 "h$isString" v >>= fromJSValUnchecked+{-# INLINE isString #-}++isBoolean :: JSVal -> GHCJSPure Bool+isBoolean v = GHCJSPure $ jsg1 "h$isBoolean" v >>= fromJSValUnchecked+{-# INLINE isBoolean #-}++isSymbol :: JSVal -> GHCJSPure Bool+isSymbol v = GHCJSPure $ jsg1 "h$isSymbol" v >>= fromJSValUnchecked+{-# INLINE isSymbol #-}++isNumber :: JSVal -> GHCJSPure Bool+isNumber v = GHCJSPure $ jsg1 "h$isNumber" v >>= fromJSValUnchecked+{-# INLINE isNumber #-}++jsTypeOf :: JSVal -> GHCJSPure JSType+jsTypeOf v = GHCJSPure $ toEnum <$> (jsg1 "h$jsonTypeOf" v >>= fromJSValUnchecked)+{-# INLINE jsTypeOf #-}
+ src-ghc/GHCJS/Foreign/Internal.hs view
@@ -0,0 +1,67 @@+-----------------------------------------------------------------------------+--+-- Module      :  Language.Javascript.JSaddle.Value+-- Copyright   :  (c) Hamish Mackenzie+-- License     :  MIT+--+-- Maintainer  :  Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>+--+-- |+--+-----------------------------------------------------------------------------+module GHCJS.Foreign.Internal (+    jsTrue+  , jsFalse+  , jsNull+  , toJSBool+--  , fromJSBool+  , jsUndefined+  , isTruthy+  , isNull+  , isUndefined+  , JSType(..)+) where++import Language.Javascript.JSaddle.Types (JSVal(..), GHCJSPure(..))+import Language.Javascript.JSaddle.Native.Internal+       (valueToBool)+import Data.Typeable (Typeable)+import GHCJS.Prim (isNull, isUndefined)+import System.IO.Unsafe (unsafePerformIO)+import Data.IORef (newIORef)++jsTrue :: JSVal+jsTrue = JSVal . unsafePerformIO $ newIORef 3+{-# NOINLINE jsTrue #-}++jsFalse :: JSVal+jsFalse = JSVal . unsafePerformIO $ newIORef 2+{-# NOINLINE jsFalse #-}++jsNull :: JSVal+jsNull = JSVal . unsafePerformIO $ newIORef 0+{-# NOINLINE jsNull #-}++toJSBool :: Bool -> JSVal+toJSBool b = JSVal . unsafePerformIO . newIORef $ if b then 3 else 2+{-# NOINLINE toJSBool #-}++jsUndefined :: JSVal+jsUndefined = JSVal . unsafePerformIO $ newIORef 1+{-# NOINLINE jsUndefined #-}++isTruthy :: JSVal -> GHCJSPure Bool+isTruthy = GHCJSPure . valueToBool+{-# INLINE isTruthy #-}++-- types returned by JS typeof operator+data JSType = Undefined+            | Object+            | Boolean+            | Number+            | String+            | Symbol+            | Function+            | Other    -- ^ implementation dependent+            deriving (Show, Eq, Ord, Enum, Typeable)+
+ src-ghc/GHCJS/Internal/Types.hs view
@@ -0,0 +1,16 @@+module GHCJS.Internal.Types ( IsJSVal(..)+                            , jsval+                            , MutabilityType(..)+                            , Mutable+                            , Immutable+                            , IsItMutable(..)+                            , Mutability+                            ) where++import Language.Javascript.JSaddle.Types+import Language.Javascript.JSaddle.Native.Internal (stringToValue)++instance IsJSVal JSString where+  jsval_ a = GHCJSPure $ stringToValue a+  {-# INLINE jsval_ #-}+
+ src-ghc/GHCJS/Marshal.hs view
@@ -0,0 +1,169 @@+{-# LANGUAGE ScopedTypeVariables,+             FlexibleContexts,+             FlexibleInstances,+             OverloadedStrings,+             TupleSections,+             LambdaCase #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++module GHCJS.Marshal ( FromJSVal(..)+                     , ToJSVal(..)+                     , toJSVal_aeson+                     , toJSVal_pure+                     ) where++import           Control.Monad (join)+import           Control.Monad.Trans.Maybe (MaybeT(..), runMaybeT)++import qualified Data.Aeson as AE+import           Data.Int (Int8, Int16, Int32)+import           Data.Text (Text)+import           Data.Word (Word8, Word16, Word32, Word)++import           GHC.Prim++import           Language.Javascript.JSaddle.Types (JSM, JSVal, SomeJSArray(..), ghcjsPure)+import           Language.Javascript.JSaddle.Native.Internal+                 (valueToJSONValue, jsonValueToValue, valueToNumber)++import           GHCJS.Types (JSString, isUndefined, isNull)+import           GHCJS.Foreign.Internal (isTruthy)+import           GHCJS.Marshal.Pure ()++import           JavaScript.Array (fromListIO)+import qualified JavaScript.Array as A (read)++import           GHCJS.Marshal.Internal++instance FromJSVal JSVal where+  fromJSValUnchecked x = return x+  {-# INLINE fromJSValUnchecked #-}+  fromJSVal = return . Just+  {-# INLINE fromJSVal #-}+instance FromJSVal () where+  fromJSValUnchecked = fromJSValUnchecked_pure+  {-# INLINE fromJSValUnchecked #-}+  fromJSVal = fromJSVal_pure+--    {-# INLINE fromJSVal #-}+instance FromJSVal Bool where+    fromJSValUnchecked = ghcjsPure . isTruthy+    {-# INLINE fromJSValUnchecked #-}+    fromJSVal = fmap Just . ghcjsPure . isTruthy+    {-# INLINE fromJSVal #-}+instance FromJSVal Int where+    fromJSValUnchecked = fmap round . valueToNumber+    {-# INLINE fromJSValUnchecked #-}+    fromJSVal = fmap (Just . round) . valueToNumber+    {-# INLINE fromJSVal #-}+instance FromJSVal Int8 where+    fromJSValUnchecked = fmap round . valueToNumber+    {-# INLINE fromJSValUnchecked #-}+    fromJSVal = fmap (Just . round) . valueToNumber+    {-# INLINE fromJSVal #-}+instance FromJSVal Int16 where+    fromJSValUnchecked = fmap round . valueToNumber+    {-# INLINE fromJSValUnchecked #-}+    fromJSVal = fmap (Just . round) . valueToNumber+    {-# INLINE fromJSVal #-}+instance FromJSVal Int32 where+    fromJSValUnchecked = fmap round . valueToNumber+    {-# INLINE fromJSValUnchecked #-}+    fromJSVal = fmap (Just . round) . valueToNumber+    {-# INLINE fromJSVal #-}+instance FromJSVal Word where+    fromJSValUnchecked = fmap round . valueToNumber+    {-# INLINE fromJSValUnchecked #-}+    fromJSVal = fmap (Just . round) . valueToNumber+    {-# INLINE fromJSVal #-}+instance FromJSVal Word8 where+    fromJSValUnchecked = fmap round . valueToNumber+    {-# INLINE fromJSValUnchecked #-}+    fromJSVal = fmap (Just . round) . valueToNumber+    {-# INLINE fromJSVal #-}+instance FromJSVal Word16 where+    fromJSValUnchecked = fmap round . valueToNumber+    {-# INLINE fromJSValUnchecked #-}+    fromJSVal = fmap (Just . round) . valueToNumber+    {-# INLINE fromJSVal #-}+instance FromJSVal Word32 where+    fromJSValUnchecked = fmap round . valueToNumber+    {-# INLINE fromJSValUnchecked #-}+    fromJSVal = fmap (Just . round) . valueToNumber+    {-# INLINE fromJSVal #-}+instance FromJSVal Float where+    fromJSValUnchecked = fmap realToFrac . valueToNumber+    {-# INLINE fromJSValUnchecked #-}+    fromJSVal = fmap (Just . realToFrac) . valueToNumber+    {-# INLINE fromJSVal #-}+instance FromJSVal Double where+    fromJSValUnchecked = valueToNumber+    {-# INLINE fromJSValUnchecked #-}+    fromJSVal = fmap Just . valueToNumber+    {-# INLINE fromJSVal #-}+instance FromJSVal AE.Value where+    fromJSVal r = Just <$> valueToJSONValue r+    {-# INLINE fromJSVal #-}+instance (FromJSVal a, FromJSVal b) => FromJSVal (a,b) where+    fromJSVal r = runMaybeT $ (,) <$> jf r 0 <*> jf r 1+    {-# INLINE fromJSVal #-}+instance (FromJSVal a, FromJSVal b, FromJSVal c) => FromJSVal (a,b,c) where+    fromJSVal r = runMaybeT $ (,,) <$> jf r 0 <*> jf r 1 <*> jf r 2+    {-# INLINE fromJSVal #-}+instance (FromJSVal a, FromJSVal b, FromJSVal c, FromJSVal d) => FromJSVal (a,b,c,d) where+    fromJSVal r = runMaybeT $ (,,,) <$> jf r 0 <*> jf r 1 <*> jf r 2 <*> jf r 3+    {-# INLINE fromJSVal #-}+instance (FromJSVal a, FromJSVal b, FromJSVal c, FromJSVal d, FromJSVal e) => FromJSVal (a,b,c,d,e) where+    fromJSVal r = runMaybeT $ (,,,,) <$> jf r 0 <*> jf r 1 <*> jf r 2 <*> jf r 3 <*> jf r 4+    {-# INLINE fromJSVal #-}+instance (FromJSVal a, FromJSVal b, FromJSVal c, FromJSVal d, FromJSVal e, FromJSVal f) => FromJSVal (a,b,c,d,e,f) where+    fromJSVal r = runMaybeT $ (,,,,,) <$> jf r 0 <*> jf r 1 <*> jf r 2 <*> jf r 3 <*> jf r 4 <*> jf r 5+    {-# INLINE fromJSVal #-}+instance (FromJSVal a, FromJSVal b, FromJSVal c, FromJSVal d, FromJSVal e, FromJSVal f, FromJSVal g) => FromJSVal (a,b,c,d,e,f,g) where+    fromJSVal r = runMaybeT $ (,,,,,,) <$> jf r 0 <*> jf r 1 <*> jf r 2 <*> jf r 3 <*> jf r 4 <*> jf r 5 <*> jf r 6+    {-# INLINE fromJSVal #-}+instance (FromJSVal a, FromJSVal b, FromJSVal c, FromJSVal d, FromJSVal e, FromJSVal f, FromJSVal g, FromJSVal h) => FromJSVal (a,b,c,d,e,f,g,h) where+    fromJSVal r = runMaybeT $ (,,,,,,,) <$> jf r 0 <*> jf r 1 <*> jf r 2 <*> jf r 3 <*> jf r 4 <*> jf r 5 <*> jf r 6 <*> jf r 7+    {-# INLINE fromJSVal #-}++jf :: FromJSVal a => JSVal -> Int -> MaybeT JSM a+jf r n = MaybeT $ do+  r' <- A.read n (SomeJSArray r)+  ghcjsPure (isUndefined r) >>= \case+    True -> return Nothing+    False -> fromJSVal r'++instance (ToJSVal a, ToJSVal b) => ToJSVal (a,b) where+    toJSVal (a,b) = join $ arr2 <$> toJSVal a <*> toJSVal b+    {-# INLINE toJSVal #-}+instance (ToJSVal a, ToJSVal b, ToJSVal c) => ToJSVal (a,b,c) where+    toJSVal (a,b,c) = join $ arr3 <$> toJSVal a <*> toJSVal b <*> toJSVal c+    {-# INLINE toJSVal #-}+instance (ToJSVal a, ToJSVal b, ToJSVal c, ToJSVal d) => ToJSVal (a,b,c,d) where+    toJSVal (a,b,c,d) = join $ arr4 <$> toJSVal a <*> toJSVal b <*> toJSVal c <*> toJSVal d+    {-# INLINE toJSVal #-}+instance (ToJSVal a, ToJSVal b, ToJSVal c, ToJSVal d, ToJSVal e) => ToJSVal (a,b,c,d,e) where+    toJSVal (a,b,c,d,e) = join $ arr5 <$> toJSVal a <*> toJSVal b <*> toJSVal c <*> toJSVal d <*> toJSVal e+    {-# INLINE toJSVal #-}+instance (ToJSVal a, ToJSVal b, ToJSVal c, ToJSVal d, ToJSVal e, ToJSVal f) => ToJSVal (a,b,c,d,e,f) where+    toJSVal (a,b,c,d,e,f) = join $ arr6 <$> toJSVal a <*> toJSVal b <*> toJSVal c <*> toJSVal d <*> toJSVal e <*> toJSVal f+    {-# INLINE toJSVal #-}+instance (ToJSVal a, ToJSVal b, ToJSVal c, ToJSVal d, ToJSVal e, ToJSVal f, ToJSVal g) => ToJSVal (a,b,c,d,e,f,g) where+    toJSVal (a,b,c,d,e,f,g) = join $ arr7 <$> toJSVal a <*> toJSVal b <*> toJSVal c <*> toJSVal d <*> toJSVal e <*> toJSVal f <*> toJSVal g+    {-# INLINE toJSVal #-}++arr2 :: JSVal -> JSVal -> JSM JSVal+arr2 a b           = coerce <$> fromListIO [a,b]+arr3 :: JSVal -> JSVal -> JSVal -> JSM JSVal+arr3 a b c         = coerce <$> fromListIO [a,b,c]+arr4 :: JSVal -> JSVal -> JSVal -> JSVal -> JSM JSVal+arr4 a b c d       = coerce <$> fromListIO [a,b,c,d]+arr5 :: JSVal -> JSVal -> JSVal -> JSVal -> JSVal -> JSM JSVal+arr5 a b c d e     = coerce <$> fromListIO [a,b,c,d,e]+arr6 :: JSVal -> JSVal -> JSVal -> JSVal -> JSVal -> JSVal -> JSM JSVal+arr6 a b c d e f   = coerce <$> fromListIO [a,b,c,d,e,f]+arr7 :: JSVal -> JSVal -> JSVal -> JSVal -> JSVal -> JSVal -> JSVal -> JSM JSVal+arr7 a b c d e f g = coerce <$> fromListIO [a,b,c,d,e,f,g]++toJSVal_aeson :: AE.ToJSON a => a -> JSM JSVal+toJSVal_aeson = jsonValueToValue . AE.toJSON+
+ src-ghc/GHCJS/Marshal/Internal.hs view
@@ -0,0 +1,282 @@+{-# LANGUAGE CPP, ScopedTypeVariables, DeriveDataTypeable, DefaultSignatures,+             TypeOperators, TupleSections, FlexibleContexts, FlexibleInstances,+             LambdaCase+  #-}++module GHCJS.Marshal.Internal ( FromJSVal(..)+                              , ToJSVal(..)+                              , PToJSVal(..)+                              , PFromJSVal(..)+                              , Purity(..)+                              , toJSVal_generic+                              , fromJSVal_generic+                              , toJSVal_pure+                              , fromJSVal_pure+                              , fromJSValUnchecked_pure+                              ) where++import           Control.Applicative+import           Control.Monad++import           Data.Data+import           Data.Maybe+import           Data.Coerce (coerce)+import qualified Data.Text as T (pack)++import           GHC.Generics++import qualified GHCJS.Prim.Internal        as Prim+import qualified GHCJS.Foreign.Internal     as F+import           GHCJS.Types++import qualified Data.JSString.Internal.Type as JSS++import qualified JavaScript.Object.Internal as OI (Object(..), create, setProp, getProp)+import qualified JavaScript.Array.Internal as AI (SomeJSArray(..), create, push, read, fromListIO, toListIO)++import           Language.Javascript.JSaddle.Types (JSM, MutableJSArray, GHCJSPure(..), ghcjsPure, ghcjsPureMap, JSaddleHasCallStack)+import           Language.Javascript.JSaddle.String (textToStr)++data Purity = PureShared    -- ^ conversion is pure even if the original value is shared+            | PureExclusive -- ^ conversion is pure if the we only convert once+  deriving (Eq, Ord, Typeable, Data)++class PToJSVal a where+--  type PureOut a :: Purity+  pToJSVal :: a -> JSVal++class PFromJSVal a where+--  type PureIn a :: Purity+  pFromJSVal :: JSVal -> a++class ToJSVal a where+  toJSVal :: a -> JSM JSVal++  toJSValListOf :: [a] -> JSM JSVal+  toJSValListOf = fmap coerce . AI.fromListIO <=< mapM toJSVal++  -- default toJSVal :: PToJSVal a => a -> JSM (JSVal a)+  -- toJSVal x = return (pToJSVal x)++  default toJSVal :: (Generic a, GToJSVal (Rep a ())) => a -> JSM JSVal+  toJSVal = toJSVal_generic id++fromJustWithStack :: JSaddleHasCallStack => Maybe a -> a+fromJustWithStack Nothing = error "fromJSValUnchecked: fromJSVal result was Nothing"+fromJustWithStack (Just x) = x++class FromJSVal a where+  fromJSVal :: JSVal -> JSM (Maybe a)++#if MIN_VERSION_base(4,9,0) && defined(JSADDLE_HAS_CALL_STACK)+  fromJSValUnchecked :: JSaddleHasCallStack => JSVal -> JSM a+#ifdef CHECK_UNCHECKED+  fromJSValUnchecked v = fromJSVal v >>= \case+                             Nothing -> error "fromJSValUnchecked: fromJSVal result was Nothing"+                             Just x  -> return x+#else+  fromJSValUnchecked = fmap fromJustWithStack . fromJSVal+#endif+#else+  fromJSValUnchecked :: JSVal -> JSM a+  fromJSValUnchecked = fmap fromJust . fromJSVal+#endif+  {-# INLINE fromJSValUnchecked #-}++  fromJSValListOf :: JSVal -> JSM (Maybe [a])+  fromJSValListOf = fmap sequence . (mapM fromJSVal <=< AI.toListIO . coerce) -- fixme should check that it's an array++#if MIN_VERSION_base(4,9,0) && defined(JSADDLE_HAS_CALL_STACK)+  fromJSValUncheckedListOf :: JSaddleHasCallStack => JSVal -> JSM [a]+#else+  fromJSValUncheckedListOf :: JSVal -> JSM [a]+#endif+  fromJSValUncheckedListOf = mapM fromJSValUnchecked <=< AI.toListIO . coerce++  -- default fromJSVal :: PFromJSVal a => JSVal a -> JSM (Maybe a)+  -- fromJSVal x = return (Just (pFromJSVal x))++  default fromJSVal :: (Generic a, GFromJSVal (Rep a ())) => JSVal -> JSM (Maybe a)+  fromJSVal = fromJSVal_generic id++  -- default fromJSValUnchecked :: PFromJSVal a => a -> IO a+  -- fromJSValUnchecked x = return (pFromJSVal x)++-- -----------------------------------------------------------------------------++class GToJSVal a where+  gToJSVal :: (String -> String) -> Bool -> a -> JSM JSVal++class GToJSProp a where+  gToJSProp :: (String -> String) -> JSVal -> a -> JSM ()++class GToJSArr a where+  gToJSArr :: (String -> String) -> MutableJSArray -> a -> JSM ()++instance (ToJSVal b) => GToJSVal (K1 a b c) where+  gToJSVal _ _ (K1 x) = toJSVal x++instance GToJSVal p => GToJSVal (Par1 p) where+  gToJSVal f b (Par1 p) = gToJSVal f b p++instance GToJSVal (f p) => GToJSVal (Rec1 f p) where+  gToJSVal f b (Rec1 x) = gToJSVal f b x++instance (GToJSVal (a p), GToJSVal (b p)) => GToJSVal ((a :+: b) p) where+  gToJSVal f _ (L1 x) = gToJSVal f True x+  gToJSVal f _ (R1 x) = gToJSVal f True x++instance (Datatype c, GToJSVal (a p)) => GToJSVal (M1 D c a p) where+  gToJSVal f b m@(M1 x) = gToJSVal f b x++instance (Constructor c, GToJSVal (a p)) => GToJSVal (M1 C c a p) where+  gToJSVal f True m@(M1 x) = do+    obj@(OI.Object obj') <- OI.create+    v   <- gToJSVal f (conIsRecord m) x+    OI.setProp (packJSS . f $ conName m) v obj+    return obj'+  gToJSVal f _ m@(M1 x) = gToJSVal f (conIsRecord m) x++instance (GToJSArr (a p), GToJSArr (b p), GToJSProp (a p), GToJSProp (b p)) => GToJSVal ((a :*: b) p) where+  gToJSVal f True xy = do+    (OI.Object obj') <- OI.create+    gToJSProp f obj' xy+    return obj'+  gToJSVal f False xy = do+    arr@(AI.SomeJSArray arr') <- AI.create+    gToJSArr f arr xy+    return arr'++instance GToJSVal (a p) => GToJSVal (M1 S c a p) where+  gToJSVal f b (M1 x) = gToJSVal f b x++instance (GToJSProp (a p), GToJSProp (b p)) => GToJSProp ((a :*: b) p) where+  gToJSProp f o (x :*: y) = gToJSProp f o x >> gToJSProp f o y++instance (Selector c, GToJSVal (a p)) => GToJSProp (M1 S c a p) where+  gToJSProp f o m@(M1 x) = do+    r <- gToJSVal f False x+    OI.setProp (packJSS . f $ selName m) r (OI.Object o)++instance (GToJSArr (a p), GToJSArr (b p)) => GToJSArr ((a :*: b) p) where+  gToJSArr f a (x :*: y) = gToJSArr f a x >> gToJSArr f a y++instance GToJSVal (a p) => GToJSArr (M1 S c a p) where+  gToJSArr f a (M1 x) = do+    r <- gToJSVal f False x+    AI.push r a++instance GToJSVal (V1 p) where+  gToJSVal _ _ _ = return Prim.jsNull++instance GToJSVal (U1 p) where+  gToJSVal _ _ _ = return F.jsTrue++toJSVal_generic :: forall a . (Generic a, GToJSVal (Rep a ()))+                => (String -> String) -> a -> JSM JSVal+toJSVal_generic f x = gToJSVal f False (from x :: Rep a ())++-- -----------------------------------------------------------------------------++class GFromJSVal a where+  gFromJSVal :: (String -> String) -> Bool -> JSVal -> JSM (Maybe a)++class GFromJSProp a where+  gFromJSProp :: (String -> String) -> JSVal -> JSM (Maybe a)++class GFromJSArr a where+  gFromJSArr :: (String -> String) -> MutableJSArray -> Int -> JSM (Maybe (a,Int))++instance FromJSVal b => GFromJSVal (K1 a b c) where+  gFromJSVal _ _ r = fmap K1 <$> fromJSVal r++instance GFromJSVal p => GFromJSVal (Par1 p) where+  gFromJSVal f b r = gFromJSVal f b r++instance GFromJSVal (f p) => GFromJSVal (Rec1 f p) where+  gFromJSVal f b r = gFromJSVal f b r++instance (GFromJSVal (a p), GFromJSVal (b p)) => GFromJSVal ((a :+: b) p) where+  gFromJSVal f b r = do+    l <- gFromJSVal f True r+    case l of+      Just x  -> return (L1 <$> Just x)+      Nothing -> fmap R1 <$> gFromJSVal f True r++instance (Datatype c, GFromJSVal (a p)) => GFromJSVal (M1 D c a p) where+  gFromJSVal f b r = fmap M1 <$> gFromJSVal f b r++instance forall c a p . (Constructor c, GFromJSVal (a p)) => GFromJSVal (M1 C c a p) where+  gFromJSVal f True r = do+    r' <- OI.getProp (packJSS . f $ conName (undefined :: M1 C c a p)) (OI.Object r)+    ghcjsPure (isUndefined r') >>= \case+      True -> return Nothing+      False -> fmap M1 <$> gFromJSVal f (conIsRecord (undefined :: M1 C c a p)) r'+  gFromJSVal f _ r = fmap M1 <$> gFromJSVal f (conIsRecord (undefined :: M1 C c a p)) r++instance (GFromJSArr (a p), GFromJSArr (b p), GFromJSProp (a p), GFromJSProp (b p)) => GFromJSVal ((a :*: b) p) where+  gFromJSVal f True  r = gFromJSProp f r+  gFromJSVal f False r = fmap fst <$> gFromJSArr f (AI.SomeJSArray r) 0++instance GFromJSVal (a p) => GFromJSVal (M1 S c a p) where+  gFromJSVal f b r = fmap M1 <$> gFromJSVal f b r++instance (GFromJSProp (a p), GFromJSProp (b p)) => GFromJSProp ((a :*: b) p) where+  gFromJSProp f r = do+    a <- gFromJSProp f r+    case a of+      Nothing -> return Nothing+      Just a' -> fmap (a':*:) <$> gFromJSProp f r++instance forall c a p . (Selector c, GFromJSVal (a p)) => GFromJSProp (M1 S c a p) where+  gFromJSProp f o = do+    p <- OI.getProp (packJSS . f $ selName (undefined :: M1 S c a p)) (OI.Object o)+    ghcjsPure (isUndefined p) >>= \case+      True -> return Nothing+      False -> fmap M1 <$> gFromJSVal f False p++instance (GFromJSArr (a p), GFromJSArr (b p)) => GFromJSArr ((a :*: b) p) where+  gFromJSArr f r _n = do+    a <- gFromJSArr f r 0+    case a of+      Just (a',an) -> do+        b <- gFromJSArr f r an+        case b of+          Just (b',bn) -> return (Just (a' :*: b',bn))+          _            -> return Nothing++instance (GFromJSVal (a p)) => GFromJSArr (M1 S c a p) where+  gFromJSArr f o n = do+    r <- AI.read n o+    ghcjsPure (isUndefined r) >>= \case+      True -> return Nothing+      False -> fmap ((,n+1) . M1) <$> gFromJSVal f False r++instance GFromJSVal (V1 p) where+  gFromJSVal _ _ _ = return Nothing++instance GFromJSVal (U1 p) where+  gFromJSVal _ _ _ = return (Just U1)++fromJSVal_generic :: forall a . (Generic a, GFromJSVal (Rep a ()))+                => (String -> String) -> JSVal -> JSM (Maybe a)+fromJSVal_generic f x = fmap to <$> (gFromJSVal f False x :: JSM (Maybe (Rep a ())))++-- -----------------------------------------------------------------------------++fromJSVal_pure :: PFromJSVal a => JSVal -> JSM (Maybe a)+fromJSVal_pure = return . Just . pFromJSVal+{-# INLINE fromJSVal_pure #-}++fromJSValUnchecked_pure :: PFromJSVal a => JSVal -> JSM a+fromJSValUnchecked_pure = return . pFromJSVal+{-# INLINE fromJSValUnchecked_pure #-}++toJSVal_pure :: PToJSVal a => a -> JSM JSVal+toJSVal_pure = return . pToJSVal+{-# INLINE toJSVal_pure #-}++-- -----------------------------------------------------------------------------++packJSS :: String -> JSString+packJSS = textToStr . T.pack
+ src-ghc/GHCJS/Marshal/Pure.hs view
@@ -0,0 +1,19 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+module GHCJS.Marshal.Pure ( PFromJSVal(..)+                          , PToJSVal(..)+                          ) where++import           GHCJS.Types+import           GHCJS.Foreign.Internal (jsFalse, jsTrue)+import           GHCJS.Marshal.Internal++instance PFromJSVal JSVal where pFromJSVal = id+                                {-# INLINE pFromJSVal #-}+instance PFromJSVal ()    where pFromJSVal _ = ()+                                {-# INLINE pFromJSVal #-}++instance PToJSVal JSVal     where pToJSVal = id+                                  {-# INLINE pToJSVal #-}+instance PToJSVal Bool      where pToJSVal True     = jsTrue+                                  pToJSVal False    = jsFalse+                                  {-# INLINE pToJSVal #-}
+ src-ghc/GHCJS/Prim.hs view
@@ -0,0 +1,84 @@+{-# LANGUAGE MagicHash #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}++module GHCJS.Prim ( module GHCJS.Prim.Internal+                  , fromJSString+                  , toJSString+                  , isNull+                  , isUndefined+                  ) where++import           GHCJS.Prim.Internal+--import           Data.Int (Int64)+--import           Data.Typeable (Typeable)+--import           Unsafe.Coerce (unsafeCoerce)++--import           Data.Aeson (ToJSON(..), FromJSON(..))+import qualified Data.Text as T (unpack, pack)+import           Data.JSString.Text (textFromJSVal)++--import           GHC.Prim+--import qualified GHC.Exception as Ex+--import qualified GHC.Exts as Exts++import Language.Javascript.JSaddle.Types (JSVal(..), JSString(..), GHCJSPure(..), ghcjsPureMap)+import qualified Language.Javascript.JSaddle.Native.Internal as N+       (stringToValue, isNull, isUndefined)+{- | Low-level conversion utilities for packages that cannot+     depend on ghcjs-base+ -}++fromJSString :: JSVal -> GHCJSPure String+fromJSString = ghcjsPureMap T.unpack . textFromJSVal+{-# INLINE fromJSString #-}++toJSString :: String -> GHCJSPure JSVal+toJSString s = GHCJSPure $ N.stringToValue (JSString $ T.pack s)+{-# INLINE toJSString #-}++--fromJSArray :: JSVal -> IO [JSVal]+--fromJSArray = unsafeCoerce . js_fromJSArray+--{-# INLINE fromJSArray #-}+--+--toJSArray :: [JSVal] -> IO JSVal+--toJSArray = js_toJSArray . unsafeCoerce . seqList+--{-# INLINE toJSArray #-}+--+--{- | returns zero if the JSVal does not contain a number+-- -}+--fromJSInt :: JSVal -> Int+--fromJSInt = js_fromJSInt+--{-# INLINE fromJSInt #-}+--+--toJSInt :: Int -> JSVal+--toJSInt = js_toJSInt+--{-# INLINE toJSInt #-}+--++isNull :: JSVal -> GHCJSPure Bool+isNull = GHCJSPure . N.isNull+{-# INLINE isNull #-}++isUndefined :: JSVal -> GHCJSPure Bool+isUndefined = GHCJSPure . N.isUndefined+{-# INLINE isUndefined #-}++--getProp :: JSVal -> String -> IO JSVal+--getProp o p = js_getProp o (unsafeCoerce $ seqList p)+--{-# INLINE getProp #-}+--+--getProp' :: JSVal -> JSVal -> IO JSVal+--getProp' o p = js_getProp' o p+--{-# INLINE getProp' #-}+--+---- reduce the spine and all list elements to whnf+--seqList :: [a] -> [a]+--seqList xs = go xs `seq` xs+--  where go (x:xs) = x `seq` go xs+--        go []     = ()+--+--seqListSpine :: [a] -> [a]+--seqListSpine xs = go xs `seq` xs+--  where go (x:xs) = go xs+--        go []     = ()
+ src-ghc/GHCJS/Prim/Internal.hs view
@@ -0,0 +1,66 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}++module GHCJS.Prim.Internal ( JSVal(..)+                           , JSValueRef+                           , JSException(..)+                           , WouldBlockException(..)+                           , mkJSException+                           , jsNull+                           ) where++import           Control.DeepSeq (NFData(..))+import           Data.Int (Int64)+import           Data.Typeable (Typeable)+import           Unsafe.Coerce (unsafeCoerce)++import qualified GHC.Exception as Ex+import Data.IORef (newIORef, IORef)+import System.IO.Unsafe (unsafePerformIO)++-- A reference to a particular JavaScript value inside the JavaScript context+type JSValueRef = Int64++{-+  JSVal is a boxed type that can be used as FFI+  argument or result.+-}+newtype JSVal = JSVal (IORef JSValueRef)++instance NFData JSVal where+  rnf x = x `seq` ()+++{-+  When a JavaScript exception is raised inside+  a safe or interruptible foreign call, it is converted+  to a JSException+ -}+data JSException = JSException JSVal String+  deriving (Typeable)++instance Ex.Exception JSException++instance Show JSException where+  show (JSException _ xs) = "JavaScript exception: " ++ xs++mkJSException :: JSVal -> IO JSException+mkJSException ref =+  return (JSException (unsafeCoerce ref) "")++jsNull :: JSVal+jsNull = JSVal . unsafePerformIO $ newIORef 0+{-# NOINLINE jsNull #-}++{- | If a synchronous thread tries to do something that can only+     be done asynchronously, and the thread is set up to not+     continue asynchronously, it receives this exception.+ -}+data WouldBlockException = WouldBlockException+  deriving (Typeable)++instance Show WouldBlockException where+  show _ = "thread would block"++instance Ex.Exception WouldBlockException+
+ src-ghc/GHCJS/Types.hs view
@@ -0,0 +1,60 @@+{-# LANGUAGE EmptyDataDecls #-}+{-# LANGUAGE MagicHash #-}+{-# LANGUAGE BangPatterns #-}++module GHCJS.Types ( JSVal+                   , WouldBlockException(..)+                   , JSException(..)+                   , IsJSVal+                   , jsval+                   , isNull+                   , isUndefined+                   , nullRef+                   , JSString+                   , mkRef+                   , Ref#+--                   , toPtr+--                   , fromPtr+                   , JSRef+                   ) where++import Data.JSString.Internal.Type (JSString)+import GHCJS.Internal.Types++import GHCJS.Prim++import GHC.Int+import GHC.Types+import GHC.Prim+import GHC.Ptr+import GHC.IORef+import GHC.IO.Unsafe (unsafePerformIO)++import Control.DeepSeq+import Unsafe.Coerce++type Ref# = IORef Int64++mkRef :: Ref# -> JSVal+mkRef = JSVal+{-# INLINE mkRef #-}++nullRef :: JSVal+nullRef = JSVal . unsafePerformIO $ newIORef 0+{-# NOINLINE nullRef #-}++--toPtr :: JSVal -> Ptr a+--toPtr (JSVal x) = unsafeCoerce (Ptr' x 0#)+--{-# INLINE toPtr #-}+--+--fromPtr :: Ptr a -> JSVal+--fromPtr p = js_ptrVal p+--{-# INLINE fromPtr #-}+--+--data Ptr' a = Ptr' ByteArray# Int#++-- | This is a deprecated copmatibility wrapper for the old JSRef type.+--+-- See https://github.com/ghcjs/ghcjs/issues/421+type JSRef a = JSVal+{-# DEPRECATED JSRef "Use JSVal instead, or a more specific newtype wrapper of JSVal " #-}
+ src-ghc/JavaScript/Array.hs view
@@ -0,0 +1,134 @@+-----------------------------------------------------------------------------+--+-- Module      :  JavaScript.Array+-- Copyright   :  (c) Hamish Mackenzie+-- License     :  MIT+--+-- Maintainer  :  Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>+--+-- | Interface to JavaScript array+--+-----------------------------------------------------------------------------+module JavaScript.Array+    ( SomeJSArray(..)+    , JSArray+    , MutableJSArray+    , create+    , length+    , lengthIO+    , null+    , fromList+    , fromListIO+    , toList+    , toListIO+    , index, (!)+    , read+    , write+    , append+    , push+    , pop+    , unshift+    , shift+    , reverse+    , take+    , takeIO+    , drop+    , dropIO+    , slice+    , sliceIO+    , freeze+    , unsafeFreeze+    , thaw+    , unsafeThaw+    ) where++import Prelude hiding (length, drop, read, take, reverse, null)+import Control.Monad (void)+import Language.Javascript.JSaddle.Types+       (JSM, JSVal, SomeJSArray(..), JSArray,+        MutableJSArray, GHCJSPure(..))+import Control.Lens.Operators ((^.))+import Language.Javascript.JSaddle.Object (js2, js0, (<##), js1, js)+import Language.Javascript.JSaddle.Value (valToNumber)+import JavaScript.Array.Internal (create, fromList, fromListIO, toList, toListIO, index, read, push)++length :: SomeJSArray m -> GHCJSPure Int+length = GHCJSPure . lengthIO+{-# INLINE length #-}++lengthIO :: SomeJSArray m -> JSM Int+lengthIO (SomeJSArray x) = round <$> (x ^. js "length" >>= valToNumber)+{-# INLINE lengthIO #-}++null :: SomeJSArray m -> GHCJSPure Bool+null = GHCJSPure . fmap (== 0) . lengthIO+{-# INLINE null #-}++append :: SomeJSArray m -> SomeJSArray m -> JSM (SomeJSArray m1)+append (SomeJSArray x) (SomeJSArray y) = SomeJSArray <$> x ^. js1 "concat" y+{-# INLINE append #-}++write :: Int -> JSVal -> MutableJSArray -> JSM ()+write n e (SomeJSArray x) = void $ (x <## n) e+{-# INLINE write #-}++pop :: MutableJSArray -> JSM JSVal+pop (SomeJSArray x) = x ^. js0 "pop"+{-# INLINE pop #-}++unshift :: JSVal -> MutableJSArray -> JSM ()+unshift e (SomeJSArray x) = void $ x ^. js1 "unshift" e+{-# INLINE unshift #-}++shift :: MutableJSArray -> JSM JSVal+shift (SomeJSArray x) = x ^. js0 "shift"+{-# INLINE shift #-}++reverse :: MutableJSArray -> JSM ()+reverse (SomeJSArray x) = void $ x ^. js0 "reverse"+{-# INLINE reverse #-}++take :: Int -> SomeJSArray m -> GHCJSPure (SomeJSArray m1)+take n = GHCJSPure . takeIO n+{-# INLINE take #-}++takeIO :: Int -> SomeJSArray m -> JSM (SomeJSArray m1)+takeIO n (SomeJSArray x) = SomeJSArray <$> x ^. js2 "slice" (0::Int) n+{-# INLINE takeIO #-}++drop :: Int -> SomeJSArray m -> GHCJSPure (SomeJSArray m1)+drop n = GHCJSPure . dropIO n+{-# INLINE drop #-}++dropIO :: Int -> SomeJSArray m -> JSM (SomeJSArray m1)+dropIO n (SomeJSArray x) = SomeJSArray <$> x ^. js1 "slice1" n+{-# INLINE dropIO #-}++slice :: Int -> Int -> JSArray -> GHCJSPure (SomeJSArray m1)+slice s n = GHCJSPure . sliceIO s n+{-# INLINE slice #-}++sliceIO :: Int -> Int -> JSArray -> JSM (SomeJSArray m1)+sliceIO s n (SomeJSArray x) = SomeJSArray <$> x ^. js2 "slice" s n+{-# INLINE sliceIO #-}++freeze :: MutableJSArray -> JSM JSArray+freeze (SomeJSArray x) = SomeJSArray <$> x ^. js1 "slice" (0::Int)+{-# INLINE freeze #-}++unsafeFreeze :: MutableJSArray -> JSM JSArray+unsafeFreeze (SomeJSArray x) = pure (SomeJSArray x)+{-# INLINE unsafeFreeze #-}++thaw :: JSArray -> JSM MutableJSArray+thaw (SomeJSArray x) = SomeJSArray <$> x ^. js1 "slice" (0::Int)+{-# INLINE thaw #-}++unsafeThaw :: JSArray -> JSM MutableJSArray+unsafeThaw (SomeJSArray x) = pure (SomeJSArray x)+{-# INLINE unsafeThaw #-}++(!) :: JSArray -> Int -> GHCJSPure JSVal+x ! n = GHCJSPure $ read n x+{-# INLINE (!) #-}+
+ src-ghc/JavaScript/Array/Internal.hs view
@@ -0,0 +1,59 @@+{-# LANGUAGE OverloadedStrings #-}+module JavaScript.Array.Internal+    ( SomeJSArray(..)+    , JSArray+    , MutableJSArray+    , STJSArray+    , create+    , fromList+    , fromListIO+    , toList+    , toListIO+    , index+    , read+    , push+    ) where++import Prelude hiding(read)+import Control.Monad (void)+import GHCJS.Types (JSVal)+import Data.JSString.Internal.Type (JSString(..))+import Language.Javascript.JSaddle.Types (JSM, SomeJSArray(..), JSArray, MutableJSArray, STJSArray, Object(..), GHCJSPure(..))+import Language.Javascript.JSaddle.Native.Internal+       (newArray, getPropertyByName, getPropertyAtIndex, callAsFunction, valueToNumber)++create :: JSM MutableJSArray+create = SomeJSArray <$> newArray []+{-# INLINE create #-}++fromList :: [JSVal] -> GHCJSPure (SomeJSArray m)+fromList = GHCJSPure . fromListIO+{-# INLINE fromList #-}++fromListIO :: [JSVal] -> JSM (SomeJSArray m)+fromListIO xs = SomeJSArray <$> newArray xs+{-# INLINE fromListIO #-}++toList :: SomeJSArray m -> GHCJSPure [JSVal]+toList = GHCJSPure . toListIO+{-# INLINE toList #-}++toListIO :: SomeJSArray m -> JSM [JSVal]+toListIO (SomeJSArray x) = do+    len <- getPropertyByName (JSString "length") (Object x) >>= valueToNumber+    mapM (`getPropertyAtIndex` Object x) [0..round len - 1]+{-# INLINE toListIO #-}++index :: Int -> SomeJSArray m -> GHCJSPure JSVal+index n = GHCJSPure . read n+{-# INLINE index #-}++read :: Int -> SomeJSArray m -> JSM JSVal+read n (SomeJSArray x) = getPropertyAtIndex n $ Object x+{-# INLINE read #-}++push :: JSVal -> MutableJSArray -> JSM ()+push e (SomeJSArray x) = void $ do+    f <- getPropertyByName (JSString "push") (Object x)+    void $ callAsFunction (Object f) (Object x) [e]+{-# INLINE push #-}
+ src-ghc/JavaScript/Object.hs view
@@ -0,0 +1,10 @@+module JavaScript.Object ( Object+                         , create+                         , getProp, unsafeGetProp+                         , setProp, unsafeSetProp+                         -- , allProps+                         , listProps+                         -- , isInstanceOf+                         ) where++import JavaScript.Object.Internal
+ src-ghc/JavaScript/Object/Internal.hs view
@@ -0,0 +1,53 @@+module JavaScript.Object.Internal+    ( Object(..)+    , create+--    , allProps+    , listProps+    , getProp+    , unsafeGetProp+    , setProp+    , unsafeSetProp+--    , isInstanceOf+    ) where++import Language.Javascript.JSaddle.Types (JSM, JSVal, Object(..), JSString)+import Language.Javascript.JSaddle.Native.Internal+       (newEmptyObject, propertyNames, getPropertyByName, setPropertyByName)++-- | create an empty object+create :: JSM Object+create = newEmptyObject+{-# INLINE create #-}++--allProps :: Object -> JSM JSArray+--allProps o = js_allProps o+--{-# INLINE allProps #-}++listProps :: Object -> JSM [JSString]+listProps = propertyNames+{-# INLINE listProps #-}++{- | get a property from an object. If accessing the property results in+     an exception, the exception is converted to a JSException. Since exception+     handling code prevents some optimizations in some JS engines, you may want+     to use unsafeGetProp instead+ -}+getProp :: JSString -> Object -> JSM JSVal+getProp = unsafeGetProp+{-# INLINE getProp #-}++unsafeGetProp :: JSString -> Object -> JSM JSVal+unsafeGetProp = getPropertyByName+{-# INLINE unsafeGetProp #-}++setProp :: JSString -> JSVal -> Object -> JSM ()+setProp = unsafeSetProp+{-# INLINE setProp #-}++unsafeSetProp :: JSString -> JSVal -> Object -> JSM ()+unsafeSetProp = setPropertyByName+{-# INLINE unsafeSetProp #-}++--isInstanceOf :: Object -> JSVal -> GHCJSPure Bool+--isInstanceOf o s = js_isInstanceOf o s+--{-# INLINE isInstanceOf #-}
+ src-ghc/JavaScript/TypedArray.hs view
@@ -0,0 +1,19 @@+module JavaScript.TypedArray+    ( TypedArray(..)+    , Int8Array, Int16Array, Int32Array+    , Uint8Array, Uint16Array, Uint32Array+    , Uint8ClampedArray, Float32Array, Float64Array+    , length+    , byteLength+    , byteOffset+    , buffer+    , subarray+    , set+    , unsafeSet+    ) where++import Prelude ()++import JavaScript.TypedArray.Internal+import JavaScript.TypedArray.Internal.Types+
+ src-ghc/JavaScript/TypedArray/ArrayBuffer.hs view
@@ -0,0 +1,51 @@+module JavaScript.TypedArray.ArrayBuffer+    ( ArrayBuffer+    , MutableArrayBuffer+    , freeze, unsafeFreeze+    , thaw, unsafeThaw+    , byteLengthIO+    ) where++import Control.Lens.Operators ((^.))++import GHCJS.Marshal (fromJSValUnchecked)++import Language.Javascript.JSaddle.Types (JSM)+import Language.Javascript.JSaddle.Object (jsg, new, js, js1, js2)+import JavaScript.TypedArray.ArrayBuffer.Internal++create :: Int -> JSM MutableArrayBuffer+create n = SomeArrayBuffer <$> new (jsg "ArrayBuffer") [n]+{-# INLINE create #-}++{- | Create an immutable 'ArrayBuffer' by copying a 'MutableArrayBuffer' -}+freeze :: MutableArrayBuffer -> JSM ArrayBuffer+freeze (SomeArrayBuffer b) = SomeArrayBuffer <$> b ^. js1 "slice" (0 :: Int)+{-# INLINE freeze #-}++{- | Create an immutable 'ArrayBuffer' from a 'MutableArrayBuffer' without+     copying. The result shares the buffer with the argument,  not modify+     the data in the 'MutableArrayBuffer' after freezing+ -}+unsafeFreeze :: MutableArrayBuffer -> JSM ArrayBuffer+unsafeFreeze (SomeArrayBuffer b) = pure (SomeArrayBuffer b)+{-# INLINE unsafeFreeze #-}++{- | Create a 'MutableArrayBuffer' by copying an immutable 'ArrayBuffer' -}+thaw :: ArrayBuffer -> JSM MutableArrayBuffer+thaw (SomeArrayBuffer b) = SomeArrayBuffer <$> b ^. js1 "slice" (0 :: Int)+{-# INLINE thaw #-}++unsafeThaw :: ArrayBuffer -> JSM MutableArrayBuffer+unsafeThaw (SomeArrayBuffer b) = pure (SomeArrayBuffer b)+{-# INLINE unsafeThaw #-}++sliceIO :: Int -> Maybe Int -> SomeArrayBuffer any -> JSM (SomeArrayBuffer any)+sliceIO begin (Just end) (SomeArrayBuffer b) = SomeArrayBuffer <$> b ^. js2 "slice" begin end+sliceIO begin _          (SomeArrayBuffer b) = SomeArrayBuffer <$> b ^. js1 "slice" begin+{-# INLINE sliceIO #-}++byteLengthIO :: SomeArrayBuffer any -> JSM Int+byteLengthIO (SomeArrayBuffer b) = b ^. js "byteLength" >>= fromJSValUnchecked+{-# INLINE byteLengthIO #-}+
+ src-ghc/JavaScript/TypedArray/ArrayBuffer/Internal.hs view
@@ -0,0 +1,33 @@+{-# LANGUAGE GHCForeignImportPrim #-}+{-# LANGUAGE MagicHash #-}+{-# LANGUAGE UnboxedTuples #-}+{-# LANGUAGE MagicHash #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE DeriveDataTypeable #-}++module JavaScript.TypedArray.ArrayBuffer.Internal where++import GHCJS.Types++import GHCJS.Internal.Types+import GHCJS.Marshal.Pure++import GHC.Exts (State#)++import Data.Typeable++newtype SomeArrayBuffer (a :: MutabilityType s) =+  SomeArrayBuffer JSVal deriving Typeable+instance IsJSVal (SomeArrayBuffer m)++type ArrayBuffer           = SomeArrayBuffer Immutable+type MutableArrayBuffer    = SomeArrayBuffer Mutable+type STArrayBuffer s       = SomeArrayBuffer (STMutable s)++instance PToJSVal MutableArrayBuffer where+  pToJSVal (SomeArrayBuffer b) = b+instance PFromJSVal MutableArrayBuffer where+  pFromJSVal = SomeArrayBuffer
+ src-ghc/JavaScript/TypedArray/ArrayBuffer/Type.hs view
@@ -0,0 +1,6 @@+module JavaScript.TypedArray.ArrayBuffer.Type where++import GHCJS.Prim+++
+ src-ghc/JavaScript/TypedArray/DataView/Internal.hs view
@@ -0,0 +1,146 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE ForeignFunctionInterface #-}+{-# LANGUAGE UnliftedFFITypes #-}+{-# LANGUAGE GHCForeignImportPrim #-}+{-# LANGUAGE MagicHash #-}+{-# LANGUAGE UnboxedTuples #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE PolyKinds #-}++module JavaScript.TypedArray.DataView.Internal where++import Data.Int+import Data.Typeable+import Data.Word++import GHC.Exts ( State# )++import GHCJS.Prim+import GHCJS.Internal.Types++import JavaScript.TypedArray.ArrayBuffer.Internal++newtype SomeDataView (a :: MutabilityType s) = SomeDataView JSVal+  deriving Typeable++type DataView        = SomeDataView Immutable+type MutableDataView = SomeDataView Mutable+type STDataView s    = SomeDataView (STMutable s)++-- #define JSU foreign import javascript unsafe+-- #define JSS foreign import javascript safe+--+--JSU "new DataView($1)"+--    js_dataView1 :: JSVal -> JSVal+--JSS "new DataView($2,$1)"+--    js_dataView2 :: Int -> JSVal -> SomeDataView m+--JSU "new DataView($2,$1)"+--    js_unsafeDataView2 :: Int -> JSVal-> SomeDataView m+--JSS "new DataView($3,$1,$2)"+--    js_dataView :: Int -> Int -> JSVal -> SomeDataView m+--JSU "new DataView($3,$1,$2)"+--    js_unsafeDataView :: Int -> Int -> JSVal -> JSVal+--JSU "new DataView($1.buffer.slice($1.byteOffset, $1.byteLength))"+--    js_cloneDataView :: SomeDataView m -> IO (SomeDataView m1)+--+---- ----------------------------------------------------------------------------+---- immutable getters+--+--JSU "$2.getInt8($1)"          js_i_unsafeGetInt8       :: Int -> DataView -> Int8+--JSU "$2.getUint8($1)"         js_i_unsafeGetUint8      :: Int -> DataView -> Word8+--JSU "$2.getInt16($1)"         js_i_unsafeGetInt16BE    :: Int -> DataView -> Int16+--JSU "$2.getInt32($1)"         js_i_unsafeGetInt32BE    :: Int -> DataView -> Int+--JSU "$2.getUint16($1)"        js_i_unsafeGetUint16BE   :: Int -> DataView -> Word16+--JSU "$2.getUint32($1)|0"      js_i_unsafeGetUint32BE   :: Int -> DataView -> Word+--JSU "$2.getFloat32($1)"       js_i_unsafeGetFloat32BE  :: Int -> DataView -> Double+--JSU "$2.getFloat64($1)"       js_i_unsafeGetFloat64BE  :: Int -> DataView -> Double+--JSU "$2.getInt16($1,true)"    js_i_unsafeGetInt16LE    :: Int -> DataView -> Int16+--JSU "$2.getInt32($1,true)"    js_i_unsafeGetInt32LE    :: Int -> DataView -> Int+--JSU "$2.getUint16($1,true)"   js_i_unsafeGetUint16LE   :: Int -> DataView -> Word16+--JSU "$2.getUint32($1,true)|0" js_i_unsafeGetUint32LE   :: Int -> DataView -> Word+--JSU "$2.getFloat32($1,true)"  js_i_unsafeGetFloat32LE  :: Int -> DataView -> Double+--JSU "$2.getFloat64($1,true)"  js_i_unsafeGetFloat64LE  :: Int -> DataView -> Double+--+--JSS "$2.getInt8($1)"          js_i_getInt8       :: Int -> DataView -> Int8+--JSS "$2.getUint8($1)"         js_i_getUint8      :: Int -> DataView -> Word8+--JSS "$2.getInt16($1)"         js_i_getInt16BE    :: Int -> DataView -> Int16+--JSS "$2.getInt32($1)"         js_i_getInt32BE    :: Int -> DataView -> Int+--JSS "$2.getUint16($1)"        js_i_getUint16BE   :: Int -> DataView -> Word16+--JSS "$2.getUint32($1)|0"      js_i_getUint32BE   :: Int -> DataView -> Word+--JSS "$2.getFloat32($1)"       js_i_getFloat32BE  :: Int -> DataView -> Double+--JSS "$2.getFloat64($1)"       js_i_getFloat64BE  :: Int -> DataView -> Double+--JSS "$2.getInt16($1,true)"    js_i_getInt16LE    :: Int -> DataView -> Int16+--JSS "$2.getInt32($1,true)"    js_i_getInt32LE    :: Int -> DataView -> Int+--JSS "$2.getUint16($1,true)"   js_i_getUint16LE   :: Int -> DataView -> Word16+--JSS "$2.getUint32($1,true)|0" js_i_getUint32LE   :: Int -> DataView -> Word+--JSS "$2.getFloat32($1,true)"  js_i_getFloat32LE  :: Int -> DataView -> Double+--JSS "$2.getFloat64($1,true)"  js_i_getFloat64LE  :: Int -> DataView -> Double+--+---- ----------------------------------------------------------------------------+---- mutable getters+--+--JSU "$2.getInt8($1)"          js_m_unsafeGetInt8      :: Int -> SomeDataView m -> State# s -> (# State# s, Int8   #)+--JSU "$2.getUint8($1)"         js_m_unsafeGetUint8     :: Int -> SomeDataView m -> State# s -> (# State# s, Word8  #)+--JSU "$2.getInt16($1)"         js_m_unsafeGetInt16BE   :: Int -> SomeDataView m -> State# s -> (# State# s, Int16  #)+--JSU "$2.getInt32($1)"         js_m_unsafeGetInt32BE   :: Int -> SomeDataView m -> State# s -> (# State# s, Int    #)+--JSU "$2.getUint16($1)"        js_m_unsafeGetUint16BE  :: Int -> SomeDataView m -> State# s -> (# State# s, Word16 #)+--JSU "$2.getUint32($1)|0"      js_m_unsafeGetUint32BE  :: Int -> SomeDataView m -> State# s -> (# State# s, Word   #)+--JSU "$2.getFloat32($1)"       js_m_unsafeGetFloat32BE :: Int -> SomeDataView m -> State# s -> (# State# s, Double #)+--JSU "$2.getFloat64($1)"       js_m_unsafeGetFloat64BE :: Int -> SomeDataView m -> State# s -> (# State# s, Double #)+--JSU "$2.getInt16($1,true)"    js_m_unsafeGetInt16LE   :: Int -> SomeDataView m -> State# s -> (# State# s, Int16  #)+--JSU "$2.getInt32($1,true)"    js_m_unsafeGetInt32LE   :: Int -> SomeDataView m -> State# s -> (# State# s, Int    #)+--JSU "$2.getUint16($1,true)"   js_m_unsafeGetUint16LE  :: Int -> SomeDataView m -> State# s -> (# State# s, Word16 #)+--JSU "$2.getUint32($1,true)|0" js_m_unsafeGetUint32LE  :: Int -> SomeDataView m -> State# s -> (# State# s, Word   #)+--JSU "$2.getFloat32($1,true)"  js_m_unsafeGetFloat32LE :: Int -> SomeDataView m -> State# s -> (# State# s, Double #)+--JSU "$2.getFloat64($1,true)"  js_m_unsafeGetFloat64LE :: Int -> SomeDataView m -> State# s -> (# State# s, Double #)+--+--JSS "$2.getInt8($1)"          js_m_getInt8            :: Int -> SomeDataView m -> State# s -> (# State# s, Int8   #)+--JSS "$2.getUint8($1)"         js_m_getUint8           :: Int -> SomeDataView m -> State# s -> (# State# s, Word8  #)+--JSS "$2.getInt16($1)"         js_m_getInt16BE         :: Int -> SomeDataView m -> State# s -> (# State# s, Int16  #)+--JSS "$2.getInt32($1)"         js_m_getInt32BE         :: Int -> SomeDataView m -> State# s -> (# State# s, Int    #)+--JSS "$2.getUint16($1)"        js_m_getUint16BE        :: Int -> SomeDataView m -> State# s -> (# State# s, Word16 #)+--JSS "$2.getUint32($1)|0"      js_m_getUint32BE        :: Int -> SomeDataView m -> State# s -> (# State# s, Word   #)+--JSS "$2.getFloat32($1)"       js_m_getFloat32BE       :: Int -> SomeDataView m -> State# s -> (# State# s, Double #)+--JSS "$2.getFloat64($1)"       js_m_getFloat64BE       :: Int -> SomeDataView m -> State# s -> (# State# s, Double #)+--JSS "$2.getInt16($1,true)"    js_m_getInt16LE         :: Int -> SomeDataView m -> State# s -> (# State# s, Int16  #)+--JSS "$2.getInt32($1,true)"    js_m_getInt32LE         :: Int -> SomeDataView m -> State# s -> (# State# s, Int    #)+--JSS "$2.getUint16($1,true)"   js_m_getUint16LE        :: Int -> SomeDataView m -> State# s -> (# State# s, Word16 #)+--JSS "$2.getUint32($1,true)|0" js_m_getUint32LE        :: Int -> SomeDataView m -> State# s -> (# State# s, Word   #)+--JSS "$2.getFloat32($1,true)"  js_m_getFloat32LE       :: Int -> SomeDataView m -> State# s -> (# State# s, Double #)+--JSS "$2.getFloat64($1,true)"  js_m_getFloat64LE       :: Int -> SomeDataView m -> State# s -> (# State# s, Double #)+--+---- ----------------------------------------------------------------------------+---- mutable setters+--+--JSU "$3.setInt8($1,$2)"         js_unsafeSetInt8      :: Int -> Int8   -> SomeDataView m -> State# s -> (# State# s, () #)+--JSU "$3.setUint8($1,$2)"        js_unsafeSetUint8     :: Int -> Word8  -> SomeDataView m -> State# s -> (# State# s, () #)+--JSU "$3.setInt16($1,$2)"        js_unsafeSetInt16BE   :: Int -> Int16  -> SomeDataView m -> State# s -> (# State# s, () #)+--JSU "$3.setInt32($1,$2)"        js_unsafeSetInt32BE   :: Int -> Int    -> SomeDataView m -> State# s -> (# State# s, () #)+--JSU "$3.setUint16($1,$2)"       js_unsafeSetUint16BE  :: Int -> Word16 -> SomeDataView m -> State# s -> (# State# s, () #)+--JSU "$3.setUint32($1,$2)"       js_unsafeSetUint32BE  :: Int -> Word   -> SomeDataView m -> State# s -> (# State# s, () #)+--JSU "$3.setFloat32($1,$2)"      js_unsafeSetFloat32BE :: Int -> Double -> SomeDataView m -> State# s -> (# State# s, () #)+--JSU "$3.setFloat64($1,$2)"      js_unsafeSetFloat64BE :: Int -> Double -> SomeDataView m -> State# s -> (# State# s, () #)+--JSU "$3.setInt16($1,$2,true)"   js_unsafeSetInt16LE   :: Int -> Int16  -> SomeDataView m -> State# s -> (# State# s, () #)+--JSU "$3.setInt32($1,$2,true)"   js_unsafeSetInt32LE   :: Int -> Int    -> SomeDataView m -> State# s -> (# State# s, () #)+--JSU "$3.setUint16($1,$2,true)"  js_unsafeSetUint16LE  :: Int -> Word16 -> SomeDataView m -> State# s -> (# State# s, () #)+--JSU "$3.setUint32($1,$2,true)"  js_unsafeSetUint32LE  :: Int -> Word   -> SomeDataView m -> State# s -> (# State# s, () #)+--JSU "$3.setFloat32($1,$2,true)" js_unsafeSetFloat32LE :: Int -> Double -> SomeDataView m -> State# s -> (# State# s, () #)+--JSU "$3.setFloat64($1,$2,true)" js_unsafeSetFloat64LE :: Int -> Double -> SomeDataView m -> State# s -> (# State# s, () #)+--+--JSS "$3.setInt8($1,$2)"         js_setInt8            :: Int -> Int8   -> SomeDataView m -> State# s -> (# State# s, () #)+--JSS "$3.setUint8($1,$2)"        js_setUint8           :: Int -> Word8  -> SomeDataView m -> State# s -> (# State# s, () #)+--JSS "$3.setInt16($1,$2)"        js_setInt16BE         :: Int -> Int16  -> SomeDataView m -> State# s -> (# State# s, () #)+--JSS "$3.setInt32($1,$2)"        js_setInt32BE         :: Int -> Int    -> SomeDataView m -> State# s -> (# State# s, () #)+--JSS "$3.setUint16($1,$2)"       js_setUint16BE        :: Int -> Word16 -> SomeDataView m -> State# s -> (# State# s, () #)+--JSS "$3.setUint32($1,$2)"       js_setUint32BE        :: Int -> Word   -> SomeDataView m -> State# s -> (# State# s, () #)+--JSS "$3.setFloat32($1,$2)"      js_setFloat32BE       :: Int -> Double -> SomeDataView m -> State# s -> (# State# s, () #)+--JSS "$3.setFloat64($1,$2)"      js_setFloat64BE       :: Int -> Double -> SomeDataView m -> State# s -> (# State# s, () #)+--JSS "$3.setInt16($1,$2,true)"   js_setInt16LE         :: Int -> Int16  -> SomeDataView m -> State# s -> (# State# s, () #)+--JSS "$3.setInt32($1,$2,true)"   js_setInt32LE         :: Int -> Int    -> SomeDataView m -> State# s -> (# State# s, () #)+--JSS "$3.setUint16($1,$2,true)"  js_setUint16LE        :: Int -> Word16 -> SomeDataView m -> State# s -> (# State# s, () #)+--JSS "$3.setUint32($1,$2,true)"  js_setUint32LE        :: Int -> Word   -> SomeDataView m -> State# s -> (# State# s, () #)+--JSS "$3.setFloat32($1,$2,true)" js_setFloat32LE       :: Int -> Double -> SomeDataView m -> State# s -> (# State# s, () #)+--JSS "$3.setFloat64($1,$2,true)" js_setFloat64LE       :: Int -> Double -> SomeDataView m -> State# s -> (# State# s, () #)+
+ src-ghc/JavaScript/TypedArray/Immutable.hs view
@@ -0,0 +1,1 @@+module JavaScript.TypedArray.Immutable where
+ src-ghc/JavaScript/TypedArray/Internal.hs view
@@ -0,0 +1,345 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE TypeOperators #-}++module JavaScript.TypedArray.Internal where++import Prelude hiding ((!!))++import GHC.Int+import GHC.Word++import GHCJS.Internal.Types++import Control.Monad (void)+import Control.Lens.Operators ((^.))++import GHCJS.Marshal (fromJSValUnchecked)++import JavaScript.Array.Internal (SomeJSArray(..))+import JavaScript.TypedArray.ArrayBuffer+import JavaScript.TypedArray.ArrayBuffer.Internal (SomeArrayBuffer(..))+import JavaScript.TypedArray.Internal.Types++import Language.Javascript.JSaddle.Types (JSM, GHCJSPure(..))+import Language.Javascript.JSaddle.Object (js, jsg, js1, js2, new, (!!), (<##))++elemSize :: SomeTypedArray e m -> GHCJSPure Int+elemSize (SomeTypedArray a) = GHCJSPure $ a ^. js "BYTES_PER_ELEMENT" >>= fromJSValUnchecked+{-# INLINE [1] elemSize #-}+{-# RULES "elemSizeUint8Clamped" forall (x :: SomeUint8ClampedArray m). elemSize x = GHCJSPure $ return 1 #-}+{-# RULES "elemSizeUint8"        forall (x :: SomeUint8Array m).        elemSize x = GHCJSPure $ return 1 #-}+{-# RULES "elemSizeUint16"       forall (x :: SomeUint16Array m).       elemSize x = GHCJSPure $ return 2 #-}+{-# RULES "elemSizeUint32"       forall (x :: SomeUint32Array m).       elemSize x = GHCJSPure $ return 4 #-}+{-# RULES "elemSizeInt8"         forall (x :: SomeInt8Array m).         elemSize x = GHCJSPure $ return 1 #-}+{-# RULES "elemSizeInt16"        forall (x :: SomeInt16Array m).        elemSize x = GHCJSPure $ return 2 #-}+{-# RULES "elemSizeInt32"        forall (x :: SomeInt32Array m).        elemSize x = GHCJSPure $ return 4 #-}+{-# RULES "elemSizeFloat32"      forall (x :: SomeFloat32Array m).      elemSize x = GHCJSPure $ return 4 #-}+{-# RULES "elemSizeFloat64"      forall (x :: SomeFloat64Array m).      elemSize x = GHCJSPure $ return 8 #-}++instance TypedArray IOInt8Array where+  index              = indexI8+  unsafeIndex        = unsafeIndexI8+  setIndex i x       = setIndexI i (fromIntegral x)+  unsafeSetIndex i x = unsafeSetIndexI i (fromIntegral x)+  indexOf s x        = indexOfI s (fromIntegral x)+  lastIndexOf s x    = lastIndexOfI s (fromIntegral x)+  create l           = SomeTypedArray <$> new (jsg "Int8Array") [l]+  fromArray          = int8ArrayFrom+  fromArrayBuffer    = undefined++instance TypedArray IOInt16Array where+  index              = indexI16+  unsafeIndex        = unsafeIndexI16+  setIndex i x       = setIndexI i (fromIntegral x)+  unsafeSetIndex i x = unsafeSetIndexI i (fromIntegral x)+  indexOf s x        = indexOfI s (fromIntegral x)+  lastIndexOf s x    = lastIndexOfI s (fromIntegral x)+  create l           = SomeTypedArray <$> new (jsg "Int16Array") [l]+  fromArray          = int16ArrayFrom+  fromArrayBuffer    = undefined++instance TypedArray IOInt32Array where+  index           = indexI+  unsafeIndex     = unsafeIndexI+  setIndex        = setIndexI+  unsafeSetIndex  = unsafeSetIndexI+  indexOf         = indexOfI+  lastIndexOf     = lastIndexOfI+  create l        = SomeTypedArray <$> new (jsg "Int32Array") [l]+  fromArray       = int32ArrayFrom+  fromArrayBuffer = undefined++instance TypedArray IOUint8ClampedArray where+  index              = indexW8+  unsafeIndex        = unsafeIndexW8+  setIndex i x       = setIndexW i (fromIntegral x)+  unsafeSetIndex i x = unsafeSetIndexW i (fromIntegral x)+  indexOf s x        = indexOfW s (fromIntegral x)+  lastIndexOf s x    = lastIndexOfW s (fromIntegral x)+  create l           = SomeTypedArray <$> new (jsg "Uint8ClampedArray") [l]+  fromArray          = uint8ClampedArrayFrom+  fromArrayBuffer    = undefined++instance TypedArray IOUint8Array where+  index              = indexW8+  unsafeIndex        = unsafeIndexW8+  setIndex i x       = setIndexW i (fromIntegral x)+  unsafeSetIndex i x = unsafeSetIndexW i (fromIntegral x)+  indexOf s x        = indexOfW s (fromIntegral x)+  lastIndexOf s x    = lastIndexOfW s (fromIntegral x)+  create l           = SomeTypedArray <$> new (jsg "Uint8Array") [l]+  fromArray          = uint8ArrayFrom+  fromArrayBuffer    = undefined++instance TypedArray IOUint16Array where+  index              = indexW16+  unsafeIndex        = unsafeIndexW16+  setIndex i x       = setIndexW i (fromIntegral x)+  unsafeSetIndex i x = unsafeSetIndexW i (fromIntegral x)+  indexOf s x        = indexOfW s (fromIntegral x)+  lastIndexOf s x    = lastIndexOfW s (fromIntegral x)+  create l           = SomeTypedArray <$> new (jsg "Uint16Array") [l]+  fromArray          = uint16ArrayFrom+  fromArrayBuffer    = undefined++instance TypedArray IOUint32Array where+  index           = indexW+  unsafeIndex     = unsafeIndexW+  setIndex        = setIndexW+  unsafeSetIndex  = unsafeSetIndexW+  indexOf         = indexOfW+  lastIndexOf     = lastIndexOfW+  create l        = SomeTypedArray <$> new (jsg "Uint32Array") [l]+  fromArray       = uint32ArrayFrom+  fromArrayBuffer = undefined++instance TypedArray IOFloat32Array where+  index           = indexD+  unsafeIndex     = unsafeIndexD+  setIndex        = setIndexD+  unsafeSetIndex  = unsafeSetIndexD+  indexOf         = indexOfD+  lastIndexOf     = lastIndexOfD+  create l        = SomeTypedArray <$> new (jsg "Float32Array") [l]+  fromArray       = float32ArrayFrom+  fromArrayBuffer = undefined++instance TypedArray IOFloat64Array where+  index           = indexD+  unsafeIndex     = unsafeIndexD+  setIndex        = setIndexD+  unsafeSetIndex  = unsafeSetIndexD+  indexOf         = indexOfD+  lastIndexOf     = lastIndexOfD+  create l        = SomeTypedArray <$> new (jsg "Float64Array") [l]+  fromArray       = float64ArrayFrom+  fromArrayBuffer = undefined+++class TypedArray a where+  unsafeIndex     :: Int           -> a -> JSM (Elem a)+  index           :: Int           -> a -> JSM (Elem a)+  unsafeSetIndex  :: Int -> Elem a -> a -> JSM ()+  setIndex        :: Int -> Elem a -> a -> JSM ()+  create          :: Int                -> JSM a+  fromArray       :: SomeJSArray m      -> JSM a+  fromArrayBuffer :: MutableArrayBuffer -> Int    -> Maybe Int -> JSM a+  indexOf         :: Int                -> Elem a -> a -> JSM Int+  lastIndexOf     :: Int                -> Elem a -> a -> JSM Int++-- -----------------------------------------------------------------------------++indexI :: Int -> SomeTypedArray e m -> JSM Int+indexI i (SomeTypedArray a) = a !! i >>= fromJSValUnchecked+{-# INLINE indexI #-}++indexI16 :: Int -> SomeTypedArray e m -> JSM Int16+indexI16 i (SomeTypedArray a) = a !! i >>= fromJSValUnchecked+{-# INLINE indexI16 #-}++indexI8 :: Int -> SomeTypedArray e m -> JSM Int8+indexI8 i (SomeTypedArray a) = a !! i >>= fromJSValUnchecked+{-# INLINE indexI8 #-}++indexW :: Int -> SomeTypedArray e m -> JSM Word+indexW i (SomeTypedArray a) = a !! i >>= fromJSValUnchecked+{-# INLINE indexW #-}++indexW16 :: Int -> SomeTypedArray e m -> JSM Word16+indexW16 i (SomeTypedArray a) = a !! i >>= fromJSValUnchecked+{-# INLINE indexW16 #-}++indexW8 :: Int -> SomeTypedArray e m -> JSM Word8+indexW8 i (SomeTypedArray a) = a !! i >>= fromJSValUnchecked+{-# INLINE indexW8 #-}++indexD :: Int -> SomeTypedArray e m -> JSM Double+indexD i (SomeTypedArray a) = a !! i >>= fromJSValUnchecked+{-# INLINE indexD #-}++-- -----------------------------------------------------------------------------++unsafeIndexI :: Int -> SomeTypedArray e m -> JSM Int+unsafeIndexI i (SomeTypedArray a) = a !! i >>= fromJSValUnchecked+{-# INLINE unsafeIndexI #-}++unsafeIndexI16 :: Int -> SomeTypedArray e m -> JSM Int16+unsafeIndexI16 i (SomeTypedArray a) = a !! i >>= fromJSValUnchecked+{-# INLINE unsafeIndexI16 #-}++unsafeIndexI8 :: Int -> SomeTypedArray e m -> JSM Int8+unsafeIndexI8 i (SomeTypedArray a) = a !! i >>= fromJSValUnchecked+{-# INLINE unsafeIndexI8 #-}++unsafeIndexW :: Int -> SomeTypedArray e m -> JSM  Word+unsafeIndexW i (SomeTypedArray a) = a !! i >>= fromJSValUnchecked+{-# INLINE unsafeIndexW #-}++unsafeIndexW16 :: Int -> SomeTypedArray e m -> JSM Word16+unsafeIndexW16 i (SomeTypedArray a) = a !! i >>= fromJSValUnchecked+{-# INLINE unsafeIndexW16 #-}++unsafeIndexW8 :: Int -> SomeTypedArray e m -> JSM Word8+unsafeIndexW8 i (SomeTypedArray a) = a !! i >>= fromJSValUnchecked+{-# INLINE unsafeIndexW8 #-}++unsafeIndexD :: Int -> SomeTypedArray e m -> JSM Double+unsafeIndexD i (SomeTypedArray a) = a !! i >>= fromJSValUnchecked+{-# INLINE unsafeIndexD #-}++-- -----------------------------------------------------------------------------++int8ArrayFrom :: SomeJSArray m0 -> JSM (SomeInt8Array m1)+int8ArrayFrom (SomeJSArray a) = SomeTypedArray <$> jsg "Int8Array" ^. js1 "from" a+{-# INLINE int8ArrayFrom #-}++int16ArrayFrom :: SomeJSArray m0 -> JSM (SomeInt16Array m1)+int16ArrayFrom (SomeJSArray a) = SomeTypedArray <$> jsg "Int16Array" ^. js1 "from" a+{-# INLINE int16ArrayFrom #-}++int32ArrayFrom :: SomeJSArray m0 -> JSM (SomeInt32Array m1)+int32ArrayFrom (SomeJSArray a) = SomeTypedArray <$> jsg "Int32Array" ^. js1 "from" a+{-# INLINE int32ArrayFrom #-}++uint8ArrayFrom :: SomeJSArray m0 -> JSM (SomeUint8Array m1)+uint8ArrayFrom (SomeJSArray a) = SomeTypedArray <$> jsg "Uint8Array" ^. js1 "from" a+{-# INLINE uint8ArrayFrom #-}++uint8ClampedArrayFrom :: SomeJSArray m0 -> JSM (SomeUint8ClampedArray m1)+uint8ClampedArrayFrom (SomeJSArray a) = SomeTypedArray <$> jsg "Uint8ClampedArray" ^. js1 "from" a+{-# INLINE uint8ClampedArrayFrom #-}++uint16ArrayFrom :: SomeJSArray m0 -> JSM (SomeUint16Array m1)+uint16ArrayFrom (SomeJSArray a) = SomeTypedArray <$> jsg "Uint16Array" ^. js1 "from" a+{-# INLINE uint16ArrayFrom #-}++uint32ArrayFrom :: SomeJSArray m0 -> JSM (SomeUint32Array m1)+uint32ArrayFrom (SomeJSArray a) = SomeTypedArray <$> jsg "Uint32Array" ^. js1 "from" a+{-# INLINE uint32ArrayFrom #-}++float32ArrayFrom :: SomeJSArray m0 -> JSM (SomeFloat32Array m1)+float32ArrayFrom (SomeJSArray a) = SomeTypedArray <$> jsg "Float32Array" ^. js1 "from" a+{-# INLINE float32ArrayFrom #-}++float64ArrayFrom :: SomeJSArray m0 -> JSM (SomeFloat64Array m1)+float64ArrayFrom (SomeJSArray a) = SomeTypedArray <$> jsg "Float64Array" ^. js1 "from" a+{-# INLINE float64ArrayFrom #-}++-- -----------------------------------------------------------------------------++setIndexI :: Mutability m ~ IsMutable+          => Int -> Int -> SomeTypedArray e m -> JSM ()+setIndexI i x (SomeTypedArray a) = (a <## i) x+{-# INLINE setIndexI #-}++unsafeSetIndexI :: Mutability m ~ IsMutable+                => Int -> Int -> SomeTypedArray e m -> JSM ()+unsafeSetIndexI i x (SomeTypedArray a) = (a <## i) x+{-# INLINE unsafeSetIndexI #-}++setIndexW :: Mutability m ~ IsMutable+           => Int -> Word -> SomeTypedArray e m -> JSM ()+setIndexW i x (SomeTypedArray a) = (a <## i) x+{-# INLINE setIndexW #-}++unsafeSetIndexW :: Mutability m ~ IsMutable+                => Int -> Word -> SomeTypedArray e m -> JSM ()+unsafeSetIndexW i x (SomeTypedArray a) = (a <## i) x+{-# INLINE unsafeSetIndexW #-}++setIndexD :: Mutability m ~ IsMutable+          => Int -> Double -> SomeTypedArray e m -> JSM ()+setIndexD i x (SomeTypedArray a) = (a <## i) x+{-# INLINE setIndexD #-}++unsafeSetIndexD :: Mutability m ~ IsMutable+                => Int -> Double -> SomeTypedArray e m -> JSM ()+unsafeSetIndexD i x (SomeTypedArray a) = (a <## i) x+{-# INLINE unsafeSetIndexD #-}++indexOfI :: Mutability m ~ IsMutable+         => Int -> Int -> SomeTypedArray e m -> JSM Int+indexOfI s x (SomeTypedArray a) = a ^. js2 "indexOf" x s >>= fromJSValUnchecked+{-# INLINE indexOfI #-}++indexOfW :: Int -> Word -> SomeTypedArray e m -> JSM Int+indexOfW s x (SomeTypedArray a) = a ^. js2 "indexOf" x s >>= fromJSValUnchecked+{-# INLINE indexOfW #-}++indexOfD :: Int -> Double -> SomeTypedArray e m -> JSM Int+indexOfD s x (SomeTypedArray a) = a ^. js2 "indexOf" x s >>= fromJSValUnchecked+{-# INLINE indexOfD #-}++lastIndexOfI :: Int -> Int -> SomeTypedArray e m -> JSM Int+lastIndexOfI s x (SomeTypedArray a) = a ^. js2 "lastIndexOf" x s >>= fromJSValUnchecked+{-# INLINE lastIndexOfI #-}++lastIndexOfW :: Int -> Word -> SomeTypedArray e m -> JSM Int+lastIndexOfW s x (SomeTypedArray a) = a ^. js2 "lastIndexOf" x s >>= fromJSValUnchecked+{-# INLINE lastIndexOfW #-}++lastIndexOfD :: Int -> Double -> SomeTypedArray e m -> JSM Int+lastIndexOfD s x (SomeTypedArray a) = a ^. js2 "lastIndexOf" x s >>= fromJSValUnchecked+{-# INLINE lastIndexOfD #-}++-- -----------------------------------------------------------------------------+-- non-class operations usable for all typed array+{-| length of the typed array in elements -}+length :: SomeTypedArray e m -> GHCJSPure Int+length (SomeTypedArray a) = GHCJSPure $ a ^. js "length" >>= fromJSValUnchecked+{-# INLINE length #-}++{-| length of the array in bytes -}+byteLength :: SomeTypedArray e m -> GHCJSPure Int+byteLength (SomeTypedArray a) = GHCJSPure $ a ^. js "byteLength" >>= fromJSValUnchecked+{-# INLINE byteLength #-}++{-| offset of the array in the buffer -}+byteOffset :: SomeTypedArray e m -> GHCJSPure Int+byteOffset (SomeTypedArray a) = GHCJSPure $ a ^. js "byteOffset" >>= fromJSValUnchecked+{-# INLINE byteOffset #-}++{-| the underlying buffer of the array -}+buffer :: SomeTypedArray e m -> GHCJSPure (SomeArrayBuffer m)+buffer (SomeTypedArray a) = GHCJSPure $ SomeArrayBuffer <$> a ^. js "buffer"+{-# INLINE buffer #-}++{-| create a view of the existing array -}+subarray :: Int -> Int -> SomeTypedArray e m -> GHCJSPure (SomeTypedArray e m)+subarray begin end (SomeTypedArray a) = GHCJSPure$ SomeTypedArray <$> a ^. js2 "subarray" begin end+{-# INLINE subarray #-}++-- fixme convert JSException to Haskell exception+{-| copy the elements of one typed array to another -}+set :: Int -> SomeTypedArray e m -> SomeTypedArray e1 Mutable -> GHCJSPure ()+set offset (SomeTypedArray src) (SomeTypedArray dest) = GHCJSPure $ void $ dest ^. js2 "set" offset src+{-# INLINE set #-}++unsafeSet :: Int -> SomeTypedArray e m -> SomeTypedArray e1 Mutable -> GHCJSPure ()+unsafeSet offset (SomeTypedArray src) (SomeTypedArray dest) = GHCJSPure $ void $ dest ^. js2 "set" offset src+{-# INLINE unsafeSet #-}+
+ src-ghc/JavaScript/TypedArray/Internal/Types.hs view
@@ -0,0 +1,121 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE PolyKinds #-}++module JavaScript.TypedArray.Internal.Types where++import GHCJS.Types+import GHCJS.Internal.Types+import Language.Javascript.JSaddle (IsJSVal)++import Data.Int+import Data.Typeable+import Data.Word++newtype SomeTypedArray (e :: TypedArrayElem) (m :: MutabilityType s) =+  SomeTypedArray JSVal deriving Typeable+instance IsJSVal (SomeTypedArray e m)++{-+newtype SomeSTTypedArray s e = SomeSTTypedArray JSVal+  deriving (Typeable)+-}++type SomeSTTypedArray s (e :: TypedArrayElem) = SomeTypedArray e (STMutable s)++-- -----------------------------------------------------------------------------++data TypedArrayElem = Int8Elem+                    | Int16Elem+                    | Int32Elem+                    | Uint8Elem+                    | Uint16Elem+                    | Uint32Elem+                    | Uint8ClampedElem+                    | Float32Elem+                    | Float64Elem++-- -----------------------------------------------------------------------------++type SomeInt8Array         = SomeTypedArray        Int8Elem+type SomeInt16Array        = SomeTypedArray        Int16Elem+type SomeInt32Array        = SomeTypedArray        Int32Elem++type SomeUint8Array        = SomeTypedArray        Uint8Elem+type SomeUint16Array       = SomeTypedArray        Uint16Elem+type SomeUint32Array       = SomeTypedArray        Uint32Elem++type SomeFloat32Array      = SomeTypedArray        Float32Elem+type SomeFloat64Array      = SomeTypedArray        Float64Elem++type SomeUint8ClampedArray = SomeTypedArray        Uint8ClampedElem++-- -----------------------------------------------------------------------------++type Int8Array             = SomeInt8Array         Immutable+type Int16Array            = SomeInt16Array        Immutable+type Int32Array            = SomeInt32Array        Immutable++type Uint8Array            = SomeUint8Array        Immutable+type Uint16Array           = SomeUint16Array       Immutable+type Uint32Array           = SomeUint32Array       Immutable++type Uint8ClampedArray     = SomeUint8ClampedArray Immutable++type Float32Array          = SomeFloat32Array      Immutable+type Float64Array          = SomeFloat64Array      Immutable++-- -----------------------------------------------------------------------------++type IOInt8Array           = SomeInt8Array         Mutable+type IOInt16Array          = SomeInt16Array        Mutable+type IOInt32Array          = SomeInt32Array        Mutable++type IOUint8Array          = SomeUint8Array        Mutable+type IOUint16Array         = SomeUint16Array       Mutable+type IOUint32Array         = SomeUint32Array       Mutable++type IOUint8ClampedArray   = SomeUint8ClampedArray Mutable++type IOFloat32Array        = SomeFloat32Array      Mutable+type IOFloat64Array        = SomeFloat64Array      Mutable++-- -----------------------------------------------------------------------------++type STInt8Array s         = SomeSTTypedArray s Int8Elem+type STInt16Array s        = SomeSTTypedArray s Int16Elem+type STInt32Array s        = SomeSTTypedArray s Int32Elem++type STUint8Array s        = SomeSTTypedArray s Uint8Elem+type STUint16Array s       = SomeSTTypedArray s Uint16Elem+type STUint32Array s       = SomeSTTypedArray s Uint32Elem++type STFloat32Array s      = SomeSTTypedArray s Float32Elem+type STFloat64Array s      = SomeSTTypedArray s Float64Elem++type STUint8ClampedArray s = SomeSTTypedArray s Uint8ClampedElem++-- -----------------------------------------------------------------------------++type family Elem x where+    Elem (SomeUint8Array m)        = Word8+    Elem (SomeUint8ClampedArray m) = Word8+    Elem (SomeUint16Array m)       = Word16+    Elem (SomeUint32Array m)       = Word+    Elem (SomeInt8Array m)         = Int8+    Elem (SomeInt16Array m)        = Int16+    Elem (SomeInt32Array m)        = Int+    Elem (SomeFloat32Array m)      = Double+    Elem (SomeFloat64Array m)      = Double++    Elem (STUint8Array s)          = Word8+    Elem (STUint8ClampedArray s)   = Word8+    Elem (STUint16Array s)         = Word16+    Elem (STUint32Array s)         = Word+    Elem (STInt8Array s)           = Int8+    Elem (STInt16Array s)          = Int16+    Elem (STInt32Array s)          = Int+    Elem (STFloat32Array s)        = Double+    Elem (STFloat64Array s)        = Double+
src/Language/Javascript/JSaddle.hs view
@@ -1,4 +1,3 @@-{-# LANGUAGE CPP #-} ----------------------------------------------------------------------------- -- -- Module      :  Language.Javascript.JSaddle@@ -7,9 +6,10 @@ -- -- Maintainer  :  Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com> ----- | This package provides an EDSL for calling JavaScript code using---   the JavaScriptCore engine and low level Haskell bindings---   in the webkit-javascriptcore library <https://github.com/ghcjs/webkit-javascriptcore>.+-- | This package provides an EDSL for calling JavaScript that+--   can be used both from GHCJS and GHC.  When using GHC+--   the application is run using Warp and WebSockets to+--   drive a small JavaScript helper. -----------------------------------------------------------------------------  module Language.Javascript.JSaddle (@@ -35,29 +35,42 @@   --   --   Where it makes sense code examples are given in two forms.  One   --   that uses 'eval' to run a purely JavaScript version and one that-  --   uses more of the JSaddle EDSL feature being demonstated.+  --   uses more of the JSaddle EDSL feature being demonstrated.    -- * Calling Haskell from JavaScript-  -- | You can call back into haskell from JavaScript using 'fun' to+  -- | You can call back into Haskell from JavaScript using 'fun' to   --   convert a Haskell function in the JSM monad into a javascript   --   value.    -- * GHCJS Support   -- | When built with ghcjs the code works using JavaScript FFI by default.-  --   It can also be built to use webkitgtk3-javascriptcore C FFI as there-  --   are shims for these (but this introduces a dependancy on WebKitGTK+-  --   and is probably not as fast). +  -- * GHC Support+  -- | When built with ghc the code runs a small Warp server that provides+  --   index.html and jsaddle.js files.  When a browser is connected the+  --   code in jsaddle.js will open a WebSockets connection to the server+  --   and the server will run the Haskell code.  The JSaddle parts will+  --   be executed by sending commands back to the browser.++  --   Although the JavaScript code is executed in the strict order+  --   set out by the EDSL it is done asynchronously to the Haskell code.+  --   This improves the performance by reducing the number of round trips+  --   needed between the Haskell and JavaScript code.++  --+   -- * Modules     module JSaddle ) where +import GHCJS.Marshal as JSaddle import Language.Javascript.JSaddle.Types as JSaddle import Language.Javascript.JSaddle.Classes as JSaddle+import Language.Javascript.JSaddle.Marshal.String as JSaddle () import Language.Javascript.JSaddle.Monad as JSaddle import Language.Javascript.JSaddle.Exception as JSaddle import Language.Javascript.JSaddle.Value as JSaddle-import Language.Javascript.JSaddle.Arguments as JSaddle+import Language.Javascript.JSaddle.Arguments as JSaddle () import Language.Javascript.JSaddle.Properties as JSaddle import Language.Javascript.JSaddle.Object as JSaddle import Language.Javascript.JSaddle.Evaluate as JSaddle
src/Language/Javascript/JSaddle/Arguments.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE TypeSynonymInstances #-}+{-# OPTIONS_GHC -fno-warn-orphans #-} ----------------------------------------------------------------------------- -- -- Module      :  Language.Javascript.JSaddle.Arguments@@ -16,18 +17,8 @@     MakeArgs(..) ) where -import Language.Javascript.JSaddle.Classes-       (ToJSVal(..))-import Language.Javascript.JSaddle.Monad (JSM)-import Language.Javascript.JSaddle.Types (JSVal)---- | Anything that can be used to make a list of JavaScript value---   references for use as function arguments-class MakeArgs this where-    makeArgs :: this -> JSM [JSVal]--instance MakeArgs arg => MakeArgs (JSM arg) where-    makeArgs arg = arg >>= makeArgs+import Language.Javascript.JSaddle.Classes (MakeArgs(..))+import GHCJS.Marshal.Internal (ToJSVal(..))  instance ToJSVal arg => MakeArgs [arg] where     makeArgs = mapM toJSVal@@ -61,7 +52,6 @@         rarg4 <- toJSVal arg4         rarg5 <- toJSVal arg5         return [rarg1, rarg2, rarg3, rarg4, rarg5]-  instance (ToJSVal arg1, ToJSVal arg2, ToJSVal arg3, ToJSVal arg4, ToJSVal arg5, ToJSVal arg6) => MakeArgs (arg1, arg2, arg3, arg4, arg5, arg6) where     makeArgs (arg1, arg2, arg3, arg4, arg5, arg6) = do
src/Language/Javascript/JSaddle/Classes.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE TypeSynonymInstances #-} -----------------------------------------------------------------------------@@ -16,30 +17,21 @@  module Language.Javascript.JSaddle.Classes (   -- * Type classes to convert Haskell data to JavaScript-    ToJSVal(..)+    PToJSVal(..)+  , PFromJSVal(..)+  , ToJSVal(..)+  , FromJSVal(..)   , ToJSString(..)+  , FromJSString(..)   , MakeObject(..)+  , MakeArgs(..) ) where -import Language.Javascript.JSaddle.Types-       (JSM, Object(..), JSString, JSVal)---- | Anything that can be used to make a JavaScript value reference-class ToJSVal a where-    toJSVal :: a -> JSM JSVal---- | Anything that can be used to make a JavaScript string reference-class ToJSVal a => ToJSString a where-    toJSString :: a -> JSString---- | Anything that can be used to make a JavaScript object reference-class MakeObject this where-    makeObject :: this -> JSM Object--instance ToJSVal Object where-    toJSVal (Object r) = return r---- | If we already have a Object we are fine-instance MakeObject Object where-    makeObject = return-+#ifdef ghcjs_HOST_OS+import GHCJS.Marshal (ToJSVal(..), FromJSVal(..))+#else+import GHCJS.Marshal.Internal (ToJSVal(..), FromJSVal(..))+#endif+import GHCJS.Marshal.Pure (PToJSVal(..), PFromJSVal(..))+import Language.Javascript.JSaddle.Classes.Internal (MakeObject(..), MakeArgs(..))+import Language.Javascript.JSaddle.Marshal.String (ToJSString(..), FromJSString(..))
+ src/Language/Javascript/JSaddle/Classes/Internal.hs view
@@ -0,0 +1,41 @@+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeSynonymInstances #-}+-----------------------------------------------------------------------------+--+-- Module      :  Language.Javascript.JSaddle.Classes.Internal+-- Copyright   :  (c) Hamish Mackenzie+-- License     :  MIT+--+-- Maintainer  :  Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>+--+-- | These classes are used to make various JavaScript types+--   out of whatever we have.  Functions in jsaddle take these as inputs.+--   This alows implicit casting and eager evaluation.+--+-----------------------------------------------------------------------------++module Language.Javascript.JSaddle.Classes.Internal (+  -- * Type classes to convert Haskell data to JavaScript+    MakeObject(..)+  , MakeArgs(..)+) where++import Language.Javascript.JSaddle.Types+       (JSM, Object(..), JSVal)++-- | Anything that can be used to make a JavaScript object reference+class MakeObject this where+    makeObject :: this -> JSM Object++-- | If we already have a Object we are fine+instance MakeObject Object where+    makeObject = return++-- | Anything that can be used to make a list of JavaScript value+--   references for use as function arguments+class MakeArgs this where+    makeArgs :: this -> JSM [JSVal]++instance MakeArgs arg => MakeArgs (JSM arg) where+    makeArgs arg = arg >>= makeArgs+
+ src/Language/Javascript/JSaddle/Debug.hs view
@@ -0,0 +1,48 @@+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE OverloadedStrings #-}+-----------------------------------------------------------------------------+--+-- Module      :  Language.Javascript.JSaddle.WebSockets+-- Copyright   :  (c) Hamish Mackenzie+-- License     :  MIT+--+-- Maintainer  :  Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>+--+-- |+--+-----------------------------------------------------------------------------++module Language.Javascript.JSaddle.Debug (+    contexts+  , addContext+  , removeContext+  , runOnAll+  , runOnAll_+) where++import Language.Javascript.JSaddle+       (runJSM, askJSM, JSM, JSContextRef(..))+import Data.IORef (readIORef, atomicModifyIORef', newIORef, IORef)+import System.IO.Unsafe (unsafePerformIO)+import Data.Monoid ((<>))+import Control.Monad.IO.Class (MonadIO(..))+import Data.Int (Int64)++contexts :: IORef [JSContextRef]+contexts = unsafePerformIO $ newIORef []+{-# NOINLINE contexts #-}++addContext :: JSM ()+addContext = do+    ctx <- askJSM+    liftIO $ atomicModifyIORef' contexts $ \c -> (c <> [ctx], ())++removeContext :: MonadIO m => Int64 -> m ()+removeContext cid =+    liftIO $ atomicModifyIORef' contexts $ \c -> (filter ((/= cid) . contextId) c, ())++runOnAll :: MonadIO m => JSM a -> m [a]+runOnAll f = liftIO (readIORef contexts) >>= mapM (runJSM f)++runOnAll_ :: MonadIO m => JSM a -> m ()+runOnAll_ f = liftIO (readIORef contexts) >>= mapM_ (runJSM f)
src/Language/Javascript/JSaddle/Evaluate.hs view
@@ -2,6 +2,7 @@ {-# LANGUAGE FlexibleInstances #-} #ifdef ghcjs_HOST_OS {-# LANGUAGE ForeignFunctionInterface, JavaScriptFFI #-}+{-# OPTIONS_GHC -Wno-dodgy-exports -Wno-dodgy-imports #-} #endif ----------------------------------------------------------------------------- --@@ -17,28 +18,18 @@ -----------------------------------------------------------------------------  module Language.Javascript.JSaddle.Evaluate (-    evaluateScript-  , eval+    eval ) where -import Control.Monad.Trans.Reader (ask)-import Control.Monad.IO.Class (MonadIO(..)) import Language.Javascript.JSaddle.Types (JSVal) #ifdef ghcjs_HOST_OS-import GHCJS.Types (nullRef)-import GHCJS.Marshal.Pure (pFromJSVal)+import Control.Monad.IO.Class (MonadIO(..)) import Language.Javascript.JSaddle.Types (JSString) #else-import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase-       (jsevaluatescript)-import Language.Javascript.JSaddle.Native-       (makeNewJSVal, withObject, withJSString)+import Language.Javascript.JSaddle.Native.Internal+       (evaluateScript) #endif-import Language.Javascript.JSaddle.Exception (rethrow)-import Language.Javascript.JSaddle.String (nullJSString)-import Language.Javascript.JSaddle.Object (nullObject)-import Language.Javascript.JSaddle.Classes-       (MakeObject(..), ToJSString(..))+import Language.Javascript.JSaddle.Marshal.String (ToJSString(..)) import Language.Javascript.JSaddle.Monad (JSM)  -- $setup@@ -50,38 +41,22 @@ -- >>> testJSaddle $ return () -- ... --- | Evaluates a script (like eval in java script).  Unlike 'eval' this function lets you---   specify a source URL and starting line number for beter error information.------ >>> testJSaddle $ (evaluateScript "\n\n{" global "FileName" 53 >>= valToText) `catch` \(JSException e) -> array (e,e!"sourceURL", e!"line") >>= valToText--- SyntaxError: ...,FileName,55-evaluateScript :: (ToJSString script, MakeObject this, ToJSString url)-               => script         -- ^ JavaScript to evaluate-               -> this-               -> url-               -> Int            -- ^ The Line number of the first line of the script-               -> JSM JSVal-#ifdef ghcjs_HOST_OS-evaluateScript script this url line = liftIO $ js_eval (toJSString script)-foreign import javascript unsafe "$r = eval($1);"-    js_eval :: JSString -> IO JSVal-#else-evaluateScript script this url line = do-    gctxt <- ask-    rthis <- makeObject this-    result <--        withJSString (toJSString script) $ \script' ->-            withObject rthis $ \this' ->-                withJSString (toJSString url) $ \url' ->-                    rethrow $ liftIO . jsevaluatescript gctxt script' this' url' line-    makeNewJSVal result-#endif- -- | Evaluates a script (like eval in java script) -- -- >>> testJSaddle $ eval "1+1" -- 2-eval :: ToJSString script+eval :: (ToJSString script)      => script         -- ^ JavaScript to evaluate      -> JSM JSVal-eval script = evaluateScript script nullObject nullJSString 1+#ifdef ghcjs_HOST_OS+eval script = liftIO $ js_eval (toJSString script)+foreign import javascript safe+#if __GLASGOW_HASKELL__ >= 900+  "(($1) => { return eval($1); })"+#else+  "$r = eval($1);"+#endif+    js_eval :: JSString -> IO JSVal+#else+eval = evaluateScript . toJSString+#endif
src/Language/Javascript/JSaddle/Exception.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE DeriveDataTypeable #-} ----------------------------------------------------------------------------- --@@ -13,23 +14,30 @@  module Language.Javascript.JSaddle.Exception (     JSException(..)-  , rethrow+--  , rethrow ) where -import qualified Control.Exception as E (throwIO, Exception)-import Language.Javascript.JSaddle.Types-       (MutableJSArray, JSVal)+import qualified Control.Exception as E (Exception)+#ifdef ghcjs_HOST_OS+#if __GLASGOW_HASKELL__ >= 900+import GHC.JS.Prim (JSVal)+#else+import GHCJS.Prim (JSVal)+#endif+#else+import GHCJS.Prim.Internal (JSVal)+#endif import Data.Typeable (Typeable)-import Language.Javascript.JSaddle.Monad (catchval, JSM)-import Control.Monad.IO.Class (MonadIO(..))  newtype JSException = JSException JSVal deriving (Typeable) +-- | JavaScript exception+-- >>> instance Show JSException where show _ = "JSException" instance E.Exception JSException --- | Catch JavaScript exceptions and rethrow Haskell ones-rethrow :: (MutableJSArray -> JSM a) -> JSM a-rethrow f = f `catchval` \e ->-    liftIO . E.throwIO $ JSException e+---- | Catch JavaScript exceptions and rethrow Haskell ones+--rethrow :: (MutableJSArray -> JSM a) -> JSM a+--rethrow f = f `catchval` \e ->+--    liftIO . E.throwIO $ JSException e 
+ src/Language/Javascript/JSaddle/Helper.hs view
@@ -0,0 +1,30 @@+{-# LANGUAGE CPP #-}+module Language.Javascript.JSaddle.Helper where++import GHCJS.Types (JSVal)+import Language.Javascript.JSaddle.Types (JSM)++#ifdef ghcjs_HOST_OS+import GHCJS.Marshal.Pure (pFromJSVal, pToJSVal)+import JavaScript.TypedArray.ArrayBuffer (MutableArrayBuffer)+#else+import JavaScript.TypedArray.ArrayBuffer.Internal (MutableArrayBuffer, SomeArrayBuffer(..))+#endif++-- | Helper function needed because there is no FromJSVal instance for MutableArrayBuffer+mutableArrayBufferFromJSVal :: JSVal -> JSM MutableArrayBuffer+#ifdef ghcjs_HOST_OS+mutableArrayBufferFromJSVal = return . pFromJSVal+#else+mutableArrayBufferFromJSVal = return . SomeArrayBuffer+#endif+{-# INLINE mutableArrayBufferFromJSVal #-}++-- | Helper function needed because there is no ToJSVal instance for MutableArrayBuffer+mutableArrayBufferToJSVal :: MutableArrayBuffer -> JSM JSVal+#ifdef ghcjs_HOST_OS+mutableArrayBufferToJSVal = return . pToJSVal+#else+mutableArrayBufferToJSVal (SomeArrayBuffer v) = return v+#endif+{-# INLINE mutableArrayBufferToJSVal #-}
+ src/Language/Javascript/JSaddle/Marshal/String.hs view
@@ -0,0 +1,32 @@+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeSynonymInstances #-}+-----------------------------------------------------------------------------+--+-- Module      :  Language.Javascript.JSaddle.Marshal.String+-- Copyright   :  (c) Hamish Mackenzie+-- License     :  MIT+--+-- Maintainer  :  Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>+--+-- | `JSStrings` in JSaddle (when compiled with GHC) is not a `JSVal` instead it+--   is implemented with a `Text`.+--+-----------------------------------------------------------------------------++module Language.Javascript.JSaddle.Marshal.String (+  -- * Type class to convert Haskell to JavaScript string+    ToJSString(..)+  , FromJSString(..)+) where++import Language.Javascript.JSaddle.Types (JSString)+import GHCJS.Marshal.Internal (ToJSVal(..), FromJSVal(..))++-- | Anything that can be used to make a JavaScript string+class ToJSVal a => ToJSString a where+    toJSString :: a -> JSString++-- | Anything that can be constructed from a JavaScript string+class FromJSVal a => FromJSString a where+    fromJSString :: JSString -> a+
src/Language/Javascript/JSaddle/Monad.hs view
@@ -1,5 +1,8 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE PatternSynonyms #-}+#ifdef ghcjs_HOST_OS+{-# OPTIONS_GHC -Wno-dodgy-exports -Wno-dodgy-imports #-}+#endif ----------------------------------------------------------------------------- -- -- Module      :  Language.Javascript.JSaddle.Monad@@ -14,138 +17,51 @@  module Language.Javascript.JSaddle.Monad (   -- * Types-    JSM+    JSM(..)   , JSContextRef+  , MonadJSM+  , liftJSM -  -- * Running JSaddle given a DOM Window+  -- * Running JavaScript in a JavaScript context+  , askJSM+  , runJSM   , runJSaddle +  -- * Syncronizing with the JavaScript context+  , syncPoint+  , syncAfter+  , waitForAnimationFrame+  , nextAnimationFrame+   -- * Exception Handling-  , catchval   , catch   , bracket--  -- * GUI thread support-  , postGUIAsyncJS-  , postGUISyncJS ) where -import Prelude hiding (catch, read)-import Control.Monad.Trans.Reader (runReaderT, ask, ReaderT(..))-import Language.Javascript.JSaddle.Types-       (JSM, JSVal, MutableJSArray, JSContextRef)-import Control.Monad.IO.Class (MonadIO(..))-#ifdef ghcjs_HOST_OS-import GHCJS.Types (isUndefined, isNull)-import qualified JavaScript.Array as Array (create, read)-#else-import Language.Javascript.JSaddle.Native (makeNewJSVal)-import Foreign (nullPtr, alloca)-import Foreign.Storable (Storable(..))-import GI.WebKit.Objects.WebView-       (WebView(..), webViewGetMainFrame)-import GI.WebKit.Objects.WebFrame-       (webFrameGetGlobalContext)-import GI.GLib (idleAdd)-import GI.GLib.Constants(pattern PRIORITY_DEFAULT)-import Foreign.Ptr (castPtr)-import GI.JavaScriptCore.Structs.GlobalContext (GlobalContext(..))-import Foreign.ForeignPtr (withForeignPtr)-#endif-import qualified Control.Exception as E (Exception, catch, bracket)-import Control.Concurrent.MVar (takeMVar, putMVar, newEmptyMVar)- #ifndef ghcjs_HOST_OS--- | Post an action to be run in the main GUI thread.------ The current thread blocks until the action completes and the result is--- returned.----postGUISync :: IO a -> IO a-postGUISync action = do-  resultVar <- newEmptyMVar-  idleAdd PRIORITY_DEFAULT $ action >>= putMVar resultVar >> return False-  takeMVar resultVar---- | Post an action to be run in the main GUI thread.------ The current thread continues and does not wait for the result of the--- action.----postGUIAsync :: IO () -> IO ()-postGUIAsync action = do-  idleAdd PRIORITY_DEFAULT $ action >> return False-  return ()-#endif---- | Wrapped version of 'E.catch' that runs in a MonadIO that works---   a bit better with 'JSM'-catch :: (MonadIO m, E.Exception e)-      => ReaderT r IO b-      -> (e -> ReaderT r IO b)-      -> ReaderT r m b-t `catch` c = do-    r <- ask-    liftIO (runReaderT t r `E.catch` \e -> runReaderT (c e) r)---- | Wrapped version of 'E.bracket' that runs in a MonadIO that works---   a bit better with 'JSM'-bracket :: MonadIO m => ReaderT r IO a -> (a -> ReaderT r IO b) -> (a -> ReaderT r IO c) -> ReaderT r m c-bracket aquire release f = do-    r <- ask-    liftIO $ E.bracket-        (runReaderT aquire r)-        (\x -> runReaderT (release x) r)-        (\x -> runReaderT (f x) r)---- | Handle JavaScriptCore functions that take a MutableJSArray in order---   to throw exceptions.-catchval :: (MutableJSArray -> JSM a) -> (JSVal -> JSM a) -> JSM a-catchval f catcher = do-#ifdef ghcjs_HOST_OS-    pexc   <- liftIO Array.create-    result <- f pexc-    exc    <- liftIO $ Array.read 0 pexc-    if isUndefined exc || isNull exc-        then return result-        else catcher exc-#else-    gctxt <- ask-    liftIO . alloca $ \pexc -> flip runReaderT gctxt $ do-        liftIO $ poke pexc nullPtr-        result <- f pexc-        exc <- liftIO $ peek pexc-        if exc == nullPtr-            then return result-            else makeNewJSVal exc >>= catcher-#endif--#ifdef ghcjs_HOST_OS-runJSaddle :: MonadIO m => w -> JSM a -> m a-runJSaddle _ f = liftIO $ runReaderT f ()-#else-runJSaddle :: MonadIO m => WebView -> JSM a -> m a-runJSaddle webView f = liftIO $ do-    GlobalContext gctxt <- webViewGetMainFrame webView >>= webFrameGetGlobalContext-    withForeignPtr gctxt $ \ptr ->-        runReaderT f (castPtr ptr)+import Control.Monad.Trans.Reader (runReaderT, ask) #endif+import Control.Monad.IO.Class (MonadIO(..))+import Control.Monad.Catch (catch, bracket)+import Language.Javascript.JSaddle.Types (JSM(..), MonadJSM, liftJSM, JSContextRef)+import Language.Javascript.JSaddle.Run (syncPoint, syncAfter, waitForAnimationFrame, nextAnimationFrame) -postGUIAsyncJS :: JSM () -> JSM ()+-- | Gets the JavaScript context from the monad+askJSM :: MonadJSM m => m JSContextRef #ifdef ghcjs_HOST_OS-postGUIAsyncJS = id+askJSM = return () #else-postGUIAsyncJS f = do-    r <- ask-    liftIO . postGUIAsync $ runReaderT f r+askJSM = liftJSM $ JSM ask #endif -postGUISyncJS :: JSM a -> JSM a+-- | Runs a 'JSM' JavaScript function in a given JavaScript context.+runJSM :: MonadIO m => JSM a -> JSContextRef -> m a #ifdef ghcjs_HOST_OS-postGUISyncJS = id+runJSM f = liftIO . const f #else-postGUISyncJS f = do-    r <- ask-    liftIO . postGUISync $ runReaderT f r+runJSM f = liftIO . runReaderT (unJSM f) #endif +-- | Alternative version of 'runJSM'+runJSaddle :: MonadIO m => JSContextRef -> JSM a -> m a+runJSaddle = flip runJSM
src/Language/Javascript/JSaddle/Native.hs view
@@ -1,4 +1,3 @@-{-# LANGUAGE CPP #-} ----------------------------------------------------------------------------- -- -- Module      :  Language.Javascript.JSaddle.Native@@ -12,90 +11,17 @@ -----------------------------------------------------------------------------  module Language.Javascript.JSaddle.Native (-#if !defined(ghcjs_HOST_OS)-    makeNewJSVal-  , makeNewJSString-  , wrapJSString-  , withJSVal-  , withJSVals-  , withObject-  , withJSString+    module Language.Javascript.JSaddle.Native.Internal   , withToJSVal-#endif ) where -#if !defined(ghcjs_HOST_OS)-import Control.Monad.Trans.Reader (ask)-import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase-       (JSObjectRef, OpaqueJSString, JSStringRef, OpaqueJSContext,-        OpaqueJSValue, JSValueRef)-import Foreign.ForeignPtr-       (newForeignPtr_, touchForeignPtr, FinalizerPtr, newForeignPtr,-        FinalizerEnvPtr, newForeignPtrEnv, ForeignPtr)-import Control.Monad.IO.Class (MonadIO, MonadIO(..))-import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef-       (jsvalueprotect)-import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSStringRef-       (jsstringretain)+import GHCJS.Marshal.Internal (ToJSVal(..)) import Language.Javascript.JSaddle.Types-       (JSM, JSString, Object(..), JSVal)-import Foreign.ForeignPtr.Unsafe (unsafeForeignPtrToPtr)-import Language.Javascript.JSaddle.Classes (ToJSVal(..), ToJSVal)-import Foreign.Ptr (nullPtr)--makeNewJSVal :: JSValueRef -> JSM (ForeignPtr OpaqueJSValue)-makeNewJSVal val = do-    ctx <- ask-    liftIO $ do-        jsvalueprotect ctx val-        newForeignPtrEnv jsValueUnprotect ctx val--foreign import ccall unsafe "&JSValueUnprotect"-  jsValueUnprotect :: FinalizerEnvPtr OpaqueJSContext OpaqueJSValue--makeNewJSString :: MonadIO m => JSStringRef -> m (ForeignPtr OpaqueJSString)-makeNewJSString s | s == nullPtr =-    liftIO $ newForeignPtr_ s-makeNewJSString s =-    liftIO $ do-        s' <- jsstringretain s-        newForeignPtr jsStringRelease s'--wrapJSString :: MonadIO m => JSStringRef -> m (ForeignPtr OpaqueJSString)-wrapJSString s | s == nullPtr =-    liftIO $ newForeignPtr_ s-wrapJSString s = liftIO $ newForeignPtr jsStringRelease s--foreign import ccall unsafe "&JSStringRelease"-  jsStringRelease :: FinalizerPtr OpaqueJSString--withJSVal :: MonadIO m => JSVal -> (JSValueRef -> m a) -> m a-withJSVal v f =- do result <- f (unsafeForeignPtrToPtr v)-    liftIO $ touchForeignPtr v-    return result--withJSVals :: MonadIO m => [JSVal] -> ([JSValueRef] -> m a) -> m a-withJSVals v f =- do result <- f (map unsafeForeignPtrToPtr v)-    liftIO $ mapM_ touchForeignPtr v-    return result--withObject :: MonadIO m => Object -> (JSObjectRef -> m a) -> m a-withObject (Object o) f = do-    result <- f (unsafeForeignPtrToPtr o)-    liftIO $ touchForeignPtr o-    return result--withJSString :: MonadIO m => JSString -> (JSStringRef -> m a) -> m a-withJSString v f =- do result <- f (unsafeForeignPtrToPtr v)-    liftIO $ touchForeignPtr v-    return result+       (JSM(..), JSValueForSend(..))+import Language.Javascript.JSaddle.Native.Internal -withToJSVal :: ToJSVal val => val -> (JSValueRef -> JSM a) -> JSM a+withToJSVal :: ToJSVal val => val -> (JSValueForSend -> JSM a) -> JSM a withToJSVal val f = do     v <- toJSVal val     withJSVal v f-#endif 
+ src/Language/Javascript/JSaddle/Native/Internal.hs view
@@ -0,0 +1,253 @@+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE MagicHash #-}+{-# LANGUAGE UnboxedTuples #-}+-----------------------------------------------------------------------------+--+-- Module      :  Language.Javascript.JSaddle.Native+-- Copyright   :  (c) Hamish Mackenzie+-- License     :  MIT+--+-- Maintainer  :  Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>+--+-- |+--+-----------------------------------------------------------------------------++module Language.Javascript.JSaddle.Native.Internal (+    wrapJSVal+  , wrapJSString+  , withJSVal+  , withJSVals+  , withObject+  , withJSString+  , setPropertyByName+  , setPropertyAtIndex+  , stringToValue+  , numberToValue+  , jsonValueToValue+  , getPropertyByName+  , getPropertyAtIndex+  , callAsFunction+  , callAsConstructor+  , newEmptyObject+  , newAsyncCallback+  , newSyncCallback+  , newArray+  , evaluateScript+  , deRefVal+  , valueToBool+  , valueToNumber+  , valueToString+  , valueToJSON+  , valueToJSONValue+  , isNull+  , isUndefined+  , strictEqual+  , instanceOf+  , propertyNames+) where++import Control.Monad.IO.Class (MonadIO(..))++import Data.Aeson (Value)++import Language.Javascript.JSaddle.Types+       (AsyncCommand(..), JSM(..), JSString(..), addCallback,+        Object(..), JSVal(..), JSValueForSend(..), JSCallAsFunction,+        JSStringReceived(..), JSStringForSend(..), JSObjectForSend(..))+import Language.Javascript.JSaddle.Monad (askJSM)+import Language.Javascript.JSaddle.Run+       (Command(..), Result(..), sendCommand,+        sendAsyncCommand, sendLazyCommand, wrapJSVal)+import GHC.IORef (IORef(..), readIORef)+import GHC.STRef (STRef(..))+import GHC.IO (IO(..))+import GHC.Base (touch#)++wrapJSString :: MonadIO m => JSStringReceived -> m JSString+wrapJSString (JSStringReceived ref) = return $ JSString ref++touchIORef :: IORef a -> IO ()+touchIORef (IORef (STRef r#)) = IO $ \s -> case touch# r# s of s' -> (# s', () #)++withJSVal :: MonadIO m => JSVal -> (JSValueForSend -> m a) -> m a+withJSVal (JSVal ref) f = do+    result <- (f . JSValueForSend) =<< liftIO (readIORef ref)+    liftIO $ touchIORef ref+    return result++withJSVals :: MonadIO m => [JSVal] -> ([JSValueForSend] -> m a) -> m a+withJSVals v f =+ do result <- f =<< mapM (\(JSVal ref) -> liftIO $ JSValueForSend <$> readIORef ref) v+    liftIO $ mapM_ (\(JSVal ref) -> touchIORef ref) v+    return result++withObject :: MonadIO m => Object -> (JSObjectForSend -> m a) -> m a+withObject (Object o) f = withJSVal o (f . JSObjectForSend)++withJSString :: MonadIO m => JSString -> (JSStringForSend -> m a) -> m a+withJSString (JSString ref) f = f (JSStringForSend ref)++setPropertyByName :: JSString -> JSVal -> Object -> JSM ()+setPropertyByName name val this =+    withObject this $ \rthis ->+        withJSString name $ \rname ->+            withJSVal val $ \rval ->+                sendAsyncCommand $ SetPropertyByName rthis rname rval+{-# INLINE setPropertyByName #-}++setPropertyAtIndex :: Int -> JSVal -> Object -> JSM ()+setPropertyAtIndex index val this =+    withObject this $ \rthis ->+        withJSVal val $ \rval ->+            sendAsyncCommand $ SetPropertyAtIndex rthis index rval+{-# INLINE setPropertyAtIndex #-}++stringToValue :: JSString -> JSM JSVal+stringToValue s = withJSString s $ sendLazyCommand . StringToValue+{-# INLINE stringToValue #-}++numberToValue :: Double -> JSM JSVal+numberToValue = sendLazyCommand . NumberToValue+{-# INLINE numberToValue #-}++jsonValueToValue :: Value -> JSM JSVal+jsonValueToValue = sendLazyCommand . JSONValueToValue+{-# INLINE jsonValueToValue #-}++getPropertyByName :: JSString -> Object -> JSM JSVal+getPropertyByName name this =+    withObject this $ \rthis ->+        withJSString name $ sendLazyCommand . GetPropertyByName rthis+{-# INLINE getPropertyByName #-}++getPropertyAtIndex :: Int -> Object -> JSM JSVal+getPropertyAtIndex index this =+    withObject this $ \rthis -> sendLazyCommand $ GetPropertyAtIndex rthis index+{-# INLINE getPropertyAtIndex #-}++callAsFunction :: Object -> Object -> [JSVal] -> JSM JSVal+callAsFunction f this args =+    withObject f $ \rfunction ->+        withObject this $ \rthis ->+            withJSVals args $ sendLazyCommand . CallAsFunction rfunction rthis+{-# INLINE callAsFunction #-}++callAsConstructor :: Object -> [JSVal] -> JSM JSVal+callAsConstructor f args =+    withObject f $ \rfunction ->+        withJSVals args $ sendLazyCommand . CallAsConstructor rfunction+{-# INLINE callAsConstructor #-}++newEmptyObject :: JSM Object+newEmptyObject = Object <$> sendLazyCommand NewEmptyObject+{-# INLINE newEmptyObject #-}++newAsyncCallback :: JSCallAsFunction -> JSM Object+newAsyncCallback f = do+    object <- Object <$> sendLazyCommand NewAsyncCallback+    add <- addCallback <$> askJSM+    liftIO $ add object f+    return object+{-# INLINE newAsyncCallback #-}++newSyncCallback :: JSCallAsFunction -> JSM Object+newSyncCallback f = do+    object <- Object <$> sendLazyCommand NewSyncCallback+    add <- addCallback <$> askJSM+    liftIO $ add object f+    return object+{-# INLINE newSyncCallback #-}++newArray :: [JSVal] -> JSM JSVal+newArray xs = withJSVals xs $ \xs' -> sendLazyCommand (NewArray xs')+{-# INLINE newArray #-}++evaluateScript :: JSString -> JSM JSVal+evaluateScript script = withJSString script $ sendLazyCommand . EvaluateScript+{-# INLINE evaluateScript #-}++deRefVal :: JSVal -> JSM Result+deRefVal value = withJSVal value $ sendCommand . DeRefVal+{-# INLINE deRefVal #-}++valueToBool :: JSVal -> JSM Bool+valueToBool v@(JSVal ref) = liftIO (readIORef ref) >>= \case+    0 -> return False -- null+    1 -> return False -- undefined+    2 -> return False -- false+    3 -> return True  -- true+    _ -> withJSVal v $ \rval -> do+        (ValueToBoolResult result) <- sendCommand (ValueToBool rval)+        return result+{-# INLINE valueToBool #-}++valueToNumber :: JSVal -> JSM Double+valueToNumber value =+    withJSVal value $ \rval -> do+        (ValueToNumberResult result) <- sendCommand (ValueToNumber rval)+        return result+{-# INLINE valueToNumber #-}++valueToString :: JSVal -> JSM JSString+valueToString value = withJSVal value $ \rval -> do+    (ValueToStringResult result) <- sendCommand (ValueToString rval)+    wrapJSString result+{-# INLINE valueToString #-}++valueToJSON :: JSVal -> JSM JSString+valueToJSON value = withJSVal value $ \rval -> do+    (ValueToJSONResult result) <- sendCommand (ValueToJSON rval)+    wrapJSString result+{-# INLINE valueToJSON #-}++valueToJSONValue :: JSVal -> JSM Value+valueToJSONValue value = withJSVal value $ \rval -> do+    (ValueToJSONValueResult result) <- sendCommand (ValueToJSONValue rval)+    return result+{-# INLINE valueToJSONValue #-}++isNull :: JSVal -> JSM Bool+isNull v@(JSVal ref) = liftIO (readIORef ref) >>= \case+    0 -> return True  -- null+    1 -> return False -- undefined+    2 -> return False -- false+    3 -> return False -- true+    _ -> withJSVal v $ \rval -> do+        (IsNullResult result) <- sendCommand $ IsNull rval+        return result+{-# INLINE isNull #-}++isUndefined :: JSVal -> JSM Bool+isUndefined v@(JSVal ref) = liftIO (readIORef ref) >>= \case+    0 -> return False -- null+    1 -> return True  -- undefined+    2 -> return False -- false+    3 -> return False -- true+    _ -> withJSVal v $ \rval -> do+        (IsUndefinedResult result) <- sendCommand $ IsUndefined rval+        return result+{-# INLINE isUndefined #-}++strictEqual :: JSVal -> JSVal -> JSM Bool+strictEqual a b =+    withJSVal a $ \aref ->+        withJSVal b $ \bref -> do+            (StrictEqualResult result) <- sendCommand $ StrictEqual aref bref+            return result+{-# INLINE strictEqual #-}++instanceOf :: JSVal -> Object -> JSM Bool+instanceOf value constructor =+    withJSVal value $ \rval ->+        withObject constructor $ \c' -> do+            (InstanceOfResult result) <- sendCommand $ InstanceOf rval c'+            return result+{-# INLINE instanceOf #-}++propertyNames :: Object -> JSM [JSString]+propertyNames this =+    withObject this $ \rthis -> do+        (PropertyNamesResult result) <- sendCommand $ PropertyNames rthis+        mapM wrapJSString result+{-# INLINE propertyNames #-}
+ src/Language/Javascript/JSaddle/Null.hs view
@@ -0,0 +1,56 @@+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE OverloadedStrings #-}+-----------------------------------------------------------------------------+--+-- Module      :  Language.Javascript.JSaddle.WebSockets+-- Copyright   :  (c) Hamish Mackenzie+-- License     :  MIT+--+-- Maintainer  :  Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>+--+-- |+--+-----------------------------------------------------------------------------++module Language.Javascript.JSaddle.Null (+    run+) where++import Language.Javascript.JSaddle.Types+       (BatchResults(..), JSM, JSStringReceived(..), Batch(..),+        Results(..), Result(..), Command(..))+import Control.Concurrent.Chan (readChan, writeChan, newChan)+import Language.Javascript.JSaddle.Run (runJavaScript)+import Control.Concurrent (forkIO)+import Control.Monad (forever)+import Data.Aeson (Value(..))+import Data.Maybe (mapMaybe)++-- | This is for performance testing JSaddle code that does not need to+-- to read anything back from the JavaScript context.+-- Anthing that does try to read will get JS null, 0 or "" back (depending+-- on how the value is read).+run :: JSM () -> IO ()+run f = do+    batches <- newChan+    (processResult, _processSyncResult, start) <- runJavaScript (writeChan batches) f+    _ <- forkIO $ forever $+        readChan batches >>= \case+            Batch commands _ batchNumber ->+                processResult $ BatchResults batchNumber . Success [] $ mapMaybe (\case+                        Left _ -> Nothing+                        Right command -> Just $+                            case command of+                                DeRefVal _ -> DeRefValResult 0 ""+                                ValueToBool _ -> ValueToBoolResult False+                                ValueToNumber _ -> ValueToNumberResult 0+                                ValueToString _ -> ValueToStringResult (JSStringReceived "")+                                ValueToJSON _ -> ValueToJSONResult (JSStringReceived "null")+                                ValueToJSONValue _ -> ValueToJSONValueResult Null+                                IsNull _ -> IsNullResult True+                                IsUndefined _ -> IsUndefinedResult False+                                StrictEqual _ _ -> StrictEqualResult False+                                InstanceOf _ _ -> InstanceOfResult False+                                PropertyNames _ -> PropertyNamesResult []+                                Sync -> SyncResult) commands+    start
src/Language/Javascript/JSaddle/Object.hs view
@@ -6,6 +6,7 @@ #ifdef ghcjs_HOST_OS {-# LANGUAGE ForeignFunctionInterface #-} {-# LANGUAGE JavaScriptFFI #-}+{-# OPTIONS_GHC -Wno-dodgy-exports -Wno-dodgy-imports #-} #endif {-# OPTIONS_GHC -fno-warn-orphans #-} -----------------------------------------------------------------------------@@ -21,7 +22,7 @@ -----------------------------------------------------------------------------  module Language.Javascript.JSaddle.Object (-    Object+    Object(..)   , MakeObject(..)    -- * Property lookup@@ -56,10 +57,16 @@   , new   , call   , obj+  , create+  , getProp+  , unsafeGetProp+  , setProp+  , unsafeSetProp    -- * Calling Haskell From JavaScript   , Function(..)   , function+  , asyncFunction   , freeFunction   , fun   , JSCallAsFunction@@ -74,12 +81,14 @@   --   and pass it to the continuation.    -- * Arrays+  , fromListIO   , array    -- * Global Object   , global    -- * Enumerating Properties+  , listProps   , propertyNames   , properties @@ -89,69 +98,57 @@   , nullObject ) where -import Control.Applicative import Prelude hiding ((!!))-import Language.Javascript.JSaddle.Types-       (JSPropertyNameArray, JSString, Object(..), MutableJSArray,-        JSVal, Index)-import Foreign.C.Types (CSize(..), CULong(..), CUInt(..), CULLong(..))+import Data.Coerce (coerce) #ifdef ghcjs_HOST_OS-import GHCJS.Types (nullRef, jsval)+import GHCJS.Types (nullRef)+#if __GLASGOW_HASKELL__ >= 900+import GHC.JS.Foreign.Callback+#else import GHCJS.Foreign.Callback-       (releaseCallback, syncCallback2, OnBlocked(..), Callback)-import GHCJS.Marshal.Pure (pFromJSVal)-import JavaScript.Array (JSArray)+#endif+       (releaseCallback, syncCallback2, asyncCallback2, OnBlocked(..), Callback)+import GHCJS.Marshal (ToJSVal(..))+import JavaScript.Array (MutableJSArray) import qualified JavaScript.Array as Array (toListIO, fromListIO) import JavaScript.Array.Internal (SomeJSArray(..))-import qualified JavaScript.Object as Object (create)-import Control.Monad (liftM)-import Data.Coerce (coerce)+import JavaScript.Object (create, listProps)+import Language.Javascript.JSaddle.Monad (JSM)+import Language.Javascript.JSaddle.Types+       (JSString, Object(..),+        JSVal(..), JSCallAsFunction) #else-import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef-       (jsobjectmake, jspropertynamearraygetnameatindex,-        jspropertynamearraygetcount, jsobjectcopypropertynames,-        jsobjectcallasconstructor, jsobjectmakearray,-        jsobjectcallasfunction,-        JSObjectCallAsFunctionCallback, mkJSObjectCallAsFunctionCallback,-        jsobjectmakefunctionwithcallback)-import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef-       (jsvaluemakeundefined)-import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSContextRef-       (jscontextgetglobalobject)-import Foreign (peekArray, nullPtr, withArrayLen)-import Foreign.Ptr (freeHaskellFunPtr)+import GHCJS.Marshal.Internal (ToJSVal(..)) import Language.Javascript.JSaddle.Native-       (makeNewJSString, makeNewJSVal, wrapJSString, withJSVals,-        withObject, withJSString, withToJSVal)-import System.IO.Unsafe (unsafePerformIO)-import Foreign.ForeignPtr (newForeignPtr_)+       (newAsyncCallback, newSyncCallback, callAsFunction, callAsConstructor)+import Language.Javascript.JSaddle.Monad (askJSM, JSM)+import Language.Javascript.JSaddle.Types+       (JSValueForSend(..), AsyncCommand(..), JSString, Object(..),+        SomeJSArray(..), JSVal(..), JSCallAsFunction, JSContextRef(..))+import JavaScript.Object.Internal (create, listProps)+import Language.Javascript.JSaddle.Run (sendAsyncCommand) #endif-import Language.Javascript.JSaddle.Exception (rethrow)-import Language.Javascript.JSaddle.Value-       (JSUndefined, valToObject)-import Language.Javascript.JSaddle.Classes-       (ToJSVal(..), ToJSString(..), MakeObject(..))+import JavaScript.Array.Internal (fromListIO)+import Language.Javascript.JSaddle.Value (valToObject)+import Language.Javascript.JSaddle.Classes (MakeObject(..))+import Language.Javascript.JSaddle.Marshal.String (ToJSString(..)) import Language.Javascript.JSaddle.Arguments (MakeArgs(..))-import Language.Javascript.JSaddle.Monad-       (JSM)-import Control.Monad.Trans.Reader (runReaderT, ask) import Control.Monad.IO.Class (MonadIO(..))-import qualified Control.Exception as E (catch)-import Control.Exception (SomeException)-import Foreign.Storable (Storable(..)) import Language.Javascript.JSaddle.Properties import Control.Lens (IndexPreservingGetter, to)-import Language.Javascript.JSaddle.String (nullJSString)-import Data.Text (Text)+import Data.IORef (newIORef, readIORef)+import System.IO.Unsafe (unsafePerformIO)  -- $setup+-- >>> import Control.Concurrent.MVar (newEmptyMVar, takeMVar, putMVar) -- >>> import Language.Javascript.JSaddle.Test (testJSaddle) -- >>> import Language.Javascript.JSaddle.Evaluate (eval)--- >>> import Language.Javascript.JSaddle.Value (val, valToText, JSNull(..))+-- >>> import Language.Javascript.JSaddle.Value (val, valToText, JSNull(..), deRefVal)+-- >>> import Language.Javascript.JSaddle.String (strToText) -- >>> import Control.Lens.Operators ((^.)) -- >>> import qualified Data.Text as T (unpack) --- | Object can be made by evaluating a fnction in 'JSM' as long+-- | Object can be made by evaluating a function in 'JSM' as long --   as it returns something we can make into a Object. instance MakeObject v => MakeObject (JSM v) where     makeObject v = v >>= makeObject@@ -168,9 +165,7 @@     -> JSM JSVal -- ^ Property reference this ! name = do     rthis <- makeObject this-    rethrow $ objGetPropertyByName rthis rname-  where-    rname = toJSString name+    objGetPropertyByName rthis name  -- | Lookup a property based on its index. --@@ -179,12 +174,12 @@ -- >>> testJSaddle $ val "Hello World" !! 6 -- W (!!) :: (MakeObject this)-     => this           -- ^ Object to look on-     -> Index          -- ^ Index of the property to lookup+     => this      -- ^ Object to look on+     -> Int       -- ^ Index of the property to lookup      -> JSM JSVal -- ^ Property reference this !! index = do     rthis <- makeObject this-    rethrow $ objGetPropertyAtIndex rthis index+    objGetPropertyAtIndex rthis index  -- | Makes a getter for a particular property name. --@@ -197,7 +192,7 @@ js :: (MakeObject s, ToJSString name)    => name          -- ^ Name of the property to find    -> IndexPreservingGetter s (JSM JSVal)-js name = to (!name)+js name = to (! name)  -- | Makes a setter for a particular property name. --@@ -206,7 +201,7 @@ -- >>> testJSaddle $ eval "'Hello World'.length = 12" -- 12 -- >>> testJSaddle $ val "Hello World" ^. jss "length" 12--- 12+-- undefined jss :: (ToJSString name, ToJSVal val)    => name          -- ^ Name of the property to find    -> val@@ -268,12 +263,8 @@ -- | Handy way to get and hold onto a reference top level javascript -- -- >>> testJSaddle $ eval "w = console; w.log('Hello World')"--- ** Message: console message:  @1: Hello World--- <BLANKLINE> -- undefined -- >>> testJSaddle $ do w <- jsg "console"; w ^. js1 "log" "Hello World"--- ** Message: console message:...@0: Hello World--- <BLANKLINE> -- undefined jsg :: ToJSString a => a -> JSM JSVal jsg name = global ! name@@ -293,8 +284,9 @@ -- -- > jsg0 name = jsgf name () ----- >>> testJSaddle $ jsg0 "globalFunc"--- TypeError:...undefined...is not an objec...+-- >>> testJSaddle $ jsg0 "globalFunc" >>= valToText+-- A JavaScript exception was thrown! (may not reach Haskell code)+-- TypeError:...undefine... jsg0 :: (ToJSString name) => name -> JSM JSVal jsg0 name = jsgf name () @@ -339,9 +331,9 @@     => this -> name -> args -> JSM JSVal (#) this name args = do     rthis <- makeObject this-    f <- rethrow $ objGetPropertyByName rthis name+    f <- objGetPropertyByName rthis name     f' <- valToObject f-    rethrow $ objCallAsFunction f' rthis args+    objCallAsFunction f' rthis args  -- | Call a JavaScript function --@@ -351,12 +343,12 @@ -- 5 infixr 2 ## (##) :: (MakeObject this, MakeArgs args)-    => this -> Index -> args -> JSM JSVal+    => this -> Int -> args -> JSM JSVal (##) this index args = do     rthis <- makeObject this-    f <- rethrow $ objGetPropertyAtIndex rthis index+    f <- objGetPropertyAtIndex rthis index     f' <- valToObject f-    rethrow $ objCallAsFunction f' rthis args+    objCallAsFunction f' rthis args  -- | Set a JavaScript property --@@ -372,7 +364,7 @@      -> JSM () (<#) this name val = do     rthis <- makeObject this-    rethrow $ objSetPropertyByName rthis name val 0+    objSetPropertyByName rthis name val  -- | Set a JavaScript property --@@ -382,13 +374,13 @@ -- 1 infixr 1 <## (<##) :: (MakeObject this, ToJSVal val)-     => this           -- ^ Object to set the property on-     -> Index          -- ^ Index of the property to set-     -> val            -- ^ Value to set it to+     => this   -- ^ Object to set the property on+     -> Int    -- ^ Index of the property to set+     -> val    -- ^ Value to set it to      -> JSM () (<##) this index val = do     rthis <- makeObject this-    rethrow $ objSetPropertyAtIndex rthis index val+    objSetPropertyAtIndex rthis index val  -- | Use this to create a new JavaScript object --@@ -403,7 +395,7 @@     -> JSM JSVal new constructor args = do     f <- makeObject constructor-    rethrow $ objCallAsConstructor f args+    objCallAsConstructor f args  -- | Call function with a given @this@.  In most cases you should use '#'. --@@ -416,7 +408,7 @@ call f this args = do     rfunction <- makeObject f     rthis     <- makeObject this-    rethrow $ objCallAsFunction rfunction rthis args+    objCallAsFunction rfunction rthis args  -- | Make an empty object using the default constuctor --@@ -425,119 +417,109 @@ -- >>> testJSaddle $ do { a <- obj; (a <# "x") "Hello"; a ^. js "x" } -- Hello obj :: JSM Object-#ifdef ghcjs_HOST_OS-obj = liftIO Object.create-#else-obj = do-    gctxt <- ask-    Object <$> (liftIO (jsobjectmake gctxt nullPtr nullPtr) >>= makeNewJSVal)-#endif---- | Type used for Haskell functions called from JavaScript.-type JSCallAsFunction = JSVal      -- ^ Function object-                     -> JSVal      -- ^ this-                     -> [JSVal]    -- ^ Function arguments-                     -> JSM JSUndefined -- ^ Only 'JSUndefined' can be returned because-                                        --   the function may need to be executed in a-                                        --   different thread.  If you need to get a-                                        --   value out pass in a continuation function-                                        --   as an argument and invoke it from haskell.+obj = create  -- | Short hand @::JSCallAsFunction@ so a haskell function can be passed to --   a to a JavaScipt one. -- -- >>> testJSaddle $ eval "(function(f) {f('Hello');})(function (a) {console.log(a)})"--- ** Message: console message:  @1: Hello--- <BLANKLINE> -- undefined--- >>> testJSaddle $ call (eval "(function(f) {f('Hello');})") global [fun $ \ _ _ args -> valToText (head args) >>= (liftIO . putStrLn . T.unpack) ]+-- >>> :{+--  testJSaddle $ do+--    result <- liftIO newEmptyMVar+--    deRefVal $ call (eval "(function(f) {f('Hello');})") global [fun $ \ _ _ [arg1] -> do+--         valToText arg1 >>= (liftIO . putMVar result)+--         ]+--    liftIO $ takeMVar result+-- :} -- Hello--- undefined fun :: JSCallAsFunction -> JSCallAsFunction fun = id  #ifdef ghcjs_HOST_OS-type HaskellCallback = Callback (JSVal -> JSVal -> IO ())+data Function = Function {functionCallback :: Callback (JSVal -> JSVal -> IO ()), functionObject :: Object} #else-type HaskellCallback = JSObjectCallAsFunctionCallback+newtype Function = Function {functionObject :: Object} #endif -data Function = Function {functionCallback :: HaskellCallback, functionObject :: Object} --- ^ Make a JavaScript function object that wraps a Haskell function.-function :: ToJSString name-         => name             -- ^ Name of the function-         -> JSCallAsFunction -- ^ Haskell function to call-         -> JSM Function       -- ^ Returns a JavaScript function object that will+#ifdef ghcjs_HOST_OS+-- Do not replace `function ()` with `=>` as `arguments` will not work+foreign import javascript unsafe+#if __GLASGOW_HASKELL__ >= 900+  "(($1) => { return function () { $1(this, arguments); }; })"+#else+  "$r = function () { $1(this, arguments); }"+#endif+    makeFunctionWithCallback :: Callback (JSVal -> JSVal -> IO ()) -> IO Object+#endif++-- | Make a JavaScript function object that wraps a Haskell function.+-- Calls made to the function will be synchronous where possible+-- (on GHCJS it uses on `syncCallback2` with `ContinueAsync`).+function :: JSCallAsFunction -- ^ Haskell function to call+         -> JSM Function     -- ^ Returns a JavaScript function object that will                              --   call the Haskell one when it is called #ifdef ghcjs_HOST_OS-function name f = liftIO $ do+function f = do     callback <- syncCallback2 ContinueAsync $ \this args -> do         rargs <- Array.toListIO (coerce args)-        runReaderT (f this this rargs) () -- TODO pass function object through-    Function callback <$> makeFunctionWithCallback (toJSString name) callback-foreign import javascript unsafe "$r = function () { $2(this, arguments); }"-    makeFunctionWithCallback :: JSString -> Callback (JSVal -> JSVal -> IO ()) -> IO Object+        f this this rargs -- TODO pass function object through+    Function callback <$> makeFunctionWithCallback callback #else-function name f = do-    gctxt <- ask-    callback <- liftIO $ mkJSObjectCallAsFunctionCallback (wrap gctxt)-    withJSString (toJSString name) $ \name' ->-        Function callback . Object <$>-            (liftIO (jsobjectmakefunctionwithcallback gctxt name' callback) >>= makeNewJSVal)-  where-    wrap gctxt _ctx fobj' this' argc argv exception = do-            args' <- peekArray (fromIntegral argc) argv-            (`runReaderT` gctxt) $ do-                fobj <- makeNewJSVal fobj'-                this <- makeNewJSVal this'-                args <- mapM makeNewJSVal args'-                f fobj this args-                liftIO $ jsvaluemakeundefined gctxt-      `E.catch` \(e :: SomeException) ->-            (`runReaderT` gctxt) $ do-                withToJSVal (show e) $ liftIO . poke exception-                liftIO $ jsvaluemakeundefined gctxt+function f = do+    object <- newSyncCallback f+    return $ Function object #endif -freeFunction :: MonadIO m => Function -> m ()-freeFunction (Function callback _) = liftIO $+-- | Make a JavaScript function object that wraps a Haskell function.+-- Calls made to the function will be asynchronous.+asyncFunction :: JSCallAsFunction -- ^ Haskell function to call+              -> JSM Function     -- ^ Returns a JavaScript function object that will+                                  --   call the Haskell one when it is called #ifdef ghcjs_HOST_OS+asyncFunction f = do+    callback <- asyncCallback2 $ \this args -> do+        rargs <- Array.toListIO (coerce args)+        f this this rargs -- TODO pass function object through+    Function callback <$> makeFunctionWithCallback callback+#else+asyncFunction f = do+    object <- newAsyncCallback f+    return $ Function object+#endif++freeFunction :: Function -> JSM ()+#ifdef ghcjs_HOST_OS+freeFunction (Function callback _) = liftIO $     releaseCallback callback #else-    freeHaskellFunPtr callback+freeFunction (Function (Object (JSVal objectRef))) = do+    -- By now the callback should ideally have been removed from whatever+    -- events it was added to.+    -- In case a call to the callback is still pending (perhaps just being sent+    -- on the JS side) we use FreeCallback to queue the callback to be freed when+    -- the next batch of results comes back fro JS.+    -- We are not using withJSVal to keep JS value "alive" because FreeCallback+    -- does not use the it.+    n <- liftIO $ readIORef objectRef+    sendAsyncCommand (FreeCallback (JSValueForSend n)) #endif  instance ToJSVal Function where-    toJSVal (Function _ f) = toJSVal f+    toJSVal = toJSVal . functionObject  -- | A callback to Haskell can be used as a JavaScript value.  This will create --   an anonymous JavaScript function object.  Use 'function' to create one with --   a name. instance ToJSVal JSCallAsFunction where-    toJSVal f = functionObject <$> function nullJSString f >>= toJSVal+    toJSVal f = functionObject <$> function f >>= toJSVal  instance MakeArgs JSCallAsFunction where     makeArgs f = do-        rarg <- functionObject <$> function nullJSString f >>= toJSVal+        rarg <- functionObject <$> function f >>= toJSVal         return [rarg] -makeArray :: MakeArgs args => args -> MutableJSArray -> JSM Object-#ifdef ghcjs_HOST_OS-makeArray args exceptions = do-    rargs <- makeArgs args-    liftIO $ Object . jsval <$> Array.fromListIO rargs-#else-makeArray args exceptions = do-    gctxt <- ask-    rargs <- makeArgs args-    result <--        withJSVals rargs $ \rargs' ->-            liftIO $ withArrayLen rargs' $ \ len ptr ->-                jsobjectmakearray gctxt (fromIntegral len) ptr exceptions-    Object <$> makeNewJSVal result-#endif- -- | Make an JavaScript array from a list of values -- -- >>> testJSaddle $ eval "['Hello', 'World'][1]"@@ -549,82 +531,31 @@ -- >>> testJSaddle $ array ("Hello", JSNull, (), True, 1.0::Double) -- Hello,,,true,1 array :: MakeArgs args => args -> JSM Object-array = rethrow . makeArray---- Make an array out of various lists-instance ToJSVal [JSVal] where-    toJSVal = toJSVal . array--instance ToJSVal [JSM JSVal] where-    toJSVal = toJSVal . array--instance ToJSVal [Double] where-    toJSVal = toJSVal . array--instance ToJSVal [Float] where-    toJSVal = toJSVal . array--instance ToJSVal [Int] where-    toJSVal = toJSVal . array--instance ToJSVal [JSString] where-    toJSVal = toJSVal . array--instance ToJSVal [String] where-    toJSVal = toJSVal . array--instance ToJSVal [Text] where-    toJSVal = toJSVal . array--instance ToJSVal [Bool] where-    toJSVal = toJSVal . array+array args = do+    rargs <- makeArgs args+    Object . coerce <$> fromListIO rargs  -- | JavaScript's global object-global :: JSM Object #ifdef ghcjs_HOST_OS-global = liftIO js_window-foreign import javascript unsafe "$r = window"-    js_window :: IO Object+foreign import javascript unsafe+#if __GLASGOW_HASKELL__ >= 900+  "(() => { return globalThis; })" #else-global = do-    gctxt <- ask-    result <- liftIO $ jscontextgetglobalobject gctxt-    Object <$> makeNewJSVal result+  "$r = globalThis" #endif---- | Get an array containing the property names present on a given object-#if !defined(ghcjs_HOST_OS)-copyPropertyNames :: MakeObject this => this -> JSM JSPropertyNameArray-copyPropertyNames this = do-    gctxt <- ask-    this' <- makeObject this-    withObject this' $ \rthis ->-        liftIO $ jsobjectcopypropertynames gctxt rthis---- | Get the number of names in a property name array-propertyNamesCount :: MonadIO m => JSPropertyNameArray -> m CSize-propertyNamesCount names = liftIO $ jspropertynamearraygetcount names---- | Get a name out of a property name array-propertyNamesAt :: MonadIO m => JSPropertyNameArray -> CSize -> m JSString-propertyNamesAt names index = liftIO $ jspropertynamearraygetnameatindex names index >>= makeNewJSString---- | Convert property array to a list-propertyNamesList :: MonadIO m => JSPropertyNameArray -> m [JSString]-propertyNamesList names = do-    count <- propertyNamesCount names-    mapM (propertyNamesAt names) $ enumFromTo 0 (count - 1)+    global :: Object+#else+global :: Object+global = Object . JSVal . unsafePerformIO $ newIORef 4 #endif  -- | Get a list containing the property names present on a given object+-- >>> testJSaddle $ show . map strToText <$> propertyNames obj+-- []+-- >>> testJSaddle $ show . map strToText <$> propertyNames (eval "({x:1, y:2})")+-- ["x","y"] propertyNames :: MakeObject this => this -> JSM [JSString]-#ifdef ghcjs_HOST_OS-propertyNames this = makeObject this >>= liftIO . js_propertyNames >>= liftIO . (fmap (map pFromJSVal)) . Array.toListIO-foreign import javascript unsafe "$r = []; h$forIn($1, function(n){$r.push(n);})"-    js_propertyNames :: Object -> IO JSArray-#else-propertyNames this = copyPropertyNames this >>= propertyNamesList-#endif+propertyNames this = makeObject this >>= listProps  -- | Get a list containing references to all the  properties present on a given object properties :: MakeObject this => this -> JSM [JSVal]@@ -635,25 +566,22 @@                   => Object                   -> Object                   -> args-                  -> MutableJSArray                   -> JSM JSVal #ifdef ghcjs_HOST_OS-objCallAsFunction f this args exceptions = do+objCallAsFunction f this args = do     rargs <- makeArgs args >>= liftIO . Array.fromListIO-    liftIO $ js_apply f this rargs exceptions-foreign import javascript unsafe "try { $r = $1.apply($2, $3) } catch(e) { $4[0] = e }"-    js_apply :: Object -> Object -> MutableJSArray -> MutableJSArray -> IO JSVal+    liftIO $ js_apply f this rargs+foreign import javascript safe+#if __GLASGOW_HASKELL__ >= 900+  "(($1,$2,$3) => { return $1.apply($2, $3); })" #else-objCallAsFunction f this args exceptions = do-    gctxt <- ask+  "$r = $1.apply($2, $3)"+#endif+    js_apply :: Object -> Object -> MutableJSArray -> IO JSVal+#else+objCallAsFunction f this args = do     rargs <- makeArgs args-    result <--        withObject f $ \rfunction ->-            withObject this $ \rthis ->-                withJSVals rargs $ \rargs' ->-                    liftIO $ withArrayLen rargs' $ \ largs pargs ->-                        jsobjectcallasfunction gctxt rfunction rthis (fromIntegral largs) pargs exceptions-    makeNewJSVal result+    callAsFunction f this rargs #endif  -- | Call a JavaScript object as a constructor. Consider using 'new'.@@ -663,15 +591,39 @@ objCallAsConstructor :: MakeArgs args                      => Object                      -> args-                     -> MutableJSArray                      -> JSM JSVal #ifdef ghcjs_HOST_OS-objCallAsConstructor f args exceptions = do+objCallAsConstructor f args = do     rargs <- makeArgs args >>= liftIO . Array.fromListIO-    liftIO $ js_new f rargs exceptions-foreign import javascript unsafe "\-    try {\+    liftIO $ js_new f rargs+foreign import javascript safe+#if __GLASGOW_HASKELL__ >= 900+  "(($1,$2) => {\         switch($2.length) {\+            case 0 : return new $1();\+            case 1 : return new $1($2[0]);\+            case 2 : return new $1($2[0],$2[1]);\+            case 3 : return new $1($2[0],$2[1],$2[2]);\+            case 4 : return new $1($2[0],$2[1],$2[2],$2[3]);\+            case 5 : return new $1($2[0],$2[1],$2[2],$2[3],$2[4]);\+            case 6 : return new $1($2[0],$2[1],$2[2],$2[3],$2[4],$2[5]);\+            case 7 : return new $1($2[0],$2[1],$2[2],$2[3],$2[4],$2[5],$2[6]);\+            default:\+                var temp = function() {\+                    ret = $1.apply(this, $2);\+                };\+                temp.prototype = $1.prototype;\+                var i = new temp();\+                if(ret instanceof Object) {\+                    return ret;\+                } else {\+                    i.constructor = $1;\+                    return i;\+                }\+        }\+  })"+#else+       "switch($2.length) {\             case 0 : $r = new $1(); break;\             case 1 : $r = new $1($2[0]); break;\             case 2 : $r = new $1($2[0],$2[1]); break;\@@ -681,37 +633,31 @@             case 6 : $r = new $1($2[0],$2[1],$2[2],$2[3],$2[4],$2[5]); break;\             case 7 : $r = new $1($2[0],$2[1],$2[2],$2[3],$2[4],$2[5],$2[6]); break;\             default:\-                var ret;\                 var temp = function() {\                     ret = $1.apply(this, $2);\                 };\                 temp.prototype = $1.prototype;\                 var i = new temp();\-                if(ret instanceof Object)\-                    return ret;\-                i.constructor = $1;\-                return i;\-        }\-    }\-    catch(e) {\-        $3[0] = e;\-    }"-    js_new :: Object -> MutableJSArray -> MutableJSArray -> IO JSVal+                if(ret instanceof Object) {\+                    $r = ret;\+                } else {\+                    i.constructor = $1;\+                    $r = i;\+                }\+        }"+#endif+    js_new :: Object -> MutableJSArray -> IO JSVal #else-objCallAsConstructor f args exceptions = do-    gctxt <- ask+objCallAsConstructor f args = do     rargs <- makeArgs args-    result <--        withObject f $ \rfunction ->-            withJSVals rargs $ \rargs' ->-                liftIO $ withArrayLen rargs' $ \ largs pargs ->-                    jsobjectcallasconstructor gctxt rfunction (fromIntegral largs) pargs exceptions-    makeNewJSVal result+    callAsConstructor f rargs #endif +-- >>> testJSaddle $ strictEqual nullObject (eval "null")+-- true nullObject :: Object #ifdef ghcjs_HOST_OS nullObject = Object nullRef #else-nullObject = Object . unsafePerformIO $ newForeignPtr_ nullPtr+nullObject = Object . JSVal . unsafePerformIO $ newIORef 0 #endif
src/Language/Javascript/JSaddle/Properties.hs view
@@ -22,109 +22,87 @@  module Language.Javascript.JSaddle.Properties (   -- * Getting Property Values-    objGetPropertyByName+    getProp, unsafeGetProp+  , objGetPropertyByName   , objGetPropertyAtIndex   -- * Setting Property Values+  , setProp, unsafeSetProp   , objSetPropertyByName   , objSetPropertyAtIndex ) where -import Language.Javascript.JSaddle.Classes-       (ToJSVal(..), ToJSString(..)) import Language.Javascript.JSaddle.Monad (JSM)-import Language.Javascript.JSaddle.Types-       (MutableJSArray, Object(..), JSPropertyAttributes,-        Index)+import Language.Javascript.JSaddle.Types (JSVal, Object(..))+import JavaScript.Object.Internal (getProp, unsafeGetProp, setProp, unsafeSetProp) #ifdef ghcjs_HOST_OS-import Language.Javascript.JSaddle.Types (JSString)+import GHCJS.Marshal (ToJSVal(..)) #else-import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef-       (jsobjectgetpropertyatindex, jsobjectgetproperty,-        jsobjectsetpropertyatindex, jsobjectsetproperty)+import GHCJS.Marshal.Internal (ToJSVal(..)) import Language.Javascript.JSaddle.Native-       (makeNewJSVal, withObject, withJSString, withToJSVal)+       (withObject, withToJSVal)+import Language.Javascript.JSaddle.Run+       (AsyncCommand(..), sendLazyCommand, sendAsyncCommand) #endif-import Control.Monad.Trans.Reader (ask)-import Control.Monad.IO.Class (MonadIO(..))-import Language.Javascript.JSaddle.Value (JSVal) import Language.Javascript.JSaddle.Arguments () import Language.Javascript.JSaddle.String ()+import Language.Javascript.JSaddle.Marshal.String (ToJSString(..))  -- | Get a property value given the object and the name of the property. objGetPropertyByName :: ToJSString name                      => Object         -- ^ object to find the property on.                      -> name           -- ^ name of the property.-                     -> MutableJSArray -- ^ exception if one is raised.                      -> JSM JSVal      -- ^ returns the property value.-#ifdef ghcjs_HOST_OS-objGetPropertyByName this name = liftIO . js_tryGetProp (toJSString name) this-foreign import javascript unsafe "try { $r=$2[$1] } catch(e) { $3[0] = e }"-    js_tryGetProp :: JSString -> Object -> MutableJSArray -> IO JSVal-#else-objGetPropertyByName this name exceptions = do-    gctxt <- ask-    withObject this $ \rthis ->-        withJSString (toJSString name) $ \name' ->-            (liftIO $ jsobjectgetproperty gctxt rthis name' exceptions) >>= makeNewJSVal-#endif+objGetPropertyByName this name = unsafeGetProp (toJSString name) this  -- | Get a property value given the object and the index of the property.-objGetPropertyAtIndex :: Object         -- ^ object to find the property on.-                      -> Index          -- ^ index of the property.-                      -> MutableJSArray -- ^ exception if one is raised.-                      -> JSM JSVal      -- ^ returns the property value.+objGetPropertyAtIndex :: Object    -- ^ object to find the property on.+                      -> Int       -- ^ index of the property.+                      -> JSM JSVal -- ^ returns the property value. #ifdef ghcjs_HOST_OS-objGetPropertyAtIndex this index = liftIO . js_tryIndex index this-foreign import javascript unsafe "try { $r=$2[$1] } catch(e) { $3[0] = e }"-    js_tryIndex :: Index -> Object -> MutableJSArray -> IO JSVal+objGetPropertyAtIndex this index = js_tryIndex index this+foreign import javascript unsafe+#if __GLASGOW_HASKELL__ >= 900+  "(($1,$2) => { return $2[$1]; })" #else-objGetPropertyAtIndex this index exceptions = do-    gctxt <- ask-    withObject this $ \rthis ->-        (liftIO $ jsobjectgetpropertyatindex gctxt rthis index exceptions) >>= makeNewJSVal+  "$r=$2[$1]" #endif+    js_tryIndex :: Int -> Object -> IO JSVal+#else+objGetPropertyAtIndex this index =+    withObject this $ \rthis -> sendLazyCommand $ GetPropertyAtIndex rthis index+#endif  -- | Set a property value given the object and the name of the property. objSetPropertyByName :: (ToJSString name, ToJSVal val)                      => Object               -- ^ object to set the property on.                      -> name                 -- ^ name of the property.                      -> val                  -- ^ new value to set the property to.-                     -> JSPropertyAttributes -- ^ property attributes to give the property.-                     -> MutableJSArray       -- ^ exception if one is raised.                      -> JSM ()-#ifdef ghcjs_HOST_OS-objSetPropertyByName this name val attributes exceptions = do+objSetPropertyByName this name val = do     vref <- toJSVal val-    liftIO $ js_trySetProp (toJSString name) this vref exceptions-foreign import javascript unsafe "try { $2[$1]=$3 } catch(e) { $4[0] = e }"-    js_trySetProp :: JSString -> Object -> JSVal -> MutableJSArray -> IO ()-#else-objSetPropertyByName this name val attributes exceptions = do-    gctxt <- ask-    withObject this $ \rthis ->-        withJSString (toJSString name) $ \name' ->-        withToJSVal val $ \rval ->-            liftIO $ jsobjectsetproperty gctxt rthis name' rval attributes exceptions-#endif+    unsafeSetProp (toJSString name) vref this  -- | Set a property value given the object and the index of the property. objSetPropertyAtIndex :: (ToJSVal val)                       => Object         -- ^ object to find property on.-                      -> Index          -- ^ index of the property.+                      -> Int          -- ^ index of the property.                       -> val            -- ^ new value to set the property to.-                      -> MutableJSArray -- ^ exception if one is raised.                       -> JSM () #ifdef ghcjs_HOST_OS-objSetPropertyAtIndex this index val exceptions = do+objSetPropertyAtIndex this index val = do     vref <- toJSVal val-    liftIO $ js_trySetAtIndex index this vref exceptions-foreign import javascript unsafe "try { $2[$1]=$3 } catch(e) { $4[0] = e }"-    js_trySetAtIndex :: Index -> Object -> JSVal -> MutableJSArray -> IO ()+    js_trySetAtIndex index this vref+foreign import javascript unsafe+#if __GLASGOW_HASKELL__ >= 900+  "(($1,$2,$3) => { return $2[$1]=$3; })" #else-objSetPropertyAtIndex this index val exceptions = do-    gctxt <- ask+  "$2[$1]=$3"+#endif+    js_trySetAtIndex :: Int -> Object -> JSVal -> IO ()+#else+objSetPropertyAtIndex this index val =     withObject this $ \rthis ->         withToJSVal val $ \rval ->-            liftIO $ jsobjectsetpropertyatindex gctxt rthis index rval exceptions+            sendAsyncCommand $ SetPropertyAtIndex rthis index rval #endif 
+ src/Language/Javascript/JSaddle/Run.hs view
@@ -0,0 +1,312 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE MagicHash #-}+{-# LANGUAGE UnboxedTuples #-}+-----------------------------------------------------------------------------+--+-- Module      :  Language.Javascript.JSaddle.Run+-- Copyright   :  (c) Hamish Mackenzie+-- License     :  MIT+--+-- Maintainer  :  Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>+--+-- |+--+-----------------------------------------------------------------------------++module Language.Javascript.JSaddle.Run (+  -- * Running JSM+    syncPoint+  , syncAfter+  , waitForAnimationFrame+  , nextAnimationFrame+  , enableLogging+#ifndef ghcjs_HOST_OS+  -- * Functions used to implement JSaddle using JSON messaging+  , runJavaScript+  , AsyncCommand(..)+  , Command(..)+  , Result(..)+  , sendCommand+  , sendLazyCommand+  , sendAsyncCommand+  , wrapJSVal+#endif+) where++import Prelude ()+import Prelude.Compat++#ifdef ghcjs_HOST_OS+import Language.Javascript.JSaddle.Types (JSM, syncPoint, syncAfter)+import qualified JavaScript.Web.AnimationFrame as GHCJS+       (waitForAnimationFrame)+#else+import Control.Exception (throwIO, evaluate)+import Control.Monad (void, when, zipWithM_)+import Control.Monad.IO.Class (MonadIO(..))+import Control.Monad.Trans.Reader (ask, runReaderT)+import Control.Monad.STM (atomically)+import Control.Concurrent (forkIO, myThreadId)+import Control.Concurrent.STM.TChan+       (tryReadTChan, TChan, readTChan, writeTChan, newTChanIO)+import Control.Concurrent.STM.TVar+       (writeTVar, readTVar, readTVarIO, modifyTVar', newTVarIO)+import Control.Concurrent.MVar+       (tryTakeMVar, MVar, putMVar, takeMVar, newMVar, newEmptyMVar, readMVar, modifyMVar)++import System.IO.Unsafe (unsafeInterleaveIO)+import System.Random++import GHC.Base (IO(..), mkWeak#)+import GHC.Conc (ThreadId(..))+import qualified Data.Text as T (unpack, pack)+import qualified Data.Map as M (lookup, delete, insert, empty, size)+import qualified Data.Set as S (empty, member, insert, delete)+import Data.Time.Clock (getCurrentTime,diffUTCTime)+import Data.IORef+       (mkWeakIORef, newIORef, atomicWriteIORef, readIORef)++import Language.Javascript.JSaddle.Types+       (Command(..), AsyncCommand(..), Result(..), BatchResults(..), Results(..), JSContextRef(..), JSVal(..),+        Object(..), JSValueReceived(..), JSM(..), Batch(..), JSValueForSend(..), syncPoint, syncAfter, sendCommand)+import Language.Javascript.JSaddle.Exception (JSException(..))+import Control.DeepSeq (deepseq)+#if MIN_VERSION_base(4,11,0)+import GHC.Stats (getRTSStatsEnabled, getRTSStats, RTSStats(..), gcdetails_live_bytes, gc)+#else+import GHC.Stats (getGCStatsEnabled, getGCStats, GCStats(..))+#endif+import Data.Foldable (forM_)+#endif++-- | Enable (or disable) JSaddle logging+enableLogging :: Bool -> JSM ()+#ifdef ghcjs_HOST_OS+enableLogging _ = return ()+#else+enableLogging v = do+    f <- doEnableLogging <$> JSM ask+    liftIO $ f v+#endif++-- | On GHCJS this is 'JavaScript.Web.AnimationFrame.waitForAnimationFrame'.+--   On GHC it will delay the execution of the current batch of asynchronous+--   command when they are sent to JavaScript.  It will not delay the Haskell+--   code execution.  The time returned will be based on the Haskell clock+--   (not the JavaScript clock).+waitForAnimationFrame :: JSM Double+#ifdef ghcjs_HOST_OS+waitForAnimationFrame = GHCJS.waitForAnimationFrame+#else+waitForAnimationFrame = do+    -- We can't get the timestamp from requestAnimationFrame so this will have to do+    start <- startTime <$> JSM ask+    now <- liftIO getCurrentTime+    void $ sendLazyCommand SyncWithAnimationFrame+    return $ realToFrac (diffUTCTime now start)+#endif++-- | Tries to executes the given code in the next animation frame callback.+--   Avoid synchronous opperations where possible.+nextAnimationFrame :: (Double -> JSM a) -> JSM a+nextAnimationFrame f = do+    t <- waitForAnimationFrame+    syncAfter (f t)++#ifndef ghcjs_HOST_OS+sendLazyCommand :: (JSValueForSend -> AsyncCommand) -> JSM JSVal+sendLazyCommand cmd = do+    nextRefTVar <- nextRef <$> JSM ask+    n <- liftIO . atomically $ do+        n <- subtract 1 <$> readTVar nextRefTVar+        writeTVar nextRefTVar $! n+        return n+    s <- doSendAsyncCommand <$> JSM ask+    liftIO $ s (cmd $ JSValueForSend n)+    wrapJSVal (JSValueReceived n)++sendAsyncCommand :: AsyncCommand -> JSM ()+sendAsyncCommand cmd = do+    s <- doSendAsyncCommand <$> JSM ask+    liftIO $ s cmd++runJavaScript :: (Batch -> IO ()) -> JSM () -> IO (Results -> IO (), Results -> IO Batch, IO ())+runJavaScript sendBatch entryPoint = do+    contextId' <- randomIO+    startTime' <- getCurrentTime+    recvMVar <- newEmptyMVar+    lastAsyncBatch <- newEmptyMVar+    commandChan <- newTChanIO+    callbacks <- newTVarIO M.empty+    nextRef' <- newTVarIO 0+    finalizerThreads' <- newMVar S.empty+    animationFrameHandlers' <- newMVar []+    loggingEnabled <- newIORef False+    liveRefs' <- newMVar S.empty+    let ctx = JSContextRef {+            contextId = contextId'+          , startTime = startTime'+          , doSendCommand = \cmd -> cmd `deepseq` do+                result <- newEmptyMVar+                atomically $ writeTChan commandChan (Right (cmd, result))+                unsafeInterleaveIO $+                    takeMVar result >>= \case+                        (ThrowJSValue v) -> do+                            jsval <- wrapJSVal' ctx v+                            throwIO $ JSException jsval+                        r -> return r+          , doSendAsyncCommand = \cmd -> cmd `deepseq` atomically (writeTChan commandChan $ Left cmd)+          , addCallback = \(Object (JSVal ioref)) cb -> do+                val <- readIORef ioref+                atomically $ modifyTVar' callbacks (M.insert val cb)+          , nextRef = nextRef'+          , doEnableLogging = atomicWriteIORef loggingEnabled+          , finalizerThreads = finalizerThreads'+          , animationFrameHandlers = animationFrameHandlers'+          , liveRefs = liveRefs'+          }+        processResults :: Bool -> Results -> IO ()+        processResults syncCallbacks = \case+            (ProtocolError err) -> error $ "Protocol error : " <> T.unpack err+            (Callback n br (JSValueReceived fNumber) f this a) -> do+                putMVar recvMVar (n, br)+                f' <- runReaderT (unJSM $ wrapJSVal f) ctx+                this' <- runReaderT  (unJSM $ wrapJSVal this) ctx+                args <- runReaderT (unJSM $ mapM wrapJSVal a) ctx+                logInfo (("Call " <> show fNumber <> " ") <>)+                (M.lookup fNumber <$> liftIO (readTVarIO callbacks)) >>= \case+                    Nothing -> liftIO $ putStrLn "Callback called after it was freed"+                    Just cb -> void . forkIO $ do+                        runReaderT (unJSM $ cb f' this' args) ctx+                        when syncCallbacks $+                            doSendAsyncCommand ctx EndSyncBlock+            Duplicate nBatch nExpected -> do+                putStrLn $ "Error : Unexpected Duplicate. syncCallbacks=" <> show syncCallbacks <>+                    " nBatch=" <> show nBatch <> " nExpected=" <> show nExpected+                void $ doSendCommand ctx Sync+            BatchResults n br -> putMVar recvMVar (n, br)+        asyncResults :: Results -> IO ()+        asyncResults results =+            void . forkIO $ processResults False results+        syncResults :: Results -> IO Batch+        syncResults results = do+            void . forkIO $ processResults True results+            readMVar lastAsyncBatch+        logInfo s =+            readIORef loggingEnabled >>= \case+                True -> do+                    currentBytesUsedStr <- getRTSStatsEnabled >>= \case+                        True  -> show . currentBytesUsed <$> getRTSStats+                        False -> return "??"+                    cbCount <- M.size <$> readTVarIO callbacks+                    putStrLn . s $ "M " <> currentBytesUsedStr <> " CB " <> show cbCount <> " "+                False -> return ()+    _ <- forkIO . numberForeverFromM_ 1 $ \nBatch ->+        readBatch nBatch commandChan >>= \case+            (batch@(Batch cmds _ _), resultMVars) -> do+                logInfo (\x -> "Sync " <> x <> show (length cmds, last cmds))+                _ <- tryTakeMVar lastAsyncBatch+                putMVar lastAsyncBatch batch+                sendBatch batch+                takeResult recvMVar nBatch >>= \case+                    (n, _) | n /= nBatch -> error $ "Unexpected jsaddle results (expected batch " <> show nBatch <> ", got batch " <> show n <> ")"+                    (_, Success callbacksToFree results)+                           | length results /= length resultMVars -> error "Unexpected number of jsaddle results"+                           | otherwise -> do+                        zipWithM_ putMVar resultMVars results+                        forM_ callbacksToFree $ \(JSValueReceived val) ->+                            atomically (modifyTVar' callbacks (M.delete val))+                    (_, Failure callbacksToFree results exception err) -> do+                        -- The exception will only be rethrown in Haskell if/when one of the+                        -- missing results (if any) is evaluated.+                        putStrLn "A JavaScript exception was thrown! (may not reach Haskell code)"+                        putStrLn err+                        zipWithM_ putMVar resultMVars $ results <> repeat (ThrowJSValue exception)+                        forM_ callbacksToFree $ \(JSValueReceived val) ->+                            atomically (modifyTVar' callbacks (M.delete val))+    return (asyncResults, syncResults, runReaderT (unJSM entryPoint) ctx)+  where+    numberForeverFromM_ :: (Monad m, Enum n) => n -> (n -> m a) -> m ()+    numberForeverFromM_ !n f = do+      _ <- f n+      numberForeverFromM_ (succ n) f+    takeResult recvMVar nBatch =+        takeMVar recvMVar >>= \case+            (n, _) | n < nBatch -> takeResult recvMVar nBatch+            r -> return r+    readBatch :: Int -> TChan (Either AsyncCommand (Command, MVar Result)) -> IO (Batch, [MVar Result])+    readBatch nBatch chan = do+        first <- atomically $ readTChan chan -- We want at least one command to send+        loop first ([], [])+      where+        loop :: Either AsyncCommand (Command, MVar Result) -> ([Either AsyncCommand Command], [MVar Result]) -> IO (Batch, [MVar Result])+        loop (Left asyncCmd@(SyncWithAnimationFrame _)) (cmds, resultMVars) =+            atomically (readTChan chan) >>= \cmd -> loopAnimation cmd (Left asyncCmd:cmds, resultMVars)+        loop (Right (syncCmd, resultMVar)) (cmds', resultMVars') = do+            let cmds = Right syncCmd:cmds'+                resultMVars = resultMVar:resultMVars'+            atomically (tryReadTChan chan) >>= \case+                Nothing -> return (Batch (reverse cmds) False nBatch, reverse resultMVars)+                Just cmd -> loop cmd (cmds, resultMVars)+        loop (Left asyncCmd) (cmds', resultMVars) = do+            let cmds = Left asyncCmd:cmds'+            atomically (tryReadTChan chan) >>= \case+                Nothing -> return (Batch (reverse cmds) False nBatch, reverse resultMVars)+                Just cmd -> loop cmd (cmds, resultMVars)+        -- When we have seen a SyncWithAnimationFrame command only a synchronous command should end the batch+        loopAnimation :: Either AsyncCommand (Command, MVar Result) -> ([Either AsyncCommand Command], [MVar Result]) -> IO (Batch, [MVar Result])+        loopAnimation (Right (Sync, resultMVar)) (cmds, resultMVars) =+            return (Batch (reverse (Right Sync:cmds)) True nBatch, reverse (resultMVar:resultMVars))+        loopAnimation (Right (syncCmd, resultMVar)) (cmds, resultMVars) =+            atomically (readTChan chan) >>= \cmd -> loopAnimation cmd (Right syncCmd:cmds, resultMVar:resultMVars)+        loopAnimation (Left asyncCmd) (cmds, resultMVars) =+            atomically (readTChan chan) >>= \cmd -> loopAnimation cmd (Left asyncCmd:cmds, resultMVars)+#ifndef ghcjs_HOST_OS+#if MIN_VERSION_base(4,11,0)+    currentBytesUsed = gcdetails_live_bytes . gc+#else+    getRTSStatsEnabled = getGCStatsEnabled+    getRTSStats = getGCStats+#endif+#endif+++addThreadFinalizer :: ThreadId -> IO () -> IO ()+addThreadFinalizer t@(ThreadId t#) (IO finalizer) =+    IO $ \s -> case mkWeak# t# t finalizer s of { (# s1, _ #) -> (# s1, () #) }+++wrapJSVal :: JSValueReceived -> JSM JSVal+wrapJSVal v = do+    ctx <- JSM ask+    liftIO $ wrapJSVal' ctx v++wrapJSVal' :: JSContextRef -> JSValueReceived -> IO JSVal+wrapJSVal' ctx (JSValueReceived n) = do+    ref <- liftIO $ newIORef n+    when (n >= 5 || n < 0) $+#ifdef JSADDLE_CHECK_WRAPJSVAL+     do lr <- takeMVar $ liveRefs ctx+        if n `S.member` lr+            then do+                putStrLn $ "JS Value Ref " <> show n <> " already wrapped"+                putMVar (liveRefs ctx) lr+            else putMVar (liveRefs ctx) =<< evaluate (S.insert n lr)+#endif+        void . mkWeakIORef ref $ do+            ft <- takeMVar $ finalizerThreads ctx+            t <- myThreadId+            let tname = T.pack $ show t+            doSendAsyncCommand ctx $ FreeRef tname $ JSValueForSend n+            if tname `S.member` ft+                then putMVar (finalizerThreads ctx) ft+                else do+                    addThreadFinalizer t $ do+                        modifyMVar (finalizerThreads ctx) $ \s -> return (S.delete tname s, ())+                        doSendAsyncCommand ctx $ FreeRefs tname+                    putMVar (finalizerThreads ctx) =<< evaluate (S.insert tname ft)+    return (JSVal ref)+#endif
+ src/Language/Javascript/JSaddle/Run/Files.hs view
@@ -0,0 +1,466 @@+{-# LANGUAGE OverloadedStrings #-}+-----------------------------------------------------------------------------+--+-- Module      :  Language.Javascript.JSaddle.WebSockets.Files+-- Copyright   :  (c) Hamish Mackenzie+-- License     :  MIT+--+-- Maintainer  :  Hamish Mackenzie <Hamish.K.Mackenzie@gmail.com>+--+-- |+--+-----------------------------------------------------------------------------++module Language.Javascript.JSaddle.Run.Files (+    indexHtml+  , initState+  , runBatch+  , ghcjsHelpers+) where++import Prelude ()+import Prelude.Compat++import Data.ByteString.Lazy (ByteString)++indexHtml :: ByteString+indexHtml =+    "<!DOCTYPE html>\n\+    \<html>\n\+    \<head>\n\+    \<title>JSaddle</title>\n\+    \</head>\n\+    \<body>\n\+    \</body>\n\+    \<script src=\"/jsaddle.js\"></script>\n\+    \</html>"++initState :: ByteString+initState = "\+    \        var jsaddle_values = new Map();\n\+    \        var jsaddle_free = new Map();\n\+    \        jsaddle_values.set(0, null);\n\+    \        jsaddle_values.set(1, undefined);\n\+    \        jsaddle_values.set(2, false);\n\+    \        jsaddle_values.set(3, true);\n\+    \        jsaddle_values.set(4, globalThis);\n\+    \        var jsaddle_index = 100;\n\+    \        var expectedBatch = 1;\n\+    \        var lastResults = [0, {\"tag\": \"Success\", \"contents\": [[], []]}];\n\+    \        var inCallback = 0;\n\+    \        var asyncBatch = null;\n\+    \"++runBatch :: (ByteString -> ByteString) -> Maybe (ByteString -> ByteString) -> ByteString+runBatch send sendSync = "\+    \  var runBatch = function(firstBatch) {\n\+    \    var processBatch = function(timestamp) {\n\+    \      var batch = firstBatch;\n\+    \      var callbacksToFree = [];\n\+    \      var results = [];\n\+    \      inCallback++;\n\+    \      try {\n\+    \        syncDepth = initialSyncDepth || 0;\n\+    \        for(;;){\n\+    \          if(batch[2] === expectedBatch) {\n\+    \            expectedBatch++;\n\+    \            var nCommandsLength = batch[0].length;\n\+    \            for (var nCommand = 0; nCommand != nCommandsLength; nCommand++) {\n\+    \                var cmd = batch[0][nCommand];\n\+    \                if (cmd.Left) {\n\+    \                    var d = cmd.Left;\n\+    \                    switch (d.tag) {\n\+    \                            case \"FreeRef\":\n\+    \                                var refsToFree = jsaddle_free.get(d.contents[0]) || [];\n\+    \                                refsToFree.push(d.contents[1]);\n\+    \                                jsaddle_free.set(d.contents[0], refsToFree);\n\+    \                                break;\n\+    \                            case \"FreeRefs\":\n\+    \                                var refsToFree = jsaddle_free.get(d.contents) || [];\n\+    \                                for(var nRef = 0; nRef != refsToFree.length; nRef++)\n\+    \                                    jsaddle_values.delete(refsToFree[nRef]);\n\+    \                                jsaddle_free.delete(d.contents);\n\+    \                                break;\n\+    \                            case \"SetPropertyByName\":\n\+    \                                jsaddle_values.get(d.contents[0])[d.contents[1]]=jsaddle_values.get(d.contents[2]);\n\+    \                                break;\n\+    \                            case \"SetPropertyAtIndex\":\n\+    \                                jsaddle_values.get(d.contents[0])[d.contents[1]]=jsaddle_values.get(d.contents[2]);\n\+    \                                break;\n\+    \                            case \"EvaluateScript\":\n\+    \                                var n = d.contents[1];\n\+    \                                jsaddle_values.set(n, eval(d.contents[0]));\n\+    \                                break;\n\+    \                            case \"StringToValue\":\n\+    \                                var n = d.contents[1];\n\+    \                                jsaddle_values.set(n, d.contents[0]);\n\+    \                                break;\n\+    \                            case \"JSONValueToValue\":\n\+    \                                var n = d.contents[1];\n\+    \                                jsaddle_values.set(n, d.contents[0]);\n\+    \                                break;\n\+    \                            case \"GetPropertyByName\":\n\+    \                                var n = d.contents[2];\n\+    \                                jsaddle_values.set(n, jsaddle_values.get(d.contents[0])[d.contents[1]]);\n\+    \                                break;\n\+    \                            case \"GetPropertyAtIndex\":\n\+    \                                var n = d.contents[2];\n\+    \                                jsaddle_values.set(n, jsaddle_values.get(d.contents[0])[d.contents[1]]);\n\+    \                                break;\n\+    \                            case \"NumberToValue\":\n\+    \                                var n = d.contents[1];\n\+    \                                jsaddle_values.set(n, d.contents[0]);\n\+    \                                break;\n\+    \                            case \"NewEmptyObject\":\n\+    \                                var n = d.contents;\n\+    \                                jsaddle_values.set(n, {});\n\+    \                                break;\n\+    \                            case \"NewAsyncCallback\":\n\+    \                                (function() {\n\+    \                                    var nFunction = d.contents;\n\+    \                                    var func = function() {\n\+    \                                        var nFunctionInFunc = ++jsaddle_index;\n\+    \                                        jsaddle_values.set(nFunctionInFunc, func);\n\+    \                                        var nThis = ++jsaddle_index;\n\+    \                                        jsaddle_values.set(nThis, this);\n\+    \                                        var args = [];\n\+    \                                        for (var i = 0; i != arguments.length; i++) {\n\+    \                                            var nArg = ++jsaddle_index;\n\+    \                                            jsaddle_values.set(nArg, arguments[i]);\n\+    \                                            args[i] = nArg;\n\+    \                                        }\n\+    \                                        " <> send "{\"tag\": \"Callback\", \"contents\": [lastResults[0], lastResults[1], nFunction, nFunctionInFunc, nThis, args]}" <> "\n\+    \                                    };\n\+    \                                    jsaddle_values.set(nFunction, func);\n\+    \                                })();\n\+    \                                break;\n\+    \                            case \"NewSyncCallback\":\n\+    \                                (function() {\n\+    \                                    var nFunction = d.contents;\n\+    \                                    var func = function() {\n\+    \                                        var nFunctionInFunc = ++jsaddle_index;\n\+    \                                        jsaddle_values.set(nFunctionInFunc, func);\n\+    \                                        var nThis = ++jsaddle_index;\n\+    \                                        jsaddle_values.set(nThis, this);\n\+    \                                        var args = [];\n\+    \                                        for (var i = 0; i != arguments.length; i++) {\n\+    \                                            var nArg = ++jsaddle_index;\n\+    \                                            jsaddle_values.set(nArg, arguments[i]);\n\+    \                                            args[i] = nArg;\n\+    \                                        }\n" <> (+    case sendSync of+      Just s  ->+        "                                        if(inCallback > 0) {\n\+        \                                          " <> send "{\"tag\": \"Callback\", \"contents\": [lastResults[0], lastResults[1], nFunction, nFunctionInFunc, nThis, args]}" <> "\n\+        \                                        } else {\n\+        \                                          initialSyncDepth = 1;\n\+        \                                          runBatch(" <> s "{\"tag\": \"Callback\", \"contents\": [lastResults[0], lastResults[1], nFunction, nFunctionInFunc, nThis, args]}" <> ");\n\+        \                                        }\n"+      Nothing ->+        "                                        " <> send "{\"tag\": \"Callback\", \"contents\": [lastResults[0], lastResults[1], nFunction, nFunctionInFunc, nThis, args]}" <> "\n"+    ) <>+    "                                    };\n\+    \                                    jsaddle_values.set(nFunction, func);\n\+    \                                })();\n\+    \                                break;\n\+    \                            case \"FreeCallback\":\n\+    \                                callbacksToFree.push(d.contents);\n\+    \                                break;\n\+    \                            case \"CallAsFunction\":\n\+    \                                var n = d.contents[3];\n\+    \                                jsaddle_values.set(n,\n\+    \                                    jsaddle_values.get(d.contents[0]).apply(jsaddle_values.get(d.contents[1]),\n\+    \                                        d.contents[2].map(function(arg){return jsaddle_values.get(arg);})));\n\+    \                                break;\n\+    \                            case \"CallAsConstructor\":\n\+    \                                var n = d.contents[2];\n\+    \                                var r;\n\+    \                                var f = jsaddle_values.get(d.contents[0]);\n\+    \                                var a = d.contents[1].map(function(arg){return jsaddle_values.get(arg);});\n\+    \                                switch(a.length) {\n\+    \                                    case 0 : r = new f(); break;\n\+    \                                    case 1 : r = new f(a[0]); break;\n\+    \                                    case 2 : r = new f(a[0],a[1]); break;\n\+    \                                    case 3 : r = new f(a[0],a[1],a[2]); break;\n\+    \                                    case 4 : r = new f(a[0],a[1],a[2],a[3]); break;\n\+    \                                    case 5 : r = new f(a[0],a[1],a[2],a[3],a[4]); break;\n\+    \                                    case 6 : r = new f(a[0],a[1],a[2],a[3],a[4],a[5]); break;\n\+    \                                    case 7 : r = new f(a[0],a[1],a[2],a[3],a[4],a[5],a[6]); break;\n\+    \                                    default:\n\+    \                                        var ret;\n\+    \                                        var temp = function() {\n\+    \                                            ret = f.apply(this, a);\n\+    \                                        };\n\+    \                                        temp.prototype = f.prototype;\n\+    \                                        var i = new temp();\n\+    \                                        if(ret instanceof Object)\n\+    \                                            r = ret;\n\+    \                                        else {\n\+    \                                            i.constructor = f;\n\+    \                                            r = i;\n\+    \                                        }\n\+    \                                }\n\+    \                                jsaddle_values.set(n, r);\n\+    \                                break;\n\+    \                            case \"NewArray\":\n\+    \                                var n = d.contents[1];\n\+    \                                jsaddle_values.set(n, d.contents[0].map(function(v){return jsaddle_values.get(v);}));\n\+    \                                break;\n\+    \                            case \"SyncWithAnimationFrame\":\n\+    \                                var n = d.contents;\n\+    \                                jsaddle_values.set(n, timestamp);\n\+    \                                break;\n\+    \                            case \"StartSyncBlock\":\n\+    \                                syncDepth++;\n\+    \                                break;\n\+    \                            case \"EndSyncBlock\":\n\+    \                                syncDepth--;\n\+    \                                break;\n\+    \                            default:\n\+    \                                " <> send "{\"tag\": \"ProtocolError\", \"contents\": e.data}" <> "\n\+    \                                return;\n\+    \                    }\n\+    \                } else {\n\+    \                    var d = cmd.Right;\n\+    \                    switch (d.tag) {\n\+    \                            case \"ValueToString\":\n\+    \                                var val = jsaddle_values.get(d.contents);\n\+    \                                var s = val === null ? \"null\" : val === undefined ? \"undefined\" : val.toString();\n\+    \                                results.push({\"tag\": \"ValueToStringResult\", \"contents\": s});\n\+    \                                break;\n\+    \                            case \"ValueToBool\":\n\+    \                                results.push({\"tag\": \"ValueToBoolResult\", \"contents\": jsaddle_values.get(d.contents) ? true : false});\n\+    \                                break;\n\+    \                            case \"ValueToNumber\":\n\+    \                                results.push({\"tag\": \"ValueToNumberResult\", \"contents\": Number(jsaddle_values.get(d.contents))});\n\+    \                                break;\n\+    \                            case \"ValueToJSON\":\n\+    \                                var s = jsaddle_values.get(d.contents) === undefined ? \"\" : JSON.stringify(jsaddle_values.get(d.contents));\n\+    \                                results.push({\"tag\": \"ValueToJSONResult\", \"contents\": s});\n\+    \                                break;\n\+    \                            case \"ValueToJSONValue\":\n\+    \                                results.push({\"tag\": \"ValueToJSONValueResult\", \"contents\": jsaddle_values.get(d.contents)});\n\+    \                                break;\n\+    \                            case \"DeRefVal\":\n\+    \                                var n = d.contents;\n\+    \                                var v = jsaddle_values.get(n);\n\+    \                                var c = (v === null           ) ? [0, \"\"] :\n\+    \                                        (v === undefined      ) ? [1, \"\"] :\n\+    \                                        (v === false          ) ? [2, \"\"] :\n\+    \                                        (v === true           ) ? [3, \"\"] :\n\+    \                                        (typeof v === \"number\") ? [-1, v.toString()] :\n\+    \                                        (typeof v === \"string\") ? [-2, v]\n\+    \                                                                : [-3, \"\"];\n\+    \                                results.push({\"tag\": \"DeRefValResult\", \"contents\": c});\n\+    \                                break;\n\+    \                            case \"IsNull\":\n\+    \                                results.push({\"tag\": \"IsNullResult\", \"contents\": jsaddle_values.get(d.contents) === null});\n\+    \                                break;\n\+    \                            case \"IsUndefined\":\n\+    \                                results.push({\"tag\": \"IsUndefinedResult\", \"contents\": jsaddle_values.get(d.contents) === undefined});\n\+    \                                break;\n\+    \                            case \"InstanceOf\":\n\+    \                                results.push({\"tag\": \"InstanceOfResult\", \"contents\": jsaddle_values.get(d.contents[0]) instanceof jsaddle_values.get(d.contents[1])});\n\+    \                                break;\n\+    \                            case \"StrictEqual\":\n\+    \                                results.push({\"tag\": \"StrictEqualResult\", \"contents\": jsaddle_values.get(d.contents[0]) === jsaddle_values.get(d.contents[1])});\n\+    \                                break;\n\+    \                            case \"PropertyNames\":\n\+    \                                var result = [];\n\+    \                                for (name in jsaddle_values.get(d.contents)) { result.push(name); }\n\+    \                                results.push({\"tag\": \"PropertyNamesResult\", \"contents\": result});\n\+    \                                break;\n\+    \                            case \"Sync\":\n\+    \                                results.push({\"tag\": \"SyncResult\", \"contents\": []});\n\+    \                                break;\n\+    \                            default:\n\+    \                                results.push({\"tag\": \"ProtocolError\", \"contents\": e.data});\n\+    \                        }\n\+    \                }\n\+    \            }\n\+    \            if(syncDepth <= 0) {\n\+    \              lastResults = [batch[2], {\"tag\": \"Success\", \"contents\": [callbacksToFree, results]}];\n\+    \              " <> send "{\"tag\": \"BatchResults\", \"contents\": [lastResults[0], lastResults[1]]}" <> "\n\+    \              break;\n\+    \            } else {\n" <> (+    case sendSync of+      Just s  ->+        "              lastResults = [batch[2], {\"tag\": \"Success\", \"contents\": [callbacksToFree, results]}];\n\+        \              batch = " <> s "{\"tag\": \"BatchResults\", \"contents\": [lastResults[0], lastResults[1]]}" <> ";\n\+        \              results = [];\n\+        \              callbacksToFree = [];\n"+      Nothing ->+        "              " <> send "{\"tag\": \"BatchResults\", \"contents\": [batch[2], {\"tag\": \"Success\", \"contents\": [callbacksToFree, results]}]}" <> "\n\+        \              break;\n"+    ) <>+    "            }\n\+    \          } else {\n\+    \            if(syncDepth <= 0) {\n\+    \              break;\n\+    \            } else {\n" <> (+    case sendSync of+      Just s  ->+        "              if(batch[2] === expectedBatch - 1) {\n\+        \                batch = " <> s "{\"tag\": \"BatchResults\", \"contents\": [lastResults[0], lastResults[1]]}" <> ";\n\+        \              } else {\n\+        \                batch = " <> s "{\"tag\": \"Duplicate\", \"contents\": [batch[2], expectedBatch]}" <> ";\n\+        \              }\n\+        \              results = [];\n\+        \              callbacksToFree = [];\n"+      Nothing ->+        "              " <> send "{\"tag\": \"Duplicate\", \"contents\": [batch[2], expectedBatch]}" <> "\n\+        \              break;\n"+    ) <>+    "            }\n\+    \          }\n\+    \        }\n\+    \      }\n\+    \      catch (err) {\n\+    \        var n = ++jsaddle_index;\n\+    \        jsaddle_values.set(n, err);\n\+    \        console.log(err);\n\+    \        " <> send "{\"tag\": \"BatchResults\", \"contents\": [batch[2], {\"tag\": \"Failure\", \"contents\": [callbacksToFree, results, n, String(err)]}]}" <> "\n\+    \      }\n\+    \      if(inCallback == 1) {\n\+    \          while(asyncBatch !== null) {\n\+    \              var b = asyncBatch;\n\+    \              asyncBatch = null;\n\+    \              if(b[2] == expectedBatch) runBatch(b);\n\+    \          }\n\+    \      }\n\+    \      inCallback--;\n\+    \    };\n\+    \    if(batch[1] && (initialSyncDepth || 0) === 0) {\n\+    \        globalThis.requestAnimationFrame(processBatch);\n\+    \    }\n\+    \    else {\n\+    \        processBatch(globalThis.performance ? globalThis.performance.now() : null);\n\+    \    }\n\+    \  };\n\+    \  initialSyncDepth = 0;\n\+    \  runBatch(batch);\n\+    \"++ghcjsHelpers :: ByteString+ghcjsHelpers = "\+    \function h$isNumber(o) {\+    \    return typeof(o) === 'number';\n\+    \}\n\+    \\n\+    \// returns true for null, but not for functions and host objects\n\+    \function h$isObject(o) {\n\+    \    return typeof(o) === 'object';\n\+    \}\n\+    \\n\+    \function h$isString(o) {\n\+    \    return typeof(o) === 'string';\n\+    \}\n\+    \\n\+    \function h$isSymbol(o) {\n\+    \    return typeof(o) === 'symbol';\n\+    \}\n\+    \\n\+    \function h$isBoolean(o) {\n\+    \    return typeof(o) === 'boolean';\n\+    \}\n\+    \\n\+    \function h$isFunction(o) {\n\+    \    return typeof(o) === 'function';\n\+    \}\n\+    \\n\+    \function h$jsTypeOf(o) {\n\+    \    var t = typeof(o);\n\+    \    if(t === 'undefined') return 0;\n\+    \    if(t === 'object')    return 1;\n\+    \    if(t === 'boolean')   return 2;\n\+    \    if(t === 'number')    return 3;\n\+    \    if(t === 'string')    return 4;\n\+    \    if(t === 'symbol')    return 5;\n\+    \    if(t === 'function')  return 6;\n\+    \    return 7; // other, host object etc\n\+    \}\n\+    \\n\+    \function h$jsonTypeOf(o) {\n\+    \    if (!(o instanceof Object)) {\n\+    \        if (o == null) {\n\+    \            return 0;\n\+    \        } else if (typeof o == 'number') {\n\+    \            if (h$isInteger(o)) {\n\+    \                return 1;\n\+    \            } else {\n\+    \                return 2;\n\+    \            }\n\+    \        } else if (typeof o == 'boolean') {\n\+    \            return 3;\n\+    \        } else {\n\+    \            return 4;\n\+    \        }\n\+    \    } else {\n\+    \        if (Object.prototype.toString.call(o) == '[object Array]') {\n\+    \            // it's an array\n\+    \            return 5;\n\+    \        } else if (!o) {\n\+    \            // null \n\+    \            return 0;\n\+    \        } else {\n\+    \            // it's an object\n\+    \            return 6;\n\+    \        }\n\+    \    }\n\+    \\n\+    \}\n\+    \function h$roundUpToMultipleOf(n,m) {\n\+    \  var rem = n % m;\n\+    \  return rem === 0 ? n : n - rem + m;\n\+    \}\n\+    \\n\+    \function h$newByteArray(len) {\n\+    \  var len0 = Math.max(h$roundUpToMultipleOf(len, 8), 8);\n\+    \  var buf = new ArrayBuffer(len0);\n\+    \  return { buf: buf\n\+    \         , len: len\n\+    \         , i3: new Int32Array(buf)\n\+    \         , u8: new Uint8Array(buf)\n\+    \         , u1: new Uint16Array(buf)\n\+    \         , f3: new Float32Array(buf)\n\+    \         , f6: new Float64Array(buf)\n\+    \         , dv: new DataView(buf)\n\+    \         }\n\+    \}\n\+    \function h$wrapBuffer(buf, unalignedOk, offset, length) {\n\+    \  if(!unalignedOk && offset && offset % 8 !== 0) {\n\+    \    throw (\"h$wrapBuffer: offset not aligned:\" + offset);\n\+    \  }\n\+    \  if(!buf || !(buf instanceof ArrayBuffer))\n\+    \    throw \"h$wrapBuffer: not an ArrayBuffer\"\n\+    \  if(!offset) { offset = 0; }\n\+    \  if(!length || length < 0) { length = buf.byteLength - offset; }\n\+    \  return { buf: buf\n\+    \         , len: length\n\+    \         , i3: (offset%4) ? null : new Int32Array(buf, offset, length >> 2)\n\+    \         , u8: new Uint8Array(buf, offset, length)\n\+    \         , u1: (offset%2) ? null : new Uint16Array(buf, offset, length >> 1)\n\+    \         , f3: (offset%4) ? null : new Float32Array(buf, offset, length >> 2)\n\+    \         , f6: (offset%8) ? null : new Float64Array(buf, offset, length >> 3)\n\+    \         , dv: new DataView(buf, offset, length)\n\+    \         };\n\+    \}\n\+    \function h$newByteArrayFromBase64String(base64) {\n\+    \  var bin = globalThis.atob(base64);\n\+    \  var ba = h$newByteArray(bin.length);\n\+    \  var u8 = ba.u8;\n\+    \  for (var i = 0; i < bin.length; i++) {\n\+    \    u8[i] = bin.charCodeAt(i);\n\+    \  }\n\+    \  return ba;\n\+    \}\n\+    \function h$byteArrayToBase64String(off, len, ba) {\n\+    \  var bin = '';\n\+    \  var u8 = ba.u8;\n\+    \  var end = off + len;\n\+    \  for (var i = off; i < end; i++) {\n\+    \    bin += String.fromCharCode(u8[i]);\n\+    \  }\n\+    \  return globalThis.btoa(bin);\n\+    \}\n\+    \"
src/Language/Javascript/JSaddle/String.hs view
@@ -1,6 +1,9 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE TypeSynonymInstances #-}+#ifdef ghcjs_HOST_OS+{-# OPTIONS_GHC -Wno-dodgy-imports #-}+#endif ----------------------------------------------------------------------------- -- -- Module      :  Language.Javascript.JSaddle.String@@ -15,60 +18,32 @@  module Language.Javascript.JSaddle.String (     JSString-  , ToJSString(..)    -- * Data.Text helpers+  , textFromJSString+  , textToJSString   , strToText   , textToStr-  , nullJSString ) where  import Data.Text (Text)-import Control.Monad.IO.Class (MonadIO(..))-import Language.Javascript.JSaddle.Types (JSString)+import Language.Javascript.JSaddle.Types (JSString(..)) #ifdef ghcjs_HOST_OS import Data.JSString.Text (textFromJSString, textToJSString)-import GHCJS.Marshal.Internal (PFromJSVal(..))-import GHCJS.Types (nullRef)-#else-import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSStringRef-       (jsstringcreatewithcharacters, jsstringgetcharactersptr,-        jsstringgetlength)-import Language.Javascript.JSaddle.Native (makeNewJSString, withJSString)-import System.IO.Unsafe (unsafePerformIO)-import Foreign.ForeignPtr (newForeignPtr_)-import Foreign.Ptr (nullPtr)-import qualified Data.Text.Foreign as T (fromPtr)-import Foreign (castPtr)-import Data.Text.Foreign (useAsPtr) #endif-import Language.Javascript.JSaddle.Classes (ToJSString(..)) --- | Convert a JavaScript string to a Haskell 'Text'-strToText :: MonadIO m => JSString -> m Text-#ifdef ghcjs_HOST_OS-strToText = return . textFromJSString-#else-strToText jsstring' = liftIO $ withJSString jsstring' $ \jsstring -> do-    l <- jsstringgetlength jsstring-    p <- jsstringgetcharactersptr jsstring-    T.fromPtr (castPtr p) (fromIntegral l)+#ifndef ghcjs_HOST_OS+textFromJSString :: JSString -> Text+textFromJSString (JSString text) = text++textToJSString :: Text -> JSString+textToJSString = JSString #endif +-- | Convert a JavaScript string to a Haskell 'Text'+strToText :: JSString -> Text+strToText = textFromJSString+ -- | Convert a Haskell 'Text' to a JavaScript string textToStr :: Text -> JSString-#ifdef ghcjs_HOST_OS textToStr = textToJSString-#else-textToStr text = unsafePerformIO $-    useAsPtr text $ \p l ->-        jsstringcreatewithcharacters (castPtr p) (fromIntegral l) >>= makeNewJSString-#endif--nullJSString :: JSString-#ifdef ghcjs_HOST_OS-nullJSString = pFromJSVal nullRef-#else-nullJSString = unsafePerformIO $ newForeignPtr_ nullPtr-#endif-
− src/Language/Javascript/JSaddle/Test.hs
@@ -1,176 +0,0 @@-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE PatternSynonyms #-}------------------------------------------------------------------------------------ Module      :  TestJSC--- Copyright   :  (c) Hamish Mackenzie--- License     :  MIT------ Maintainer  :  Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>------ |-----------------------------------------------------------------------------------module Language.Javascript.JSaddle.Test (-    testJSaddle-  , showJSaddle-  , listWindowProperties-) where--import Control.Applicative-import Prelude hiding((!!), catch)-import GI.Gtk-       (Window, widgetDestroy, widgetShowAll,-        mainQuit, containerAdd, scrolledWindowNew,-        windowSetPosition, windowSetDefaultSize, windowNew)-import Control.Concurrent-       (tryTakeMVar, forkIO, newMVar, putMVar, takeMVar, newEmptyMVar,-        yield)-import GI.Gtk.Enums (WindowType(..), WindowPosition(..))-import GI.WebKit.Objects.WebView-       (webViewGetMainFrame, webViewNew)-import System.IO.Unsafe (unsafePerformIO)-import Control.Monad.Trans.Reader (runReaderT)-import GI.WebKit.Objects.WebFrame-       (webFrameGetGlobalContext)-import Language.Javascript.JSaddle-import qualified Data.Text as T-import Control.Monad.IO.Class (MonadIO(..))-import Control.Monad (forM, when)-import Control.Lens.Getter ((^.))-import Data.Monoid ((<>))-import Control.Concurrent.MVar (MVar)-import qualified GI.Gtk.Functions as Gtk (init, main)-import GI.GLib.Functions (timeoutAdd)-import GI.Gtk.Enums (WindowPosition(..))-import Data.GI.Base.Signals (on)-import GI.GLib (idleAdd)-import GI.GLib.Constants(pattern PRIORITY_DEFAULT, pattern PRIORITY_LOW)-import GI.Gtk.Objects.Widget (onWidgetDestroy)-import GI.JavaScriptCore.Structs.GlobalContext (GlobalContext(..))-import Foreign.ForeignPtr (withForeignPtr)-import Foreign.Ptr (castPtr)-import GI.Gtk.Objects.Adjustment (Adjustment(..))---- | Post an action to be run in the main GUI thread.------ The current thread blocks until the action completes and the result is--- returned.----postGUISync :: IO a -> IO a-postGUISync action = do-  resultVar <- newEmptyMVar-  idleAdd PRIORITY_DEFAULT $ action >>= putMVar resultVar >> return False-  takeMVar resultVar---- | Post an action to be run in the main GUI thread.------ The current thread continues and does not wait for the result of the--- action.----postGUIAsync :: IO () -> IO ()-postGUIAsync action = do-  idleAdd PRIORITY_DEFAULT $ action >> return False-  return ()--data TestState = TestState { jsContext :: GlobalContext, window :: Window }--state :: MVar (Maybe TestState)-state = unsafePerformIO $ newMVar Nothing-{-# NOINLINE state #-}--done :: MVar ()-done = unsafePerformIO newEmptyMVar-{-# NOINLINE done #-}---- >>> testJSaddle $ ((global ^. js "console" . js "log") # ["Hello"])-testJSaddle :: ToJSVal val => JSM val -> IO ()-testJSaddle = testJSaddle' False---- >>> showJSaddle $ eval "document.body.innerHTML = 'Test'"-showJSaddle :: ToJSVal val => JSM val -> IO ()-showJSaddle = testJSaddle' True--debugLog :: String -> IO ()-debugLog _ = return ()--testJSaddle' :: ToJSVal val => Bool -> JSM val -> IO ()-testJSaddle' showWindow f = do-    debugLog "taking done"-    _ <- tryTakeMVar done-    debugLog "taking state"-    mbState <- takeMVar state-    TestState {..} <- case mbState of-        Nothing -> do-            debugLog "newState"-            newState <- newEmptyMVar-            debugLog "fork"-            _ <- forkIO $ do-                debugLog "initGUI"-                _ <- Gtk.init mempty-                debugLog "windowNew"-                window <- windowNew WindowTypeToplevel-                debugLog "timeoutAdd"-                _ <- timeoutAdd PRIORITY_LOW 10 $ yield >> return True-                windowSetDefaultSize window 900 600-                windowSetPosition window WindowPositionCenter-                scrollWin <- scrolledWindowNew (Nothing :: Maybe Adjustment) (Nothing :: Maybe Adjustment)-                webView <- webViewNew-                window `containerAdd` scrollWin-                scrollWin `containerAdd` webView-                _ <- onWidgetDestroy window $ do-                    debugLog "onDestroy"-                    _ <- tryTakeMVar state-                    debugLog "put state"-                    putMVar state Nothing-                    debugLog "mainQuit"-                    mainQuit-                    debugLog "put done"-                    putMVar done ()-                    return ()-                debugLog "get context"-                jsContext <- webViewGetMainFrame webView >>= webFrameGetGlobalContext-                debugLog "put initial state"-                putMVar newState TestState {..}-                debugLog "maybe show"-                when showWindow $ widgetShowAll window-                debugLog "mainGUI"-                Gtk.main-                debugLog "mainGUI exited"-            takeMVar newState-        Just s@TestState {..} -> do-            debugLog "maybe show (2)"-            when showWindow . postGUISync $ widgetShowAll window-            return s-    x <- postGUISync $ withContext jsContext $ runReaderT ((f >>= valToText >>= liftIO . putStrLn . T.unpack)-            `catch` \ (JSException e) -> valToText e >>= liftIO . putStrLn . T.unpack)-    debugLog "put state"-    putMVar state $ Just TestState {..}-    return x--withContext :: GlobalContext -> (JSContextRef -> IO a) -> IO a-withContext (GlobalContext fptr) f = withForeignPtr fptr $ f . castPtr--listWindowProperties :: IO ()-listWindowProperties = testJSaddle $ T.pack . show <$> do-  window <- jsg "window"-  names <- propertyNames window-  forM names $ \name -> do-        v <- window ^. js name >>= valToText-        n <- strToText name-        return (n, v)-    `catch`-        \(JSException e) -> do-            n <- strToText name-            msg <- valToText e-            return (n, T.pack " error " <> msg)---------
src/Language/Javascript/JSaddle/Types.hs view
@@ -1,8 +1,24 @@-{-# LANGUAGE CPP                   #-}-{-# LANGUAGE FlexibleInstances     #-}+{-# LANGUAGE CPP                        #-}+#ifdef ghcjs_HOST_OS+{-# OPTIONS_GHC -Wno-dodgy-exports      #-}+#else+{-# LANGUAGE TypeFamilies               #-}+{-# LANGUAGE UndecidableInstances       #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE DeriveGeneric              #-}+{-# LANGUAGE DataKinds                  #-}+{-# LANGUAGE PolyKinds                  #-}+{-# LANGUAGE FlexibleContexts           #-}+{-# LANGUAGE DefaultSignatures          #-}+{-# LANGUAGE ImplicitParams             #-}+#endif+{-# LANGUAGE ConstraintKinds            #-}+{-# LANGUAGE KindSignatures             #-}+{-# LANGUAGE AllowAmbiguousTypes        #-}+{-# LANGUAGE TypeOperators              #-} ----------------------------------------------------------------------------- ----- Module      :  Language.Javascript.JSaddle.Properties+-- Module      :  Language.Javascript.JSaddle.Types -- Copyright   :  (c) Hamish Mackenzie -- License     :  MIT --@@ -13,57 +29,503 @@ -----------------------------------------------------------------------------  module Language.Javascript.JSaddle.Types (-    JSVal+  -- * JavaScript Context+    JSContextRef(..)++  -- * The JSM Monad+  , JSM(..)+  , MonadJSM(..)+  , liftJSM++  -- * Pure GHCJS functions+  , GHCJSPure(..)+  , ghcjsPure+  , ghcjsPureMap+  , ghcjsPureId++  -- * JavaScript Value Types+  , JSVal(..)+  , IsJSVal(..)+  , jsval+  , SomeJSArray(..)+  , JSArray   , MutableJSArray+  , STJSArray   , Object(..)-  , JSPropertyNameArray-  , JSPropertyAttributes-  , JSContextRef-  , JSString-  , Index+  , JSString(..)   , Nullable(..)-  , JSM+  , JSCallAsFunction++  -- * Debugging+  , JSaddleHasCallStack++  -- * Sync JSM+  , syncPoint+  , syncAfter++#ifndef ghcjs_HOST_OS+  , sendCommand++  -- * JavaScript Context Commands+  , MutabilityType(..)+  , Mutable+  , Immutable+  , IsItMutable(..)+  , Mutability+  , JSValueReceived(..)+  , JSValueForSend(..)+  , JSStringReceived(..)+  , JSStringForSend(..)+  , JSObjectForSend(..)+  , AsyncCommand(..)+  , Command(..)+  , Batch(..)+  , Result(..)+  , BatchResults(..)+  , Results(..)+#endif ) where -import Control.Monad.Trans.Reader (ReaderT(..))+import Control.Monad.IO.Class (MonadIO(..)) #ifdef ghcjs_HOST_OS import GHCJS.Types import JavaScript.Object.Internal (Object(..))-import JavaScript.Array (MutableJSArray)-import Data.Word (Word(..))+import JavaScript.Array.Internal (SomeJSArray(..), JSArray, MutableJSArray, STJSArray) import GHCJS.Nullable (Nullable(..)) #else-import Foreign.ForeignPtr (ForeignPtr)-import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase-       (OpaqueJSString, JSValueRefRef,-        JSContextRef, JSPropertyNameArrayRef, OpaqueJSValue)-import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef (JSPropertyAttributes)-import Foreign.C (CUInt(..))+import GHCJS.Prim.Internal (JSVal(..), JSValueRef)+import Data.JSString.Internal.Type (JSString(..))+import Control.DeepSeq (NFData(..))+import Control.Monad.Catch (MonadThrow, MonadCatch(..), MonadMask(..))+import Control.Monad.Codensity (Codensity(..))+import Control.Monad.Trans.Cont (ContT(..))+import Control.Monad.Trans.Except (ExceptT(..))+import Control.Monad.Trans.Identity (IdentityT(..))+import Control.Monad.Trans.Maybe (MaybeT(..))+import Control.Monad.Trans.Reader (ReaderT(..), ask)+import Control.Monad.Trans.RWS.Lazy as Lazy (RWST(..))+import Control.Monad.Trans.RWS.Strict as Strict (RWST(..))+import Control.Monad.Trans.State.Lazy as Lazy (StateT(..))+import Control.Monad.Trans.State.Strict as Strict (StateT(..))+import Control.Monad.Trans.Writer.Lazy as Lazy (WriterT(..))+import Control.Monad.Trans.Writer.Strict as Strict (WriterT(..))+import Control.Monad.Trans.Class (MonadTrans(..))+import Control.Monad.Fix (MonadFix)+import Control.Monad.Ref (MonadAtomicRef(..), MonadRef(..))+import Control.Concurrent.STM.TVar (TVar)+import Control.Concurrent.MVar (MVar)+import Data.Int (Int64)+import Data.Set (Set)+import Data.Text (Text)+import Data.Time.Clock (UTCTime(..))+import Data.Type.Equality (type (~~))+import Data.Typeable (Typeable)+import Data.Coerce (coerce, Coercible)+import Data.Aeson+       (defaultOptions, genericToEncoding, ToJSON(..), FromJSON(..), Value)+import GHC.Exts (TYPE)+import GHC.Generics (Generic)+import Control.Monad.IO.Unlift (MonadUnliftIO)+import qualified Control.Monad.Fail as Fail #endif +#if MIN_VERSION_base(4,9,0) && defined(CHECK_UNCHECKED)+import GHC.Stack (HasCallStack)+#else+import GHC.Exts (Constraint)+#endif++-- | Identifies a JavaScript execution context.+--   When using GHCJS this is just '()' since their is only one context.+--   When using GHC it includes the functions JSaddle needs to communicate+--   with the JavaScript context. #ifdef ghcjs_HOST_OS-newtype JSPropertyNameArray = JSPropertyNameArray { unJSPropertyNameArrayRef :: JSVal }-type JSPropertyAttributes = Word-type JSContextRef  = ()-type Index         = Int+type JSContextRef = () #else-type JSVal = ForeignPtr OpaqueJSValue-type MutableJSArray = JSValueRefRef-type JSPropertyNameArray = JSPropertyNameArrayRef-type Index = CUInt-newtype Object = Object (ForeignPtr OpaqueJSValue)-type JSString = ForeignPtr OpaqueJSString-newtype Nullable a = Nullable a+data JSContextRef = JSContextRef {+    contextId              :: Int64+  , startTime              :: UTCTime+  , doSendCommand          :: Command -> IO Result+  , doSendAsyncCommand     :: AsyncCommand -> IO ()+  , addCallback            :: Object -> JSCallAsFunction -> IO ()+  , nextRef                :: TVar JSValueRef+  , doEnableLogging        :: Bool -> IO ()+  , finalizerThreads       :: MVar (Set Text)+  , animationFrameHandlers :: MVar [Double -> JSM ()]+  , liveRefs               :: MVar (Set Int64)+} #endif --- | The @JSM@ monad keeps track of the JavaScript context.+-- | The 'JSM' monad keeps track of the JavaScript execution context. ----- Given a @JSM@ function and a 'JSContextRef' you can run the--- function like this...+--   When using GHCJS it is `IO`. ----- > runReaderT jsmFunction javaScriptContext+--   Given a 'JSM' function and a 'JSContextRef' you can run the+--   function like this... ----- For an example of how to set up WebKitGTK+ see tests/TestJSaddle.hs-type JSM = ReaderT JSContextRef IO+-- > runJSM jsmFunction javaScriptContext+#ifdef ghcjs_HOST_OS+type JSM = IO+#else+newtype JSM a = JSM { unJSM :: ReaderT JSContextRef IO a }+    deriving (Functor, Applicative, Monad, MonadIO, MonadFix, MonadThrow, MonadUnliftIO, Fail.MonadFail)++instance MonadCatch JSM where+    t `catch` c = JSM (unJSM (syncAfter t) `catch` \e -> unJSM (c e))++instance MonadMask JSM where+  mask a = JSM $ mask $ \unmask -> unJSM (a $ q unmask)+    where q :: (ReaderT JSContextRef IO a -> ReaderT JSContextRef IO a) -> JSM a -> JSM a+          q unmask (JSM b) = syncAfter . JSM $ unmask b+  uninterruptibleMask a =+    JSM $ uninterruptibleMask $ \unmask -> unJSM (a $ q unmask)+      where q :: (ReaderT JSContextRef IO a -> ReaderT JSContextRef IO a) -> JSM a -> JSM a+            q unmask (JSM b) = syncAfter . JSM $ unmask b+#if MIN_VERSION_exceptions(0,9,0)+  generalBracket acquire release use =+    JSM $ generalBracket+      (unJSM acquire)+      (\resource exitCase -> unJSM $ release resource exitCase)+      (unJSM . syncAfter . use)+#endif++#endif++-- | Forces execution of pending asyncronous code+syncPoint :: JSM ()+#ifdef ghcjs_HOST_OS+syncPoint = return ()+#else+syncPoint = do+    SyncResult <- sendCommand Sync+    return ()+#endif++-- | Forces execution of pending asyncronous code after performing `f`+syncAfter :: JSM a -> JSM a+#ifdef ghcjs_HOST_OS+syncAfter = id+#else+syncAfter f = do+    result <- f+    syncPoint+    return result+#endif++#ifndef ghcjs_HOST_OS+sendCommand :: Command -> JSM Result+sendCommand cmd = do+    s <- doSendCommand <$> JSM ask+    liftIO $ s cmd+#endif++-- | Type we can give to functions that are pure when using ghcjs, but+--   live in JSM when using jsaddle.+--+--   Some functions that can be pure in GHCJS cannot be implemented in+--   a pure way in JSaddle (because we need to know the JSContextRef).+--   Instead we implement versions of these functions in that return+--   `GHCJSPure a` instead of `a`.  To call them in a way that will+--   work when compiling with GHCJS use `ghcjsPure`.+#ifdef ghcjs_HOST_OS+type GHCJSPure a = a+#else+newtype GHCJSPure a = GHCJSPure (JSM a)+#endif++-- | Used when you want to call a functions that is pure in GHCJS, but+--   lives in the JSM in jsaddle.+ghcjsPure :: GHCJSPure a -> JSM a+#ifdef ghcjs_HOST_OS+ghcjsPure = pure+#else+ghcjsPure (GHCJSPure x) = x+#endif+{-# INLINE ghcjsPure #-}++ghcjsPureMap :: (a -> b) -> GHCJSPure a -> GHCJSPure b+#ifdef ghcjs_HOST_OS+ghcjsPureMap = id+#else+ghcjsPureMap f (GHCJSPure x) = GHCJSPure (f <$> x)+#endif+{-# INLINE ghcjsPureMap #-}++ghcjsPureId :: a -> GHCJSPure a+#ifdef ghcjs_HOST_OS+ghcjsPureId = id+#else+ghcjsPureId = GHCJSPure . return+#endif+{-# INLINE ghcjsPureId #-}++-- | The 'MonadJSM' is to 'JSM' what 'MonadIO' is to 'IO'.+--   When using GHCJS it is 'MonadIO'.+#ifdef ghcjs_HOST_OS+type MonadJSM = MonadIO+#else+class (Applicative m, MonadIO m) => MonadJSM m where+    liftJSM' :: JSM a -> m a++    default liftJSM' :: (MonadJSM m', MonadTrans t, m ~ t m') => JSM a -> m a+    liftJSM' = lift . (liftJSM' :: MonadJSM m' => JSM a -> m' a)+    {-# INLINE liftJSM' #-}++instance MonadJSM JSM where+    liftJSM' = id+    {-# INLINE liftJSM' #-}++instance (MonadJSM m) => MonadJSM (ContT r m) where+    liftJSM' = lift . liftJSM'+    {-# INLINE liftJSM' #-}++instance (MonadJSM m) => MonadJSM (ExceptT e m) where+    liftJSM' = lift . liftJSM'+    {-# INLINE liftJSM' #-}++instance (MonadJSM m) => MonadJSM (IdentityT m) where+    liftJSM' = lift . liftJSM'+    {-# INLINE liftJSM' #-}++instance (MonadJSM m) => MonadJSM (MaybeT m) where+    liftJSM' = lift . liftJSM'+    {-# INLINE liftJSM' #-}++instance (MonadJSM m) => MonadJSM (ReaderT r m) where+    liftJSM' = lift . liftJSM'+    {-# INLINE liftJSM' #-}++instance (Monoid w, MonadJSM m) => MonadJSM (Lazy.RWST r w s m) where+    liftJSM' = lift . liftJSM'+    {-# INLINE liftJSM' #-}++instance (Monoid w, MonadJSM m) => MonadJSM (Strict.RWST r w s m) where+    liftJSM' = lift . liftJSM'+    {-# INLINE liftJSM' #-}++instance (MonadJSM m) => MonadJSM (Lazy.StateT s m) where+    liftJSM' = lift . liftJSM'+    {-# INLINE liftJSM' #-}++instance (MonadJSM m) => MonadJSM (Strict.StateT s m) where+    liftJSM' = lift . liftJSM'+    {-# INLINE liftJSM' #-}++instance (Monoid w, MonadJSM m) => MonadJSM (Lazy.WriterT w m) where+    liftJSM' = lift . liftJSM'+    {-# INLINE liftJSM' #-}++instance (Monoid w, MonadJSM m) => MonadJSM (Strict.WriterT w m) where+    liftJSM' = lift . liftJSM'+    {-# INLINE liftJSM' #-}++instance (m ~~ m', MonadJSM m') => MonadJSM (Codensity (m :: k -> TYPE rep)) where+    liftJSM' = lift . liftJSM'++instance MonadRef JSM where+    type Ref JSM = Ref IO+    newRef = liftIO . newRef+    readRef = liftIO . readRef+    writeRef r = liftIO . writeRef r++instance MonadAtomicRef JSM where+    atomicModifyRef r = liftIO . atomicModifyRef r+#endif++-- | The 'liftJSM' is to 'JSM' what 'liftIO' is to 'IO'.+--   When using GHCJS it is 'liftIO'.+liftJSM :: MonadJSM m => JSM a -> m a+#ifdef ghcjs_HOST_OS+liftJSM = liftIO+#else+liftJSM = liftJSM'+#endif+{-# INLINE liftJSM #-}++-- | Type used for Haskell functions called from JavaScript.+type JSCallAsFunction = JSVal      -- ^ Function object+                     -> JSVal      -- ^ this+                     -> [JSVal]    -- ^ Function arguments+                     -> JSM ()     -- ^ Only () (aka 'JSUndefined') can be returned because+                                   --   the function may need to be executed in a+                                   --   different thread.  If you need to get a+                                   --   value out pass in a continuation function+                                   --   as an argument and invoke it from haskell.++#ifndef ghcjs_HOST_OS++class IsJSVal a where+  jsval_ :: a -> GHCJSPure JSVal++  default jsval_ :: Coercible a JSVal => a -> GHCJSPure JSVal+  jsval_ = GHCJSPure . return . coerce+  {-# INLINE jsval_ #-}++jsval :: IsJSVal a => a -> GHCJSPure JSVal+jsval = jsval_+{-# INLINE jsval #-}++data MutabilityType s = Mutable_ s+                      | Immutable_ s+                      | STMutable s++type Mutable   = Mutable_ ()+type Immutable = Immutable_ ()++data IsItMutable = IsImmutable+                 | IsMutable++type family Mutability (a :: MutabilityType s) :: IsItMutable where+  Mutability Immutable     = IsImmutable+  Mutability Mutable       = IsMutable+  Mutability (STMutable s) = IsMutable++newtype SomeJSArray (m :: MutabilityType s) = SomeJSArray JSVal+  deriving (Typeable)+instance IsJSVal (SomeJSArray m)++-- | See 'JavaScript.Array.Internal.JSArray'+type JSArray        = SomeJSArray Immutable+-- | See 'JavaScript.Array.Internal.MutableJSArray'+type MutableJSArray = SomeJSArray Mutable++-- | See 'JavaScript.Array.Internal.STJSArray'+type STJSArray s    = SomeJSArray (STMutable s)++-- | See 'JavaScript.Object.Internal.Object'+newtype Object = Object JSVal++-- | See 'GHCJS.Nullable.Nullable'+newtype Nullable a = Nullable a++-- | Wrapper used when receiving a 'JSVal' from the JavaScript context+newtype JSValueReceived = JSValueReceived JSValueRef deriving(Show, ToJSON, FromJSON)++-- | Wrapper used when sending a 'JSVal' to the JavaScript context+newtype JSValueForSend = JSValueForSend JSValueRef deriving(Show, ToJSON, FromJSON, Generic)+instance NFData JSValueForSend++-- | Wrapper used when sending a 'Object' to the JavaScript context+newtype JSObjectForSend = JSObjectForSend JSValueForSend deriving(Show, ToJSON, FromJSON, Generic)+instance NFData JSObjectForSend++-- | Wrapper used when receiving a 'JSString' from the JavaScript context+newtype JSStringReceived = JSStringReceived Text deriving(Show, ToJSON, FromJSON)++-- | Wrapper used when sending a 'JString' to the JavaScript context+newtype JSStringForSend = JSStringForSend Text deriving(Show, ToJSON, FromJSON, Generic)+instance NFData JSStringForSend++-- | Command sent to a JavaScript context for execution asynchronously+data AsyncCommand = FreeRef Text JSValueForSend+                  | FreeRefs Text+                  | SetPropertyByName JSObjectForSend JSStringForSend JSValueForSend+                  | SetPropertyAtIndex JSObjectForSend Int JSValueForSend+                  | StringToValue JSStringForSend JSValueForSend+                  | NumberToValue Double JSValueForSend+                  | JSONValueToValue Value JSValueForSend+                  | GetPropertyByName JSObjectForSend JSStringForSend JSValueForSend+                  | GetPropertyAtIndex JSObjectForSend Int JSValueForSend+                  | CallAsFunction JSObjectForSend JSObjectForSend [JSValueForSend] JSValueForSend+                  | CallAsConstructor JSObjectForSend [JSValueForSend] JSValueForSend+                  | NewEmptyObject JSValueForSend+                  | NewAsyncCallback JSValueForSend+                  | NewSyncCallback JSValueForSend+                  | FreeCallback JSValueForSend+                  | NewArray [JSValueForSend] JSValueForSend+                  | EvaluateScript JSStringForSend JSValueForSend+                  | SyncWithAnimationFrame JSValueForSend+                  | StartSyncBlock+                  | EndSyncBlock+                   deriving (Show, Generic)++instance ToJSON AsyncCommand where+    toEncoding = genericToEncoding defaultOptions++instance FromJSON AsyncCommand++instance NFData AsyncCommand++-- | Command sent to a JavaScript context for execution synchronously+data Command = DeRefVal JSValueForSend+             | ValueToBool JSValueForSend+             | ValueToNumber JSValueForSend+             | ValueToString JSValueForSend+             | ValueToJSON JSValueForSend+             | ValueToJSONValue JSValueForSend+             | IsNull JSValueForSend+             | IsUndefined JSValueForSend+             | StrictEqual JSValueForSend JSValueForSend+             | InstanceOf JSValueForSend JSObjectForSend+             | PropertyNames JSObjectForSend+             | Sync+             deriving (Show, Generic)++instance ToJSON Command where+    toEncoding = genericToEncoding defaultOptions++instance FromJSON Command++instance NFData Command++-- | Batch of commands that can be sent together to the JavaScript context+data Batch = Batch [Either AsyncCommand Command] Bool Int+             deriving (Show, Generic)++instance ToJSON Batch where+    toEncoding = genericToEncoding defaultOptions++instance FromJSON Batch++instance NFData Batch++-- | Result of a 'Command' returned from the JavaScript context+data Result = DeRefValResult JSValueRef Text+            | ValueToBoolResult Bool+            | ValueToNumberResult Double+            | ValueToStringResult JSStringReceived+            | ValueToJSONResult JSStringReceived+            | ValueToJSONValueResult Value+            | IsNullResult Bool+            | IsUndefinedResult Bool+            | StrictEqualResult Bool+            | InstanceOfResult Bool+            | PropertyNamesResult [JSStringReceived]+            | ThrowJSValue JSValueReceived+            | SyncResult+            deriving (Show, Generic)++instance ToJSON Result where+    toEncoding = genericToEncoding defaultOptions++instance FromJSON Result++data BatchResults = Success [JSValueReceived] [Result]+                  | Failure [JSValueReceived] [Result] JSValueReceived String+             deriving (Show, Generic)++instance ToJSON BatchResults where+    toEncoding = genericToEncoding defaultOptions++instance FromJSON BatchResults++data Results = BatchResults Int BatchResults+             | Duplicate Int Int+             | Callback Int BatchResults JSValueReceived JSValueReceived JSValueReceived [JSValueReceived]+             | ProtocolError Text+             deriving (Show, Generic)++instance ToJSON Results where+    toEncoding = genericToEncoding defaultOptions++instance FromJSON Results+#endif++-- | Like HasCallStack, but only when jsaddle cabal flag check-unchecked is set+#if MIN_VERSION_base(4,9,0) && defined(CHECK_UNCHECKED)+type JSaddleHasCallStack = HasCallStack+#else+type JSaddleHasCallStack = (() :: Constraint)+#endif  
src/Language/Javascript/JSaddle/Value.hs view
@@ -5,6 +5,7 @@ {-# LANGUAGE LambdaCase #-} #ifdef ghcjs_HOST_OS {-# LANGUAGE ForeignFunctionInterface, JavaScriptFFI #-}+{-# OPTIONS_GHC -Wno-dodgy-exports -Wno-dodgy-imports #-} #endif {-# OPTIONS_GHC -fno-warn-orphans #-} -----------------------------------------------------------------------------@@ -44,6 +45,7 @@   , showJSValue    -- * Converting JavaScript values+  , isTruthy   , valToBool   , valToNumber   , valToStr@@ -53,15 +55,24 @@    -- * Make JavaScript values from Haskell ones   , val-  , valMakeNull+  , jsNull+  , valNull+  , isNull   , valIsNull-  , valMakeUndefined+  , jsUndefined+  , valUndefined+  , isUndefined   , valIsUndefined   , maybeNullOrUndefined   , maybeNullOrUndefined'-  , valMakeBool+  , toJSBool+  , jsTrue+  , jsFalse+  , valBool   , valMakeNumber   , valMakeString+  , valMakeText+  , valMakeJSON    -- * Convert to and from JSValue   , deRefVal@@ -70,48 +81,40 @@   , instanceOf ) where -import Control.Applicative-import Prelude hiding (catch)-import Language.Javascript.JSaddle.Types-       (Object(..), JSString, JSVal)+import Data.Text (Text)+import qualified Data.Text as T (pack, unpack)+import Data.Aeson (Value)+import Data.JSString.Text (textToJSString)+ #ifdef ghcjs_HOST_OS import Language.Javascript.JSaddle.Types-       (MutableJSArray)-import GHCJS.Types (JSVal(..), isNull, isUndefined)-import GHCJS.Foreign (toJSBool, isTruthy, jsNull, jsUndefined)-import qualified GHCJS.Marshal as GHCJS (toJSVal)-import GHCJS.Marshal.Pure (pToJSVal)-import Data.JSString.Text (textToJSString)+       (Object(..), JSString(..), JSVal(..), ghcjsPure)+import GHCJS.Marshal (ToJSVal(..)) #else-import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef-       (jsvalueisinstanceofconstructor, jsvaluecreatejsonstring,-        JSType(..), jsvaluegettype, jsvaluemakestring, jsvaluemakenumber,-        jsvaluemakeboolean, jsvaluemakeundefined, jsvaluemakenull,-        jsvaluetoobject, jsvaluetostringcopy, jsvaluetonumber,-        jsvaluetoboolean, jsvalueisnull, jsvalueisundefined,-        jsvalueisstrictequal)+import Data.Char (chr, ord)+import Data.Word (Word, Word8, Word16, Word32)+import Data.Int (Int8, Int16, Int32)+import GHCJS.Marshal.Internal (ToJSVal(..), FromJSVal(..))+import Language.Javascript.JSaddle.Types+       (Object(..), JSString(..), JSVal(..), ghcjsPure) import Language.Javascript.JSaddle.Native-       (makeNewJSVal, wrapJSString, withJSVal, withObject, withJSString,-        withToJSVal)+       (valueToNumber, valueToString, valueToJSON, numberToValue, stringToValue, jsonValueToValue)+import qualified Language.Javascript.JSaddle.Native as N+       (deRefVal, strictEqual, instanceOf)+import Language.Javascript.JSaddle.Run (Result(..)) #endif import Language.Javascript.JSaddle.Monad (JSM)-import Language.Javascript.JSaddle.Exception (rethrow)-import Control.Monad.Trans.Reader (ask)-import Control.Monad.IO.Class (MonadIO(..))-import Data.Text (Text)-import qualified Data.Text as T (pack) import Language.Javascript.JSaddle.Classes-       (MakeObject(..), ToJSString(..), ToJSVal(..))+       (MakeObject(..), MakeArgs(..))+import Language.Javascript.JSaddle.Marshal.String (ToJSString(..), FromJSString(..)) import Language.Javascript.JSaddle.String (strToText, textToStr)-import Language.Javascript.JSaddle.Arguments (MakeArgs(..))-import Data.Word (Word32, Word, Word64)-import Data.Int (Int32, Int64)+import GHCJS.Foreign.Internal (jsTrue, jsFalse, jsNull, toJSBool, jsUndefined, isTruthy, isNull, isUndefined)  -- $setup -- >>> import Language.Javascript.JSaddle.Test (testJSaddle) -- >>> import Language.Javascript.JSaddle.Monad (catch) -- >>> import Language.Javascript.JSaddle.Exception (JSException(..))--- >>> import Language.Javascript.JSaddle.Object (obj)+-- >>> import Language.Javascript.JSaddle.Object (obj, jsg) -- >>> import qualified Data.Text as T (pack)  data JSNull      = JSNull -- ^ Type that represents a value that can only be null.@@ -162,14 +165,7 @@ -- >>> testJSaddle $ valToBool "1" -- true valToBool :: ToJSVal value => value -> JSM Bool-#ifdef ghcjs_HOST_OS-valToBool value = isTruthy <$> toJSVal value-#else-valToBool value = do-    gctxt <- ask-    withToJSVal value $ \rval ->-        liftIO $ jsvaluetoboolean gctxt rval-#endif+valToBool value = toJSVal value >>= ghcjsPure . isTruthy  -- | Given a JavaScript value get its numeric value. --   May throw JSException.@@ -193,43 +189,49 @@ valToNumber :: ToJSVal value => value -> JSM Double #ifdef ghcjs_HOST_OS valToNumber value = jsrefToNumber <$> toJSVal value-foreign import javascript unsafe "$r = Number($1);" jsrefToNumber :: JSVal -> Double+foreign import javascript unsafe+#if __GLASGOW_HASKELL__ >= 900+  "(($1) => { return Number($1); })" #else-valToNumber value = do-    gctxt <- ask-    withToJSVal value $ \rval ->-        rethrow $ liftIO . jsvaluetonumber gctxt rval+  "$r = Number($1);" #endif+     jsrefToNumber :: JSVal -> Double+#else+valToNumber value = toJSVal value >>= valueToNumber+#endif  -- | Given a JavaScript value get its string value (as a JavaScript string). --   May throw JSException. ----- >>> testJSaddle $ valToStr JSNull >>= strToText+-- >>> testJSaddle $ strToText <$> valToStr JSNull -- null--- >>> testJSaddle $ valToStr () >>= strToText+-- >>> testJSaddle $ strToText <$> valToStr () -- undefined--- >>> testJSaddle $ valToStr True >>= strToText+-- >>> testJSaddle $ strToText <$> valToStr True -- true--- >>> testJSaddle $ valToStr False >>= strToText+-- >>> testJSaddle $ strToText <$> valToStr False -- false--- >>> testJSaddle $ valToStr (1.0 :: Double) >>= strToText+-- >>> testJSaddle $ strToText <$> valToStr (1.0 :: Double) -- 1--- >>> testJSaddle $ valToStr (0.0 :: Double) >>= strToText+-- >>> testJSaddle $ strToText <$> valToStr (0.0 :: Double) -- 0--- >>> testJSaddle $ valToStr "" >>= strToText+-- >>> testJSaddle $ strToText <$> valToStr "" -- <BLANKLINE>--- >>> testJSaddle $ valToStr "1" >>= strToText+-- >>> testJSaddle $ strToText <$> valToStr "1" -- 1 valToStr :: ToJSVal value => value -> JSM JSString #ifdef ghcjs_HOST_OS valToStr value = jsrefToString <$> toJSVal value-foreign import javascript unsafe "$r = $1.toString();" jsrefToString :: JSVal -> JSString+foreign import javascript unsafe+#if __GLASGOW_HASKELL__ >= 900+  "(($1) => { return $1.toString(); })" #else-valToStr value = do-    gctxt <- ask-    withToJSVal value $ \rval ->-        rethrow (liftIO . jsvaluetostringcopy gctxt rval) >>= wrapJSString+  "$r = $1.toString();" #endif+    jsrefToString :: JSVal -> JSString+#else+valToStr value = toJSVal value >>= valueToString+#endif  -- | Given a JavaScript value get its string value (as a Haskell 'Text'). --   May throw JSException.@@ -251,47 +253,50 @@ -- >>> testJSaddle $ show <$> valToText "1" -- "1" valToText :: ToJSVal value => value -> JSM Text-valToText jsvar = valToStr jsvar >>= strToText+valToText jsvar = strToText <$> valToStr jsvar  -- | Given a JavaScript value get a JSON string value. --   May throw JSException. ----- >>> testJSaddle $ valToJSON 0 JSNull >>= strToText+-- >>> testJSaddle $ strToText <$> valToJSON JSNull -- null--- >>> testJSaddle $ valToJSON 0 () >>= strToText+-- >>> testJSaddle $ strToText <$> valToJSON () -- <BLANKLINE>--- >>> testJSaddle $ valToJSON 0 True >>= strToText+-- >>> testJSaddle $ strToText <$> valToJSON True -- true--- >>> testJSaddle $ valToJSON 0 False >>= strToText+-- >>> testJSaddle $ strToText <$> valToJSON False -- false--- >>> testJSaddle $ valToJSON 0 (1.0 :: Double) >>= strToText+-- >>> testJSaddle $ strToText <$> valToJSON (1.0 :: Double) -- 1--- >>> testJSaddle $ valToJSON 0 (0.0 :: Double) >>= strToText+-- >>> testJSaddle $ strToText <$> valToJSON (0.0 :: Double) -- 0--- >>> testJSaddle $ valToJSON 0 "" >>= strToText+-- >>> testJSaddle $ strToText <$> valToJSON "" -- ""--- >>> testJSaddle $ valToJSON 0 "1" >>= strToText+-- >>> testJSaddle $ strToText <$> valToJSON "1" -- "1"--- >>> testJSaddle $ obj >>= valToJSON 0 >>= strToText+-- >>> testJSaddle $ strToText <$> (obj >>= valToJSON) -- {}-valToJSON :: ToJSVal value => Word -> value -> JSM JSString+valToJSON :: ToJSVal value => value -> JSM JSString #ifdef ghcjs_HOST_OS-valToJSON indent value = jsrefToJSON <$> toJSVal value-foreign import javascript unsafe "$r = JSON.stringify($1);" jsrefToJSON :: JSVal -> JSString+valToJSON value = jsrefToJSON <$> toJSVal value+foreign import javascript unsafe+#if __GLASGOW_HASKELL__ >= 900+  "(($1) => { return $1 === undefined ? \"\" : JSON.stringify($1); })" #else-valToJSON indent value = do-    gctxt <- ask-    withToJSVal value $ \rval ->-        rethrow (liftIO . jsvaluecreatejsonstring gctxt rval (fromIntegral indent)) >>= wrapJSString+  "$r = $1 === undefined ? \"\" : JSON.stringify($1);" #endif+    jsrefToJSON :: JSVal -> JSString+#else+valToJSON value = toJSVal value >>= valueToJSON+#endif  -- | Given a JavaScript value get its object value. --   May throw JSException. -- -- >>> testJSaddle $ (valToObject JSNull >>= valToText) `catch` \ (JSException e) -> valToText e--- TypeError:...null...is not an object+-- null -- >>> testJSaddle $ (valToObject () >>= valToText) `catch` \ (JSException e) -> valToText e--- TypeError:...undefined...is not an object+-- undefined -- >>> testJSaddle $ valToObject True -- true -- >>> testJSaddle $ valToObject False@@ -305,27 +310,26 @@ -- >>> testJSaddle $ valToObject "1" -- 1 valToObject :: ToJSVal value => value -> JSM Object-valToObject value = Object <$>-#ifdef ghcjs_HOST_OS-    toJSVal value-#else- do gctxt <- ask-    withToJSVal value $ \rval ->-        rethrow (liftIO . jsvaluetoobject gctxt rval) >>= makeNewJSVal-#endif+valToObject value = Object <$> toJSVal value  instance MakeObject JSVal where-    makeObject = valToObject+    makeObject = return . Object +instance ToJSVal Object where+    toJSVal (Object r) = return r+ -- | Convert to a JavaScript value (just an alias for 'toJSVal') val :: ToJSVal value     => value          -- ^ value to convert to a JavaScript value     -> JSM JSVal val = toJSVal +#ifndef ghcjs_HOST_OS -- | If we already have a JSVal we are fine instance ToJSVal JSVal where     toJSVal = return+    {-# INLINE toJSVal #-}+#endif  -- | A single JSVal can be used as the argument list instance MakeArgs JSVal where@@ -335,52 +339,68 @@ --   as it returns something we can make into a JSVal. instance ToJSVal v => ToJSVal (JSM v) where     toJSVal v = v >>= toJSVal+    {-# INLINE toJSVal #-}  ----------- null ------------------ | Make a @null@ JavaScript value-valMakeNull :: JSM JSVal-#ifdef ghcjs_HOST_OS-valMakeNull = return jsNull-#else-valMakeNull = ask >>= (liftIO . jsvaluemakenull) >>= makeNewJSVal-#endif+-- | A @null@ JavaScript value+valNull :: JSVal+valNull = jsNull+{-# INLINE valNull #-}  -- | Makes a @null@ JavaScript value instance ToJSVal JSNull where-    toJSVal = const valMakeNull+    toJSVal = const (return jsNull)+    {-# INLINE toJSVal #-}  -- | Makes an argument list with just a single @null@ JavaScript value instance MakeArgs JSNull where-    makeArgs _ = valMakeNull >>= (\ref -> return [ref])+    makeArgs _ = return [jsNull] +#ifndef ghcjs_HOST_OS -- | Makes a JSVal or @null@ JavaScript value instance ToJSVal a => ToJSVal (Maybe a) where-    toJSVal Nothing = valMakeNull+    toJSVal Nothing = return jsNull     toJSVal (Just a) = toJSVal a+    {-# INLINE toJSVal #-}+instance FromJSVal a => FromJSVal (Maybe a) where+    fromJSValUnchecked x =+        ghcjsPure (isUndefined x) >>= \case+            True  -> return Nothing+            False -> ghcjsPure (isNull x) >>= \case+                    True  -> return Nothing+                    False -> fromJSVal x+    {-# INLINE fromJSValUnchecked #-}+    fromJSVal x =+        ghcjsPure (isUndefined x) >>= \case+            True  -> return (Just Nothing)+            False -> ghcjsPure (isNull x) >>= \case+                    True  -> return (Just Nothing)+                    False -> fmap (fmap Just) fromJSVal x+    {-# INLINE fromJSVal #-} +-- Make an array out of various lists+instance ToJSVal a => ToJSVal [a] where+    toJSVal = toJSValListOf+    {-# INLINE toJSVal #-}++instance FromJSVal a => FromJSVal [a] where+    fromJSVal = fromJSValListOf+    {-# INLINE fromJSVal #-}+#endif+ -- | Test a JavaScript value to see if it is @null@ valIsNull :: ToJSVal value => value -> JSM Bool-#ifdef ghcjs_HOST_OS-valIsNull value = isNull <$> toJSVal value-#else-valIsNull value = do-    gctxt <- ask-    withToJSVal value $ \rval ->-        liftIO $ jsvalueisnull gctxt rval-#endif+valIsNull value = toJSVal value >>= ghcjsPure . isNull  ----------- undefined ------------------ | Make an @undefined@ JavaScript value-valMakeUndefined :: JSM JSVal-#ifdef ghcjs_HOST_OS-valMakeUndefined = return jsUndefined-#else-valMakeUndefined = ask >>= (liftIO . jsvaluemakeundefined) >>= makeNewJSVal-#endif+-- | An @undefined@ JavaScript value+valUndefined :: JSVal+valUndefined = jsUndefined+{-# INLINE valUndefined #-}  -- | Makes an @undefined@ JavaScript value instance ToJSVal JSUndefined where-    toJSVal = const valMakeUndefined+    toJSVal = const (return jsUndefined)  --We can't allow this if JSUndefined is () as () is no args not "(null)". --Use [()] instead.@@ -393,132 +413,136 @@  -- | Test a JavaScript value to see if it is @undefined@ valIsUndefined :: ToJSVal value => value -> JSM Bool-#ifdef ghcjs_HOST_OS-valIsUndefined value = isUndefined <$> toJSVal value-#else-valIsUndefined value = do-    gctxt <- ask-    withToJSVal value $ \rval ->-        liftIO $ jsvalueisundefined gctxt rval-#endif+valIsUndefined value = toJSVal value >>= ghcjsPure . isUndefined  -- | Convert a JSVal to a Maybe JSVal (converting null and undefined to Nothing) maybeNullOrUndefined :: ToJSVal value => value -> JSM (Maybe JSVal) maybeNullOrUndefined value = do     rval <- toJSVal value-    valIsNull rval >>= \case+    ghcjsPure (isNull rval) >>= \case         True -> return Nothing         _    ->-            valIsUndefined rval >>= \case+            ghcjsPure (isUndefined rval) >>= \case                 True -> return Nothing                 _    -> return (Just rval)  maybeNullOrUndefined' :: ToJSVal value => (JSVal -> JSM a) -> value -> JSM (Maybe a) maybeNullOrUndefined' f value = do     rval <- toJSVal value-    valIsNull rval >>= \case+    ghcjsPure (isNull rval) >>= \case         True -> return Nothing         _    ->-            valIsUndefined rval >>= \case+            ghcjsPure (isUndefined rval) >>= \case                 True -> return Nothing                 _    -> Just <$> f rval  ----------- booleans ------------------ | Make a JavaScript boolean value-valMakeBool :: Bool -> JSM JSVal-#ifdef ghcjs_HOST_OS-valMakeBool b = return  $ toJSBool b-#else-valMakeBool b = do-    gctxt <- ask-    liftIO (jsvaluemakeboolean gctxt b) >>= makeNewJSVal-#endif+-- | A JavaScript boolean value+valBool :: Bool -> JSVal+valBool = toJSBool+{-# INLINE valBool #-} +#ifndef ghcjs_HOST_OS -- | Make a JavaScript boolean value instance ToJSVal Bool where-    toJSVal = valMakeBool+    toJSVal = return . valBool+    {-# INLINE toJSVal #-}+#endif  -- | Makes an argument list with just a single JavaScript boolean value instance MakeArgs Bool where-    makeArgs b = valMakeBool b >>= (\ref -> return [ref])+    makeArgs b = return [valBool b]  ----------- numbers --------------- -- | Make a JavaScript number valMakeNumber :: Double -> JSM JSVal-#ifdef ghcjs_HOST_OS-valMakeNumber n = liftIO $ GHCJS.toJSVal n-#else-valMakeNumber n = do-    gctxt <- ask-    liftIO (jsvaluemakenumber gctxt n) >>= makeNewJSVal-#endif+valMakeNumber = toJSVal+{-# INLINE valMakeNumber #-} +#ifndef ghcjs_HOST_OS -- | Makes a JavaScript number instance ToJSVal Double where-    toJSVal = valMakeNumber+    toJSVal = numberToValue+    {-# INLINE toJSVal #-}  instance ToJSVal Float where-    toJSVal = valMakeNumber . realToFrac+    toJSVal = numberToValue . realToFrac+    {-# INLINE toJSVal #-}  instance ToJSVal Word where-    toJSVal = valMakeNumber . fromIntegral+    toJSVal = numberToValue . fromIntegral+    {-# INLINE toJSVal #-} -instance ToJSVal Word32 where-    toJSVal = valMakeNumber . fromIntegral+instance ToJSVal Word8 where+    toJSVal = numberToValue . fromIntegral+    {-# INLINE toJSVal #-} -instance ToJSVal Word64 where-    toJSVal = valMakeNumber . fromIntegral+instance ToJSVal Word16 where+    toJSVal = numberToValue . fromIntegral+    {-# INLINE toJSVal #-} +instance ToJSVal Word32 where+    toJSVal = numberToValue . fromIntegral+    {-# INLINE toJSVal #-}+ instance ToJSVal Int where-    toJSVal = valMakeNumber . fromIntegral+    toJSVal = numberToValue . fromIntegral+    {-# INLINE toJSVal #-} -instance ToJSVal Int32 where-    toJSVal = valMakeNumber . fromIntegral+instance ToJSVal Int8 where+    toJSVal = numberToValue . fromIntegral+    {-# INLINE toJSVal #-} -instance ToJSVal Int64 where-    toJSVal = valMakeNumber . fromIntegral+instance ToJSVal Int16 where+    toJSVal = numberToValue . fromIntegral+    {-# INLINE toJSVal #-} +instance ToJSVal Int32 where+    toJSVal = numberToValue . fromIntegral+    {-# INLINE toJSVal #-}+#endif+ -- | Makes an argument list with just a single JavaScript number instance MakeArgs Double where     makeArgs n = valMakeNumber n >>= (\ref -> return [ref])  -- | Make a JavaScript string from `Text` valMakeText :: Text -> JSM JSVal-#ifdef ghcjs_HOST_OS-valMakeText = return . pToJSVal . textToJSString-#else-valMakeText text = do-    gctxt <- ask-    withJSString (textToStr text) $ \s ->-        liftIO (jsvaluemakestring gctxt s) >>= makeNewJSVal-#endif+valMakeText = toJSVal . textToJSString+{-# INLINE valMakeText #-}  -- | Make a JavaScript string from `JSString` valMakeString :: JSString -> JSM JSVal-#ifdef ghcjs_HOST_OS-valMakeString = return . pToJSVal-#else-valMakeString str = do-    gctxt <- ask-    withJSString str $ \s ->-        liftIO (jsvaluemakestring gctxt s) >>= makeNewJSVal-#endif+valMakeString = toJSVal+{-# INLINE valMakeString #-} +#ifndef ghcjs_HOST_OS -- | Makes a JavaScript string instance ToJSVal Text where-    toJSVal = valMakeText+    toJSVal = stringToValue . JSString+    {-# INLINE toJSVal #-}+instance FromJSVal Text where+    fromJSValUnchecked = valToText+    {-# INLINE fromJSValUnchecked #-}+    fromJSVal = fmap Just . valToText+    {-# INLINE fromJSVal #-}+#endif  -- | Makes an argument list with just a single JavaScript string instance MakeArgs Text where     makeArgs t = valMakeText t >>= (\ref -> return [ref]) --- | Makes a JavaScript string-instance ToJSVal String where-    toJSVal = valMakeText . T.pack-+#ifndef ghcjs_HOST_OS -- | Makes a JavaScript string instance ToJSVal JSString where-    toJSVal = valMakeString+    toJSVal = stringToValue+    {-# INLINE toJSVal #-}+instance FromJSVal JSString where+    fromJSValUnchecked = valToStr+    {-# INLINE fromJSValUnchecked #-}+    fromJSVal = fmap Just . valToStr+    {-# INLINE fromJSVal #-}+#endif  -- | If we already have a JSString we are fine instance ToJSString JSString where@@ -530,6 +554,47 @@ instance ToJSString String where     toJSString = textToStr . T.pack +instance FromJSString Text where+    fromJSString = strToText++instance FromJSString String where+    fromJSString v = T.unpack $ strToText v++instance FromJSString JSString where+    fromJSString = id++#ifndef ghcjs_HOST_OS+instance ToJSVal Char where+    toJSVal = valMakeNumber . fromIntegral . ord+    {-# INLINE toJSVal #-}+    toJSValListOf = valMakeText . T.pack+    {-# INLINE toJSValListOf #-}+instance FromJSVal Char where+    fromJSValUnchecked = fmap (chr . round) . valToNumber+    {-# INLINE fromJSValUnchecked #-}+    fromJSVal = fmap (Just . chr . round) . valToNumber+    {-# INLINE fromJSVal #-}+    fromJSValUncheckedListOf = fmap (T.unpack . strToText) . valToStr+    {-# INLINE fromJSValListOf #-}+    fromJSValListOf = fmap (Just . T.unpack . strToText) . valToStr+    {-# INLINE fromJSValUncheckedListOf #-}+#endif++-- | Make a JavaScript string from AESON `Value`+valMakeJSON :: Value -> JSM JSVal+valMakeJSON = toJSVal++#ifndef ghcjs_HOST_OS+-- | Makes a JSON value+instance ToJSVal Value where+    toJSVal = jsonValueToValue+    {-# INLINE toJSVal #-}+#endif++-- | Makes an argument list with just a single JSON value+instance MakeArgs Value where+    makeArgs t = valMakeJSON t >>= (\ref -> return [ref])+ -- | Derefernce a value reference. -- -- >>> testJSaddle $ showJSValue <$> deRefVal JSNull@@ -549,6 +614,8 @@ -- >>> testJSaddle $ showJSValue <$> deRefVal "1" -- "1" -- >>> testJSaddle $ showJSValue <$> (valToObject True >>= deRefVal)+-- true+-- >>> testJSaddle $ showJSValue <$> (obj >>= deRefVal) -- object deRefVal :: ToJSVal value => value -> JSM JSValue #ifdef ghcjs_HOST_OS@@ -561,24 +628,37 @@         3 -> ValNumber <$> valToNumber valref         4 -> ValString <$> valToText valref         5 -> ValObject <$> valToObject valref-foreign import javascript unsafe "$r = ($1 === undefined)?0:\-                                       ($1===null)?1:\-                                       (typeof $1===\"boolean\")?2:\-                                       (typeof $1===\"number\")?3:\-                                       (typeof $1===\"string\")?4:\-                                       (typeof $1===\"object\")?5:-1;" jsrefGetType :: JSVal -> Int+        _ -> error "Unexpected result dereferencing JSaddle value"+foreign import javascript unsafe+#if __GLASGOW_HASKELL__ >= 900+  "(($1) => { return ($1 === undefined)?0:\+                     ($1===null)?1:\+                     (typeof $1===\"boolean\")?2:\+                     (typeof $1===\"number\")?3:\+                     (typeof $1===\"string\")?4:\+                     (typeof $1===\"object\")?5:-1; })" #else+  "$r = ($1 === undefined)?0:\+        ($1===null)?1:\+        (typeof $1===\"boolean\")?2:\+        (typeof $1===\"number\")?3:\+        (typeof $1===\"string\")?4:\+        (typeof $1===\"object\")?5:-1;"+#endif+    jsrefGetType :: JSVal -> Int+#else deRefVal value = do-    gctxt <- ask     v <- toJSVal value-    withJSVal v $ \rval ->-        liftIO (jsvaluegettype gctxt rval) >>= \case-            Kjstypenull      -> return ValNull-            Kjstypeundefined -> return ValUndefined-            Kjstypeboolean   -> ValBool   <$> valToBool v-            Kjstypenumber    -> ValNumber <$> valToNumber v-            Kjstypestring    -> ValString <$> valToText v-            Kjstypeobject    -> ValObject <$> valToObject v+    result <- N.deRefVal v+    return $ case result of+        DeRefValResult 0    _ -> ValNull+        DeRefValResult 1    _ -> ValUndefined+        DeRefValResult 2    _ -> ValBool False+        DeRefValResult 3    _ -> ValBool True+        DeRefValResult (-1) s -> ValNumber (read (T.unpack s))+        DeRefValResult (-2) s -> ValString s+        DeRefValResult (-3) _ -> ValObject (Object v)+        _                     -> error "Unexpected result dereferencing JSaddle value" #endif  -- | Make a JavaScript value out of a 'JSValue' ADT.@@ -596,9 +676,9 @@ valMakeRef :: JSValue -> JSM JSVal valMakeRef value =     case value of-        ValNull              -> valMakeNull-        ValUndefined         -> valMakeUndefined-        ValBool b            -> valMakeBool b+        ValNull              -> return valNull+        ValUndefined         -> return valUndefined+        ValBool b            -> return $ valBool b         ValNumber n          -> valMakeNumber n         ValString s          -> valMakeText s         ValObject (Object o) -> return o@@ -606,6 +686,7 @@ -- | Makes a JavaScript value from a 'JSValue' ADT. instance ToJSVal JSValue where     toJSVal = valMakeRef+    {-# INLINE toJSVal #-}  -- | Makes an argument list with just a single JavaScript value from a 'JSValue' ADT. instance MakeArgs JSValue where@@ -617,9 +698,23 @@  #ifdef ghcjs_HOST_OS foreign import javascript unsafe-  "$1===$2" jsvalueisstrictequal :: JSVal -> JSVal -> Bool+#if __GLASGOW_HASKELL__ >= 900+  "(($1,$2) => { return $1===$2; })"+#else+  "$1===$2" #endif+    jsvalueisstrictequal :: JSVal -> JSVal -> Bool+#endif +-- | Determine if two values are equal (JavaScripts ===)+-- >>> testJSaddle $ strictEqual True False+-- false+-- >>> testJSaddle $ strictEqual True True+-- true+-- >>> testJSaddle $ strictEqual "Hello" ()+-- false+-- >>> testJSaddle $ strictEqual "Hello" "Hello"+-- true strictEqual :: (ToJSVal a, ToJSVal b) => a -> b -> JSM Bool strictEqual a b = do     aval <- toJSVal a@@ -627,36 +722,31 @@ #ifdef ghcjs_HOST_OS     return $ jsvalueisstrictequal aval bval #else-    gctxt <- ask-    withJSVal aval $ \aref ->-        withJSVal bval $ \bref ->-            liftIO $ jsvalueisstrictequal gctxt aref bref+    N.strictEqual aval bval #endif  #ifdef ghcjs_HOST_OS-foreign import javascript unsafe "\-    try {\-        $r = $1 instanceof $2\-    }\-    catch(e) {\-        $3[0] = e;\-    }"-  js_isInstanceOf :: JSVal -> Object -> MutableJSArray -> Bool+foreign import javascript unsafe+#if __GLASGOW_HASKELL__ >= 900+  "(($1,$2) => { return $1 instanceof $2; })"+#else+  "$1 instanceof $2" #endif+  js_isInstanceOf :: JSVal -> Object -> Bool+#endif +-- | Determine if two values are equal (JavaScripts ===)+-- >>> testJSaddle $ instanceOf obj (Object <$> jsg "Object")+-- true instanceOf :: (ToJSVal value, MakeObject constructor) => value -> constructor -> JSM Bool instanceOf value constructor = do     v <- toJSVal value     c <- makeObject constructor #ifdef ghcjs_HOST_OS-    rethrow $ return . js_isInstanceOf v c+    return $ js_isInstanceOf v c #else-    gctxt <- ask-    withJSVal v $ \rval ->-        withObject c $ \c' ->-            rethrow $ liftIO . jsvalueisinstanceofconstructor gctxt rval c'+    N.instanceOf v c #endif-   
− tests/DocTest.hs
@@ -1,35 +0,0 @@-{-# LANGUAGE CPP #-}-module Main (-    main-) where--import Test.DocTest--main :: IO ()-main = doctest [-    "-hide-all-packages",-    "-package=webkitgtk3-javascriptcore-" ++ VERSION_webkitgtk3_javascriptcore,-    "-package=template-haskell-" ++ VERSION_template_haskell,-    "-package=base-" ++ VERSION_base,-    "-package=lens-" ++ VERSION_lens,-    "-package=text-" ++ VERSION_text,-    "-package=transformers-" ++ VERSION_transformers,-    "-package=haskell-gi-base-" ++ VERSION_haskell_gi_base,-    "-package=gi-glib-" ++ VERSION_gi_glib,-    "-package=gi-gtk-" ++ VERSION_gi_gtk,-    "-package=gi-webkit-" ++ VERSION_gi_webkit,-    "-package=gi-javascriptcore-" ++ VERSION_gi_javascriptcore,-    "-isrc",-    "src/Language/Javascript/JSaddle/Arguments.hs",-    "src/Language/Javascript/JSaddle/Classes.hs",-    "src/Language/Javascript/JSaddle/Evaluate.hs",-    "src/Language/Javascript/JSaddle/Exception.hs",-    "src/Language/Javascript/JSaddle/Monad.hs",-    "src/Language/Javascript/JSaddle/Native.hs",-    "src/Language/Javascript/JSaddle/Object.hs",-    "src/Language/Javascript/JSaddle/Properties.hs",-    "src/Language/Javascript/JSaddle/String.hs",-    "src/Language/Javascript/JSaddle/Test.hs",-    "src/Language/Javascript/JSaddle/Types.hs",-    "src/Language/Javascript/JSaddle/Value.hs" ]-