on 33cfd89 help sign in
39 files changed+1322−1503
since splitsnapshots
unifiedsplit
.gitignore−1 .hgtags−9 Data/Text.hs+76−81 Data/Text/Array.hs+4−5 Data/Text/Encoding.hs+20−9 Data/Text/Encoding/Error.hs+1−3 Data/Text/Internal/Builder.hs+2−17 Data/Text/Internal/Builder/Functions.hs+1−2 Data/Text/Internal/Builder/Int/Digits.hs+1−1 Data/Text/Internal/Fusion.hs+24−34 Data/Text/Internal/Fusion/CaseMapping.hs−842 Data/Text/Internal/Fusion/Common.hs+117−72 Data/Text/Internal/Fusion/Types.hs+13−8 Data/Text/Internal/Read.hs+3−3 Data/Text/Lazy.hs+12−76 Data/Text/Lazy/Builder.hs+1−1 Data/Text/Lazy/Builder/Int.hs+4−4 Data/Text/Lazy/Encoding.hs+18−7 Data/Text/Lazy/Read.hs+2−4 Data/Text/Read.hs+1−1 Data/Text/Show.hs−89 benchmarks/haskell/Benchmarks.hs+1−1 benchmarks/haskell/Benchmarks/Pure.hs−7 benchmarks/haskell/Benchmarks/ReadNumbers.hs+5−2 benchmarks/haskell/Benchmarks/Stream.hs+5−16 benchmarks/text-benchmarks.cabal+4−14 cbits/case_mapping.c+852 cbits/cbits.c+94 changelog.md+3−75 scripts/Arsec.hs+17−4 scripts/CaseFolding.hs+11−7 scripts/CaseMapping.hs+10−9 scripts/SpecialCasing.hs+10−7 tests/LiteralRuleTest.hs−21 tests/Makefile+1−6 tests/Tests/Properties.hs−6 tests/literal-rule-test.sh−29 tests/text-tests.cabal+1−3 text.cabal+8−27
.gitignore−1
@@ -1,3 +1,2 @@
11dist
22cabal-dev
3−cabal.sandbox.config
.hgtags−9
@@ -50,17 +50,8 @@ d99cd091cdf71ce807a4255f6cc509c3154f51ea 0.11.3.1
5050fb7299f22449750c653ac64dee4bd63c13ea6e4c 1.1.1.1
5151eb170cb533b63534d166b5fd5344b36676adf140 1.1.1.2
5252e749e05f715d02445803f653cd3d97d5395d7c6f 1.1.1.3
53−b0dff8ca1142595bab489a768ca62e6a6805aac4 1.1.1.4
5453f8a60279237c1c28e094868740d9188dd94fcc9e 1.2.0.0
55546231451979b2d33e28038b75f2dab19c9731f5c3 1.2.0.1
565599a3503b4ad001fc1894e90286e96d7dea1e9195 1.2.0.2
575647f138edf15576b9adaeed64784e30811099f202 1.2.0.3
58570b064b0c69106bbcd13cb0099e72ae5fa2347bf0 1.2.0.4
59−8bbb3e222a0037035d893f731b0a23be449f7346 1.2.0.5
60−18c7f8e19872762b7e28ee1871e72f70ea54e3cd 1.2.0.6
61−42f751b87b4a187db93f595a8166d51746ff57d4 1.2.1.0
62−78227a84740b70dcd4cf7a65f3bcf603d87e48e2 1.2.1.1
63−40f268e6735749ef36f487e1d928eaa957bb431d 1.2.1.2
64−631fd055e27fa10983e17e9ad36d1b285b85c661 1.2.1.3
65−8221a68ed5ec37028357df9c6c25f52320e54ad9 1.2.2.0
66−ce1c5ac65eb9f5580114b4e380092b05a485e95d 1.2.2.1
Data/Text.hs+76−81
@@ -129,7 +129,6 @@ module Data.Text
129129 , drop
130130 , dropEnd
131131 , takeWhile
132− , takeWhileEnd
133132 , dropWhile
134133 , dropWhileEnd
135134 , dropAround
@@ -192,12 +191,11 @@ module Data.Text
192191
193192 -- * Low level operations
194193 , copy
195− , unpackCString#
196194 ) where
197195
198196import Prelude (Char, Bool(..), Int, Maybe(..), String,
199197 Eq(..), Ord(..), Ordering(..), (++),
200− Read(..),
198+ Read(..), Show(..),
201199 (&&), (||), (+), (-), (.), ($), ($!), (>>),
202200 not, return, otherwise, quot)
203201#if defined(HAVE_DEEPSEQ)
@@ -213,23 +211,17 @@ import Control.Monad (foldM)
213211import Control.Monad.ST (ST)
214212import qualified Data.Text.Array as A
215213import qualified Data.List as L
216−import Data.Binary (Binary(get, put))
217214import Data.Monoid (Monoid(..))
218−#if MIN_VERSION_base(4,9,0)
219−import Data.Semigroup (Semigroup(..))
220−#endif
221215import Data.String (IsString(..))
222216import qualified Data.Text.Internal.Fusion as S
223217import qualified Data.Text.Internal.Fusion.Common as S
224−import Data.Text.Encoding (decodeUtf8', encodeUtf8)
225218import Data.Text.Internal.Fusion (stream, reverseStream, unstream)
226219import Data.Text.Internal.Private (span_)
227−import Data.Text.Internal (Text(..), empty, firstf, mul, safe, text)
228−import Data.Text.Show (singleton, unpack, unpackCString#)
220+import Data.Text.Internal (Text(..), empty, empty_, firstf, mul, safe, text)
229221import qualified Prelude as P
230222import Data.Text.Unsafe (Iter(..), iter, iter_, lengthWord16, reverseIter,
231223 reverseIter_, unsafeHead, unsafeTail)
232−import Data.Text.Internal.Unsafe.Char (unsafeChr)
224+import Data.Text.Internal.Unsafe.Char (unsafeChr, unsafeWrite)
233225import qualified Data.Text.Internal.Functions as F
234226import qualified Data.Text.Internal.Encoding.Utf16 as U16
235227import Data.Text.Internal.Search (indices)
@@ -238,13 +230,15 @@ import Data.ByteString (ByteString)
238230import qualified Data.Text.Lazy as L
239231import Data.Int (Int64)
240232#endif
241−import GHC.Base (eqInt, neInt, gtInt, geInt, ltInt, leInt)
233+#if __GLASGOW_HASKELL__ >= 702
234+import qualified GHC.CString as GHC
235+#else
236+import qualified GHC.Base as GHC
237+#endif
242238#if __GLASGOW_HASKELL__ >= 708
243239import qualified GHC.Exts as Exts
244240#endif
245−#if MIN_VERSION_base(4,7,0)
246−import Text.Printf (PrintfArg, formatArg, formatString)
247−#endif
241+import GHC.Prim (Addr#)
248242
249243-- $strict
250244--
@@ -330,24 +324,15 @@ instance Eq Text where
330324instance Ord Text where
331325 compare = compareText
332326
327+instance Show Text where
328+ showsPrec p ps r = showsPrec p (unpack ps) r
329+
333330instance Read Text where
334331 readsPrec p str = [(pack x,y) | (x,y) <- readsPrec p str]
335332
336−#if MIN_VERSION_base(4,9,0)
337−-- Semigroup orphan instances for older GHCs are provided by
338−-- 'semigroups` package
339−
340−instance Semigroup Text where
341− (<>) = append
342−#endif
343−
344333instance Monoid Text where
345334 mempty = empty
346−#if MIN_VERSION_base(4,9,0)
347− mappend = (<>) -- future-proof definition
348−#else
349335 mappend = append
350−#endif
351336 mconcat = concat
352337
353338instance IsString Text where
@@ -364,14 +349,6 @@ instance Exts.IsList Text where
364349instance NFData Text where rnf !_ = ()
365350#endif
366351
367−instance Binary Text where
368− put t = put (encodeUtf8 t)
369− get = do
370− bs <- get
371− case decodeUtf8' bs of
372− P.Left exn -> P.fail (P.show exn)
373− P.Right a -> P.return a
374−
375352-- | This instance preserves data abstraction at the cost of inefficiency.
376353-- We omit reflection services for the sake of data abstraction.
377354--
@@ -395,12 +372,6 @@ instance Data Text where
395372 _ -> P.error "gunfold"
396373 dataTypeOf _ = textDataType
397374
398−#if MIN_VERSION_base(4,7,0)
399−-- | Only defined for @base-4.7.0.0@ and later
400−instance PrintfArg Text where
401− formatArg txt = formatString $ unpack txt
402−#endif
403−
404375packConstr :: Constr
405376packConstr = mkConstr textDataType "pack" [] Prefix
406377
@@ -430,6 +401,54 @@ pack :: String -> Text
430401pack = unstream . S.map safe . S.streamList
431402{-# INLINE [1] pack #-}
432403
404+-- | /O(n)/ Convert a 'Text' into a 'String'. Subject to fusion.
405+unpack :: Text -> String
406+unpack = S.unstreamList . stream
407+{-# INLINE [1] unpack #-}
408+
409+-- | /O(n)/ Convert a literal string into a Text. Subject to fusion.
410+unpackCString# :: Addr# -> Text
411+unpackCString# addr# = unstream (S.streamCString# addr#)
412+{-# NOINLINE unpackCString# #-}
413+
414+{-# RULES "TEXT literal" forall a.
415+ unstream (S.map safe (S.streamList (GHC.unpackCString# a)))
416+ = unpackCString# a #-}
417+
418+{-# RULES "TEXT literal UTF8" forall a.
419+ unstream (S.map safe (S.streamList (GHC.unpackCStringUtf8# a)))
420+ = unpackCString# a #-}
421+
422+{-# RULES "TEXT empty literal"
423+ unstream (S.map safe (S.streamList []))
424+ = empty_ #-}
425+
426+{-# RULES "TEXT singleton literal" forall a.
427+ unstream (S.map safe (S.streamList [a]))
428+ = singleton_ a #-}
429+
430+-- | /O(1)/ Convert a character into a Text. Subject to fusion.
431+-- Performs replacement on invalid scalar values.
432+singleton :: Char -> Text
433+singleton = unstream . S.singleton . safe
434+{-# INLINE [1] singleton #-}
435+
436+{-# RULES "TEXT singleton" forall a.
437+ unstream (S.singleton (safe a))
438+ = singleton_ a #-}
439+
440+-- This is intended to reduce inlining bloat.
441+singleton_ :: Char -> Text
442+singleton_ c = Text (A.run x) 0 len
443+ where x :: ST s (A.MArray s)
444+ x = do arr <- A.new len
445+ _ <- unsafeWrite arr 0 d
446+ return arr
447+ len | d < '\x10000' = 1
448+ | otherwise = 2
449+ d = safe c
450+{-# NOINLINE singleton_ #-}
451+
433452-- -----------------------------------------------------------------------------
434453-- * Basic functions
435454
@@ -486,8 +505,8 @@ head t = S.head (stream t)
486505uncons :: Text -> Maybe (Char, Text)
487506uncons t@(Text arr off len)
488507 | len <= 0 = Nothing
489− | otherwise = Just $ let !(Iter c d) = iter t 0
490− in (c, text arr (off+d) (len-d))
508+ | otherwise = Just (c, text arr (off+d) (len-d))
509+ where Iter c d = iter t 0
491510{-# INLINE [1] uncons #-}
492511
493512-- | Lifted from Control.Arrow and specialized.
@@ -572,9 +591,7 @@ isSingleton = S.isSingleton . stream
572591-- Subject to fusion.
573592length :: Text -> Int
574593length t = S.length (stream t)
575−{-# INLINE [0] length #-}
576−-- length needs to be phased after the compareN/length rules otherwise
577−-- it may inline before the rules have an opportunity to fire.
594+{-# INLINE length #-}
578595
579596-- | /O(n)/ Compare the count of characters in a 'Text' to a number.
580597-- Subject to fusion.
@@ -593,32 +610,32 @@ compareLength t n = S.compareLengthI (stream t) n
593610
594611{-# RULES
595612"TEXT ==N/length -> compareLength/==EQ" [~1] forall t n.
596− eqInt (length t) n = compareLength t n == EQ
613+ (==) (length t) n = compareLength t n == EQ
597614 #-}
598615
599616{-# RULES
600617"TEXT /=N/length -> compareLength//=EQ" [~1] forall t n.
601− neInt (length t) n = compareLength t n /= EQ
618+ (/=) (length t) n = compareLength t n /= EQ
602619 #-}
603620
604621{-# RULES
605622"TEXT <N/length -> compareLength/==LT" [~1] forall t n.
606− ltInt (length t) n = compareLength t n == LT
623+ (<) (length t) n = compareLength t n == LT
607624 #-}
608625
609626{-# RULES
610627"TEXT <=N/length -> compareLength//=GT" [~1] forall t n.
611− leInt (length t) n = compareLength t n /= GT
628+ (<=) (length t) n = compareLength t n /= GT
612629 #-}
613630
614631{-# RULES
615632"TEXT >N/length -> compareLength/==GT" [~1] forall t n.
616− gtInt (length t) n = compareLength t n == GT
633+ (>) (length t) n = compareLength t n == GT
617634 #-}
618635
619636{-# RULES
620637"TEXT >=N/length -> compareLength//=LT" [~1] forall t n.
621− geInt (length t) n = compareLength t n /= LT
638+ (>=) (length t) n = compareLength t n /= LT
622639 #-}
623640
624641-- -----------------------------------------------------------------------------
@@ -741,7 +758,7 @@ replace needle@(Text _ _ neeLen)
741758-- instead of itself.
742759toCaseFold :: Text -> Text
743760toCaseFold t = unstream (S.toCaseFold (stream t))
744−{-# INLINE toCaseFold #-}
761+{-# INLINE [0] toCaseFold #-}
745762
746763-- | /O(n)/ Convert a string to lower case, using simple case
747764-- conversion. Subject to fusion.
@@ -915,13 +932,13 @@ concatMap f = concat . foldr ((:) . f) []
915932{-# INLINE concatMap #-}
916933
917934-- | /O(n)/ 'any' @p@ @t@ determines whether any character in the
918−-- 'Text' @t@ satisfies the predicate @p@. Subject to fusion.
935+-- 'Text' @t@ satisifes the predicate @p@. Subject to fusion.
919936any :: (Char -> Bool) -> Text -> Bool
920937any p t = S.any p (stream t)
921938{-# INLINE any #-}
922939
923940-- | /O(n)/ 'all' @p@ @t@ determines whether all characters in the
924−-- 'Text' @t@ satisfy the predicate @p@. Subject to fusion.
941+-- 'Text' @t@ satisify the predicate @p@. Subject to fusion.
925942all :: (Char -> Bool) -> Text -> Bool
926943all p t = S.all p (stream t)
927944{-# INLINE all #-}
@@ -1152,27 +1169,6 @@ takeWhile p t@(Text arr off len) = loop 0
11521169 unstream (S.takeWhile p (stream t)) = takeWhile p t
11531170 #-}
11541171
1155−-- | /O(n)/ 'takeWhileEnd', applied to a predicate @p@ and a 'Text',
1156−-- returns the longest suffix (possibly empty) of elements that
1157−-- satisfy @p@. Subject to fusion.
1158−-- Examples:
1159−--
1160−-- > takeWhileEnd (=='o') "foo" == "oo"
1161−takeWhileEnd :: (Char -> Bool) -> Text -> Text
1162−takeWhileEnd p t@(Text arr off len) = loop (len-1) len
1163− where loop !i !l | l <= 0 = t
1164− | p c = loop (i+d) (l+d)
1165− | otherwise = text arr (off+l) (len-l)
1166− where (c,d) = reverseIter t i
1167−{-# INLINE [1] takeWhileEnd #-}
1168−
1169−{-# RULES
1170−"TEXT takeWhileEnd -> fused" [~1] forall p t.
1171− takeWhileEnd p t = S.reverse (S.takeWhile p (S.reverseStream t))
1172−"TEXT takeWhileEnd -> unfused" [1] forall p t.
1173− S.reverse (S.takeWhile p (S.reverseStream t)) = takeWhileEnd p t
1174− #-}
1175−
11761172-- | /O(n)/ 'dropWhile' @p@ @t@ returns the suffix remaining after
11771173-- 'takeWhile' @p@ @t@. Subject to fusion.
11781174dropWhile :: (Char -> Bool) -> Text -> Text
@@ -1191,9 +1187,8 @@ dropWhile p t@(Text arr off len) = loop 0 0
11911187 #-}
11921188
11931189-- | /O(n)/ 'dropWhileEnd' @p@ @t@ returns the prefix remaining after
1194−-- dropping characters that satisfy the predicate @p@ from the end of
1190+-- dropping characters that fail the predicate @p@ from the end of
11951191-- @t@. Subject to fusion.
1196−--
11971192-- Examples:
11981193--
11991194-- > dropWhileEnd (=='.') "foo..." == "foo"
@@ -1213,7 +1208,7 @@ dropWhileEnd p t@(Text arr off len) = loop (len-1) len
12131208 #-}
12141209
12151210-- | /O(n)/ 'dropAround' @p@ @t@ returns the substring remaining after
1216−-- dropping characters that satisfy the predicate @p@ from both the
1211+-- dropping characters that fail the predicate @p@ from both the
12171212-- beginning and end of @t@. Subject to fusion.
12181213dropAround :: (Char -> Bool) -> Text -> Text
12191214dropAround p = dropWhile p . dropWhileEnd p
@@ -1540,7 +1535,7 @@ countChar c t = S.countChar c (stream t)
15401535-- equivalent to a pair of 'unpack' operations.
15411536zip :: Text -> Text -> [(Char,Char)]
15421537zip a b = S.unstreamList $ S.zipWith (,) (stream a) (stream b)
1543−{-# INLINE zip #-}
1538+{-# INLINE [0] zip #-}
15441539
15451540-- | /O(n)/ 'zipWith' generalises 'zip' by zipping with the function
15461541-- given as the first argument, instead of a tupling function.
@@ -1548,7 +1543,7 @@ zip a b = S.unstreamList $ S.zipWith (,) (stream a) (stream b)
15481543zipWith :: (Char -> Char -> Char) -> Text -> Text -> Text
15491544zipWith f t1 t2 = unstream (S.zipWith g (stream t1) (stream t2))
15501545 where g a b = safe (f a b)
1551−{-# INLINE zipWith #-}
1546+{-# INLINE [0] zipWith #-}
15521547
15531548-- | /O(n)/ Breaks a 'Text' up into a list of words, delimited by 'Char's
15541549-- representing white space.
Data/Text/Array.hs+4−5
@@ -20,7 +20,7 @@
2020-- > import qualified Data.Text.Array as A
2121--
2222-- The names in this module resemble those in the 'Data.Array' family
23−-- of modules, but are shorter due to the assumption of qualified
23+-- of modules, but are shorter due to the assumption of qualifid
2424-- naming.
2525module Data.Text.Array
2626 (
@@ -74,7 +74,7 @@ import Foreign.C.Types (CInt, CSize)
7474#endif
7575import GHC.Base (ByteArray#, MutableByteArray#, Int(..),
7676 indexWord16Array#, newByteArray#,
77− unsafeFreezeByteArray#, writeWord16Array#)
77+ unsafeCoerce#, writeWord16Array#)
7878import GHC.ST (ST(..), runST)
7979import GHC.Word (Word16(..))
8080import Prelude hiding (length, read)
@@ -130,9 +130,8 @@ array_size_error = error "Data.Text.Array.new: size overflow"
130130
131131-- | Freeze a mutable array. Do not mutate the 'MArray' afterwards!
132132unsafeFreeze :: MArray s -> ST s Array
133−unsafeFreeze MArray{..} = ST $ \s1# ->
134− case unsafeFreezeByteArray# maBA s1# of
135− (# s2#, ba# #) -> (# s2#, Array ba#
133+unsafeFreeze MArray{..} = ST $ \s# ->
134+ (# s#, Array (unsafeCoerce# maBA)
136135#if defined(ASSERTS)
137136 maLen
138137#endif
Data/Text/Encoding.hs+20−9
@@ -55,9 +55,13 @@ module Data.Text.Encoding
5555 , encodeUtf32LE
5656 , encodeUtf32BE
5757
58+#if MIN_VERSION_bytestring(0,10,4)
5859 -- * Encoding Text using ByteString Builders
60+ -- | /Note/ that these functions are only available if built against
61+ -- @bytestring >= 0.10.4.0@.
5962 , encodeUtf8Builder
6063 , encodeUtf8BuilderEscaped
64+#endif
6165 ) where
6266
6367#if __GLASGOW_HASKELL__ >= 702
@@ -66,17 +70,26 @@ import Control.Monad.ST.Unsafe (unsafeIOToST, unsafeSTToIO)
6670import Control.Monad.ST (unsafeIOToST, unsafeSTToIO)
6771#endif
6872
73+#if MIN_VERSION_bytestring(0,10,4)
74+import Data.Bits ((.&.))
75+import Data.Text.Internal.Unsafe.Char (ord)
76+import qualified Data.ByteString.Builder as B
77+import qualified Data.ByteString.Builder.Internal as B hiding (empty, append)
78+import qualified Data.ByteString.Builder.Prim as BP
79+import qualified Data.ByteString.Builder.Prim.Internal as BP
80+import qualified Data.Text.Internal.Encoding.Utf16 as U16
81+#endif
82+
6983import Control.Exception (evaluate, try)
7084import Control.Monad.ST (runST)
71−import Data.Bits ((.&.))
7285import Data.ByteString as B
7386import Data.ByteString.Internal as B hiding (c2w)
87+import Data.Text ()
7488import Data.Text.Encoding.Error (OnDecodeError, UnicodeException, strictDecode)
7589import Data.Text.Internal (Text(..), safe, text)
7690import Data.Text.Internal.Private (runText)
77−import Data.Text.Internal.Unsafe.Char (ord, unsafeWrite)
91+import Data.Text.Internal.Unsafe.Char (unsafeWrite)
7892import Data.Text.Internal.Unsafe.Shift (shiftR)
79−import Data.Text.Show ()
8093import Data.Text.Unsafe (unsafeDupablePerformIO)
8194import Data.Word (Word8, Word32)
8295import Foreign.C.Types (CSize(..))
@@ -85,13 +98,8 @@ import Foreign.Marshal.Utils (with)
8598import Foreign.Ptr (Ptr, minusPtr, nullPtr, plusPtr)
8699import Foreign.Storable (Storable, peek, poke)
87100import GHC.Base (ByteArray#, MutableByteArray#)
88−import qualified Data.ByteString.Builder as B
89−import qualified Data.ByteString.Builder.Internal as B hiding (empty, append)
90−import qualified Data.ByteString.Builder.Prim as BP
91−import qualified Data.ByteString.Builder.Prim.Internal as BP
92101import qualified Data.Text.Array as A
93102import qualified Data.Text.Internal.Encoding.Fusion as E
94−import qualified Data.Text.Internal.Encoding.Utf16 as U16
95103import qualified Data.Text.Internal.Fusion as F
96104
97105#include "text_cbits.h"
@@ -278,7 +286,7 @@ streamDecodeUtf8With onErr = decodeChunk B.empty 0 0
278286 return $! text arr 0 (fromIntegral n)
279287 lastPtr <- peek curPtrPtr
280288 let left = lastPtr `minusPtr` curPtr
281− !undecoded = case state of
289+ undecoded = case state of
282290 UTF8_ACCEPT -> B.empty
283291 _ -> B.append undecoded0 (B.drop left bs)
284292 return $ Some chunkText undecoded
@@ -307,6 +315,8 @@ decodeUtf8' :: ByteString -> Either UnicodeException Text
307315decodeUtf8' = unsafeDupablePerformIO . try . evaluate . decodeUtf8With strictDecode
308316{-# INLINE decodeUtf8' #-}
309317
318+#if MIN_VERSION_bytestring(0,10,4)
319+
310320-- | Encode text to a ByteString 'B.Builder' using UTF-8 encoding.
311321encodeUtf8Builder :: Text -> B.Builder
312322encodeUtf8Builder = encodeUtf8BuilderEscaped (BP.liftFixedToBounded BP.word8)
@@ -367,6 +377,7 @@ encodeUtf8BuilderEscaped be =
367377 outerLoop i (B.BufferRange op ope)
368378 where
369379 poke8 j v = poke (op `plusPtr` j) (fromIntegral v :: Word8)
380+#endif
370381
371382-- | Encode text using UTF-8 encoding.
372383encodeUtf8 :: Text -> ByteString
Data/Text/Encoding/Error.hs+1−3
@@ -1,7 +1,5 @@
11{-# LANGUAGE CPP, DeriveDataTypeable #-}
2−#if __GLASGOW_HASKELL__ >= 704
3−{-# LANGUAGE Safe #-}
4−#elif __GLASGOW_HASKELL__ >= 702
2+#if __GLASGOW_HASKELL__ >= 702
53{-# LANGUAGE Trustworthy #-}
64#endif
75-- |
Data/Text/Internal/Builder.hs+2−17
@@ -6,7 +6,7 @@
66-- Module : Data.Text.Internal.Builder
77-- Copyright : (c) 2013 Bryan O'Sullivan
88-- (c) 2010 Johan Tibell
9−-- License : BSD-style (see LICENSE)
9+-- License : BSD3-style (see LICENSE)
1010--
1111-- Maintainer : Johan Tibell <johan.tibell@gmail.com>
1212-- Stability : experimental
@@ -59,9 +59,6 @@ module Data.Text.Internal.Builder
5959
6060import Control.Monad.ST (ST, runST)
6161import Data.Monoid (Monoid(..))
62−#if MIN_VERSION_base(4,9,0)
63−import Data.Semigroup (Semigroup(..))
64−#endif
6562import Data.Text.Internal (Text(..))
6663import Data.Text.Internal.Lazy (smallChunkSize)
6764import Data.Text.Unsafe (inlineInterleaveST)
@@ -92,22 +89,12 @@ newtype Builder = Builder {
9289 -> ST s [S.Text]
9390 }
9491
95−#if MIN_VERSION_base(4,9,0)
96−instance Semigroup Builder where
97− (<>) = append
98− {-# INLINE (<>) #-}
99−#endif
100−
10192instance Monoid Builder where
10293 mempty = empty
10394 {-# INLINE mempty #-}
104−#if MIN_VERSION_base(4,9,0)
105− mappend = (<>) -- future-proof definition
106−#else
10795 mappend = append
108−#endif
10996 {-# INLINE mappend #-}
110− mconcat = foldr mappend Data.Monoid.mempty
97+ mconcat = foldr mappend mempty
11198 {-# INLINE mconcat #-}
11299
113100instance String.IsString Builder where
@@ -242,8 +229,6 @@ flush = Builder $ \ k buf@(Buffer p o u l) ->
242229 !t = Text arr o u
243230 ts <- inlineInterleaveST (k b)
244231 return $! t : ts
245−{-# INLINE [1] flush #-}
246−-- defer inlining so that flush/flush rule may fire.
247232
248233------------------------------------------------------------------------
249234
Data/Text/Internal/Builder/Functions.hs+1−2
@@ -23,8 +23,7 @@ module Data.Text.Internal.Builder.Functions
2323
2424import Data.Monoid (mappend)
2525import Data.Text.Lazy.Builder (Builder)
26−import GHC.Base (chr#,ord#,(+#),Int(I#),Char(C#))
27−import Prelude ()
26+import GHC.Base
2827
2928-- | Unsafe conversion for decimal digits.
3029{-# INLINE i2d #-}
Data/Text/Internal/Builder/Int/Digits.hs+1−1
@@ -2,7 +2,7 @@
22
33-- Module: Data.Text.Internal.Builder.Int.Digits
44-- Copyright: (c) 2013 Bryan O'Sullivan
5−-- License: BSD-style
5+-- License: BSD3
66-- Maintainer: Bryan O'Sullivan <bos@serpentine.com>
77-- Stability: experimental
88-- Portability: portable
Data/Text/Internal/Fusion.hs+24−34
@@ -98,35 +98,25 @@ reverseStream (Text arr off len) = Stream next (off+len-1) (betweenSize (len `sh
9898-- | /O(n)/ Convert a 'Stream Char' into a 'Text'.
9999unstream :: Stream Char -> Text
100100unstream (Stream next0 s0 len) = runText $ \done -> do
101− -- Before encoding each char we perform a buffer realloc check assuming
102− -- worst case encoding size of two 16-bit units for the char. Just add an
103− -- extra space to the buffer so that we do not end up reallocating even when
104− -- all the chars are encoded as single unit.
105− let mlen = upperBound 4 len + 1
101+ let mlen = upperBound 4 len
106102 arr0 <- A.new mlen
107− let outer !arr !maxi = encode
103+ let outer arr top = loop
108104 where
109− -- keep the common case loop as small as possible
110− encode !si !di =
111− case next0 si of
112− Done -> done arr di
113− Skip si' -> encode si' di
114− Yield c si'
115− -- simply check for the worst case
116− | maxi < di + 1 -> realloc si di
117− | otherwise -> do
118− n <- unsafeWrite arr di c
119− encode si' (di + n)
120−
121− -- keep uncommon case separate from the common case code
122− {-# NOINLINE realloc #-}
123− realloc !si !di = do
124− let newlen = (maxi + 1) * 2
125− arr' <- A.new newlen
126− A.copyM arr' 0 arr 0 di
127− outer arr' (newlen - 1) si di
128−
129− outer arr0 (mlen - 1) s0 0
105+ loop !s !i =
106+ case next0 s of
107+ Done -> done arr i
108+ Skip s' -> loop s' i
109+ Yield x s'
110+ | j >= top -> {-# SCC "unstream/resize" #-} do
111+ let top' = (top + 1) `shiftL` 1
112+ arr' <- A.new top'
113+ A.copyM arr' 0 arr 0 top
114+ outer arr' top' s i
115+ | otherwise -> do d <- unsafeWrite arr i x
116+ loop s' (i+d)
117+ where j | ord x < 0x10000 = i
118+ | otherwise = i + 1
119+ outer arr0 mlen s0 0
130120{-# INLINE [0] unstream #-}
131121{-# RULES "STREAM stream/unstream fusion" forall s. stream (unstream s) = s #-}
132122
@@ -176,15 +166,15 @@ reverse (Stream next s len0)
176166-- | /O(n)/ Perform the equivalent of 'scanr' over a list, only with
177167-- the input and result reversed.
178168reverseScanr :: (Char -> Char -> Char) -> Char -> Stream Char -> Stream Char
179−reverseScanr f z0 (Stream next0 s0 len) = Stream next (Scan1 z0 s0) (len+1) -- HINT maybe too low
169+reverseScanr f z0 (Stream next0 s0 len) = Stream next (S1 :*: z0 :*: s0) (len+1) -- HINT maybe too low
180170 where
181171 {-# INLINE next #-}
182− next (Scan1 z s) = Yield z (Scan2 z s)
183− next (Scan2 z s) = case next0 s of
184− Yield x s' -> let !x' = f x z
185− in Yield x' (Scan2 x' s')
186− Skip s' -> Skip (Scan2 z s')
187− Done -> Done
172+ next (S1 :*: z :*: s) = Yield z (S2 :*: z :*: s)
173+ next (S2 :*: z :*: s) = case next0 s of
174+ Yield x s' -> let !x' = f x z
175+ in Yield x' (S2 :*: x' :*: s')
176+ Skip s' -> Skip (S2 :*: z :*: s')
177+ Done -> Done
188178{-# INLINE reverseScanr #-}
189179
190180-- | /O(n)/ Like 'unfoldr', 'unfoldrN' builds a stream from a seed
Data/Text/Internal/Fusion/CaseMapping.hsdeleted−842
@@ -1,842 +0,0 @@
1−{-# LANGUAGE Rank2Types #-}
2−-- AUTOMATICALLY GENERATED - DO NOT EDIT
3−-- Generated by scripts/CaseMapping.hs
4−-- CaseFolding-8.0.0.txt
5−-- Date: 2015-01-13, 18:16:36 GMT [MD]
6−-- SpecialCasing-8.0.0.txt
7−-- Date: 2014-12-16, 23:08:04 GMT [MD]
8−
9−module Data.Text.Internal.Fusion.CaseMapping where
10−import Data.Char
11−import Data.Text.Internal.Fusion.Types
12−
13−upperMapping :: forall s. Char -> s -> Step (CC s) Char
14−{-# NOINLINE upperMapping #-}
15−-- LATIN SMALL LETTER SHARP S
16−upperMapping '\x00df' s = Yield '\x0053' (CC s '\x0053' '\x0000')
17−-- LATIN SMALL LIGATURE FF
18−upperMapping '\xfb00' s = Yield '\x0046' (CC s '\x0046' '\x0000')
19−-- LATIN SMALL LIGATURE FI
20−upperMapping '\xfb01' s = Yield '\x0046' (CC s '\x0049' '\x0000')
21−-- LATIN SMALL LIGATURE FL
22−upperMapping '\xfb02' s = Yield '\x0046' (CC s '\x004c' '\x0000')
23−-- LATIN SMALL LIGATURE FFI
24−upperMapping '\xfb03' s = Yield '\x0046' (CC s '\x0046' '\x0049')
25−-- LATIN SMALL LIGATURE FFL
26−upperMapping '\xfb04' s = Yield '\x0046' (CC s '\x0046' '\x004c')
27−-- LATIN SMALL LIGATURE LONG S T
28−upperMapping '\xfb05' s = Yield '\x0053' (CC s '\x0054' '\x0000')
29−-- LATIN SMALL LIGATURE ST
30−upperMapping '\xfb06' s = Yield '\x0053' (CC s '\x0054' '\x0000')
31−-- ARMENIAN SMALL LIGATURE ECH YIWN
32−upperMapping '\x0587' s = Yield '\x0535' (CC s '\x0552' '\x0000')
33−-- ARMENIAN SMALL LIGATURE MEN NOW
34−upperMapping '\xfb13' s = Yield '\x0544' (CC s '\x0546' '\x0000')
35−-- ARMENIAN SMALL LIGATURE MEN ECH
36−upperMapping '\xfb14' s = Yield '\x0544' (CC s '\x0535' '\x0000')
37−-- ARMENIAN SMALL LIGATURE MEN INI
38−upperMapping '\xfb15' s = Yield '\x0544' (CC s '\x053b' '\x0000')
39−-- ARMENIAN SMALL LIGATURE VEW NOW
40−upperMapping '\xfb16' s = Yield '\x054e' (CC s '\x0546' '\x0000')
41−-- ARMENIAN SMALL LIGATURE MEN XEH
42−upperMapping '\xfb17' s = Yield '\x0544' (CC s '\x053d' '\x0000')
43−-- LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
44−upperMapping '\x0149' s = Yield '\x02bc' (CC s '\x004e' '\x0000')
45−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
46−upperMapping '\x0390' s = Yield '\x0399' (CC s '\x0308' '\x0301')
47−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
48−upperMapping '\x03b0' s = Yield '\x03a5' (CC s '\x0308' '\x0301')
49−-- LATIN SMALL LETTER J WITH CARON
50−upperMapping '\x01f0' s = Yield '\x004a' (CC s '\x030c' '\x0000')
51−-- LATIN SMALL LETTER H WITH LINE BELOW
52−upperMapping '\x1e96' s = Yield '\x0048' (CC s '\x0331' '\x0000')
53−-- LATIN SMALL LETTER T WITH DIAERESIS
54−upperMapping '\x1e97' s = Yield '\x0054' (CC s '\x0308' '\x0000')
55−-- LATIN SMALL LETTER W WITH RING ABOVE
56−upperMapping '\x1e98' s = Yield '\x0057' (CC s '\x030a' '\x0000')
57−-- LATIN SMALL LETTER Y WITH RING ABOVE
58−upperMapping '\x1e99' s = Yield '\x0059' (CC s '\x030a' '\x0000')
59−-- LATIN SMALL LETTER A WITH RIGHT HALF RING
60−upperMapping '\x1e9a' s = Yield '\x0041' (CC s '\x02be' '\x0000')
61−-- GREEK SMALL LETTER UPSILON WITH PSILI
62−upperMapping '\x1f50' s = Yield '\x03a5' (CC s '\x0313' '\x0000')
63−-- GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
64−upperMapping '\x1f52' s = Yield '\x03a5' (CC s '\x0313' '\x0300')
65−-- GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
66−upperMapping '\x1f54' s = Yield '\x03a5' (CC s '\x0313' '\x0301')
67−-- GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
68−upperMapping '\x1f56' s = Yield '\x03a5' (CC s '\x0313' '\x0342')
69−-- GREEK SMALL LETTER ALPHA WITH PERISPOMENI
70−upperMapping '\x1fb6' s = Yield '\x0391' (CC s '\x0342' '\x0000')
71−-- GREEK SMALL LETTER ETA WITH PERISPOMENI
72−upperMapping '\x1fc6' s = Yield '\x0397' (CC s '\x0342' '\x0000')
73−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
74−upperMapping '\x1fd2' s = Yield '\x0399' (CC s '\x0308' '\x0300')
75−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
76−upperMapping '\x1fd3' s = Yield '\x0399' (CC s '\x0308' '\x0301')
77−-- GREEK SMALL LETTER IOTA WITH PERISPOMENI
78−upperMapping '\x1fd6' s = Yield '\x0399' (CC s '\x0342' '\x0000')
79−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
80−upperMapping '\x1fd7' s = Yield '\x0399' (CC s '\x0308' '\x0342')
81−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
82−upperMapping '\x1fe2' s = Yield '\x03a5' (CC s '\x0308' '\x0300')
83−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
84−upperMapping '\x1fe3' s = Yield '\x03a5' (CC s '\x0308' '\x0301')
85−-- GREEK SMALL LETTER RHO WITH PSILI
86−upperMapping '\x1fe4' s = Yield '\x03a1' (CC s '\x0313' '\x0000')
87−-- GREEK SMALL LETTER UPSILON WITH PERISPOMENI
88−upperMapping '\x1fe6' s = Yield '\x03a5' (CC s '\x0342' '\x0000')
89−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
90−upperMapping '\x1fe7' s = Yield '\x03a5' (CC s '\x0308' '\x0342')
91−-- GREEK SMALL LETTER OMEGA WITH PERISPOMENI
92−upperMapping '\x1ff6' s = Yield '\x03a9' (CC s '\x0342' '\x0000')
93−-- GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
94−upperMapping '\x1f80' s = Yield '\x1f08' (CC s '\x0399' '\x0000')
95−-- GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
96−upperMapping '\x1f81' s = Yield '\x1f09' (CC s '\x0399' '\x0000')
97−-- GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
98−upperMapping '\x1f82' s = Yield '\x1f0a' (CC s '\x0399' '\x0000')
99−-- GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
100−upperMapping '\x1f83' s = Yield '\x1f0b' (CC s '\x0399' '\x0000')
101−-- GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
102−upperMapping '\x1f84' s = Yield '\x1f0c' (CC s '\x0399' '\x0000')
103−-- GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
104−upperMapping '\x1f85' s = Yield '\x1f0d' (CC s '\x0399' '\x0000')
105−-- GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
106−upperMapping '\x1f86' s = Yield '\x1f0e' (CC s '\x0399' '\x0000')
107−-- GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
108−upperMapping '\x1f87' s = Yield '\x1f0f' (CC s '\x0399' '\x0000')
109−-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
110−upperMapping '\x1f88' s = Yield '\x1f08' (CC s '\x0399' '\x0000')
111−-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
112−upperMapping '\x1f89' s = Yield '\x1f09' (CC s '\x0399' '\x0000')
113−-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
114−upperMapping '\x1f8a' s = Yield '\x1f0a' (CC s '\x0399' '\x0000')
115−-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
116−upperMapping '\x1f8b' s = Yield '\x1f0b' (CC s '\x0399' '\x0000')
117−-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
118−upperMapping '\x1f8c' s = Yield '\x1f0c' (CC s '\x0399' '\x0000')
119−-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
120−upperMapping '\x1f8d' s = Yield '\x1f0d' (CC s '\x0399' '\x0000')
121−-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
122−upperMapping '\x1f8e' s = Yield '\x1f0e' (CC s '\x0399' '\x0000')
123−-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
124−upperMapping '\x1f8f' s = Yield '\x1f0f' (CC s '\x0399' '\x0000')
125−-- GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
126−upperMapping '\x1f90' s = Yield '\x1f28' (CC s '\x0399' '\x0000')
127−-- GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
128−upperMapping '\x1f91' s = Yield '\x1f29' (CC s '\x0399' '\x0000')
129−-- GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
130−upperMapping '\x1f92' s = Yield '\x1f2a' (CC s '\x0399' '\x0000')
131−-- GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
132−upperMapping '\x1f93' s = Yield '\x1f2b' (CC s '\x0399' '\x0000')
133−-- GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
134−upperMapping '\x1f94' s = Yield '\x1f2c' (CC s '\x0399' '\x0000')
135−-- GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
136−upperMapping '\x1f95' s = Yield '\x1f2d' (CC s '\x0399' '\x0000')
137−-- GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
138−upperMapping '\x1f96' s = Yield '\x1f2e' (CC s '\x0399' '\x0000')
139−-- GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
140−upperMapping '\x1f97' s = Yield '\x1f2f' (CC s '\x0399' '\x0000')
141−-- GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
142−upperMapping '\x1f98' s = Yield '\x1f28' (CC s '\x0399' '\x0000')
143−-- GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
144−upperMapping '\x1f99' s = Yield '\x1f29' (CC s '\x0399' '\x0000')
145−-- GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
146−upperMapping '\x1f9a' s = Yield '\x1f2a' (CC s '\x0399' '\x0000')
147−-- GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
148−upperMapping '\x1f9b' s = Yield '\x1f2b' (CC s '\x0399' '\x0000')
149−-- GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
150−upperMapping '\x1f9c' s = Yield '\x1f2c' (CC s '\x0399' '\x0000')
151−-- GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
152−upperMapping '\x1f9d' s = Yield '\x1f2d' (CC s '\x0399' '\x0000')
153−-- GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
154−upperMapping '\x1f9e' s = Yield '\x1f2e' (CC s '\x0399' '\x0000')
155−-- GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
156−upperMapping '\x1f9f' s = Yield '\x1f2f' (CC s '\x0399' '\x0000')
157−-- GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
158−upperMapping '\x1fa0' s = Yield '\x1f68' (CC s '\x0399' '\x0000')
159−-- GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
160−upperMapping '\x1fa1' s = Yield '\x1f69' (CC s '\x0399' '\x0000')
161−-- GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
162−upperMapping '\x1fa2' s = Yield '\x1f6a' (CC s '\x0399' '\x0000')
163−-- GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
164−upperMapping '\x1fa3' s = Yield '\x1f6b' (CC s '\x0399' '\x0000')
165−-- GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
166−upperMapping '\x1fa4' s = Yield '\x1f6c' (CC s '\x0399' '\x0000')
167−-- GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
168−upperMapping '\x1fa5' s = Yield '\x1f6d' (CC s '\x0399' '\x0000')
169−-- GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
170−upperMapping '\x1fa6' s = Yield '\x1f6e' (CC s '\x0399' '\x0000')
171−-- GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
172−upperMapping '\x1fa7' s = Yield '\x1f6f' (CC s '\x0399' '\x0000')
173−-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
174−upperMapping '\x1fa8' s = Yield '\x1f68' (CC s '\x0399' '\x0000')
175−-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
176−upperMapping '\x1fa9' s = Yield '\x1f69' (CC s '\x0399' '\x0000')
177−-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
178−upperMapping '\x1faa' s = Yield '\x1f6a' (CC s '\x0399' '\x0000')
179−-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
180−upperMapping '\x1fab' s = Yield '\x1f6b' (CC s '\x0399' '\x0000')
181−-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
182−upperMapping '\x1fac' s = Yield '\x1f6c' (CC s '\x0399' '\x0000')
183−-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
184−upperMapping '\x1fad' s = Yield '\x1f6d' (CC s '\x0399' '\x0000')
185−-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
186−upperMapping '\x1fae' s = Yield '\x1f6e' (CC s '\x0399' '\x0000')
187−-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
188−upperMapping '\x1faf' s = Yield '\x1f6f' (CC s '\x0399' '\x0000')
189−-- GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
190−upperMapping '\x1fb3' s = Yield '\x0391' (CC s '\x0399' '\x0000')
191−-- GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
192−upperMapping '\x1fbc' s = Yield '\x0391' (CC s '\x0399' '\x0000')
193−-- GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
194−upperMapping '\x1fc3' s = Yield '\x0397' (CC s '\x0399' '\x0000')
195−-- GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
196−upperMapping '\x1fcc' s = Yield '\x0397' (CC s '\x0399' '\x0000')
197−-- GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
198−upperMapping '\x1ff3' s = Yield '\x03a9' (CC s '\x0399' '\x0000')
199−-- GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
200−upperMapping '\x1ffc' s = Yield '\x03a9' (CC s '\x0399' '\x0000')
201−-- GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
202−upperMapping '\x1fb2' s = Yield '\x1fba' (CC s '\x0399' '\x0000')
203−-- GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
204−upperMapping '\x1fb4' s = Yield '\x0386' (CC s '\x0399' '\x0000')
205−-- GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
206−upperMapping '\x1fc2' s = Yield '\x1fca' (CC s '\x0399' '\x0000')
207−-- GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
208−upperMapping '\x1fc4' s = Yield '\x0389' (CC s '\x0399' '\x0000')
209−-- GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
210−upperMapping '\x1ff2' s = Yield '\x1ffa' (CC s '\x0399' '\x0000')
211−-- GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
212−upperMapping '\x1ff4' s = Yield '\x038f' (CC s '\x0399' '\x0000')
213−-- GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
214−upperMapping '\x1fb7' s = Yield '\x0391' (CC s '\x0342' '\x0399')
215−-- GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
216−upperMapping '\x1fc7' s = Yield '\x0397' (CC s '\x0342' '\x0399')
217−-- GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
218−upperMapping '\x1ff7' s = Yield '\x03a9' (CC s '\x0342' '\x0399')
219−upperMapping c s = Yield (toUpper c) (CC s '\0' '\0')
220−lowerMapping :: forall s. Char -> s -> Step (CC s) Char
221−{-# NOINLINE lowerMapping #-}
222−-- LATIN CAPITAL LETTER I WITH DOT ABOVE
223−lowerMapping '\x0130' s = Yield '\x0069' (CC s '\x0307' '\x0000')
224−lowerMapping c s = Yield (toLower c) (CC s '\0' '\0')
225−titleMapping :: forall s. Char -> s -> Step (CC s) Char
226−{-# NOINLINE titleMapping #-}
227−-- LATIN SMALL LETTER SHARP S
228−titleMapping '\x00df' s = Yield '\x0053' (CC s '\x0073' '\x0000')
229−-- LATIN SMALL LIGATURE FF
230−titleMapping '\xfb00' s = Yield '\x0046' (CC s '\x0066' '\x0000')
231−-- LATIN SMALL LIGATURE FI
232−titleMapping '\xfb01' s = Yield '\x0046' (CC s '\x0069' '\x0000')
233−-- LATIN SMALL LIGATURE FL
234−titleMapping '\xfb02' s = Yield '\x0046' (CC s '\x006c' '\x0000')
235−-- LATIN SMALL LIGATURE FFI
236−titleMapping '\xfb03' s = Yield '\x0046' (CC s '\x0066' '\x0069')
237−-- LATIN SMALL LIGATURE FFL
238−titleMapping '\xfb04' s = Yield '\x0046' (CC s '\x0066' '\x006c')
239−-- LATIN SMALL LIGATURE LONG S T
240−titleMapping '\xfb05' s = Yield '\x0053' (CC s '\x0074' '\x0000')
241−-- LATIN SMALL LIGATURE ST
242−titleMapping '\xfb06' s = Yield '\x0053' (CC s '\x0074' '\x0000')
243−-- ARMENIAN SMALL LIGATURE ECH YIWN
244−titleMapping '\x0587' s = Yield '\x0535' (CC s '\x0582' '\x0000')
245−-- ARMENIAN SMALL LIGATURE MEN NOW
246−titleMapping '\xfb13' s = Yield '\x0544' (CC s '\x0576' '\x0000')
247−-- ARMENIAN SMALL LIGATURE MEN ECH
248−titleMapping '\xfb14' s = Yield '\x0544' (CC s '\x0565' '\x0000')
249−-- ARMENIAN SMALL LIGATURE MEN INI
250−titleMapping '\xfb15' s = Yield '\x0544' (CC s '\x056b' '\x0000')
251−-- ARMENIAN SMALL LIGATURE VEW NOW
252−titleMapping '\xfb16' s = Yield '\x054e' (CC s '\x0576' '\x0000')
253−-- ARMENIAN SMALL LIGATURE MEN XEH
254−titleMapping '\xfb17' s = Yield '\x0544' (CC s '\x056d' '\x0000')
255−-- LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
256−titleMapping '\x0149' s = Yield '\x02bc' (CC s '\x004e' '\x0000')
257−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
258−titleMapping '\x0390' s = Yield '\x0399' (CC s '\x0308' '\x0301')
259−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
260−titleMapping '\x03b0' s = Yield '\x03a5' (CC s '\x0308' '\x0301')
261−-- LATIN SMALL LETTER J WITH CARON
262−titleMapping '\x01f0' s = Yield '\x004a' (CC s '\x030c' '\x0000')
263−-- LATIN SMALL LETTER H WITH LINE BELOW
264−titleMapping '\x1e96' s = Yield '\x0048' (CC s '\x0331' '\x0000')
265−-- LATIN SMALL LETTER T WITH DIAERESIS
266−titleMapping '\x1e97' s = Yield '\x0054' (CC s '\x0308' '\x0000')
267−-- LATIN SMALL LETTER W WITH RING ABOVE
268−titleMapping '\x1e98' s = Yield '\x0057' (CC s '\x030a' '\x0000')
269−-- LATIN SMALL LETTER Y WITH RING ABOVE
270−titleMapping '\x1e99' s = Yield '\x0059' (CC s '\x030a' '\x0000')
271−-- LATIN SMALL LETTER A WITH RIGHT HALF RING
272−titleMapping '\x1e9a' s = Yield '\x0041' (CC s '\x02be' '\x0000')
273−-- GREEK SMALL LETTER UPSILON WITH PSILI
274−titleMapping '\x1f50' s = Yield '\x03a5' (CC s '\x0313' '\x0000')
275−-- GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
276−titleMapping '\x1f52' s = Yield '\x03a5' (CC s '\x0313' '\x0300')
277−-- GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
278−titleMapping '\x1f54' s = Yield '\x03a5' (CC s '\x0313' '\x0301')
279−-- GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
280−titleMapping '\x1f56' s = Yield '\x03a5' (CC s '\x0313' '\x0342')
281−-- GREEK SMALL LETTER ALPHA WITH PERISPOMENI
282−titleMapping '\x1fb6' s = Yield '\x0391' (CC s '\x0342' '\x0000')
283−-- GREEK SMALL LETTER ETA WITH PERISPOMENI
284−titleMapping '\x1fc6' s = Yield '\x0397' (CC s '\x0342' '\x0000')
285−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
286−titleMapping '\x1fd2' s = Yield '\x0399' (CC s '\x0308' '\x0300')
287−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
288−titleMapping '\x1fd3' s = Yield '\x0399' (CC s '\x0308' '\x0301')
289−-- GREEK SMALL LETTER IOTA WITH PERISPOMENI
290−titleMapping '\x1fd6' s = Yield '\x0399' (CC s '\x0342' '\x0000')
291−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
292−titleMapping '\x1fd7' s = Yield '\x0399' (CC s '\x0308' '\x0342')
293−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
294−titleMapping '\x1fe2' s = Yield '\x03a5' (CC s '\x0308' '\x0300')
295−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
296−titleMapping '\x1fe3' s = Yield '\x03a5' (CC s '\x0308' '\x0301')
297−-- GREEK SMALL LETTER RHO WITH PSILI
298−titleMapping '\x1fe4' s = Yield '\x03a1' (CC s '\x0313' '\x0000')
299−-- GREEK SMALL LETTER UPSILON WITH PERISPOMENI
300−titleMapping '\x1fe6' s = Yield '\x03a5' (CC s '\x0342' '\x0000')
301−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
302−titleMapping '\x1fe7' s = Yield '\x03a5' (CC s '\x0308' '\x0342')
303−-- GREEK SMALL LETTER OMEGA WITH PERISPOMENI
304−titleMapping '\x1ff6' s = Yield '\x03a9' (CC s '\x0342' '\x0000')
305−-- GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
306−titleMapping '\x1fb2' s = Yield '\x1fba' (CC s '\x0345' '\x0000')
307−-- GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
308−titleMapping '\x1fb4' s = Yield '\x0386' (CC s '\x0345' '\x0000')
309−-- GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
310−titleMapping '\x1fc2' s = Yield '\x1fca' (CC s '\x0345' '\x0000')
311−-- GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
312−titleMapping '\x1fc4' s = Yield '\x0389' (CC s '\x0345' '\x0000')
313−-- GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
314−titleMapping '\x1ff2' s = Yield '\x1ffa' (CC s '\x0345' '\x0000')
315−-- GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
316−titleMapping '\x1ff4' s = Yield '\x038f' (CC s '\x0345' '\x0000')
317−-- GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
318−titleMapping '\x1fb7' s = Yield '\x0391' (CC s '\x0342' '\x0345')
319−-- GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
320−titleMapping '\x1fc7' s = Yield '\x0397' (CC s '\x0342' '\x0345')
321−-- GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
322−titleMapping '\x1ff7' s = Yield '\x03a9' (CC s '\x0342' '\x0345')
323−titleMapping c s = Yield (toTitle c) (CC s '\0' '\0')
324−foldMapping :: forall s. Char -> s -> Step (CC s) Char
325−{-# NOINLINE foldMapping #-}
326−-- MICRO SIGN
327−foldMapping '\x00b5' s = Yield '\x03bc' (CC s '\x0000' '\x0000')
328−-- LATIN SMALL LETTER SHARP S
329−foldMapping '\x00df' s = Yield '\x0073' (CC s '\x0073' '\x0000')
330−-- LATIN CAPITAL LETTER I WITH DOT ABOVE
331−foldMapping '\x0130' s = Yield '\x0069' (CC s '\x0307' '\x0000')
332−-- LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
333−foldMapping '\x0149' s = Yield '\x02bc' (CC s '\x006e' '\x0000')
334−-- LATIN SMALL LETTER LONG S
335−foldMapping '\x017f' s = Yield '\x0073' (CC s '\x0000' '\x0000')
336−-- LATIN SMALL LETTER J WITH CARON
337−foldMapping '\x01f0' s = Yield '\x006a' (CC s '\x030c' '\x0000')
338−-- COMBINING GREEK YPOGEGRAMMENI
339−foldMapping '\x0345' s = Yield '\x03b9' (CC s '\x0000' '\x0000')
340−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
341−foldMapping '\x0390' s = Yield '\x03b9' (CC s '\x0308' '\x0301')
342−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
343−foldMapping '\x03b0' s = Yield '\x03c5' (CC s '\x0308' '\x0301')
344−-- GREEK SMALL LETTER FINAL SIGMA
345−foldMapping '\x03c2' s = Yield '\x03c3' (CC s '\x0000' '\x0000')
346−-- GREEK BETA SYMBOL
347−foldMapping '\x03d0' s = Yield '\x03b2' (CC s '\x0000' '\x0000')
348−-- GREEK THETA SYMBOL
349−foldMapping '\x03d1' s = Yield '\x03b8' (CC s '\x0000' '\x0000')
350−-- GREEK PHI SYMBOL
351−foldMapping '\x03d5' s = Yield '\x03c6' (CC s '\x0000' '\x0000')
352−-- GREEK PI SYMBOL
353−foldMapping '\x03d6' s = Yield '\x03c0' (CC s '\x0000' '\x0000')
354−-- GREEK KAPPA SYMBOL
355−foldMapping '\x03f0' s = Yield '\x03ba' (CC s '\x0000' '\x0000')
356−-- GREEK RHO SYMBOL
357−foldMapping '\x03f1' s = Yield '\x03c1' (CC s '\x0000' '\x0000')
358−-- GREEK LUNATE EPSILON SYMBOL
359−foldMapping '\x03f5' s = Yield '\x03b5' (CC s '\x0000' '\x0000')
360−-- ARMENIAN SMALL LIGATURE ECH YIWN
361−foldMapping '\x0587' s = Yield '\x0565' (CC s '\x0582' '\x0000')
362−-- CHEROKEE SMALL LETTER YE
363−foldMapping '\x13f8' s = Yield '\x13f0' (CC s '\x0000' '\x0000')
364−-- CHEROKEE SMALL LETTER YI
365−foldMapping '\x13f9' s = Yield '\x13f1' (CC s '\x0000' '\x0000')
366−-- CHEROKEE SMALL LETTER YO
367−foldMapping '\x13fa' s = Yield '\x13f2' (CC s '\x0000' '\x0000')
368−-- CHEROKEE SMALL LETTER YU
369−foldMapping '\x13fb' s = Yield '\x13f3' (CC s '\x0000' '\x0000')
370−-- CHEROKEE SMALL LETTER YV
371−foldMapping '\x13fc' s = Yield '\x13f4' (CC s '\x0000' '\x0000')
372−-- CHEROKEE SMALL LETTER MV
373−foldMapping '\x13fd' s = Yield '\x13f5' (CC s '\x0000' '\x0000')
374−-- LATIN SMALL LETTER H WITH LINE BELOW
375−foldMapping '\x1e96' s = Yield '\x0068' (CC s '\x0331' '\x0000')
376−-- LATIN SMALL LETTER T WITH DIAERESIS
377−foldMapping '\x1e97' s = Yield '\x0074' (CC s '\x0308' '\x0000')
378−-- LATIN SMALL LETTER W WITH RING ABOVE
379−foldMapping '\x1e98' s = Yield '\x0077' (CC s '\x030a' '\x0000')
380−-- LATIN SMALL LETTER Y WITH RING ABOVE
381−foldMapping '\x1e99' s = Yield '\x0079' (CC s '\x030a' '\x0000')
382−-- LATIN SMALL LETTER A WITH RIGHT HALF RING
383−foldMapping '\x1e9a' s = Yield '\x0061' (CC s '\x02be' '\x0000')
384−-- LATIN SMALL LETTER LONG S WITH DOT ABOVE
385−foldMapping '\x1e9b' s = Yield '\x1e61' (CC s '\x0000' '\x0000')
386−-- LATIN CAPITAL LETTER SHARP S
387−foldMapping '\x1e9e' s = Yield '\x0073' (CC s '\x0073' '\x0000')
388−-- GREEK SMALL LETTER UPSILON WITH PSILI
389−foldMapping '\x1f50' s = Yield '\x03c5' (CC s '\x0313' '\x0000')
390−-- GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
391−foldMapping '\x1f52' s = Yield '\x03c5' (CC s '\x0313' '\x0300')
392−-- GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
393−foldMapping '\x1f54' s = Yield '\x03c5' (CC s '\x0313' '\x0301')
394−-- GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
395−foldMapping '\x1f56' s = Yield '\x03c5' (CC s '\x0313' '\x0342')
396−-- GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
397−foldMapping '\x1f80' s = Yield '\x1f00' (CC s '\x03b9' '\x0000')
398−-- GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
399−foldMapping '\x1f81' s = Yield '\x1f01' (CC s '\x03b9' '\x0000')
400−-- GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
401−foldMapping '\x1f82' s = Yield '\x1f02' (CC s '\x03b9' '\x0000')
402−-- GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
403−foldMapping '\x1f83' s = Yield '\x1f03' (CC s '\x03b9' '\x0000')
404−-- GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
405−foldMapping '\x1f84' s = Yield '\x1f04' (CC s '\x03b9' '\x0000')
406−-- GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
407−foldMapping '\x1f85' s = Yield '\x1f05' (CC s '\x03b9' '\x0000')
408−-- GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
409−foldMapping '\x1f86' s = Yield '\x1f06' (CC s '\x03b9' '\x0000')
410−-- GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
411−foldMapping '\x1f87' s = Yield '\x1f07' (CC s '\x03b9' '\x0000')
412−-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
413−foldMapping '\x1f88' s = Yield '\x1f00' (CC s '\x03b9' '\x0000')
414−-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
415−foldMapping '\x1f89' s = Yield '\x1f01' (CC s '\x03b9' '\x0000')
416−-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
417−foldMapping '\x1f8a' s = Yield '\x1f02' (CC s '\x03b9' '\x0000')
418−-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
419−foldMapping '\x1f8b' s = Yield '\x1f03' (CC s '\x03b9' '\x0000')
420−-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
421−foldMapping '\x1f8c' s = Yield '\x1f04' (CC s '\x03b9' '\x0000')
422−-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
423−foldMapping '\x1f8d' s = Yield '\x1f05' (CC s '\x03b9' '\x0000')
424−-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
425−foldMapping '\x1f8e' s = Yield '\x1f06' (CC s '\x03b9' '\x0000')
426−-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
427−foldMapping '\x1f8f' s = Yield '\x1f07' (CC s '\x03b9' '\x0000')
428−-- GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
429−foldMapping '\x1f90' s = Yield '\x1f20' (CC s '\x03b9' '\x0000')
430−-- GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
431−foldMapping '\x1f91' s = Yield '\x1f21' (CC s '\x03b9' '\x0000')
432−-- GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
433−foldMapping '\x1f92' s = Yield '\x1f22' (CC s '\x03b9' '\x0000')
434−-- GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
435−foldMapping '\x1f93' s = Yield '\x1f23' (CC s '\x03b9' '\x0000')
436−-- GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
437−foldMapping '\x1f94' s = Yield '\x1f24' (CC s '\x03b9' '\x0000')
438−-- GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
439−foldMapping '\x1f95' s = Yield '\x1f25' (CC s '\x03b9' '\x0000')
440−-- GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
441−foldMapping '\x1f96' s = Yield '\x1f26' (CC s '\x03b9' '\x0000')
442−-- GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
443−foldMapping '\x1f97' s = Yield '\x1f27' (CC s '\x03b9' '\x0000')
444−-- GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
445−foldMapping '\x1f98' s = Yield '\x1f20' (CC s '\x03b9' '\x0000')
446−-- GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
447−foldMapping '\x1f99' s = Yield '\x1f21' (CC s '\x03b9' '\x0000')
448−-- GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
449−foldMapping '\x1f9a' s = Yield '\x1f22' (CC s '\x03b9' '\x0000')
450−-- GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
451−foldMapping '\x1f9b' s = Yield '\x1f23' (CC s '\x03b9' '\x0000')
452−-- GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
453−foldMapping '\x1f9c' s = Yield '\x1f24' (CC s '\x03b9' '\x0000')
454−-- GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
455−foldMapping '\x1f9d' s = Yield '\x1f25' (CC s '\x03b9' '\x0000')
456−-- GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
457−foldMapping '\x1f9e' s = Yield '\x1f26' (CC s '\x03b9' '\x0000')
458−-- GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
459−foldMapping '\x1f9f' s = Yield '\x1f27' (CC s '\x03b9' '\x0000')
460−-- GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
461−foldMapping '\x1fa0' s = Yield '\x1f60' (CC s '\x03b9' '\x0000')
462−-- GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
463−foldMapping '\x1fa1' s = Yield '\x1f61' (CC s '\x03b9' '\x0000')
464−-- GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
465−foldMapping '\x1fa2' s = Yield '\x1f62' (CC s '\x03b9' '\x0000')
466−-- GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
467−foldMapping '\x1fa3' s = Yield '\x1f63' (CC s '\x03b9' '\x0000')
468−-- GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
469−foldMapping '\x1fa4' s = Yield '\x1f64' (CC s '\x03b9' '\x0000')
470−-- GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
471−foldMapping '\x1fa5' s = Yield '\x1f65' (CC s '\x03b9' '\x0000')
472−-- GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
473−foldMapping '\x1fa6' s = Yield '\x1f66' (CC s '\x03b9' '\x0000')
474−-- GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
475−foldMapping '\x1fa7' s = Yield '\x1f67' (CC s '\x03b9' '\x0000')
476−-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
477−foldMapping '\x1fa8' s = Yield '\x1f60' (CC s '\x03b9' '\x0000')
478−-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
479−foldMapping '\x1fa9' s = Yield '\x1f61' (CC s '\x03b9' '\x0000')
480−-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
481−foldMapping '\x1faa' s = Yield '\x1f62' (CC s '\x03b9' '\x0000')
482−-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
483−foldMapping '\x1fab' s = Yield '\x1f63' (CC s '\x03b9' '\x0000')
484−-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
485−foldMapping '\x1fac' s = Yield '\x1f64' (CC s '\x03b9' '\x0000')
486−-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
487−foldMapping '\x1fad' s = Yield '\x1f65' (CC s '\x03b9' '\x0000')
488−-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
489−foldMapping '\x1fae' s = Yield '\x1f66' (CC s '\x03b9' '\x0000')
490−-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
491−foldMapping '\x1faf' s = Yield '\x1f67' (CC s '\x03b9' '\x0000')
492−-- GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
493−foldMapping '\x1fb2' s = Yield '\x1f70' (CC s '\x03b9' '\x0000')
494−-- GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
495−foldMapping '\x1fb3' s = Yield '\x03b1' (CC s '\x03b9' '\x0000')
496−-- GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
497−foldMapping '\x1fb4' s = Yield '\x03ac' (CC s '\x03b9' '\x0000')
498−-- GREEK SMALL LETTER ALPHA WITH PERISPOMENI
499−foldMapping '\x1fb6' s = Yield '\x03b1' (CC s '\x0342' '\x0000')
500−-- GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
501−foldMapping '\x1fb7' s = Yield '\x03b1' (CC s '\x0342' '\x03b9')
502−-- GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
503−foldMapping '\x1fbc' s = Yield '\x03b1' (CC s '\x03b9' '\x0000')
504−-- GREEK PROSGEGRAMMENI
505−foldMapping '\x1fbe' s = Yield '\x03b9' (CC s '\x0000' '\x0000')
506−-- GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
507−foldMapping '\x1fc2' s = Yield '\x1f74' (CC s '\x03b9' '\x0000')
508−-- GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
509−foldMapping '\x1fc3' s = Yield '\x03b7' (CC s '\x03b9' '\x0000')
510−-- GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
511−foldMapping '\x1fc4' s = Yield '\x03ae' (CC s '\x03b9' '\x0000')
512−-- GREEK SMALL LETTER ETA WITH PERISPOMENI
513−foldMapping '\x1fc6' s = Yield '\x03b7' (CC s '\x0342' '\x0000')
514−-- GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
515−foldMapping '\x1fc7' s = Yield '\x03b7' (CC s '\x0342' '\x03b9')
516−-- GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
517−foldMapping '\x1fcc' s = Yield '\x03b7' (CC s '\x03b9' '\x0000')
518−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
519−foldMapping '\x1fd2' s = Yield '\x03b9' (CC s '\x0308' '\x0300')
520−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
521−foldMapping '\x1fd3' s = Yield '\x03b9' (CC s '\x0308' '\x0301')
522−-- GREEK SMALL LETTER IOTA WITH PERISPOMENI
523−foldMapping '\x1fd6' s = Yield '\x03b9' (CC s '\x0342' '\x0000')
524−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
525−foldMapping '\x1fd7' s = Yield '\x03b9' (CC s '\x0308' '\x0342')
526−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
527−foldMapping '\x1fe2' s = Yield '\x03c5' (CC s '\x0308' '\x0300')
528−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
529−foldMapping '\x1fe3' s = Yield '\x03c5' (CC s '\x0308' '\x0301')
530−-- GREEK SMALL LETTER RHO WITH PSILI
531−foldMapping '\x1fe4' s = Yield '\x03c1' (CC s '\x0313' '\x0000')
532−-- GREEK SMALL LETTER UPSILON WITH PERISPOMENI
533−foldMapping '\x1fe6' s = Yield '\x03c5' (CC s '\x0342' '\x0000')
534−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
535−foldMapping '\x1fe7' s = Yield '\x03c5' (CC s '\x0308' '\x0342')
536−-- GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
537−foldMapping '\x1ff2' s = Yield '\x1f7c' (CC s '\x03b9' '\x0000')
538−-- GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
539−foldMapping '\x1ff3' s = Yield '\x03c9' (CC s '\x03b9' '\x0000')
540−-- GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
541−foldMapping '\x1ff4' s = Yield '\x03ce' (CC s '\x03b9' '\x0000')
542−-- GREEK SMALL LETTER OMEGA WITH PERISPOMENI
543−foldMapping '\x1ff6' s = Yield '\x03c9' (CC s '\x0342' '\x0000')
544−-- GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
545−foldMapping '\x1ff7' s = Yield '\x03c9' (CC s '\x0342' '\x03b9')
546−-- GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
547−foldMapping '\x1ffc' s = Yield '\x03c9' (CC s '\x03b9' '\x0000')
548−-- LATIN CAPITAL LETTER J WITH CROSSED-TAIL
549−foldMapping '\xa7b2' s = Yield '\x029d' (CC s '\x0000' '\x0000')
550−-- LATIN CAPITAL LETTER CHI
551−foldMapping '\xa7b3' s = Yield '\xab53' (CC s '\x0000' '\x0000')
552−-- LATIN CAPITAL LETTER BETA
553−foldMapping '\xa7b4' s = Yield '\xa7b5' (CC s '\x0000' '\x0000')
554−-- LATIN CAPITAL LETTER OMEGA
555−foldMapping '\xa7b6' s = Yield '\xa7b7' (CC s '\x0000' '\x0000')
556−-- CHEROKEE SMALL LETTER A
557−foldMapping '\xab70' s = Yield '\x13a0' (CC s '\x0000' '\x0000')
558−-- CHEROKEE SMALL LETTER E
559−foldMapping '\xab71' s = Yield '\x13a1' (CC s '\x0000' '\x0000')
560−-- CHEROKEE SMALL LETTER I
561−foldMapping '\xab72' s = Yield '\x13a2' (CC s '\x0000' '\x0000')
562−-- CHEROKEE SMALL LETTER O
563−foldMapping '\xab73' s = Yield '\x13a3' (CC s '\x0000' '\x0000')
564−-- CHEROKEE SMALL LETTER U
565−foldMapping '\xab74' s = Yield '\x13a4' (CC s '\x0000' '\x0000')
566−-- CHEROKEE SMALL LETTER V
567−foldMapping '\xab75' s = Yield '\x13a5' (CC s '\x0000' '\x0000')
568−-- CHEROKEE SMALL LETTER GA
569−foldMapping '\xab76' s = Yield '\x13a6' (CC s '\x0000' '\x0000')
570−-- CHEROKEE SMALL LETTER KA
571−foldMapping '\xab77' s = Yield '\x13a7' (CC s '\x0000' '\x0000')
572−-- CHEROKEE SMALL LETTER GE
573−foldMapping '\xab78' s = Yield '\x13a8' (CC s '\x0000' '\x0000')
574−-- CHEROKEE SMALL LETTER GI
575−foldMapping '\xab79' s = Yield '\x13a9' (CC s '\x0000' '\x0000')
576−-- CHEROKEE SMALL LETTER GO
577−foldMapping '\xab7a' s = Yield '\x13aa' (CC s '\x0000' '\x0000')
578−-- CHEROKEE SMALL LETTER GU
579−foldMapping '\xab7b' s = Yield '\x13ab' (CC s '\x0000' '\x0000')
580−-- CHEROKEE SMALL LETTER GV
581−foldMapping '\xab7c' s = Yield '\x13ac' (CC s '\x0000' '\x0000')
582−-- CHEROKEE SMALL LETTER HA
583−foldMapping '\xab7d' s = Yield '\x13ad' (CC s '\x0000' '\x0000')
584−-- CHEROKEE SMALL LETTER HE
585−foldMapping '\xab7e' s = Yield '\x13ae' (CC s '\x0000' '\x0000')
586−-- CHEROKEE SMALL LETTER HI
587−foldMapping '\xab7f' s = Yield '\x13af' (CC s '\x0000' '\x0000')
588−-- CHEROKEE SMALL LETTER HO
589−foldMapping '\xab80' s = Yield '\x13b0' (CC s '\x0000' '\x0000')
590−-- CHEROKEE SMALL LETTER HU
591−foldMapping '\xab81' s = Yield '\x13b1' (CC s '\x0000' '\x0000')
592−-- CHEROKEE SMALL LETTER HV
593−foldMapping '\xab82' s = Yield '\x13b2' (CC s '\x0000' '\x0000')
594−-- CHEROKEE SMALL LETTER LA
595−foldMapping '\xab83' s = Yield '\x13b3' (CC s '\x0000' '\x0000')
596−-- CHEROKEE SMALL LETTER LE
597−foldMapping '\xab84' s = Yield '\x13b4' (CC s '\x0000' '\x0000')
598−-- CHEROKEE SMALL LETTER LI
599−foldMapping '\xab85' s = Yield '\x13b5' (CC s '\x0000' '\x0000')
600−-- CHEROKEE SMALL LETTER LO
601−foldMapping '\xab86' s = Yield '\x13b6' (CC s '\x0000' '\x0000')
602−-- CHEROKEE SMALL LETTER LU
603−foldMapping '\xab87' s = Yield '\x13b7' (CC s '\x0000' '\x0000')
604−-- CHEROKEE SMALL LETTER LV
605−foldMapping '\xab88' s = Yield '\x13b8' (CC s '\x0000' '\x0000')
606−-- CHEROKEE SMALL LETTER MA
607−foldMapping '\xab89' s = Yield '\x13b9' (CC s '\x0000' '\x0000')
608−-- CHEROKEE SMALL LETTER ME
609−foldMapping '\xab8a' s = Yield '\x13ba' (CC s '\x0000' '\x0000')
610−-- CHEROKEE SMALL LETTER MI
611−foldMapping '\xab8b' s = Yield '\x13bb' (CC s '\x0000' '\x0000')
612−-- CHEROKEE SMALL LETTER MO
613−foldMapping '\xab8c' s = Yield '\x13bc' (CC s '\x0000' '\x0000')
614−-- CHEROKEE SMALL LETTER MU
615−foldMapping '\xab8d' s = Yield '\x13bd' (CC s '\x0000' '\x0000')
616−-- CHEROKEE SMALL LETTER NA
617−foldMapping '\xab8e' s = Yield '\x13be' (CC s '\x0000' '\x0000')
618−-- CHEROKEE SMALL LETTER HNA
619−foldMapping '\xab8f' s = Yield '\x13bf' (CC s '\x0000' '\x0000')
620−-- CHEROKEE SMALL LETTER NAH
621−foldMapping '\xab90' s = Yield '\x13c0' (CC s '\x0000' '\x0000')
622−-- CHEROKEE SMALL LETTER NE
623−foldMapping '\xab91' s = Yield '\x13c1' (CC s '\x0000' '\x0000')
624−-- CHEROKEE SMALL LETTER NI
625−foldMapping '\xab92' s = Yield '\x13c2' (CC s '\x0000' '\x0000')
626−-- CHEROKEE SMALL LETTER NO
627−foldMapping '\xab93' s = Yield '\x13c3' (CC s '\x0000' '\x0000')
628−-- CHEROKEE SMALL LETTER NU
629−foldMapping '\xab94' s = Yield '\x13c4' (CC s '\x0000' '\x0000')
630−-- CHEROKEE SMALL LETTER NV
631−foldMapping '\xab95' s = Yield '\x13c5' (CC s '\x0000' '\x0000')
632−-- CHEROKEE SMALL LETTER QUA
633−foldMapping '\xab96' s = Yield '\x13c6' (CC s '\x0000' '\x0000')
634−-- CHEROKEE SMALL LETTER QUE
635−foldMapping '\xab97' s = Yield '\x13c7' (CC s '\x0000' '\x0000')
636−-- CHEROKEE SMALL LETTER QUI
637−foldMapping '\xab98' s = Yield '\x13c8' (CC s '\x0000' '\x0000')
638−-- CHEROKEE SMALL LETTER QUO
639−foldMapping '\xab99' s = Yield '\x13c9' (CC s '\x0000' '\x0000')
640−-- CHEROKEE SMALL LETTER QUU
641−foldMapping '\xab9a' s = Yield '\x13ca' (CC s '\x0000' '\x0000')
642−-- CHEROKEE SMALL LETTER QUV
643−foldMapping '\xab9b' s = Yield '\x13cb' (CC s '\x0000' '\x0000')
644−-- CHEROKEE SMALL LETTER SA
645−foldMapping '\xab9c' s = Yield '\x13cc' (CC s '\x0000' '\x0000')
646−-- CHEROKEE SMALL LETTER S
647−foldMapping '\xab9d' s = Yield '\x13cd' (CC s '\x0000' '\x0000')
648−-- CHEROKEE SMALL LETTER SE
649−foldMapping '\xab9e' s = Yield '\x13ce' (CC s '\x0000' '\x0000')
650−-- CHEROKEE SMALL LETTER SI
651−foldMapping '\xab9f' s = Yield '\x13cf' (CC s '\x0000' '\x0000')
652−-- CHEROKEE SMALL LETTER SO
653−foldMapping '\xaba0' s = Yield '\x13d0' (CC s '\x0000' '\x0000')
654−-- CHEROKEE SMALL LETTER SU
655−foldMapping '\xaba1' s = Yield '\x13d1' (CC s '\x0000' '\x0000')
656−-- CHEROKEE SMALL LETTER SV
657−foldMapping '\xaba2' s = Yield '\x13d2' (CC s '\x0000' '\x0000')
658−-- CHEROKEE SMALL LETTER DA
659−foldMapping '\xaba3' s = Yield '\x13d3' (CC s '\x0000' '\x0000')
660−-- CHEROKEE SMALL LETTER TA
661−foldMapping '\xaba4' s = Yield '\x13d4' (CC s '\x0000' '\x0000')
662−-- CHEROKEE SMALL LETTER DE
663−foldMapping '\xaba5' s = Yield '\x13d5' (CC s '\x0000' '\x0000')
664−-- CHEROKEE SMALL LETTER TE
665−foldMapping '\xaba6' s = Yield '\x13d6' (CC s '\x0000' '\x0000')
666−-- CHEROKEE SMALL LETTER DI
667−foldMapping '\xaba7' s = Yield '\x13d7' (CC s '\x0000' '\x0000')
668−-- CHEROKEE SMALL LETTER TI
669−foldMapping '\xaba8' s = Yield '\x13d8' (CC s '\x0000' '\x0000')
670−-- CHEROKEE SMALL LETTER DO
671−foldMapping '\xaba9' s = Yield '\x13d9' (CC s '\x0000' '\x0000')
672−-- CHEROKEE SMALL LETTER DU
673−foldMapping '\xabaa' s = Yield '\x13da' (CC s '\x0000' '\x0000')
674−-- CHEROKEE SMALL LETTER DV
675−foldMapping '\xabab' s = Yield '\x13db' (CC s '\x0000' '\x0000')
676−-- CHEROKEE SMALL LETTER DLA
677−foldMapping '\xabac' s = Yield '\x13dc' (CC s '\x0000' '\x0000')
678−-- CHEROKEE SMALL LETTER TLA
679−foldMapping '\xabad' s = Yield '\x13dd' (CC s '\x0000' '\x0000')
680−-- CHEROKEE SMALL LETTER TLE
681−foldMapping '\xabae' s = Yield '\x13de' (CC s '\x0000' '\x0000')
682−-- CHEROKEE SMALL LETTER TLI
683−foldMapping '\xabaf' s = Yield '\x13df' (CC s '\x0000' '\x0000')
684−-- CHEROKEE SMALL LETTER TLO
685−foldMapping '\xabb0' s = Yield '\x13e0' (CC s '\x0000' '\x0000')
686−-- CHEROKEE SMALL LETTER TLU
687−foldMapping '\xabb1' s = Yield '\x13e1' (CC s '\x0000' '\x0000')
688−-- CHEROKEE SMALL LETTER TLV
689−foldMapping '\xabb2' s = Yield '\x13e2' (CC s '\x0000' '\x0000')
690−-- CHEROKEE SMALL LETTER TSA
691−foldMapping '\xabb3' s = Yield '\x13e3' (CC s '\x0000' '\x0000')
692−-- CHEROKEE SMALL LETTER TSE
693−foldMapping '\xabb4' s = Yield '\x13e4' (CC s '\x0000' '\x0000')
694−-- CHEROKEE SMALL LETTER TSI
695−foldMapping '\xabb5' s = Yield '\x13e5' (CC s '\x0000' '\x0000')
696−-- CHEROKEE SMALL LETTER TSO
697−foldMapping '\xabb6' s = Yield '\x13e6' (CC s '\x0000' '\x0000')
698−-- CHEROKEE SMALL LETTER TSU
699−foldMapping '\xabb7' s = Yield '\x13e7' (CC s '\x0000' '\x0000')
700−-- CHEROKEE SMALL LETTER TSV
701−foldMapping '\xabb8' s = Yield '\x13e8' (CC s '\x0000' '\x0000')
702−-- CHEROKEE SMALL LETTER WA
703−foldMapping '\xabb9' s = Yield '\x13e9' (CC s '\x0000' '\x0000')
704−-- CHEROKEE SMALL LETTER WE
705−foldMapping '\xabba' s = Yield '\x13ea' (CC s '\x0000' '\x0000')
706−-- CHEROKEE SMALL LETTER WI
707−foldMapping '\xabbb' s = Yield '\x13eb' (CC s '\x0000' '\x0000')
708−-- CHEROKEE SMALL LETTER WO
709−foldMapping '\xabbc' s = Yield '\x13ec' (CC s '\x0000' '\x0000')
710−-- CHEROKEE SMALL LETTER WU
711−foldMapping '\xabbd' s = Yield '\x13ed' (CC s '\x0000' '\x0000')
712−-- CHEROKEE SMALL LETTER WV
713−foldMapping '\xabbe' s = Yield '\x13ee' (CC s '\x0000' '\x0000')
714−-- CHEROKEE SMALL LETTER YA
715−foldMapping '\xabbf' s = Yield '\x13ef' (CC s '\x0000' '\x0000')
716−-- LATIN SMALL LIGATURE FF
717−foldMapping '\xfb00' s = Yield '\x0066' (CC s '\x0066' '\x0000')
718−-- LATIN SMALL LIGATURE FI
719−foldMapping '\xfb01' s = Yield '\x0066' (CC s '\x0069' '\x0000')
720−-- LATIN SMALL LIGATURE FL
721−foldMapping '\xfb02' s = Yield '\x0066' (CC s '\x006c' '\x0000')
722−-- LATIN SMALL LIGATURE FFI
723−foldMapping '\xfb03' s = Yield '\x0066' (CC s '\x0066' '\x0069')
724−-- LATIN SMALL LIGATURE FFL
725−foldMapping '\xfb04' s = Yield '\x0066' (CC s '\x0066' '\x006c')
726−-- LATIN SMALL LIGATURE LONG S T
727−foldMapping '\xfb05' s = Yield '\x0073' (CC s '\x0074' '\x0000')
728−-- LATIN SMALL LIGATURE ST
729−foldMapping '\xfb06' s = Yield '\x0073' (CC s '\x0074' '\x0000')
730−-- ARMENIAN SMALL LIGATURE MEN NOW
731−foldMapping '\xfb13' s = Yield '\x0574' (CC s '\x0576' '\x0000')
732−-- ARMENIAN SMALL LIGATURE MEN ECH
733−foldMapping '\xfb14' s = Yield '\x0574' (CC s '\x0565' '\x0000')
734−-- ARMENIAN SMALL LIGATURE MEN INI
735−foldMapping '\xfb15' s = Yield '\x0574' (CC s '\x056b' '\x0000')
736−-- ARMENIAN SMALL LIGATURE VEW NOW
737−foldMapping '\xfb16' s = Yield '\x057e' (CC s '\x0576' '\x0000')
738−-- ARMENIAN SMALL LIGATURE MEN XEH
739−foldMapping '\xfb17' s = Yield '\x0574' (CC s '\x056d' '\x0000')
740−-- OLD HUNGARIAN CAPITAL LETTER A
741−foldMapping '\x10c80' s = Yield '\x10cc0' (CC s '\x0000' '\x0000')
742−-- OLD HUNGARIAN CAPITAL LETTER AA
743−foldMapping '\x10c81' s = Yield '\x10cc1' (CC s '\x0000' '\x0000')
744−-- OLD HUNGARIAN CAPITAL LETTER EB
745−foldMapping '\x10c82' s = Yield '\x10cc2' (CC s '\x0000' '\x0000')
746−-- OLD HUNGARIAN CAPITAL LETTER AMB
747−foldMapping '\x10c83' s = Yield '\x10cc3' (CC s '\x0000' '\x0000')
748−-- OLD HUNGARIAN CAPITAL LETTER EC
749−foldMapping '\x10c84' s = Yield '\x10cc4' (CC s '\x0000' '\x0000')
750−-- OLD HUNGARIAN CAPITAL LETTER ENC
751−foldMapping '\x10c85' s = Yield '\x10cc5' (CC s '\x0000' '\x0000')
752−-- OLD HUNGARIAN CAPITAL LETTER ECS
753−foldMapping '\x10c86' s = Yield '\x10cc6' (CC s '\x0000' '\x0000')
754−-- OLD HUNGARIAN CAPITAL LETTER ED
755−foldMapping '\x10c87' s = Yield '\x10cc7' (CC s '\x0000' '\x0000')
756−-- OLD HUNGARIAN CAPITAL LETTER AND
757−foldMapping '\x10c88' s = Yield '\x10cc8' (CC s '\x0000' '\x0000')
758−-- OLD HUNGARIAN CAPITAL LETTER E
759−foldMapping '\x10c89' s = Yield '\x10cc9' (CC s '\x0000' '\x0000')
760−-- OLD HUNGARIAN CAPITAL LETTER CLOSE E
761−foldMapping '\x10c8a' s = Yield '\x10cca' (CC s '\x0000' '\x0000')
762−-- OLD HUNGARIAN CAPITAL LETTER EE
763−foldMapping '\x10c8b' s = Yield '\x10ccb' (CC s '\x0000' '\x0000')
764−-- OLD HUNGARIAN CAPITAL LETTER EF
765−foldMapping '\x10c8c' s = Yield '\x10ccc' (CC s '\x0000' '\x0000')
766−-- OLD HUNGARIAN CAPITAL LETTER EG
767−foldMapping '\x10c8d' s = Yield '\x10ccd' (CC s '\x0000' '\x0000')
768−-- OLD HUNGARIAN CAPITAL LETTER EGY
769−foldMapping '\x10c8e' s = Yield '\x10cce' (CC s '\x0000' '\x0000')
770−-- OLD HUNGARIAN CAPITAL LETTER EH
771−foldMapping '\x10c8f' s = Yield '\x10ccf' (CC s '\x0000' '\x0000')
772−-- OLD HUNGARIAN CAPITAL LETTER I
773−foldMapping '\x10c90' s = Yield '\x10cd0' (CC s '\x0000' '\x0000')
774−-- OLD HUNGARIAN CAPITAL LETTER II
775−foldMapping '\x10c91' s = Yield '\x10cd1' (CC s '\x0000' '\x0000')
776−-- OLD HUNGARIAN CAPITAL LETTER EJ
777−foldMapping '\x10c92' s = Yield '\x10cd2' (CC s '\x0000' '\x0000')
778−-- OLD HUNGARIAN CAPITAL LETTER EK
779−foldMapping '\x10c93' s = Yield '\x10cd3' (CC s '\x0000' '\x0000')
780−-- OLD HUNGARIAN CAPITAL LETTER AK
781−foldMapping '\x10c94' s = Yield '\x10cd4' (CC s '\x0000' '\x0000')
782−-- OLD HUNGARIAN CAPITAL LETTER UNK
783−foldMapping '\x10c95' s = Yield '\x10cd5' (CC s '\x0000' '\x0000')
784−-- OLD HUNGARIAN CAPITAL LETTER EL
785−foldMapping '\x10c96' s = Yield '\x10cd6' (CC s '\x0000' '\x0000')
786−-- OLD HUNGARIAN CAPITAL LETTER ELY
787−foldMapping '\x10c97' s = Yield '\x10cd7' (CC s '\x0000' '\x0000')
788−-- OLD HUNGARIAN CAPITAL LETTER EM
789−foldMapping '\x10c98' s = Yield '\x10cd8' (CC s '\x0000' '\x0000')
790−-- OLD HUNGARIAN CAPITAL LETTER EN
791−foldMapping '\x10c99' s = Yield '\x10cd9' (CC s '\x0000' '\x0000')
792−-- OLD HUNGARIAN CAPITAL LETTER ENY
793−foldMapping '\x10c9a' s = Yield '\x10cda' (CC s '\x0000' '\x0000')
794−-- OLD HUNGARIAN CAPITAL LETTER O
795−foldMapping '\x10c9b' s = Yield '\x10cdb' (CC s '\x0000' '\x0000')
796−-- OLD HUNGARIAN CAPITAL LETTER OO
797−foldMapping '\x10c9c' s = Yield '\x10cdc' (CC s '\x0000' '\x0000')
798−-- OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE
799−foldMapping '\x10c9d' s = Yield '\x10cdd' (CC s '\x0000' '\x0000')
800−-- OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE
801−foldMapping '\x10c9e' s = Yield '\x10cde' (CC s '\x0000' '\x0000')
802−-- OLD HUNGARIAN CAPITAL LETTER OEE
803−foldMapping '\x10c9f' s = Yield '\x10cdf' (CC s '\x0000' '\x0000')
804−-- OLD HUNGARIAN CAPITAL LETTER EP
805−foldMapping '\x10ca0' s = Yield '\x10ce0' (CC s '\x0000' '\x0000')
806−-- OLD HUNGARIAN CAPITAL LETTER EMP
807−foldMapping '\x10ca1' s = Yield '\x10ce1' (CC s '\x0000' '\x0000')
808−-- OLD HUNGARIAN CAPITAL LETTER ER
809−foldMapping '\x10ca2' s = Yield '\x10ce2' (CC s '\x0000' '\x0000')
810−-- OLD HUNGARIAN CAPITAL LETTER SHORT ER
811−foldMapping '\x10ca3' s = Yield '\x10ce3' (CC s '\x0000' '\x0000')
812−-- OLD HUNGARIAN CAPITAL LETTER ES
813−foldMapping '\x10ca4' s = Yield '\x10ce4' (CC s '\x0000' '\x0000')
814−-- OLD HUNGARIAN CAPITAL LETTER ESZ
815−foldMapping '\x10ca5' s = Yield '\x10ce5' (CC s '\x0000' '\x0000')
816−-- OLD HUNGARIAN CAPITAL LETTER ET
817−foldMapping '\x10ca6' s = Yield '\x10ce6' (CC s '\x0000' '\x0000')
818−-- OLD HUNGARIAN CAPITAL LETTER ENT
819−foldMapping '\x10ca7' s = Yield '\x10ce7' (CC s '\x0000' '\x0000')
820−-- OLD HUNGARIAN CAPITAL LETTER ETY
821−foldMapping '\x10ca8' s = Yield '\x10ce8' (CC s '\x0000' '\x0000')
822−-- OLD HUNGARIAN CAPITAL LETTER ECH
823−foldMapping '\x10ca9' s = Yield '\x10ce9' (CC s '\x0000' '\x0000')
824−-- OLD HUNGARIAN CAPITAL LETTER U
825−foldMapping '\x10caa' s = Yield '\x10cea' (CC s '\x0000' '\x0000')
826−-- OLD HUNGARIAN CAPITAL LETTER UU
827−foldMapping '\x10cab' s = Yield '\x10ceb' (CC s '\x0000' '\x0000')
828−-- OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE
829−foldMapping '\x10cac' s = Yield '\x10cec' (CC s '\x0000' '\x0000')
830−-- OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE
831−foldMapping '\x10cad' s = Yield '\x10ced' (CC s '\x0000' '\x0000')
832−-- OLD HUNGARIAN CAPITAL LETTER EV
833−foldMapping '\x10cae' s = Yield '\x10cee' (CC s '\x0000' '\x0000')
834−-- OLD HUNGARIAN CAPITAL LETTER EZ
835−foldMapping '\x10caf' s = Yield '\x10cef' (CC s '\x0000' '\x0000')
836−-- OLD HUNGARIAN CAPITAL LETTER EZS
837−foldMapping '\x10cb0' s = Yield '\x10cf0' (CC s '\x0000' '\x0000')
838−-- OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN
839−foldMapping '\x10cb1' s = Yield '\x10cf1' (CC s '\x0000' '\x0000')
840−-- OLD HUNGARIAN CAPITAL LETTER US
841−foldMapping '\x10cb2' s = Yield '\x10cf2' (CC s '\x0000' '\x0000')
842−foldMapping c s = Yield (toLower c) (CC s '\0' '\0')
Data/Text/Internal/Fusion/Common.hs+117−72
@@ -1,7 +1,7 @@
1−{-# LANGUAGE BangPatterns, MagicHash, Rank2Types #-}
1+{-# LANGUAGE BangPatterns, ForeignFunctionInterface, MagicHash, Rank2Types #-}
22-- |
33-- Module : Data.Text.Internal.Fusion.Common
4−-- Copyright : (c) Bryan O'Sullivan 2009, 2012
4+-- Copyright : (c) Bryan O'Sullivan 2009, 2012, 2015
55--
66-- License : BSD-style
77-- Maintainer : bos@serpentine.com
@@ -71,6 +71,9 @@ module Data.Text.Internal.Fusion.Common
7171 -- ** Scans
7272 , scanl
7373
74+ -- ** Accumulating maps
75+ -- , mapAccumL
76+
7477 -- ** Generation and unfolding
7578 , replicateCharI
7679 , replicateI
@@ -101,20 +104,24 @@ module Data.Text.Internal.Fusion.Common
101104 , zipWith
102105 ) where
103106
104−import Prelude (Bool(..), Char, Eq(..), Int, Integral, Maybe(..),
107+import Prelude (Bool(..), Char, Eq(..), IO, Int, Integral, Maybe(..),
105108 Ord(..), Ordering(..), String, (.), ($), (+), (-), (*), (++),
106− (&&), fromIntegral, otherwise)
107−import qualified Data.List as L
108−import qualified Prelude as P
109+ (&&), fmap, fromIntegral, otherwise, return)
109110import Data.Bits (shiftL)
110111import Data.Char (isLetter)
111112import Data.Int (Int64)
112−import Data.Text.Internal.Fusion.Types
113−import Data.Text.Internal.Fusion.CaseMapping (foldMapping, lowerMapping, titleMapping,
114− upperMapping)
115113import Data.Text.Internal.Fusion.Size
114+import Data.Text.Internal.Fusion.Types
115+import Data.Text.Internal.Unsafe (inlinePerformIO)
116+import Data.Text.Internal.Unsafe.Char (ord, unsafeChr)
117+import Data.Word (Word16)
118+import Foreign.Ptr (Ptr, nullPtr, plusPtr)
119+import Foreign.Storable (peek)
116120import GHC.Prim (Addr#, chr#, indexCharOffAddr#, ord#)
117121import GHC.Types (Char(..), Int(..))
122+import qualified Data.Char as Char
123+import qualified Data.List as L
124+import qualified Prelude as P
118125
119126singleton :: Char -> Stream Char
120127singleton c = Stream next False 1
@@ -184,9 +191,6 @@ cons !w (Stream next0 s0 len) = Stream next (C1 s0) (len+1)
184191 Yield x s' -> Yield x (C0 s')
185192{-# INLINE [0] cons #-}
186193
187−data Snoc a = N
188− | J !a
189−
190194-- | /O(n)/ Adds a character to the end of a stream.
191195snoc :: Stream Char -> Char -> Stream Char
192196snoc (Stream next0 xs0 len) w = Stream next (J xs0) (len+1)
@@ -404,6 +408,22 @@ caseConvert remap (Stream next0 s0 len) = Stream next (CC s0 '\0' '\0') len
404408 Yield c s' -> remap c s'
405409 next (CC s a b) = Yield a (CC s b '\0')
406410
411+-- | Convert a single character to a Step.
412+convert :: (Word16 -> IO (Ptr Word16))
413+ -> (Char -> Char)
414+ -> Char -> s -> Step (CC s) Char
415+convert lookup f c s
416+ | c > '\xffff' = Yield (f c) (CC s '\0' '\0')
417+ | otherwise = inlinePerformIO $ do
418+ ptr <- lookup (fromIntegral (ord c))
419+ if (ptr == nullPtr)
420+ then return $ Yield (f c) (CC s '\0' '\0')
421+ else do
422+ x <- unsafeChr `fmap` peek ptr
423+ y <- unsafeChr `fmap` peek (ptr `plusPtr` 2)
424+ z <- unsafeChr `fmap` peek (ptr `plusPtr` 4)
425+ return $ Yield x (CC s y z)
426+
407427-- | /O(n)/ Convert a string to folded case. This function is mainly
408428-- useful for performing caseless (or case insensitive) string
409429-- comparisons.
@@ -419,7 +439,7 @@ caseConvert remap (Stream next0 s0 len) = Stream next (CC s0 '\0' '\0') len
419439-- case folded to the Greek small letter letter mu (U+03BC) instead of
420440-- itself.
421441toCaseFold :: Stream Char -> Stream Char
422−toCaseFold = caseConvert foldMapping
442+toCaseFold = caseConvert (convert to_case_fold Char.toLower)
423443{-# INLINE [0] toCaseFold #-}
424444
425445-- | /O(n)/ Convert a string to upper case, using simple case
@@ -427,7 +447,7 @@ toCaseFold = caseConvert foldMapping
427447-- For instance, the German eszett (U+00DF) maps to the two-letter
428448-- sequence SS.
429449toUpper :: Stream Char -> Stream Char
430−toUpper = caseConvert upperMapping
450+toUpper = caseConvert (convert to_upper Char.toUpper)
431451{-# INLINE [0] toUpper #-}
432452
433453-- | /O(n)/ Convert a string to lower case, using simple case
@@ -436,7 +456,7 @@ toUpper = caseConvert upperMapping
436456-- maps to the sequence Latin small letter i (U+0069) followed by
437457-- combining dot above (U+0307).
438458toLower :: Stream Char -> Stream Char
439−toLower = caseConvert lowerMapping
459+toLower = caseConvert (convert to_lower Char.toLower)
440460{-# INLINE [0] toLower #-}
441461
442462-- | /O(n)/ Convert a string to title case, using simple case
@@ -466,27 +486,24 @@ toTitle (Stream next0 s0 len) = Stream next (CC (False :*: s0) '\0' '\0') len
466486 Skip s' -> Skip (CC (letter :*: s') '\0' '\0')
467487 Yield c s'
468488 | letter' -> if letter
469− then lowerMapping c (letter' :*: s')
470− else titleMapping c (letter' :*: s')
489+ then convert to_lower Char.toLower c (letter' :*: s')
490+ else convert to_title Char.toTitle c (letter' :*: s')
471491 | otherwise -> Yield c (CC (letter' :*: s') '\0' '\0')
472492 where letter' = isLetter c
473493 next (CC s a b) = Yield a (CC s b '\0')
474494{-# INLINE [0] toTitle #-}
475495
476−data Justify i s = Just1 !i !s
477− | Just2 !i !s
478−
479496justifyLeftI :: Integral a => a -> Char -> Stream Char -> Stream Char
480497justifyLeftI k c (Stream next0 s0 len) =
481− Stream next (Just1 0 s0) (larger (fromIntegral k) len)
498+ Stream next (s0 :*: S1 :*: 0) (larger (fromIntegral k) len)
482499 where
483− next (Just1 n s) =
500+ next (s :*: S1 :*: n) =
484501 case next0 s of
485− Done -> next (Just2 n s)
486− Skip s' -> Skip (Just1 n s')
487− Yield x s' -> Yield x (Just1 (n+1) s')
488− next (Just2 n s)
489− | n < k = Yield c (Just2 (n+1) s)
502+ Done -> next (s :*: S2 :*: n)
503+ Skip s' -> Skip (s' :*: S1 :*: n)
504+ Yield x s' -> Yield x (s' :*: S1 :*: n+1)
505+ next (s :*: S2 :*: n)
506+ | n < k = Yield c (s :*: S2 :*: n+1)
490507 | otherwise = Done
491508 {-# INLINE next #-}
492509{-# INLINE [0] justifyLeftI #-}
@@ -593,7 +610,7 @@ concatMap f = foldr (append . f) empty
593610{-# INLINE [0] concatMap #-}
594611
595612-- | /O(n)/ any @p @xs determines if any character in the stream
596−-- @xs@ satisfies the predicate @p@.
613+-- @xs@ satisifes the predicate @p@.
597614any :: (Char -> Bool) -> Stream Char -> Bool
598615any p (Stream next0 s0 _len) = loop_any s0
599616 where
@@ -605,7 +622,7 @@ any p (Stream next0 s0 _len) = loop_any s0
605622{-# INLINE [0] any #-}
606623
607624-- | /O(n)/ all @p @xs determines if all characters in the 'Text'
608−-- @xs@ satisfy the predicate @p@.
625+-- @xs@ satisify the predicate @p@.
609626all :: (Char -> Bool) -> Stream Char -> Bool
610627all p (Stream next0 s0 _len) = loop_all s0
611628 where
@@ -654,27 +671,50 @@ minimum (Stream next0 s0 _len) = loop0_minimum s0
654671-- * Building streams
655672
656673scanl :: (Char -> Char -> Char) -> Char -> Stream Char -> Stream Char
657−scanl f z0 (Stream next0 s0 len) = Stream next (Scan1 z0 s0) (len+1) -- HINT maybe too low
674+scanl f z0 (Stream next0 s0 len) = Stream next (S1 :*: z0 :*: s0) (len+1) -- HINT maybe too low
658675 where
659676 {-# INLINE next #-}
660− next (Scan1 z s) = Yield z (Scan2 z s)
661− next (Scan2 z s) = case next0 s of
662− Yield x s' -> let !x' = f z x
663− in Yield x' (Scan2 x' s')
664− Skip s' -> Skip (Scan2 z s')
665− Done -> Done
677+ next (S1 :*: z :*: s) = Yield z (S2 :*: z :*: s)
678+ next (S2 :*: z :*: s) = case next0 s of
679+ Yield x s' -> let !x' = f z x
680+ in Yield x' (S2 :*: x' :*: s')
681+ Skip s' -> Skip (S2 :*: z :*: s')
682+ Done -> Done
666683{-# INLINE [0] scanl #-}
667684
685+-- -----------------------------------------------------------------------------
686+-- ** Accumulating maps
687+
688+{-
689+-- | /O(n)/ Like a combination of 'map' and 'foldl'. Applies a
690+-- function to each element of a stream, passing an accumulating
691+-- parameter from left to right, and returns a final stream.
692+--
693+-- /Note/: Unlike the version over lists, this function does not
694+-- return a final value for the accumulator, because the nature of
695+-- streams precludes it.
696+mapAccumL :: (a -> b -> (a,b)) -> a -> Stream b -> Stream b
697+mapAccumL f z0 (Stream next0 s0 len) = Stream next (s0 :*: z0) len -- HINT depends on f
698+ where
699+ {-# INLINE next #-}
700+ next (s :*: z) = case next0 s of
701+ Yield x s' -> let (z',y) = f z x
702+ in Yield y (s' :*: z')
703+ Skip s' -> Skip (s' :*: z)
704+ Done -> Done
705+{-# INLINE [0] mapAccumL #-}
706+-}
707+
668708-- -----------------------------------------------------------------------------
669709-- ** Generating and unfolding streams
670710
671711replicateCharI :: Integral a => a -> Char -> Stream Char
672−replicateCharI !n !c
712+replicateCharI n c
673713 | n < 0 = empty
674714 | otherwise = Stream next 0 (fromIntegral n) -- HINT maybe too low
675715 where
676− next !i | i >= n = Done
677− | otherwise = Yield c (i + 1)
716+ next i | i >= n = Done
717+ | otherwise = Yield c (i + 1)
678718{-# INLINE [0] replicateCharI #-}
679719
680720data RI s = RI !s {-# UNPACK #-} !Int64
@@ -739,27 +779,24 @@ take n0 (Stream next0 s0 len) =
739779 Yield x s' -> Yield x ((n-1) :*: s')
740780{-# INLINE [0] take #-}
741781
742−data Drop a s = NS !s
743− | JS !a !s
744−
745782-- | /O(n)/ drop n, applied to a stream, returns the suffix of the
746783-- stream after the first @n@ characters, or the empty stream if @n@
747784-- is greater than the length of the stream.
748785drop :: Integral a => a -> Stream Char -> Stream Char
749786drop n0 (Stream next0 s0 len) =
750− Stream next (JS n0 s0) (len - fromIntegral (max 0 n0))
787+ Stream next (J n0 :*: s0) (len - fromIntegral (max 0 n0))
751788 where
752789 {-# INLINE next #-}
753− next (JS n s)
754− | n <= 0 = Skip (NS s)
790+ next (J n :*: s)
791+ | n <= 0 = Skip (N :*: s)
755792 | otherwise = case next0 s of
756793 Done -> Done
757− Skip s' -> Skip (JS n s')
758− Yield _ s' -> Skip (JS (n-1) s')
759− next (NS s) = case next0 s of
794+ Skip s' -> Skip (J n :*: s')
795+ Yield _ s' -> Skip (J (n-1) :*: s')
796+ next (N :*: s) = case next0 s of
760797 Done -> Done
761− Skip s' -> Skip (NS s')
762− Yield x s' -> Yield x (NS s')
798+ Skip s' -> Skip (N :*: s')
799+ Yield x s' -> Yield x (N :*: s')
763800{-# INLINE [0] drop #-}
764801
765802-- | takeWhile, applied to a predicate @p@ and a stream, returns the
@@ -777,18 +814,18 @@ takeWhile p (Stream next0 s0 len) = Stream next s0 len -- HINT maybe too high
777814
778815-- | dropWhile @p @xs returns the suffix remaining after takeWhile @p @xs.
779816dropWhile :: (Char -> Bool) -> Stream Char -> Stream Char
780−dropWhile p (Stream next0 s0 len) = Stream next (L s0) len -- HINT maybe too high
817+dropWhile p (Stream next0 s0 len) = Stream next (S1 :*: s0) len -- HINT maybe too high
781818 where
782819 {-# INLINE next #-}
783− next (L s) = case next0 s of
820+ next (S1 :*: s) = case next0 s of
784821 Done -> Done
785− Skip s' -> Skip (L s')
786− Yield x s' | p x -> Skip (L s')
787− | otherwise -> Yield x (R s')
788− next (R s) = case next0 s of
822+ Skip s' -> Skip (S1 :*: s')
823+ Yield x s' | p x -> Skip (S1 :*: s')
824+ | otherwise -> Yield x (S2 :*: s')
825+ next (S2 :*: s) = case next0 s of
789826 Done -> Done
790− Skip s' -> Skip (R s')
791− Yield x s' -> Yield x (R s')
827+ Skip s' -> Skip (S2 :*: s')
828+ Yield x s' -> Yield x (S2 :*: s')
792829{-# INLINE [0] dropWhile #-}
793830
794831-- | /O(n)/ The 'isPrefixOf' function takes two 'Stream's and returns
@@ -895,25 +932,21 @@ findIndicesI p (Stream next s0 _len) = loop_findIndex 0 s0
895932-------------------------------------------------------------------------------
896933-- * Zipping
897934
898−-- | Strict triple.
899−data Zip a b m = Z1 !a !b
900− | Z2 !a !b !m
901−
902935-- | zipWith generalises 'zip' by zipping with the function given as
903936-- the first argument, instead of a tupling function.
904937zipWith :: (a -> a -> b) -> Stream a -> Stream a -> Stream b
905938zipWith f (Stream next0 sa0 len1) (Stream next1 sb0 len2) =
906− Stream next (Z1 sa0 sb0) (smaller len1 len2)
939+ Stream next (sa0 :*: sb0 :*: N) (smaller len1 len2)
907940 where
908− next (Z1 sa sb) = case next0 sa of
909− Done -> Done
910− Skip sa' -> Skip (Z1 sa' sb)
911− Yield a sa' -> Skip (Z2 sa' sb a)
912−
913− next (Z2 sa' sb a) = case next1 sb of
914− Done -> Done
915− Skip sb' -> Skip (Z2 sa' sb' a)
916− Yield b sb' -> Yield (f a b) (Z1 sa' sb')
941+ next (sa :*: sb :*: N) = case next0 sa of
942+ Done -> Done
943+ Skip sa' -> Skip (sa' :*: sb :*: N)
944+ Yield a sa' -> Skip (sa' :*: sb :*: J a)
945+
946+ next (sa' :*: sb :*: J a) = case next1 sb of
947+ Done -> Done
948+ Skip sb' -> Skip (sa' :*: sb' :*: J a)
949+ Yield b sb' -> Yield (f a b) (sa' :*: sb' :*: N)
917950{-# INLINE [0] zipWith #-}
918951
919952-- | /O(n)/ The 'countCharI' function returns the number of times the
@@ -936,3 +969,15 @@ emptyError func = internalError func "Empty input"
936969
937970internalError :: String -> a
938971internalError func = streamError func "Internal error"
972+
973+foreign import ccall unsafe "_hs_text_to_upper" to_upper
974+ :: Word16 -> IO (Ptr Word16)
975+
976+foreign import ccall unsafe "_hs_text_to_lower" to_lower
977+ :: Word16 -> IO (Ptr Word16)
978+
979+foreign import ccall unsafe "_hs_text_to_case_fold" to_case_fold
980+ :: Word16 -> IO (Ptr Word16)
981+
982+foreign import ccall unsafe "_hs_text_to_title" to_title
983+ :: Word16 -> IO (Ptr Word16)
Data/Text/Internal/Fusion/Types.hs+13−8
@@ -20,11 +20,13 @@
2020module Data.Text.Internal.Fusion.Types
2121 (
2222 CC(..)
23+ , M(..)
24+ , M8
2325 , PairS(..)
24− , Scan(..)
2526 , RS(..)
2627 , Step(..)
2728 , Stream(..)
29+ , Switch(..)
2830 , empty
2931 ) where
3032
@@ -34,23 +36,26 @@ import Data.Word (Word8)
3436-- | Specialised tuple for case conversion.
3537data CC s = CC !s {-# UNPACK #-} !Char {-# UNPACK #-} !Char
3638
37−-- | Restreaming state.
39+-- | Specialised, strict Maybe-like type.
40+data M a = N
41+ | J !a
42+
43+type M8 = M Word8
44+
45+-- Restreaming state.
3846data RS s
3947 = RS0 !s
4048 | RS1 !s {-# UNPACK #-} !Word8
4149 | RS2 !s {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8
4250 | RS3 !s {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8
4351
44−-- | Strict pair.
52+infixl 2 :*:
4553data PairS a b = !a :*: !b
4654 -- deriving (Eq, Ord, Show)
47−infixl 2 :*:
4855
49−-- | An intermediate result in a scan.
50−data Scan s = Scan1 {-# UNPACK #-} !Char !s
51− | Scan2 {-# UNPACK #-} !Char !s
56+-- | Allow a function over a stream to switch between two states.
57+data Switch = S1 | S2
5258
53−-- | Intermediate result in a processing pipeline.
5459data Step s a = Done
5560 | Skip !s
5661 | Yield !a !s
Data/Text/Internal/Read.hs+3−3
@@ -7,7 +7,7 @@
77-- Stability : experimental
88-- Portability : GHC
99--
10−-- Common internal functions for reading textual data.
10+-- Common internal functiopns for reading textual data.
1111module Data.Text.Internal.Read
1212 (
1313 IReader
@@ -18,7 +18,7 @@ module Data.Text.Internal.Read
1818 , perhaps
1919 ) where
2020
21−import Control.Applicative as App (Applicative(..))
21+import Control.Applicative (Applicative(..))
2222import Control.Arrow (first)
2323import Control.Monad (ap)
2424import Data.Char (ord)
@@ -38,7 +38,7 @@ instance Applicative (IParser t) where
3838 (<*>) = ap
3939
4040instance Monad (IParser t) where
41− return = App.pure
41+ return = pure
4242 m >>= k = P $ \t -> case runP m t of
4343 Left err -> Left err
4444 Right (a,t') -> runP (k a) t'
Data/Text/Lazy.hs+12−76
@@ -140,7 +140,6 @@ module Data.Text.Lazy
140140 , drop
141141 , dropEnd
142142 , takeWhile
143− , takeWhileEnd
144143 , dropWhile
145144 , dropWhileEnd
146145 , dropAround
@@ -211,13 +210,9 @@ import Control.DeepSeq (NFData(..))
211210import Data.Int (Int64)
212211import qualified Data.List as L
213212import Data.Char (isSpace)
214−import Data.Data (Data(gfoldl, toConstr, gunfold, dataTypeOf), constrIndex,
215− Constr, mkConstr, DataType, mkDataType, Fixity(Prefix))
216−import Data.Binary (Binary(get, put))
213+import Data.Data (Data(gfoldl, toConstr, gunfold, dataTypeOf))
214+import Data.Data (mkNoRepType)
217215import Data.Monoid (Monoid(..))
218−#if MIN_VERSION_base(4,9,0)
219−import Data.Semigroup (Semigroup(..))
220−#endif
221216import Data.String (IsString(..))
222217import qualified Data.Text as T
223218import qualified Data.Text.Internal as T
@@ -229,7 +224,6 @@ import Data.Text.Internal.Lazy.Fusion (stream, unstream)
229224import Data.Text.Internal.Lazy (Text(..), chunk, empty, foldlChunks,
230225 foldrChunks, smallChunkSize)
231226import Data.Text.Internal (firstf, safe, text)
232−import Data.Text.Lazy.Encoding (decodeUtf8', encodeUtf8)
233227import qualified Data.Text.Internal.Functions as F
234228import Data.Text.Internal.Lazy.Search (indices)
235229#if __GLASGOW_HASKELL__ >= 702
@@ -241,9 +235,6 @@ import qualified GHC.Base as GHC
241235import qualified GHC.Exts as Exts
242236#endif
243237import GHC.Prim (Addr#)
244−#if MIN_VERSION_base(4,7,0)
245−import Text.Printf (PrintfArg, formatArg, formatString)
246−#endif
247238
248239-- $fusion
249240--
@@ -341,21 +332,9 @@ instance Show Text where
341332instance Read Text where
342333 readsPrec p str = [(pack x,y) | (x,y) <- readsPrec p str]
343334
344−#if MIN_VERSION_base(4,9,0)
345−-- Semigroup orphan instances for older GHCs are provided by
346−-- 'semigroups` package
347−
348−instance Semigroup Text where
349− (<>) = append
350−#endif
351−
352335instance Monoid Text where
353336 mempty = empty
354−#if MIN_VERSION_base(4,9,0)
355− mappend = (<>) -- future-proof definition
356−#else
357337 mappend = append
358−#endif
359338 mconcat = concat
360339
361340instance IsString Text where
@@ -374,38 +353,11 @@ instance NFData Text where
374353 rnf (Chunk _ ts) = rnf ts
375354#endif
376355
377−instance Binary Text where
378− put t = put (encodeUtf8 t)
379− get = do
380− bs <- get
381− case decodeUtf8' bs of
382− P.Left exn -> P.fail (P.show exn)
383− P.Right a -> P.return a
384−
385−-- | This instance preserves data abstraction at the cost of inefficiency.
386−-- We omit reflection services for the sake of data abstraction.
387−--
388−-- This instance was created by copying the updated behavior of
389−-- @"Data.Text".@'Data.Text.Text'
390356instance Data Text where
391357 gfoldl f z txt = z pack `f` (unpack txt)
392− toConstr _ = packConstr
393− gunfold k z c = case constrIndex c of
394− 1 -> k (z pack)
395− _ -> error "Data.Text.Lazy.Text.gunfold"
396− dataTypeOf _ = textDataType
397−
398−#if MIN_VERSION_base(4,7,0)
399−-- | Only defined for @base-4.7.0.0@ and later
400−instance PrintfArg Text where
401− formatArg txt = formatString $ unpack txt
402−#endif
403−
404−packConstr :: Constr
405−packConstr = mkConstr textDataType "pack" [] Prefix
406−
407−textDataType :: DataType
408−textDataType = mkDataType "Data.Text.Lazy.Text" [packConstr]
358+ toConstr _ = error "Data.Text.Lazy.Text.toConstr"
359+ gunfold _ _ = error "Data.Text.Lazy.Text.gunfold"
360+ dataTypeOf _ = mkNoRepType "Data.Text.Lazy.Text"
409361
410362-- | /O(n)/ Convert a 'String' into a 'Text'.
411363--
@@ -545,7 +497,7 @@ tail Empty = emptyError "tail"
545497 unstream (S.tail (stream t)) = tail t
546498 #-}
547499
548−-- | /O(n\/c)/ Returns all but the last character of a 'Text', which must
500+-- | /O(1)/ Returns all but the last character of a 'Text', which must
549501-- be non-empty. Subject to fusion.
550502init :: Text -> Text
551503init (Chunk t0 ts0) = go t0 ts0
@@ -581,7 +533,7 @@ isSingleton :: Text -> Bool
581533isSingleton = S.isSingleton . stream
582534{-# INLINE isSingleton #-}
583535
584−-- | /O(n\/c)/ Returns the last character of a 'Text', which must be
536+-- | /O(1)/ Returns the last character of a 'Text', which must be
585537-- non-empty. Subject to fusion.
586538last :: Text -> Char
587539last Empty = emptyError "last"
@@ -881,13 +833,13 @@ concatMap f = concat . foldr ((:) . f) []
881833{-# INLINE concatMap #-}
882834
883835-- | /O(n)/ 'any' @p@ @t@ determines whether any character in the
884−-- 'Text' @t@ satisfies the predicate @p@. Subject to fusion.
836+-- 'Text' @t@ satisifes the predicate @p@. Subject to fusion.
885837any :: (Char -> Bool) -> Text -> Bool
886838any p t = S.any p (stream t)
887839{-# INLINE any #-}
888840
889841-- | /O(n)/ 'all' @p@ @t@ determines whether all characters in the
890−-- 'Text' @t@ satisfy the predicate @p@. Subject to fusion.
842+-- 'Text' @t@ satisify the predicate @p@. Subject to fusion.
891843all :: (Char -> Bool) -> Text -> Bool
892844all p t = S.all p (stream t)
893845{-# INLINE all #-}
@@ -996,7 +948,7 @@ cycle t = let t' = foldrChunks Chunk t' t
996948
997949-- | @'iterate' f x@ returns an infinite 'Text' of repeated applications
998950-- of @f@ to @x@:
999−--
951+--
1000952-- > iterate f x == [x, f x, f (f x), ...]
1001953iterate :: (Char -> Char) -> Char -> Text
1002954iterate f c = let t c' = Chunk (T.singleton c') (t (f c'))
@@ -1144,20 +1096,6 @@ takeWhile p t0 = takeWhile' t0
11441096"LAZY TEXT takeWhile -> unfused" [1] forall p t.
11451097 unstream (S.takeWhile p (stream t)) = takeWhile p t
11461098 #-}
1147−-- | /O(n)/ 'takeWhileEnd', applied to a predicate @p@ and a 'Text',
1148−-- returns the longest suffix (possibly empty) of elements that
1149−-- satisfy @p@.
1150−-- Examples:
1151−--
1152−-- > takeWhileEnd (=='o') "foo" == "oo"
1153−takeWhileEnd :: (Char -> Bool) -> Text -> Text
1154−takeWhileEnd p = takeChunk empty . L.reverse . toChunks
1155− where takeChunk acc [] = acc
1156− takeChunk acc (t:ts) = if T.length t' < T.length t
1157− then (Chunk t' acc)
1158− else takeChunk (Chunk t' acc) ts
1159− where t' = T.takeWhileEnd p t
1160−{-# INLINE takeWhileEnd #-}
11611099
11621100-- | /O(n)/ 'dropWhile' @p@ @t@ returns the suffix remaining after
11631101-- 'takeWhile' @p@ @t@. Subject to fusion.
@@ -1176,11 +1114,9 @@ dropWhile p t0 = dropWhile' t0
11761114"LAZY TEXT dropWhile -> unfused" [1] forall p t.
11771115 unstream (S.dropWhile p (stream t)) = dropWhile p t
11781116 #-}
1179−
11801117-- | /O(n)/ 'dropWhileEnd' @p@ @t@ returns the prefix remaining after
1181−-- dropping characters that satisfy the predicate @p@ from the end of
1118+-- dropping characters that fail the predicate @p@ from the end of
11821119-- @t@.
1183−--
11841120-- Examples:
11851121--
11861122-- > dropWhileEnd (=='.') "foo..." == "foo"
@@ -1197,7 +1133,7 @@ dropWhileEnd p = go
11971133{-# INLINE dropWhileEnd #-}
11981134
11991135-- | /O(n)/ 'dropAround' @p@ @t@ returns the substring remaining after
1200−-- dropping characters that satisfy the predicate @p@ from both the
1136+-- dropping characters that fail the predicate @p@ from both the
12011137-- beginning and end of @t@. Subject to fusion.
12021138dropAround :: (Char -> Bool) -> Text -> Text
12031139dropAround p = dropWhile p . dropWhileEnd p
Data/Text/Lazy/Builder.hs+1−1
@@ -8,7 +8,7 @@
88-- Module : Data.Text.Lazy.Builder
99-- Copyright : (c) 2013 Bryan O'Sullivan
1010-- (c) 2010 Johan Tibell
11−-- License : BSD-style (see LICENSE)
11+-- License : BSD3-style (see LICENSE)
1212--
1313-- Maintainer : Johan Tibell <johan.tibell@gmail.com>
1414-- Stability : experimental
Data/Text/Lazy/Builder/Int.hs+4−4
@@ -7,7 +7,7 @@
77-- Module: Data.Text.Lazy.Builder.Int
88-- Copyright: (c) 2013 Bryan O'Sullivan
99-- (c) 2011 MailRank, Inc.
10−-- License: BSD-style
10+-- License: BSD3
1111-- Maintainer: Bryan O'Sullivan <bos@serpentine.com>
1212-- Stability: experimental
1313-- Portability: portable
@@ -35,7 +35,7 @@ import Control.Monad.ST
3535
3636#ifdef __GLASGOW_HASKELL__
3737# if defined(INTEGER_GMP)
38−import GHC.Integer.GMP.Internals (Integer(S#))
38+import GHC.Integer.GMP.Internals
3939# elif defined(INTEGER_SIMPLE)
4040import GHC.Integer
4141# else
@@ -55,7 +55,7 @@ decimal :: Integral a => a -> Builder
5555{-# RULES "decimal/Int16" decimal = boundedDecimal :: Int16 -> Builder #-}
5656{-# RULES "decimal/Int32" decimal = boundedDecimal :: Int32 -> Builder #-}
5757{-# RULES "decimal/Int64" decimal = boundedDecimal :: Int64 -> Builder #-}
58−{-# RULES "decimal/Word" decimal = positive :: Data.Word.Word -> Builder #-}
58+{-# RULES "decimal/Word" decimal = positive :: Word -> Builder #-}
5959{-# RULES "decimal/Word8" decimal = positive :: Word8 -> Builder #-}
6060{-# RULES "decimal/Word16" decimal = positive :: Word16 -> Builder #-}
6161{-# RULES "decimal/Word32" decimal = positive :: Word32 -> Builder #-}
@@ -247,7 +247,7 @@ integer base i
247247 PAIR(x,y) -> pblock q <> pblock r <> putB ns
248248 where q = fromInteger x
249249 r = fromInteger y
250− putB _ = Data.Monoid.mempty
250+ putB _ = mempty
251251
252252 int :: Int -> Builder
253253 int x | base == 10 = decimal x
Data/Text/Lazy/Encoding.hs+18−7
@@ -46,25 +46,30 @@ module Data.Text.Lazy.Encoding
4646 , encodeUtf32LE
4747 , encodeUtf32BE
4848
49+#if MIN_VERSION_bytestring(0,10,4)
4950 -- * Encoding Text using ByteString Builders
5051 , encodeUtf8Builder
5152 , encodeUtf8BuilderEscaped
53+#endif
5254 ) where
5355
5456import Control.Exception (evaluate, try)
55−import Data.Monoid (Monoid(..))
5657import Data.Text.Encoding.Error (OnDecodeError, UnicodeException, strictDecode)
5758import Data.Text.Internal.Lazy (Text(..), chunk, empty, foldrChunks)
58−import Data.Word (Word8)
5959import qualified Data.ByteString as S
60−import qualified Data.ByteString.Builder as B
61−import qualified Data.ByteString.Builder.Extra as B (safeStrategy, toLazyByteStringWith)
62−import qualified Data.ByteString.Builder.Prim as BP
6360import qualified Data.ByteString.Lazy as B
6461import qualified Data.ByteString.Lazy.Internal as B
6562import qualified Data.ByteString.Unsafe as B
63+#if MIN_VERSION_bytestring(0,10,4)
64+import Data.Word (Word8)
65+import Data.Monoid (mappend, mempty)
66+import qualified Data.ByteString.Builder as B
67+import qualified Data.ByteString.Builder.Extra as B (safeStrategy, toLazyByteStringWith)
68+import qualified Data.ByteString.Builder.Prim as BP
6669import qualified Data.Text as T
70+#endif
6771import qualified Data.Text.Encoding as TE
72+import qualified Data.Text.Lazy as L
6873import qualified Data.Text.Internal.Lazy.Encoding.Fusion as E
6974import qualified Data.Text.Internal.Lazy.Fusion as F
7075import Data.Text.Unsafe (unsafeDupablePerformIO)
@@ -105,7 +110,7 @@ decodeUtf8With onErr (B.Chunk b0 bs0) =
105110 | S.null l = empty
106111 | otherwise = case onErr desc (Just (B.unsafeHead l)) of
107112 Nothing -> empty
108− Just c -> Chunk (T.singleton c) Empty
113+ Just c -> L.singleton c
109114 desc = "Data.Text.Lazy.Encoding.decodeUtf8With: Invalid UTF-8 stream"
110115decodeUtf8With _ _ = empty
111116
@@ -142,6 +147,7 @@ decodeUtf8' bs = unsafeDupablePerformIO $ do
142147{-# INLINE decodeUtf8' #-}
143148
144149encodeUtf8 :: Text -> B.ByteString
150+#if MIN_VERSION_bytestring(0,10,4)
145151encodeUtf8 Empty = B.empty
146152encodeUtf8 lt@(Chunk t _) =
147153 B.toLazyByteStringWith strategy B.empty $ encodeUtf8Builder lt
@@ -156,13 +162,18 @@ encodeUtf8 lt@(Chunk t _) =
156162
157163encodeUtf8Builder :: Text -> B.Builder
158164encodeUtf8Builder =
159− foldrChunks (\c b -> TE.encodeUtf8Builder c `mappend` b) Data.Monoid.mempty
165+ foldrChunks (\c b -> TE.encodeUtf8Builder c `mappend` b) mempty
160166
161167{-# INLINE encodeUtf8BuilderEscaped #-}
162168encodeUtf8BuilderEscaped :: BP.BoundedPrim Word8 -> Text -> B.Builder
163169encodeUtf8BuilderEscaped prim =
164170 foldrChunks (\c b -> TE.encodeUtf8BuilderEscaped prim c `mappend` b) mempty
165171
172+#else
173+encodeUtf8 (Chunk c cs) = B.Chunk (TE.encodeUtf8 c) (encodeUtf8 cs)
174+encodeUtf8 Empty = B.Empty
175+#endif
176+
166177-- | Decode text from little endian UTF-16 encoding.
167178decodeUtf16LEWith :: OnDecodeError -> B.ByteString -> Text
168179decodeUtf16LEWith onErr bs = F.unstream (E.streamUtf16LE onErr bs)
Data/Text/Lazy/Read.hs+2−4
@@ -1,7 +1,5 @@
11{-# LANGUAGE OverloadedStrings, CPP #-}
2−#if __GLASGOW_HASKELL__ >= 704
3−{-# LANGUAGE Safe #-}
4−#elif __GLASGOW_HASKELL__ >= 702
2+#if __GLASGOW_HASKELL__ >= 702
53{-# LANGUAGE Trustworthy #-}
64#endif
75
@@ -56,7 +54,7 @@ decimal :: Integral a => Reader a
5654{-# SPECIALIZE decimal :: Reader Int32 #-}
5755{-# SPECIALIZE decimal :: Reader Int64 #-}
5856{-# SPECIALIZE decimal :: Reader Integer #-}
59−{-# SPECIALIZE decimal :: Reader Data.Word.Word #-}
57+{-# SPECIALIZE decimal :: Reader Word #-}
6058{-# SPECIALIZE decimal :: Reader Word8 #-}
6159{-# SPECIALIZE decimal :: Reader Word16 #-}
6260{-# SPECIALIZE decimal :: Reader Word32 #-}
Data/Text/Read.hs+1−1
@@ -55,7 +55,7 @@ decimal :: Integral a => Reader a
5555{-# SPECIALIZE decimal :: Reader Int32 #-}
5656{-# SPECIALIZE decimal :: Reader Int64 #-}
5757{-# SPECIALIZE decimal :: Reader Integer #-}
58−{-# SPECIALIZE decimal :: Reader Data.Word.Word #-}
58+{-# SPECIALIZE decimal :: Reader Word #-}
5959{-# SPECIALIZE decimal :: Reader Word8 #-}
6060{-# SPECIALIZE decimal :: Reader Word16 #-}
6161{-# SPECIALIZE decimal :: Reader Word32 #-}
Data/Text/Show.hsdeleted−89
@@ -1,89 +0,0 @@
1−{-# LANGUAGE CPP, MagicHash #-}
2−{-# OPTIONS_GHC -fno-warn-orphans #-}
3−#if __GLASGOW_HASKELL__ >= 702
4−{-# LANGUAGE Trustworthy #-}
5−#endif
6−
7−-- |
8−-- Module : Data.Text.Show
9−-- Copyright : (c) 2009-2015 Bryan O'Sullivan
10−--
11−-- License : BSD-style
12−-- Maintainer : bos@serpentine.com
13−-- Stability : experimental
14−-- Portability : GHC
15−
16−module Data.Text.Show
17− (
18− singleton
19− , unpack
20− , unpackCString#
21− ) where
22−
23−import Control.Monad.ST (ST)
24−import Data.Text.Internal (Text(..), empty_, safe)
25−import Data.Text.Internal.Fusion (stream, unstream)
26−import Data.Text.Internal.Unsafe.Char (unsafeWrite)
27−import GHC.Prim (Addr#)
28−import qualified Data.Text.Array as A
29−import qualified Data.Text.Internal.Fusion.Common as S
30−
31−#if __GLASGOW_HASKELL__ >= 702
32−import qualified GHC.CString as GHC
33−#else
34−import qualified GHC.Base as GHC
35−#endif
36−
37−instance Show Text where
38− showsPrec p ps r = showsPrec p (unpack ps) r
39−
40−-- | /O(n)/ Convert a 'Text' into a 'String'. Subject to fusion.
41−unpack :: Text -> String
42−unpack = S.unstreamList . stream
43−{-# INLINE [1] unpack #-}
44−
45−-- | /O(n)/ Convert a literal string into a 'Text'. Subject to
46−-- fusion.
47−--
48−-- This is exposed solely for people writing GHC rewrite rules.
49−unpackCString# :: Addr# -> Text
50−unpackCString# addr# = unstream (S.streamCString# addr#)
51−{-# NOINLINE unpackCString# #-}
52−
53−{-# RULES "TEXT literal" [1] forall a.
54− unstream (S.map safe (S.streamList (GHC.unpackCString# a)))
55− = unpackCString# a #-}
56−
57−{-# RULES "TEXT literal UTF8" [1] forall a.
58− unstream (S.map safe (S.streamList (GHC.unpackCStringUtf8# a)))
59− = unpackCString# a #-}
60−
61−{-# RULES "TEXT empty literal" [1]
62− unstream (S.map safe (S.streamList []))
63− = empty_ #-}
64−
65−{-# RULES "TEXT singleton literal" [1] forall a.
66− unstream (S.map safe (S.streamList [a]))
67− = singleton_ a #-}
68−
69−-- | /O(1)/ Convert a character into a Text. Subject to fusion.
70−-- Performs replacement on invalid scalar values.
71−singleton :: Char -> Text
72−singleton = unstream . S.singleton . safe
73−{-# INLINE [1] singleton #-}
74−
75−{-# RULES "TEXT singleton" forall a.
76− unstream (S.singleton (safe a))
77− = singleton_ a #-}
78−
79−-- This is intended to reduce inlining bloat.
80−singleton_ :: Char -> Text
81−singleton_ c = Text (A.run x) 0 len
82− where x :: ST s (A.MArray s)
83− x = do arr <- A.new len
84− _ <- unsafeWrite arr 0 d
85− return arr
86− len | d < '\x10000' = 1
87− | otherwise = 2
88− d = safe c
89−{-# NOINLINE singleton_ #-}
benchmarks/haskell/Benchmarks.hs+1−1
@@ -53,7 +53,7 @@ benchmarks = do
5353 , Mul.benchmark
5454 , Pure.benchmark "tiny" (tf "tiny.txt")
5555 , Pure.benchmark "ascii" (tf "ascii-small.txt")
56− -- , Pure.benchmark "france" (tf "france.html")
56+ , Pure.benchmark "france" (tf "france.html")
5757 , Pure.benchmark "russian" (tf "russian-small.txt")
5858 , Pure.benchmark "japanese" (tf "japanese.txt")
5959 , ReadNumbers.benchmark (tf "numbers.txt")
benchmarks/haskell/Benchmarks/Pure.hs−7
@@ -262,13 +262,6 @@ benchmark kind fp = do
262262 , benchBSL $ nf (BL.map toUpper) bla
263263 , benchS $ nf (L.map toUpper) sa
264264 ]
265− , bgroup "uncons"
266− [ benchT $ nf T.uncons ta
267− , benchTL $ nf TL.uncons tla
268− , benchBS $ nf BS.uncons bsa
269− , benchBSL $ nf BL.uncons bla
270− , benchS $ nf L.uncons sa
271− ]
272265 , bgroup "words"
273266 [ benchT $ nf T.words ta
274267 , benchTL $ nf TL.words tla
benchmarks/haskell/Benchmarks/ReadNumbers.hs+5−2
@@ -25,7 +25,8 @@ import Data.List (foldl')
2525import Numeric (readDec, readFloat, readHex)
2626import qualified Data.ByteString.Char8 as B
2727import qualified Data.ByteString.Lazy.Char8 as BL
28−import qualified Data.ByteString.Lex.Fractional as B
28+import qualified Data.ByteString.Lex.Double as B
29+import qualified Data.ByteString.Lex.Lazy.Double as BL
2930import qualified Data.Text as T
3031import qualified Data.Text.IO as T
3132import qualified Data.Text.Lazy as TL
@@ -62,10 +63,12 @@ benchmark fp = do
6263 whnf (double . text TL.rational) tl
6364
6465 , bench "DecimalByteString" $ whnf (int . byteString B.readInt) b
65− , bench "DoubleByteString" $ whnf (double . byteString B.readDecimal) b
66+ , bench "DoubleByteString" $ whnf (double . byteString B.readDouble) b
6667
6768 , bench "DecimalLazyByteString" $
6869 whnf (int . byteString BL.readInt) bl
70+ , bench "DoubleLazyByteString" $
71+ whnf (double . byteString BL.readDouble) bl
6972 ]
7073 where
7174 -- Used for fixing types
benchmarks/haskell/Benchmarks/Stream.hs+5−16
@@ -18,11 +18,11 @@ import qualified Data.Text.Encoding as T
1818import qualified Data.Text.Encoding.Error as E
1919import qualified Data.Text.Internal.Encoding.Fusion as T
2020import qualified Data.Text.Internal.Encoding.Fusion.Common as F
21−import qualified Data.Text.Internal.Fusion as F
21+import qualified Data.Text.Internal.Fusion as T
2222import qualified Data.Text.IO as T
2323import qualified Data.Text.Lazy.Encoding as TL
2424import qualified Data.Text.Internal.Lazy.Encoding.Fusion as TL
25−import qualified Data.Text.Internal.Lazy.Fusion as FL
25+import qualified Data.Text.Internal.Lazy.Fusion as TL
2626import qualified Data.Text.Lazy.IO as TL
2727
2828instance NFData a => NFData (Stream a) where
@@ -53,25 +53,14 @@ benchmark fp = do
5353 !utf32beL = TL.encodeUtf32BE tl
5454
5555 -- For the functions which operate on streams
56− let !s = F.stream t
56+ let !s = T.stream t
5757
5858 return $ bgroup "Stream"
5959
6060 -- Fusion
6161 [ bgroup "stream" $
62− [ bench "Text" $ nf F.stream t
63− , bench "LazyText" $ nf FL.stream tl
64− ]
65− -- must perform exactly the same as stream above due to
66− -- stream/unstream (i.e. stream after unstream) fusion
67− , bgroup "stream-fusion" $
68− [ bench "Text" $ nf (F.stream . F.unstream . F.stream) t
69− , bench "LazyText" $ nf (FL.stream . FL.unstream . FL.stream) tl
70− ]
71− -- measure the overhead of unstream after stream
72− , bgroup "stream-unstream" $
73− [ bench "Text" $ nf (F.unstream . F.stream) t
74− , bench "LazyText" $ nf (FL.unstream . FL.stream) tl
62+ [ bench "Text" $ nf T.stream t
63+ , bench "LazyText" $ nf TL.stream tl
7564 ]
7665
7766 -- Encoding.Fusion
benchmarks/text-benchmarks.cabal+4−14
@@ -3,7 +3,7 @@ version: 0.0.0.0
33synopsis: Benchmarks for the text package
44description: Benchmarks for the text package
55homepage: https://bitbucket.org/bos/text
6−license: BSD2
6+license: BSD3
77license-file: ../LICENSE
88author: Jasper Van der Jeugt <jaspervdj@gmail.com>,
99 Bryan O'Sullivan <bos@serpentine.com>,
@@ -15,11 +15,6 @@ build-type: Simple
1515
1616cabal-version: >=1.2
1717
18−flag bytestring-builder
19− description: Depend on the bytestring-builder package for backwards compatibility.
20− default: False
21− manual: False
22−
2318flag llvm
2419 description: use LLVM
2520 default: False
@@ -27,7 +22,7 @@ flag llvm
2722
2823executable text-benchmarks
2924 hs-source-dirs: haskell ..
30− c-sources: ../cbits/cbits.c
25+ c-sources: ../cbits/case_mapping.c ../cbits/cbits.c
3126 cbits/time_iconv.c
3227 include-dirs: ../include
3328 main-is: Benchmarks.hs
@@ -38,7 +33,8 @@ executable text-benchmarks
3833 build-depends: base == 4.*,
3934 binary,
4035 blaze-builder,
41− bytestring-lexing >= 0.5.0,
36+ bytestring,
37+ bytestring-lexing,
4238 containers,
4339 criterion >= 0.10.0.0,
4440 deepseq,
@@ -50,12 +46,6 @@ executable text-benchmarks
5046 utf8-string,
5147 vector
5248
53− if flag(bytestring-builder)
54− build-depends: bytestring >= 0.9 && < 0.10.4,
55− bytestring-builder >= 0.10.4
56− else
57− build-depends: bytestring >= 0.10.4
58−
5949executable text-multilang
6050 hs-source-dirs: haskell
6151 main-is: Multilang.hs
cbits/case_mapping.cnew file+852
@@ -0,0 +1,852 @@
1+/*
2+ * AUTOMATICALLY GENERATED - DO NOT EDIT
3+ * Generated by scripts/CaseMapping.hs
4+ *
5+ * CaseFolding-6.3.0.txt
6+ * Date: 2012-12-20, 22:14:35 GMT [MD]
7+ * SpecialCasing-6.3.0.txt
8+ * Date: 2013-05-08, 13:54:51 GMT [MD]
9+ */
10+
11+#include <stdint.h>
12+#include <sys/types.h>
13+
14+const uint16_t _hs_text_to_upper_keys[102] = {
15+ 0x00df, /* LATIN SMALL LETTER SHARP S */
16+ 0x0149, /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
17+ 0x01f0, /* LATIN SMALL LETTER J WITH CARON */
18+ 0x0390, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
19+ 0x03b0, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
20+ 0x0587, /* ARMENIAN SMALL LIGATURE ECH YIWN */
21+ 0x1e96, /* LATIN SMALL LETTER H WITH LINE BELOW */
22+ 0x1e97, /* LATIN SMALL LETTER T WITH DIAERESIS */
23+ 0x1e98, /* LATIN SMALL LETTER W WITH RING ABOVE */
24+ 0x1e99, /* LATIN SMALL LETTER Y WITH RING ABOVE */
25+ 0x1e9a, /* LATIN SMALL LETTER A WITH RIGHT HALF RING */
26+ 0x1f50, /* GREEK SMALL LETTER UPSILON WITH PSILI */
27+ 0x1f52, /* GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */
28+ 0x1f54, /* GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */
29+ 0x1f56, /* GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */
30+ 0x1f80, /* GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI */
31+ 0x1f81, /* GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI */
32+ 0x1f82, /* GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
33+ 0x1f83, /* GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
34+ 0x1f84, /* GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
35+ 0x1f85, /* GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
36+ 0x1f86, /* GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
37+ 0x1f87, /* GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
38+ 0x1f88, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI */
39+ 0x1f89, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI */
40+ 0x1f8a, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
41+ 0x1f8b, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
42+ 0x1f8c, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
43+ 0x1f8d, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
44+ 0x1f8e, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
45+ 0x1f8f, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
46+ 0x1f90, /* GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI */
47+ 0x1f91, /* GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI */
48+ 0x1f92, /* GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
49+ 0x1f93, /* GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
50+ 0x1f94, /* GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
51+ 0x1f95, /* GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
52+ 0x1f96, /* GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
53+ 0x1f97, /* GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
54+ 0x1f98, /* GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI */
55+ 0x1f99, /* GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI */
56+ 0x1f9a, /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
57+ 0x1f9b, /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
58+ 0x1f9c, /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
59+ 0x1f9d, /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
60+ 0x1f9e, /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
61+ 0x1f9f, /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
62+ 0x1fa0, /* GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI */
63+ 0x1fa1, /* GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI */
64+ 0x1fa2, /* GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
65+ 0x1fa3, /* GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
66+ 0x1fa4, /* GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
67+ 0x1fa5, /* GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
68+ 0x1fa6, /* GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
69+ 0x1fa7, /* GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
70+ 0x1fa8, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI */
71+ 0x1fa9, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI */
72+ 0x1faa, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
73+ 0x1fab, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
74+ 0x1fac, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
75+ 0x1fad, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
76+ 0x1fae, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
77+ 0x1faf, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
78+ 0x1fb2, /* GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */
79+ 0x1fb3, /* GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI */
80+ 0x1fb4, /* GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */
81+ 0x1fb6, /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI */
82+ 0x1fb7, /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */
83+ 0x1fbc, /* GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI */
84+ 0x1fc2, /* GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */
85+ 0x1fc3, /* GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI */
86+ 0x1fc4, /* GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */
87+ 0x1fc6, /* GREEK SMALL LETTER ETA WITH PERISPOMENI */
88+ 0x1fc7, /* GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */
89+ 0x1fcc, /* GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI */
90+ 0x1fd2, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */
91+ 0x1fd3, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */
92+ 0x1fd6, /* GREEK SMALL LETTER IOTA WITH PERISPOMENI */
93+ 0x1fd7, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */
94+ 0x1fe2, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */
95+ 0x1fe3, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */
96+ 0x1fe4, /* GREEK SMALL LETTER RHO WITH PSILI */
97+ 0x1fe6, /* GREEK SMALL LETTER UPSILON WITH PERISPOMENI */
98+ 0x1fe7, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */
99+ 0x1ff2, /* GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */
100+ 0x1ff3, /* GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI */
101+ 0x1ff4, /* GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */
102+ 0x1ff6, /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI */
103+ 0x1ff7, /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */
104+ 0x1ffc, /* GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI */
105+ 0xfb00, /* LATIN SMALL LIGATURE FF */
106+ 0xfb01, /* LATIN SMALL LIGATURE FI */
107+ 0xfb02, /* LATIN SMALL LIGATURE FL */
108+ 0xfb03, /* LATIN SMALL LIGATURE FFI */
109+ 0xfb04, /* LATIN SMALL LIGATURE FFL */
110+ 0xfb05, /* LATIN SMALL LIGATURE LONG S T */
111+ 0xfb06, /* LATIN SMALL LIGATURE ST */
112+ 0xfb13, /* ARMENIAN SMALL LIGATURE MEN NOW */
113+ 0xfb14, /* ARMENIAN SMALL LIGATURE MEN ECH */
114+ 0xfb15, /* ARMENIAN SMALL LIGATURE MEN INI */
115+ 0xfb16, /* ARMENIAN SMALL LIGATURE VEW NOW */
116+ 0xfb17, /* ARMENIAN SMALL LIGATURE MEN XEH */
117+};
118+const size_t _hs_text_to_upper_len = 102;
119+const uint16_t _hs_text_to_upper_values[102][3] = {
120+ /* 0x00df - LATIN SMALL LETTER SHARP S */
121+ {0x0053, 0x0053, 0},
122+ /* 0x0149 - LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
123+ {0x02bc, 0x004e, 0},
124+ /* 0x01f0 - LATIN SMALL LETTER J WITH CARON */
125+ {0x004a, 0x030c, 0},
126+ /* 0x0390 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
127+ {0x0399, 0x0308, 0x0301},
128+ /* 0x03b0 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
129+ {0x03a5, 0x0308, 0x0301},
130+ /* 0x0587 - ARMENIAN SMALL LIGATURE ECH YIWN */
131+ {0x0535, 0x0552, 0},
132+ /* 0x1e96 - LATIN SMALL LETTER H WITH LINE BELOW */
133+ {0x0048, 0x0331, 0},
134+ /* 0x1e97 - LATIN SMALL LETTER T WITH DIAERESIS */
135+ {0x0054, 0x0308, 0},
136+ /* 0x1e98 - LATIN SMALL LETTER W WITH RING ABOVE */
137+ {0x0057, 0x030a, 0},
138+ /* 0x1e99 - LATIN SMALL LETTER Y WITH RING ABOVE */
139+ {0x0059, 0x030a, 0},
140+ /* 0x1e9a - LATIN SMALL LETTER A WITH RIGHT HALF RING */
141+ {0x0041, 0x02be, 0},
142+ /* 0x1f50 - GREEK SMALL LETTER UPSILON WITH PSILI */
143+ {0x03a5, 0x0313, 0},
144+ /* 0x1f52 - GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */
145+ {0x03a5, 0x0313, 0x0300},
146+ /* 0x1f54 - GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */
147+ {0x03a5, 0x0313, 0x0301},
148+ /* 0x1f56 - GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */
149+ {0x03a5, 0x0313, 0x0342},
150+ /* 0x1f80 - GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI */
151+ {0x1f08, 0x0399, 0},
152+ /* 0x1f81 - GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI */
153+ {0x1f09, 0x0399, 0},
154+ /* 0x1f82 - GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
155+ {0x1f0a, 0x0399, 0},
156+ /* 0x1f83 - GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
157+ {0x1f0b, 0x0399, 0},
158+ /* 0x1f84 - GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
159+ {0x1f0c, 0x0399, 0},
160+ /* 0x1f85 - GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
161+ {0x1f0d, 0x0399, 0},
162+ /* 0x1f86 - GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
163+ {0x1f0e, 0x0399, 0},
164+ /* 0x1f87 - GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
165+ {0x1f0f, 0x0399, 0},
166+ /* 0x1f88 - GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI */
167+ {0x1f08, 0x0399, 0},
168+ /* 0x1f89 - GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI */
169+ {0x1f09, 0x0399, 0},
170+ /* 0x1f8a - GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
171+ {0x1f0a, 0x0399, 0},
172+ /* 0x1f8b - GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
173+ {0x1f0b, 0x0399, 0},
174+ /* 0x1f8c - GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
175+ {0x1f0c, 0x0399, 0},
176+ /* 0x1f8d - GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
177+ {0x1f0d, 0x0399, 0},
178+ /* 0x1f8e - GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
179+ {0x1f0e, 0x0399, 0},
180+ /* 0x1f8f - GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
181+ {0x1f0f, 0x0399, 0},
182+ /* 0x1f90 - GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI */
183+ {0x1f28, 0x0399, 0},
184+ /* 0x1f91 - GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI */
185+ {0x1f29, 0x0399, 0},
186+ /* 0x1f92 - GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
187+ {0x1f2a, 0x0399, 0},
188+ /* 0x1f93 - GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
189+ {0x1f2b, 0x0399, 0},
190+ /* 0x1f94 - GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
191+ {0x1f2c, 0x0399, 0},
192+ /* 0x1f95 - GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
193+ {0x1f2d, 0x0399, 0},
194+ /* 0x1f96 - GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
195+ {0x1f2e, 0x0399, 0},
196+ /* 0x1f97 - GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
197+ {0x1f2f, 0x0399, 0},
198+ /* 0x1f98 - GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI */
199+ {0x1f28, 0x0399, 0},
200+ /* 0x1f99 - GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI */
201+ {0x1f29, 0x0399, 0},
202+ /* 0x1f9a - GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
203+ {0x1f2a, 0x0399, 0},
204+ /* 0x1f9b - GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
205+ {0x1f2b, 0x0399, 0},
206+ /* 0x1f9c - GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
207+ {0x1f2c, 0x0399, 0},
208+ /* 0x1f9d - GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
209+ {0x1f2d, 0x0399, 0},
210+ /* 0x1f9e - GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
211+ {0x1f2e, 0x0399, 0},
212+ /* 0x1f9f - GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
213+ {0x1f2f, 0x0399, 0},
214+ /* 0x1fa0 - GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI */
215+ {0x1f68, 0x0399, 0},
216+ /* 0x1fa1 - GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI */
217+ {0x1f69, 0x0399, 0},
218+ /* 0x1fa2 - GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
219+ {0x1f6a, 0x0399, 0},
220+ /* 0x1fa3 - GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
221+ {0x1f6b, 0x0399, 0},
222+ /* 0x1fa4 - GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
223+ {0x1f6c, 0x0399, 0},
224+ /* 0x1fa5 - GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
225+ {0x1f6d, 0x0399, 0},
226+ /* 0x1fa6 - GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
227+ {0x1f6e, 0x0399, 0},
228+ /* 0x1fa7 - GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
229+ {0x1f6f, 0x0399, 0},
230+ /* 0x1fa8 - GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI */
231+ {0x1f68, 0x0399, 0},
232+ /* 0x1fa9 - GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI */
233+ {0x1f69, 0x0399, 0},
234+ /* 0x1faa - GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
235+ {0x1f6a, 0x0399, 0},
236+ /* 0x1fab - GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
237+ {0x1f6b, 0x0399, 0},
238+ /* 0x1fac - GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
239+ {0x1f6c, 0x0399, 0},
240+ /* 0x1fad - GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
241+ {0x1f6d, 0x0399, 0},
242+ /* 0x1fae - GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
243+ {0x1f6e, 0x0399, 0},
244+ /* 0x1faf - GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
245+ {0x1f6f, 0x0399, 0},
246+ /* 0x1fb2 - GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */
247+ {0x1fba, 0x0399, 0},
248+ /* 0x1fb3 - GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI */
249+ {0x0391, 0x0399, 0},
250+ /* 0x1fb4 - GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */
251+ {0x0386, 0x0399, 0},
252+ /* 0x1fb6 - GREEK SMALL LETTER ALPHA WITH PERISPOMENI */
253+ {0x0391, 0x0342, 0},
254+ /* 0x1fb7 - GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */
255+ {0x0391, 0x0342, 0x0399},
256+ /* 0x1fbc - GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI */
257+ {0x0391, 0x0399, 0},
258+ /* 0x1fc2 - GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */
259+ {0x1fca, 0x0399, 0},
260+ /* 0x1fc3 - GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI */
261+ {0x0397, 0x0399, 0},
262+ /* 0x1fc4 - GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */
263+ {0x0389, 0x0399, 0},
264+ /* 0x1fc6 - GREEK SMALL LETTER ETA WITH PERISPOMENI */
265+ {0x0397, 0x0342, 0},
266+ /* 0x1fc7 - GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */
267+ {0x0397, 0x0342, 0x0399},
268+ /* 0x1fcc - GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI */
269+ {0x0397, 0x0399, 0},
270+ /* 0x1fd2 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */
271+ {0x0399, 0x0308, 0x0300},
272+ /* 0x1fd3 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */
273+ {0x0399, 0x0308, 0x0301},
274+ /* 0x1fd6 - GREEK SMALL LETTER IOTA WITH PERISPOMENI */
275+ {0x0399, 0x0342, 0},
276+ /* 0x1fd7 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */
277+ {0x0399, 0x0308, 0x0342},
278+ /* 0x1fe2 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */
279+ {0x03a5, 0x0308, 0x0300},
280+ /* 0x1fe3 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */
281+ {0x03a5, 0x0308, 0x0301},
282+ /* 0x1fe4 - GREEK SMALL LETTER RHO WITH PSILI */
283+ {0x03a1, 0x0313, 0},
284+ /* 0x1fe6 - GREEK SMALL LETTER UPSILON WITH PERISPOMENI */
285+ {0x03a5, 0x0342, 0},
286+ /* 0x1fe7 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */
287+ {0x03a5, 0x0308, 0x0342},
288+ /* 0x1ff2 - GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */
289+ {0x1ffa, 0x0399, 0},
290+ /* 0x1ff3 - GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI */
291+ {0x03a9, 0x0399, 0},
292+ /* 0x1ff4 - GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */
293+ {0x038f, 0x0399, 0},
294+ /* 0x1ff6 - GREEK SMALL LETTER OMEGA WITH PERISPOMENI */
295+ {0x03a9, 0x0342, 0},
296+ /* 0x1ff7 - GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */
297+ {0x03a9, 0x0342, 0x0399},
298+ /* 0x1ffc - GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI */
299+ {0x03a9, 0x0399, 0},
300+ /* 0xfb00 - LATIN SMALL LIGATURE FF */
301+ {0x0046, 0x0046, 0},
302+ /* 0xfb01 - LATIN SMALL LIGATURE FI */
303+ {0x0046, 0x0049, 0},
304+ /* 0xfb02 - LATIN SMALL LIGATURE FL */
305+ {0x0046, 0x004c, 0},
306+ /* 0xfb03 - LATIN SMALL LIGATURE FFI */
307+ {0x0046, 0x0046, 0x0049},
308+ /* 0xfb04 - LATIN SMALL LIGATURE FFL */
309+ {0x0046, 0x0046, 0x004c},
310+ /* 0xfb05 - LATIN SMALL LIGATURE LONG S T */
311+ {0x0053, 0x0054, 0},
312+ /* 0xfb06 - LATIN SMALL LIGATURE ST */
313+ {0x0053, 0x0054, 0},
314+ /* 0xfb13 - ARMENIAN SMALL LIGATURE MEN NOW */
315+ {0x0544, 0x0546, 0},
316+ /* 0xfb14 - ARMENIAN SMALL LIGATURE MEN ECH */
317+ {0x0544, 0x0535, 0},
318+ /* 0xfb15 - ARMENIAN SMALL LIGATURE MEN INI */
319+ {0x0544, 0x053b, 0},
320+ /* 0xfb16 - ARMENIAN SMALL LIGATURE VEW NOW */
321+ {0x054e, 0x0546, 0},
322+ /* 0xfb17 - ARMENIAN SMALL LIGATURE MEN XEH */
323+ {0x0544, 0x053d, 0},
324+};
325+const uint16_t _hs_text_to_lower_keys[1] = {
326+ 0x0130, /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
327+};
328+const size_t _hs_text_to_lower_len = 1;
329+const uint16_t _hs_text_to_lower_values[1][3] = {
330+ /* 0x0130 - LATIN CAPITAL LETTER I WITH DOT ABOVE */
331+ {0x0069, 0x0307, 0},
332+};
333+const uint16_t _hs_text_to_title_keys[48] = {
334+ 0x00df, /* LATIN SMALL LETTER SHARP S */
335+ 0x0149, /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
336+ 0x01f0, /* LATIN SMALL LETTER J WITH CARON */
337+ 0x0390, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
338+ 0x03b0, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
339+ 0x0587, /* ARMENIAN SMALL LIGATURE ECH YIWN */
340+ 0x1e96, /* LATIN SMALL LETTER H WITH LINE BELOW */
341+ 0x1e97, /* LATIN SMALL LETTER T WITH DIAERESIS */
342+ 0x1e98, /* LATIN SMALL LETTER W WITH RING ABOVE */
343+ 0x1e99, /* LATIN SMALL LETTER Y WITH RING ABOVE */
344+ 0x1e9a, /* LATIN SMALL LETTER A WITH RIGHT HALF RING */
345+ 0x1f50, /* GREEK SMALL LETTER UPSILON WITH PSILI */
346+ 0x1f52, /* GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */
347+ 0x1f54, /* GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */
348+ 0x1f56, /* GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */
349+ 0x1fb2, /* GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */
350+ 0x1fb4, /* GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */
351+ 0x1fb6, /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI */
352+ 0x1fb7, /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */
353+ 0x1fc2, /* GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */
354+ 0x1fc4, /* GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */
355+ 0x1fc6, /* GREEK SMALL LETTER ETA WITH PERISPOMENI */
356+ 0x1fc7, /* GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */
357+ 0x1fd2, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */
358+ 0x1fd3, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */
359+ 0x1fd6, /* GREEK SMALL LETTER IOTA WITH PERISPOMENI */
360+ 0x1fd7, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */
361+ 0x1fe2, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */
362+ 0x1fe3, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */
363+ 0x1fe4, /* GREEK SMALL LETTER RHO WITH PSILI */
364+ 0x1fe6, /* GREEK SMALL LETTER UPSILON WITH PERISPOMENI */
365+ 0x1fe7, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */
366+ 0x1ff2, /* GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */
367+ 0x1ff4, /* GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */
368+ 0x1ff6, /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI */
369+ 0x1ff7, /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */
370+ 0xfb00, /* LATIN SMALL LIGATURE FF */
371+ 0xfb01, /* LATIN SMALL LIGATURE FI */
372+ 0xfb02, /* LATIN SMALL LIGATURE FL */
373+ 0xfb03, /* LATIN SMALL LIGATURE FFI */
374+ 0xfb04, /* LATIN SMALL LIGATURE FFL */
375+ 0xfb05, /* LATIN SMALL LIGATURE LONG S T */
376+ 0xfb06, /* LATIN SMALL LIGATURE ST */
377+ 0xfb13, /* ARMENIAN SMALL LIGATURE MEN NOW */
378+ 0xfb14, /* ARMENIAN SMALL LIGATURE MEN ECH */
379+ 0xfb15, /* ARMENIAN SMALL LIGATURE MEN INI */
380+ 0xfb16, /* ARMENIAN SMALL LIGATURE VEW NOW */
381+ 0xfb17, /* ARMENIAN SMALL LIGATURE MEN XEH */
382+};
383+const size_t _hs_text_to_title_len = 48;
384+const uint16_t _hs_text_to_title_values[48][3] = {
385+ /* 0x00df - LATIN SMALL LETTER SHARP S */
386+ {0x0053, 0x0073, 0},
387+ /* 0x0149 - LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
388+ {0x02bc, 0x004e, 0},
389+ /* 0x01f0 - LATIN SMALL LETTER J WITH CARON */
390+ {0x004a, 0x030c, 0},
391+ /* 0x0390 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
392+ {0x0399, 0x0308, 0x0301},
393+ /* 0x03b0 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
394+ {0x03a5, 0x0308, 0x0301},
395+ /* 0x0587 - ARMENIAN SMALL LIGATURE ECH YIWN */
396+ {0x0535, 0x0582, 0},
397+ /* 0x1e96 - LATIN SMALL LETTER H WITH LINE BELOW */
398+ {0x0048, 0x0331, 0},
399+ /* 0x1e97 - LATIN SMALL LETTER T WITH DIAERESIS */
400+ {0x0054, 0x0308, 0},
401+ /* 0x1e98 - LATIN SMALL LETTER W WITH RING ABOVE */
402+ {0x0057, 0x030a, 0},
403+ /* 0x1e99 - LATIN SMALL LETTER Y WITH RING ABOVE */
404+ {0x0059, 0x030a, 0},
405+ /* 0x1e9a - LATIN SMALL LETTER A WITH RIGHT HALF RING */
406+ {0x0041, 0x02be, 0},
407+ /* 0x1f50 - GREEK SMALL LETTER UPSILON WITH PSILI */
408+ {0x03a5, 0x0313, 0},
409+ /* 0x1f52 - GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */
410+ {0x03a5, 0x0313, 0x0300},
411+ /* 0x1f54 - GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */
412+ {0x03a5, 0x0313, 0x0301},
413+ /* 0x1f56 - GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */
414+ {0x03a5, 0x0313, 0x0342},
415+ /* 0x1fb2 - GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */
416+ {0x1fba, 0x0345, 0},
417+ /* 0x1fb4 - GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */
418+ {0x0386, 0x0345, 0},
419+ /* 0x1fb6 - GREEK SMALL LETTER ALPHA WITH PERISPOMENI */
420+ {0x0391, 0x0342, 0},
421+ /* 0x1fb7 - GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */
422+ {0x0391, 0x0342, 0x0345},
423+ /* 0x1fc2 - GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */
424+ {0x1fca, 0x0345, 0},
425+ /* 0x1fc4 - GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */
426+ {0x0389, 0x0345, 0},
427+ /* 0x1fc6 - GREEK SMALL LETTER ETA WITH PERISPOMENI */
428+ {0x0397, 0x0342, 0},
429+ /* 0x1fc7 - GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */
430+ {0x0397, 0x0342, 0x0345},
431+ /* 0x1fd2 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */
432+ {0x0399, 0x0308, 0x0300},
433+ /* 0x1fd3 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */
434+ {0x0399, 0x0308, 0x0301},
435+ /* 0x1fd6 - GREEK SMALL LETTER IOTA WITH PERISPOMENI */
436+ {0x0399, 0x0342, 0},
437+ /* 0x1fd7 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */
438+ {0x0399, 0x0308, 0x0342},
439+ /* 0x1fe2 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */
440+ {0x03a5, 0x0308, 0x0300},
441+ /* 0x1fe3 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */
442+ {0x03a5, 0x0308, 0x0301},
443+ /* 0x1fe4 - GREEK SMALL LETTER RHO WITH PSILI */
444+ {0x03a1, 0x0313, 0},
445+ /* 0x1fe6 - GREEK SMALL LETTER UPSILON WITH PERISPOMENI */
446+ {0x03a5, 0x0342, 0},
447+ /* 0x1fe7 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */
448+ {0x03a5, 0x0308, 0x0342},
449+ /* 0x1ff2 - GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */
450+ {0x1ffa, 0x0345, 0},
451+ /* 0x1ff4 - GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */
452+ {0x038f, 0x0345, 0},
453+ /* 0x1ff6 - GREEK SMALL LETTER OMEGA WITH PERISPOMENI */
454+ {0x03a9, 0x0342, 0},
455+ /* 0x1ff7 - GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */
456+ {0x03a9, 0x0342, 0x0345},
457+ /* 0xfb00 - LATIN SMALL LIGATURE FF */
458+ {0x0046, 0x0066, 0},
459+ /* 0xfb01 - LATIN SMALL LIGATURE FI */
460+ {0x0046, 0x0069, 0},
461+ /* 0xfb02 - LATIN SMALL LIGATURE FL */
462+ {0x0046, 0x006c, 0},
463+ /* 0xfb03 - LATIN SMALL LIGATURE FFI */
464+ {0x0046, 0x0066, 0x0069},
465+ /* 0xfb04 - LATIN SMALL LIGATURE FFL */
466+ {0x0046, 0x0066, 0x006c},
467+ /* 0xfb05 - LATIN SMALL LIGATURE LONG S T */
468+ {0x0053, 0x0074, 0},
469+ /* 0xfb06 - LATIN SMALL LIGATURE ST */
470+ {0x0053, 0x0074, 0},
471+ /* 0xfb13 - ARMENIAN SMALL LIGATURE MEN NOW */
472+ {0x0544, 0x0576, 0},
473+ /* 0xfb14 - ARMENIAN SMALL LIGATURE MEN ECH */
474+ {0x0544, 0x0565, 0},
475+ /* 0xfb15 - ARMENIAN SMALL LIGATURE MEN INI */
476+ {0x0544, 0x056b, 0},
477+ /* 0xfb16 - ARMENIAN SMALL LIGATURE VEW NOW */
478+ {0x054e, 0x0576, 0},
479+ /* 0xfb17 - ARMENIAN SMALL LIGATURE MEN XEH */
480+ {0x0544, 0x056d, 0},
481+};
482+const uint16_t _hs_text_to_case_fold_keys[122] = {
483+ 0x00b5, /* MICRO SIGN */
484+ 0x00df, /* LATIN SMALL LETTER SHARP S */
485+ 0x0130, /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
486+ 0x0149, /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
487+ 0x017f, /* LATIN SMALL LETTER LONG S */
488+ 0x01f0, /* LATIN SMALL LETTER J WITH CARON */
489+ 0x0345, /* COMBINING GREEK YPOGEGRAMMENI */
490+ 0x0390, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
491+ 0x03b0, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
492+ 0x03c2, /* GREEK SMALL LETTER FINAL SIGMA */
493+ 0x03d0, /* GREEK BETA SYMBOL */
494+ 0x03d1, /* GREEK THETA SYMBOL */
495+ 0x03d5, /* GREEK PHI SYMBOL */
496+ 0x03d6, /* GREEK PI SYMBOL */
497+ 0x03f0, /* GREEK KAPPA SYMBOL */
498+ 0x03f1, /* GREEK RHO SYMBOL */
499+ 0x03f5, /* GREEK LUNATE EPSILON SYMBOL */
500+ 0x0587, /* ARMENIAN SMALL LIGATURE ECH YIWN */
501+ 0x10c7, /* GEORGIAN CAPITAL LETTER YN */
502+ 0x10cd, /* GEORGIAN CAPITAL LETTER AEN */
503+ 0x1e96, /* LATIN SMALL LETTER H WITH LINE BELOW */
504+ 0x1e97, /* LATIN SMALL LETTER T WITH DIAERESIS */
505+ 0x1e98, /* LATIN SMALL LETTER W WITH RING ABOVE */
506+ 0x1e99, /* LATIN SMALL LETTER Y WITH RING ABOVE */
507+ 0x1e9a, /* LATIN SMALL LETTER A WITH RIGHT HALF RING */
508+ 0x1e9b, /* LATIN SMALL LETTER LONG S WITH DOT ABOVE */
509+ 0x1e9e, /* LATIN CAPITAL LETTER SHARP S */
510+ 0x1f50, /* GREEK SMALL LETTER UPSILON WITH PSILI */
511+ 0x1f52, /* GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */
512+ 0x1f54, /* GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */
513+ 0x1f56, /* GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */
514+ 0x1f80, /* GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI */
515+ 0x1f81, /* GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI */
516+ 0x1f82, /* GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
517+ 0x1f83, /* GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
518+ 0x1f84, /* GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
519+ 0x1f85, /* GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
520+ 0x1f86, /* GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
521+ 0x1f87, /* GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
522+ 0x1f88, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI */
523+ 0x1f89, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI */
524+ 0x1f8a, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
525+ 0x1f8b, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
526+ 0x1f8c, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
527+ 0x1f8d, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
528+ 0x1f8e, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
529+ 0x1f8f, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
530+ 0x1f90, /* GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI */
531+ 0x1f91, /* GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI */
532+ 0x1f92, /* GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
533+ 0x1f93, /* GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
534+ 0x1f94, /* GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
535+ 0x1f95, /* GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
536+ 0x1f96, /* GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
537+ 0x1f97, /* GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
538+ 0x1f98, /* GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI */
539+ 0x1f99, /* GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI */
540+ 0x1f9a, /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
541+ 0x1f9b, /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
542+ 0x1f9c, /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
543+ 0x1f9d, /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
544+ 0x1f9e, /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
545+ 0x1f9f, /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
546+ 0x1fa0, /* GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI */
547+ 0x1fa1, /* GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI */
548+ 0x1fa2, /* GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
549+ 0x1fa3, /* GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
550+ 0x1fa4, /* GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
551+ 0x1fa5, /* GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
552+ 0x1fa6, /* GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
553+ 0x1fa7, /* GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
554+ 0x1fa8, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI */
555+ 0x1fa9, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI */
556+ 0x1faa, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
557+ 0x1fab, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
558+ 0x1fac, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
559+ 0x1fad, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
560+ 0x1fae, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
561+ 0x1faf, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
562+ 0x1fb2, /* GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */
563+ 0x1fb3, /* GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI */
564+ 0x1fb4, /* GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */
565+ 0x1fb6, /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI */
566+ 0x1fb7, /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */
567+ 0x1fbc, /* GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI */
568+ 0x1fbe, /* GREEK PROSGEGRAMMENI */
569+ 0x1fc2, /* GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */
570+ 0x1fc3, /* GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI */
571+ 0x1fc4, /* GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */
572+ 0x1fc6, /* GREEK SMALL LETTER ETA WITH PERISPOMENI */
573+ 0x1fc7, /* GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */
574+ 0x1fcc, /* GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI */
575+ 0x1fd2, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */
576+ 0x1fd3, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */
577+ 0x1fd6, /* GREEK SMALL LETTER IOTA WITH PERISPOMENI */
578+ 0x1fd7, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */
579+ 0x1fe2, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */
580+ 0x1fe3, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */
581+ 0x1fe4, /* GREEK SMALL LETTER RHO WITH PSILI */
582+ 0x1fe6, /* GREEK SMALL LETTER UPSILON WITH PERISPOMENI */
583+ 0x1fe7, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */
584+ 0x1ff2, /* GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */
585+ 0x1ff3, /* GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI */
586+ 0x1ff4, /* GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */
587+ 0x1ff6, /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI */
588+ 0x1ff7, /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */
589+ 0x1ffc, /* GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI */
590+ 0x2cf2, /* COPTIC CAPITAL LETTER BOHAIRIC KHEI */
591+ 0xa792, /* LATIN CAPITAL LETTER C WITH BAR */
592+ 0xa7aa, /* LATIN CAPITAL LETTER H WITH HOOK */
593+ 0xfb00, /* LATIN SMALL LIGATURE FF */
594+ 0xfb01, /* LATIN SMALL LIGATURE FI */
595+ 0xfb02, /* LATIN SMALL LIGATURE FL */
596+ 0xfb03, /* LATIN SMALL LIGATURE FFI */
597+ 0xfb04, /* LATIN SMALL LIGATURE FFL */
598+ 0xfb05, /* LATIN SMALL LIGATURE LONG S T */
599+ 0xfb06, /* LATIN SMALL LIGATURE ST */
600+ 0xfb13, /* ARMENIAN SMALL LIGATURE MEN NOW */
601+ 0xfb14, /* ARMENIAN SMALL LIGATURE MEN ECH */
602+ 0xfb15, /* ARMENIAN SMALL LIGATURE MEN INI */
603+ 0xfb16, /* ARMENIAN SMALL LIGATURE VEW NOW */
604+ 0xfb17, /* ARMENIAN SMALL LIGATURE MEN XEH */
605+};
606+const size_t _hs_text_to_case_fold_len = 122;
607+const uint16_t _hs_text_to_case_fold_values[122][3] = {
608+ /* 0x00b5 - MICRO SIGN */
609+ {0x03bc, 0, 0},
610+ /* 0x00df - LATIN SMALL LETTER SHARP S */
611+ {0x0073, 0x0073, 0},
612+ /* 0x0130 - LATIN CAPITAL LETTER I WITH DOT ABOVE */
613+ {0x0069, 0x0307, 0},
614+ /* 0x0149 - LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
615+ {0x02bc, 0x006e, 0},
616+ /* 0x017f - LATIN SMALL LETTER LONG S */
617+ {0x0073, 0, 0},
618+ /* 0x01f0 - LATIN SMALL LETTER J WITH CARON */
619+ {0x006a, 0x030c, 0},
620+ /* 0x0345 - COMBINING GREEK YPOGEGRAMMENI */
621+ {0x03b9, 0, 0},
622+ /* 0x0390 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
623+ {0x03b9, 0x0308, 0x0301},
624+ /* 0x03b0 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
625+ {0x03c5, 0x0308, 0x0301},
626+ /* 0x03c2 - GREEK SMALL LETTER FINAL SIGMA */
627+ {0x03c3, 0, 0},
628+ /* 0x03d0 - GREEK BETA SYMBOL */
629+ {0x03b2, 0, 0},
630+ /* 0x03d1 - GREEK THETA SYMBOL */
631+ {0x03b8, 0, 0},
632+ /* 0x03d5 - GREEK PHI SYMBOL */
633+ {0x03c6, 0, 0},
634+ /* 0x03d6 - GREEK PI SYMBOL */
635+ {0x03c0, 0, 0},
636+ /* 0x03f0 - GREEK KAPPA SYMBOL */
637+ {0x03ba, 0, 0},
638+ /* 0x03f1 - GREEK RHO SYMBOL */
639+ {0x03c1, 0, 0},
640+ /* 0x03f5 - GREEK LUNATE EPSILON SYMBOL */
641+ {0x03b5, 0, 0},
642+ /* 0x0587 - ARMENIAN SMALL LIGATURE ECH YIWN */
643+ {0x0565, 0x0582, 0},
644+ /* 0x10c7 - GEORGIAN CAPITAL LETTER YN */
645+ {0x2d27, 0, 0},
646+ /* 0x10cd - GEORGIAN CAPITAL LETTER AEN */
647+ {0x2d2d, 0, 0},
648+ /* 0x1e96 - LATIN SMALL LETTER H WITH LINE BELOW */
649+ {0x0068, 0x0331, 0},
650+ /* 0x1e97 - LATIN SMALL LETTER T WITH DIAERESIS */
651+ {0x0074, 0x0308, 0},
652+ /* 0x1e98 - LATIN SMALL LETTER W WITH RING ABOVE */
653+ {0x0077, 0x030a, 0},
654+ /* 0x1e99 - LATIN SMALL LETTER Y WITH RING ABOVE */
655+ {0x0079, 0x030a, 0},
656+ /* 0x1e9a - LATIN SMALL LETTER A WITH RIGHT HALF RING */
657+ {0x0061, 0x02be, 0},
658+ /* 0x1e9b - LATIN SMALL LETTER LONG S WITH DOT ABOVE */
659+ {0x1e61, 0, 0},
660+ /* 0x1e9e - LATIN CAPITAL LETTER SHARP S */
661+ {0x0073, 0x0073, 0},
662+ /* 0x1f50 - GREEK SMALL LETTER UPSILON WITH PSILI */
663+ {0x03c5, 0x0313, 0},
664+ /* 0x1f52 - GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */
665+ {0x03c5, 0x0313, 0x0300},
666+ /* 0x1f54 - GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */
667+ {0x03c5, 0x0313, 0x0301},
668+ /* 0x1f56 - GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */
669+ {0x03c5, 0x0313, 0x0342},
670+ /* 0x1f80 - GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI */
671+ {0x1f00, 0x03b9, 0},
672+ /* 0x1f81 - GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI */
673+ {0x1f01, 0x03b9, 0},
674+ /* 0x1f82 - GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
675+ {0x1f02, 0x03b9, 0},
676+ /* 0x1f83 - GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
677+ {0x1f03, 0x03b9, 0},
678+ /* 0x1f84 - GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
679+ {0x1f04, 0x03b9, 0},
680+ /* 0x1f85 - GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
681+ {0x1f05, 0x03b9, 0},
682+ /* 0x1f86 - GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
683+ {0x1f06, 0x03b9, 0},
684+ /* 0x1f87 - GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
685+ {0x1f07, 0x03b9, 0},
686+ /* 0x1f88 - GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI */
687+ {0x1f00, 0x03b9, 0},
688+ /* 0x1f89 - GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI */
689+ {0x1f01, 0x03b9, 0},
690+ /* 0x1f8a - GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
691+ {0x1f02, 0x03b9, 0},
692+ /* 0x1f8b - GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
693+ {0x1f03, 0x03b9, 0},
694+ /* 0x1f8c - GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
695+ {0x1f04, 0x03b9, 0},
696+ /* 0x1f8d - GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
697+ {0x1f05, 0x03b9, 0},
698+ /* 0x1f8e - GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
699+ {0x1f06, 0x03b9, 0},
700+ /* 0x1f8f - GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
701+ {0x1f07, 0x03b9, 0},
702+ /* 0x1f90 - GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI */
703+ {0x1f20, 0x03b9, 0},
704+ /* 0x1f91 - GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI */
705+ {0x1f21, 0x03b9, 0},
706+ /* 0x1f92 - GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
707+ {0x1f22, 0x03b9, 0},
708+ /* 0x1f93 - GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
709+ {0x1f23, 0x03b9, 0},
710+ /* 0x1f94 - GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
711+ {0x1f24, 0x03b9, 0},
712+ /* 0x1f95 - GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
713+ {0x1f25, 0x03b9, 0},
714+ /* 0x1f96 - GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
715+ {0x1f26, 0x03b9, 0},
716+ /* 0x1f97 - GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
717+ {0x1f27, 0x03b9, 0},
718+ /* 0x1f98 - GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI */
719+ {0x1f20, 0x03b9, 0},
720+ /* 0x1f99 - GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI */
721+ {0x1f21, 0x03b9, 0},
722+ /* 0x1f9a - GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
723+ {0x1f22, 0x03b9, 0},
724+ /* 0x1f9b - GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
725+ {0x1f23, 0x03b9, 0},
726+ /* 0x1f9c - GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
727+ {0x1f24, 0x03b9, 0},
728+ /* 0x1f9d - GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
729+ {0x1f25, 0x03b9, 0},
730+ /* 0x1f9e - GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
731+ {0x1f26, 0x03b9, 0},
732+ /* 0x1f9f - GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
733+ {0x1f27, 0x03b9, 0},
734+ /* 0x1fa0 - GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI */
735+ {0x1f60, 0x03b9, 0},
736+ /* 0x1fa1 - GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI */
737+ {0x1f61, 0x03b9, 0},
738+ /* 0x1fa2 - GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
739+ {0x1f62, 0x03b9, 0},
740+ /* 0x1fa3 - GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
741+ {0x1f63, 0x03b9, 0},
742+ /* 0x1fa4 - GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
743+ {0x1f64, 0x03b9, 0},
744+ /* 0x1fa5 - GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
745+ {0x1f65, 0x03b9, 0},
746+ /* 0x1fa6 - GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
747+ {0x1f66, 0x03b9, 0},
748+ /* 0x1fa7 - GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
749+ {0x1f67, 0x03b9, 0},
750+ /* 0x1fa8 - GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI */
751+ {0x1f60, 0x03b9, 0},
752+ /* 0x1fa9 - GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI */
753+ {0x1f61, 0x03b9, 0},
754+ /* 0x1faa - GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
755+ {0x1f62, 0x03b9, 0},
756+ /* 0x1fab - GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
757+ {0x1f63, 0x03b9, 0},
758+ /* 0x1fac - GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
759+ {0x1f64, 0x03b9, 0},
760+ /* 0x1fad - GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
761+ {0x1f65, 0x03b9, 0},
762+ /* 0x1fae - GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
763+ {0x1f66, 0x03b9, 0},
764+ /* 0x1faf - GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
765+ {0x1f67, 0x03b9, 0},
766+ /* 0x1fb2 - GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */
767+ {0x1f70, 0x03b9, 0},
768+ /* 0x1fb3 - GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI */
769+ {0x03b1, 0x03b9, 0},
770+ /* 0x1fb4 - GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */
771+ {0x03ac, 0x03b9, 0},
772+ /* 0x1fb6 - GREEK SMALL LETTER ALPHA WITH PERISPOMENI */
773+ {0x03b1, 0x0342, 0},
774+ /* 0x1fb7 - GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */
775+ {0x03b1, 0x0342, 0x03b9},
776+ /* 0x1fbc - GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI */
777+ {0x03b1, 0x03b9, 0},
778+ /* 0x1fbe - GREEK PROSGEGRAMMENI */
779+ {0x03b9, 0, 0},
780+ /* 0x1fc2 - GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */
781+ {0x1f74, 0x03b9, 0},
782+ /* 0x1fc3 - GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI */
783+ {0x03b7, 0x03b9, 0},
784+ /* 0x1fc4 - GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */
785+ {0x03ae, 0x03b9, 0},
786+ /* 0x1fc6 - GREEK SMALL LETTER ETA WITH PERISPOMENI */
787+ {0x03b7, 0x0342, 0},
788+ /* 0x1fc7 - GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */
789+ {0x03b7, 0x0342, 0x03b9},
790+ /* 0x1fcc - GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI */
791+ {0x03b7, 0x03b9, 0},
792+ /* 0x1fd2 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */
793+ {0x03b9, 0x0308, 0x0300},
794+ /* 0x1fd3 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */
795+ {0x03b9, 0x0308, 0x0301},
796+ /* 0x1fd6 - GREEK SMALL LETTER IOTA WITH PERISPOMENI */
797+ {0x03b9, 0x0342, 0},
798+ /* 0x1fd7 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */
799+ {0x03b9, 0x0308, 0x0342},
800+ /* 0x1fe2 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */
801+ {0x03c5, 0x0308, 0x0300},
802+ /* 0x1fe3 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */
803+ {0x03c5, 0x0308, 0x0301},
804+ /* 0x1fe4 - GREEK SMALL LETTER RHO WITH PSILI */
805+ {0x03c1, 0x0313, 0},
806+ /* 0x1fe6 - GREEK SMALL LETTER UPSILON WITH PERISPOMENI */
807+ {0x03c5, 0x0342, 0},
808+ /* 0x1fe7 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */
809+ {0x03c5, 0x0308, 0x0342},
810+ /* 0x1ff2 - GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */
811+ {0x1f7c, 0x03b9, 0},
812+ /* 0x1ff3 - GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI */
813+ {0x03c9, 0x03b9, 0},
814+ /* 0x1ff4 - GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */
815+ {0x03ce, 0x03b9, 0},
816+ /* 0x1ff6 - GREEK SMALL LETTER OMEGA WITH PERISPOMENI */
817+ {0x03c9, 0x0342, 0},
818+ /* 0x1ff7 - GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */
819+ {0x03c9, 0x0342, 0x03b9},
820+ /* 0x1ffc - GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI */
821+ {0x03c9, 0x03b9, 0},
822+ /* 0x2cf2 - COPTIC CAPITAL LETTER BOHAIRIC KHEI */
823+ {0x2cf3, 0, 0},
824+ /* 0xa792 - LATIN CAPITAL LETTER C WITH BAR */
825+ {0xa793, 0, 0},
826+ /* 0xa7aa - LATIN CAPITAL LETTER H WITH HOOK */
827+ {0x0266, 0, 0},
828+ /* 0xfb00 - LATIN SMALL LIGATURE FF */
829+ {0x0066, 0x0066, 0},
830+ /* 0xfb01 - LATIN SMALL LIGATURE FI */
831+ {0x0066, 0x0069, 0},
832+ /* 0xfb02 - LATIN SMALL LIGATURE FL */
833+ {0x0066, 0x006c, 0},
834+ /* 0xfb03 - LATIN SMALL LIGATURE FFI */
835+ {0x0066, 0x0066, 0x0069},
836+ /* 0xfb04 - LATIN SMALL LIGATURE FFL */
837+ {0x0066, 0x0066, 0x006c},
838+ /* 0xfb05 - LATIN SMALL LIGATURE LONG S T */
839+ {0x0073, 0x0074, 0},
840+ /* 0xfb06 - LATIN SMALL LIGATURE ST */
841+ {0x0073, 0x0074, 0},
842+ /* 0xfb13 - ARMENIAN SMALL LIGATURE MEN NOW */
843+ {0x0574, 0x0576, 0},
844+ /* 0xfb14 - ARMENIAN SMALL LIGATURE MEN ECH */
845+ {0x0574, 0x0565, 0},
846+ /* 0xfb15 - ARMENIAN SMALL LIGATURE MEN INI */
847+ {0x0574, 0x056b, 0},
848+ /* 0xfb16 - ARMENIAN SMALL LIGATURE VEW NOW */
849+ {0x057e, 0x0576, 0},
850+ /* 0xfb17 - ARMENIAN SMALL LIGATURE MEN XEH */
851+ {0x0574, 0x056d, 0},
852+};
cbits/cbits.c+94
@@ -309,3 +309,97 @@ _hs_text_encode_utf8(uint8_t **destp, const uint16_t *src, size_t srcoff,
309309
310310 *destp = dest;
311311}
312+
313+/*
314+ * Case mapping works as follows. We binary search a dense sorted
315+ * table of characters. If we find a match, we return the address of
316+ * a three-character sequence which represents the mapping of that
317+ * character. Short sequences are padded on the end with nulls.
318+ *
319+ * We can get away with a dense encoding, representing characters in
320+ * these tables as 16-bit values, until whenever the Unicode
321+ * consortium defines funky case mappings for code points above
322+ * U+FFFF. (The table generator scripts/CaseMapping.hs checks for
323+ * this.)
324+ */
325+
326+/*
327+ * Binary search through a case mapping table.
328+ */
329+static ssize_t case_map_search(const uint16_t *table, size_t len, uint16_t key)
330+{
331+ ssize_t max = len - 1;
332+ ssize_t min = 0;
333+
334+ while (max >= min) {
335+ ssize_t mid = min + (max - min) / 2;
336+
337+ if (table[mid] == key)
338+ return mid;
339+ if (table[mid] < key)
340+ min = mid + 1;
341+ else
342+ max = mid - 1;
343+ }
344+ return -1;
345+}
346+
347+extern const uint16_t _hs_text_to_upper_keys[];
348+extern const uint16_t _hs_text_to_upper_values[][3];
349+extern const size_t _hs_text_to_upper_len;
350+
351+const uint16_t *_hs_text_to_upper(uint16_t c)
352+{
353+ ssize_t idx = case_map_search(_hs_text_to_upper_keys,
354+ _hs_text_to_upper_len,
355+ c);
356+
357+ if (idx == -1)
358+ return NULL;
359+ return _hs_text_to_upper_values[idx];
360+}
361+
362+extern const uint16_t _hs_text_to_lower_keys[];
363+extern const uint16_t _hs_text_to_lower_values[][3];
364+extern const size_t _hs_text_to_lower_len;
365+
366+const uint16_t *_hs_text_to_lower(uint16_t c)
367+{
368+ ssize_t idx = case_map_search(_hs_text_to_lower_keys,
369+ _hs_text_to_lower_len,
370+ c);
371+
372+ if (idx == -1)
373+ return NULL;
374+ return _hs_text_to_lower_values[idx];
375+}
376+
377+extern const uint16_t _hs_text_to_case_fold_keys[];
378+extern const uint16_t _hs_text_to_case_fold_values[][3];
379+extern const size_t _hs_text_to_case_fold_len;
380+
381+const uint16_t *_hs_text_to_case_fold(uint16_t c)
382+{
383+ ssize_t idx = case_map_search(_hs_text_to_case_fold_keys,
384+ _hs_text_to_case_fold_len,
385+ c);
386+
387+ if (idx == -1)
388+ return NULL;
389+ return _hs_text_to_case_fold_values[idx];
390+}
391+
392+extern const uint16_t _hs_text_to_title_keys[];
393+extern const uint16_t _hs_text_to_title_values[][3];
394+extern const size_t _hs_text_to_title_len;
395+
396+const uint16_t *_hs_text_to_title(uint16_t c)
397+{
398+ ssize_t idx = case_map_search(_hs_text_to_title_keys,
399+ _hs_text_to_title_len,
400+ c);
401+
402+ if (idx == -1)
403+ return NULL;
404+ return _hs_text_to_title_values[idx];
405+}
changelog.md+3−75
@@ -1,83 +1,11 @@
1−1.2.2.1
2−
3−* The switch to `integer-pure` in 1.2.2.0 was apparently mistaken.
4− The build flag has been renamed accordingly. Your army of diligent
5− maintainers apologizes for the churn.
6−
7−* Spec compliance: toCaseFold now follows the Unicode 8.0 spec
8− (updated from 7.0)
9−
10−* An STG lint error has been fixed
11−
12−1.2.2.0
13−
14−* The `integer-simple` package, upon which this package optionally
15− depended, has been replaced with `integer-pure`. The build flag has
16− been renamed accordingly.
17−
18−* Bug fix: For the `Binary` instance, If UTF-8 decoding fails during a
19− `get`, the error is propagated via `fail` instead of an uncatchable
20− crash.
21−
22−* New function: `takeWhileEnd`
23−
24−* New instances for the `Text` types:
25− * if `base` >= 4.7: `PrintfArg`
26− * if `base` >= 4.9: `Semigroup`
27−
28−1.2.1.3
29−
30−* Bug fix: As it turns out, moving the literal rewrite rules to simplifier
31− phase 2 does not prevent competition with the `unpack` rule, which is
32− also active in this phase. Unfortunately this was hidden due to a silly
33− test environment mistake. Moving literal rules back to phase 1 finally
34− fixes GHC Trac #10528 correctly.
35−
36−1.2.1.2
37−
38−* Bug fix: Run literal rewrite rules in simplifier phase 2.
39− The behavior of the simplifier changed in GHC 7.10.2,
40− causing these rules to fail to fire, leading to poor code generation
41− and long compilation times. See
42− [GHC Trac #10528](https://ghc.haskell.org/trac/ghc/ticket/10528).
43−
44−1.2.1.1
45−
46−* Expose unpackCString#, which you should never use.
47−
48−1.2.1.0
49−
50−* Added Binary instances for both Text types. (If you have previously
51− been using the text-binary package to get a Binary instance, it is
52− now obsolete.)
53−
54−1.2.0.6
55−
56−* Fixed a space leak in UTF-8 decoding
57−
5811.2.0.5
592
60−* Feature parity: repeat, cycle, iterate are now implemented for lazy
61− Text, and the Data instance is more complete
62−
63−* Build speed: an inliner space explosion has been fixed with toCaseFold
64−
65−* Bug fix: encoding Int to a Builder would infinite-loop if the
66− integer-simple package was used
67−
68−* Deprecation: OnEncodeError and EncodeError are deprecated, as they
69− are never used
70−
71−* Internals: some types that are used internally in fusion-related
72− functions have moved around, been renamed, or been deleted (we don't
73− bump the major version if .Internal modules change)
74−
75−* Spec compliance: toCaseFold now follows the Unicode 7.0 spec
76− (updated from 6.3)
3+* Fixed a space explosion in the GHC inliner by changing how case
4+ mapping functions are implemented
775
7861.2.0.4
797
80−* Fixed an incompatibility with base < 4.5
8+* Resurrected compatibility with base < 4.5
819
82101.2.0.3
8311
scripts/Arsec.hs+17−4
@@ -3,7 +3,9 @@ module Arsec
33 Comment
44 , comment
55 , semi
6− , showC
6+ , showX
7+ , key
8+ , value
79 , unichar
810 , unichars
911 , module Control.Applicative
@@ -18,6 +20,7 @@ module Arsec
1820import Control.Monad
1921import Control.Applicative
2022import Data.Char
23+import Data.List (intercalate)
2124import Numeric
2225import Text.ParserCombinators.Parsec.Char hiding (lower, upper)
2326import Text.ParserCombinators.Parsec.Combinator hiding (optional)
@@ -38,7 +41,17 @@ semi = char ';' *> spaces *> pure ()
3841comment :: Parser Comment
3942comment = (char '#' *> manyTill anyToken (char '\n')) <|> string "\n"
4043
41−showC :: Char -> String
42−showC c = "'\\x" ++ d ++ "'"
44+showX :: Char -> String
45+showX c
46+ | c > '\xffff' = error $ "U+" ++ h ++ " will not fit in 16 bits"
47+ | otherwise = "0x" ++ replicate (4 - length h) '0' ++ h
4348 where h = showHex (ord c) ""
44− d = replicate (4 - length h) '0' ++ h
49+
50+key :: (t -> Char) -> (t -> String) -> t -> String
51+key code name c = " " ++ showX (code c) ++ "," ++ " /* " ++ name c ++ " */"
52+
53+value :: (t -> Char) -> (t -> String) -> (t -> String) -> t -> String
54+value code name mapping c =
55+ " /* " ++ showX (code c) ++ " - " ++ name c ++ " */\n" ++
56+ " {" ++ intercalate ", " xs ++ "},"
57+ where xs = take 3 (map showX (mapping c) ++ ["0","0"])
scripts/CaseFolding.hs+11−7
@@ -11,6 +11,7 @@ module CaseFolding
1111 ) where
1212
1313import Arsec
14+import Data.List (sort)
1415
1516data Fold = Fold {
1617 code :: Char
@@ -34,13 +35,16 @@ parseCF :: FilePath -> IO (Either ParseError CaseFolding)
3435parseCF name = parse entries name <$> readFile name
3536
3637mapCF :: CaseFolding -> [String]
37−mapCF (CF _ ms) = typ ++ (map nice . filter p $ ms) ++ [last]
38+mapCF (CF _ ms) =
39+ ["const uint16_t _hs_text_to_case_fold_keys[" ++ count ++ "] = {"] ++
40+ map (key code name) mappings ++
41+ ["};"
42+ ,"const size_t _hs_text_to_case_fold_len = " ++ count ++ ";"
43+ ,"const uint16_t _hs_text_to_case_fold_values[" ++ count ++ "][3] = {"] ++
44+ map (value code name mapping) mappings ++
45+ ["};"]
3846 where
39− typ = ["foldMapping :: forall s. Char -> s -> Step (CC s) Char"
40− ,"{-# NOINLINE foldMapping #-}"]
41− last = "foldMapping c s = Yield (toLower c) (CC s '\\0' '\\0')"
42− nice c = "-- " ++ name c ++ "\n" ++
43− "foldMapping " ++ showC (code c) ++ " s = Yield " ++ x ++ " (CC s " ++ y ++ " " ++ z ++ ")"
44− where [x,y,z] = (map showC . take 3) (mapping c ++ repeat '\0')
47+ count = show (length mappings)
48+ mappings = sort (filter p ms)
4549 p f = status f `elem` "CF" &&
4650 mapping f /= [toLower (code f)]
scripts/CaseMapping.hs+10−9
@@ -8,7 +8,7 @@ import SpecialCasing
88main = do
99 args <- getArgs
1010 let oname = case args of
11− [] -> "../Data/Text/Internal/Fusion/CaseMapping.hs"
11+ [] -> "../cbits/case_mapping.c"
1212 [o] -> o
1313 psc <- parseSC "SpecialCasing.txt"
1414 pcf <- parseCF "CaseFolding.txt"
@@ -19,17 +19,18 @@ main = do
1919 Left err -> print err >> return undefined
2020 Right ms -> return ms
2121 h <- openFile oname WriteMode
22− let comments = map ("--" ++) $
22+ let comments = map (" *" ++) $
2323 take 2 (cfComments cfs) ++ take 2 (scComments scs)
2424 mapM_ (hPutStrLn h) $
25− ["{-# LANGUAGE Rank2Types #-}"
26− ,"-- AUTOMATICALLY GENERATED - DO NOT EDIT"
27− ,"-- Generated by scripts/CaseMapping.hs"] ++
25+ ["/*"
26+ ," * AUTOMATICALLY GENERATED - DO NOT EDIT"
27+ ," * Generated by scripts/CaseMapping.hs"
28+ ," *"] ++
2829 comments ++
29− [""
30− ,"module Data.Text.Internal.Fusion.CaseMapping where"
31− ,"import Data.Char"
32− ,"import Data.Text.Internal.Fusion.Types"
30+ [" */"
31+ ,""
32+ ,"#include <stdint.h>"
33+ ,"#include <sys/types.h>"
3334 ,""]
3435 mapM_ (hPutStrLn h) (mapSC "upper" upper toUpper scs)
3536 mapM_ (hPutStrLn h) (mapSC "lower" lower toLower scs)
scripts/SpecialCasing.hs+10−7
@@ -11,6 +11,7 @@ module SpecialCasing
1111 ) where
1212
1313import Arsec
14+import Data.List (sort)
1415
1516data SpecialCasing = SC { scComments :: [Comment], scCasing :: [Case] }
1617 deriving (Show)
@@ -40,14 +41,16 @@ parseSC name = parse entries name <$> readFile name
4041mapSC :: String -> (Case -> String) -> (Char -> Char) -> SpecialCasing
4142 -> [String]
4243mapSC which access twiddle (SC _ ms) =
43− typ ++ (map nice . filter p $ ms) ++ [last]
44+ ["const uint16_t _hs_text_to_" ++ which ++ "_keys[" ++ count ++ "] = {"] ++
45+ map (key code name) mappings ++
46+ ["};"
47+ ,"const size_t _hs_text_to_" ++ which ++ "_len = " ++ count ++ ";"
48+ ,"const uint16_t _hs_text_to_" ++ which ++ "_values[" ++ count ++ "][3] = {"] ++
49+ map (value code name access) mappings ++
50+ ["};"]
4451 where
45− typ = [which ++ "Mapping :: forall s. Char -> s -> Step (CC s) Char"
46− ,"{-# NOINLINE " ++ which ++ "Mapping #-}"]
47− last = which ++ "Mapping c s = Yield (to" ++ ucFirst which ++ " c) (CC s '\\0' '\\0')"
48− nice c = "-- " ++ name c ++ "\n" ++
49− which ++ "Mapping " ++ showC (code c) ++ " s = Yield " ++ x ++ " (CC s " ++ y ++ " " ++ z ++ ")"
50− where [x,y,z] = (map showC . take 3) (access c ++ repeat '\0')
52+ count = show (length mappings)
53+ mappings = sort (filter p ms)
5154 p c = [k] /= a && a /= [twiddle k] && null (conditions c)
5255 where a = access c
5356 k = code c
tests/LiteralRuleTest.hsdeleted−21
@@ -1,21 +0,0 @@
1−{-# LANGUAGE OverloadedStrings #-}
2−
3−module LiteralRuleTest where
4−
5−import Data.Text (Text)
6−
7−-- This should produce 8 firings of the "TEXT literal" rule
8−strings :: [Text]
9−strings = [ "abstime", "aclitem", "bit", "bool", "box", "bpchar", "bytea", "char" ]
10−
11−-- This should produce 7 firings of the "TEXT literal UTF8" rule
12−utf8Strings :: [Text]
13−utf8Strings = [ "\0abstime", "\0aclitem", "\xfefe bit", "\0bool", "\0box", "\0bpchar", "\0bytea" ]
14−
15−-- This should produce 4 firings of the "TEXT empty literal" rule
16−empties :: [Text]
17−empties = [ "", "", "", "" ]
18−
19−-- This should produce 5 firings of the "TEXT empty literal" rule
20−--singletons :: [Text]
21−--singletons = [ "a", "b", "c", "d", "e" ]
tests/Makefile+1−6
@@ -1,10 +1,5 @@
11count = 1000
22
3−all: coverage literal-rule-test
4−
5−literal-rule-test:
6− ./literal-rule-test.sh
7−
83coverage: build coverage/hpc_index.html
94
105build: text-test-data
@@ -37,4 +32,4 @@ coverage/hpc_index.html: coverage/coverage.tix
3732clean:
3833 rm -rf dist coverage .hpc
3934
40−.PHONY: build coverage all literal-rule-test
35+.PHONY: build coverage
tests/Tests/Properties.hs−6
@@ -516,10 +516,6 @@ sf_takeWhile q p = (L.takeWhile p . L.filter q) `eqP`
516516 (unpackS . S.takeWhile p . S.filter q)
517517t_takeWhile p = L.takeWhile p `eqP` (unpackS . T.takeWhile p)
518518tl_takeWhile p = L.takeWhile p `eqP` (unpackS . TL.takeWhile p)
519−t_takeWhileEnd p = (L.reverse . L.takeWhile p . L.reverse) `eqP`
520− (unpackS . T.takeWhileEnd p)
521−tl_takeWhileEnd p = (L.reverse . L.takeWhile p . L.reverse) `eqP`
522− (unpackS . TL.takeWhileEnd p)
523519s_dropWhile p = L.dropWhile p `eqP` (unpackS . S.dropWhile p)
524520s_dropWhile_s p = L.dropWhile p `eqP` (unpackS . S.unstream . S.dropWhile p)
525521sf_dropWhile q p = (L.dropWhile p . L.filter q) `eqP`
@@ -1146,8 +1142,6 @@ tests =
11461142 testProperty "sf_takeWhile" sf_takeWhile,
11471143 testProperty "t_takeWhile" t_takeWhile,
11481144 testProperty "tl_takeWhile" tl_takeWhile,
1149− testProperty "t_takeWhileEnd" t_takeWhileEnd,
1150− testProperty "tl_takeWhileEnd" tl_takeWhileEnd,
11511145 testProperty "sf_dropWhile" sf_dropWhile,
11521146 testProperty "s_dropWhile" s_dropWhile,
11531147 testProperty "s_dropWhile_s" s_dropWhile_s,
tests/literal-rule-test.shdeleted−29
@@ -1,29 +0,0 @@
1−#!/bin/bash -e
2−
3−failed=0
4−
5−function check_firings() {
6− rule=$1
7− expected=$2
8− build="ghc -O -ddump-rule-firings LiteralRuleTest.hs"
9− build="$build -i.. -I../include"
10− touch LiteralRuleTest.hs
11− echo -n "Want to see $expected firings of rule $rule... " >&2
12− firings=$($build 2>&1 | grep "Rule fired: $rule\$" | wc -l)
13− rm -f LiteralRuleTest.{o.hi}
14−
15− if [ $firings != $expected ]; then
16− echo "failed, saw $firings" >&2
17− failed=1
18− else
19− echo "pass" >&2
20− fi
21−}
22−
23−check_firings "TEXT literal" 8
24−check_firings "TEXT literal UTF8" 7
25−check_firings "TEXT empty literal" 4
26−# This is broken at the moment. "TEXT literal" rule fires instead.
27−#check_firings "TEXT singleton literal" 5
28−
29−exit $failed
tests/text-tests.cabal+1−3
@@ -3,7 +3,7 @@ version: 0.0.0.0
33synopsis: Functional tests for the text package
44description: Functional tests for the text package
55homepage: https://github.com/bos/text
6−license: BSD2
6+license: BSD3
77license-file: ../LICENSE
88author: Jasper Van der Jeugt <jaspervdj@gmail.com>,
99 Bryan O'Sullivan <bos@serpentine.com>,
@@ -114,7 +114,6 @@ library
114114 Data.Text.Internal.Lazy.Search
115115 Data.Text.Internal.Private
116116 Data.Text.Read
117− Data.Text.Show
118117 Data.Text.Internal.Read
119118 Data.Text.Internal.Search
120119 Data.Text.Unsafe
@@ -136,7 +135,6 @@ library
136135 build-depends:
137136 array,
138137 base == 4.*,
139− binary,
140138 bytestring,
141139 deepseq,
142140 ghc-prim,
text.cabal+8−27
@@ -1,5 +1,5 @@
11name: text
2−version: 1.2.2.1
2+version: 1.2.0.4
33homepage: https://github.com/bos/text
44bug-reports: https://github.com/bos/text/issues
55synopsis: An efficient packed Unicode text type.
@@ -31,7 +31,7 @@ description:
3131 the @text-icu@ package:
3232 <http://hackage.haskell.org/package/text-icu>
3333
34−license: BSD2
34+license: BSD3
3535license-file: LICENSE
3636author: Bryan O'Sullivan <bos@serpentine.com>
3737maintainer: Bryan O'Sullivan <bos@serpentine.com>
@@ -64,11 +64,6 @@ extra-source-files:
6464 tests/scripts/*.sh
6565 tests/text-tests.cabal
6666
67−flag bytestring-builder
68− description: Depend on the bytestring-builder package for backwards compatibility.
69− default: False
70− manual: False
71−
7267flag developer
7368 description: operate in developer mode
7469 default: False
@@ -76,11 +71,9 @@ flag developer
7671
7772flag integer-simple
7873 description: Use the simple integer library instead of GMP
79− default: False
80− manual: False
8174
8275library
83− c-sources: cbits/cbits.c
76+ c-sources: cbits/case_mapping.c cbits/cbits.c
8477 include-dirs: include
8578
8679 exposed-modules:
@@ -102,7 +95,6 @@ library
10295 Data.Text.Internal.Encoding.Utf8
10396 Data.Text.Internal.Functions
10497 Data.Text.Internal.Fusion
105− Data.Text.Internal.Fusion.CaseMapping
10698 Data.Text.Internal.Fusion.Common
10799 Data.Text.Internal.Fusion.Size
108100 Data.Text.Internal.Fusion.Types
@@ -128,21 +120,16 @@ library
128120 Data.Text.Read
129121 Data.Text.Unsafe
130122
131− other-modules:
132− Data.Text.Show
133−
134123 build-depends:
135124 array >= 0.3,
136125 base >= 4.2 && < 5,
137− binary,
138126 deepseq >= 1.1.0.0,
139127 ghc-prim >= 0.2
140128
141− if flag(bytestring-builder)
142− build-depends: bytestring >= 0.9 && < 0.10.4,
143− bytestring-builder >= 0.10.4
129+ if impl(ghc >= 7.7)
130+ build-depends: bytestring >= 0.10.4.0
144131 else
145− build-depends: bytestring >= 0.10.4
132+ build-depends: bytestring >= 0.9
146133
147134 cpp-options: -DHAVE_DEEPSEQ
148135 ghc-options: -Wall -fwarn-tabs -funbox-strict-fields -O2
@@ -162,7 +149,7 @@ test-suite tests
162149 type: exitcode-stdio-1.0
163150 hs-source-dirs: tests .
164151 main-is: Tests.hs
165− c-sources: cbits/cbits.c
152+ c-sources: cbits/case_mapping.c cbits/cbits.c
166153 include-dirs: include
167154
168155 ghc-options:
@@ -176,7 +163,7 @@ test-suite tests
176163 QuickCheck >= 2.7,
177164 array,
178165 base,
179− binary,
166+ bytestring,
180167 deepseq,
181168 directory,
182169 ghc-prim,
@@ -186,12 +173,6 @@ test-suite tests
186173 test-framework-hunit >= 0.2,
187174 test-framework-quickcheck2 >= 0.2
188175
189− if flag(bytestring-builder)
190− build-depends: bytestring >= 0.9 && < 0.10.4,
191− bytestring-builder >= 0.10.4
192− else
193− build-depends: bytestring >= 0.10.4
194−
195176 if flag(integer-simple)
196177 cpp-options: -DINTEGER_SIMPLE
197178 build-depends: integer-simple >= 0.1 && < 0.5