on 33cfd89 help sign in
.gitignore−1
since splitsnapshots
unifiedsplit
@@ -1,3 +1,2 @@
1dist
1dist
2cabal-dev
2cabal-dev
3−cabal.sandbox.config
.hgtags−9
@@ -50,17 +50,8 @@ d99cd091cdf71ce807a4255f6cc509c3154f51ea 0.11.3.1
50fb7299f22449750c653ac64dee4bd63c13ea6e4c 1.1.1.1
50fb7299f22449750c653ac64dee4bd63c13ea6e4c 1.1.1.1
51eb170cb533b63534d166b5fd5344b36676adf140 1.1.1.2
51eb170cb533b63534d166b5fd5344b36676adf140 1.1.1.2
52e749e05f715d02445803f653cd3d97d5395d7c6f 1.1.1.3
52e749e05f715d02445803f653cd3d97d5395d7c6f 1.1.1.3
53−b0dff8ca1142595bab489a768ca62e6a6805aac4 1.1.1.4
54f8a60279237c1c28e094868740d9188dd94fcc9e 1.2.0.0
53f8a60279237c1c28e094868740d9188dd94fcc9e 1.2.0.0
556231451979b2d33e28038b75f2dab19c9731f5c3 1.2.0.1
546231451979b2d33e28038b75f2dab19c9731f5c3 1.2.0.1
5699a3503b4ad001fc1894e90286e96d7dea1e9195 1.2.0.2
5599a3503b4ad001fc1894e90286e96d7dea1e9195 1.2.0.2
5747f138edf15576b9adaeed64784e30811099f202 1.2.0.3
5647f138edf15576b9adaeed64784e30811099f202 1.2.0.3
580b064b0c69106bbcd13cb0099e72ae5fa2347bf0 1.2.0.4
570b064b0c69106bbcd13cb0099e72ae5fa2347bf0 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
129 , drop
129 , drop
130 , dropEnd
130 , dropEnd
131 , takeWhile
131 , takeWhile
132− , takeWhileEnd
133 , dropWhile
132 , dropWhile
134 , dropWhileEnd
133 , dropWhileEnd
135 , dropAround
134 , dropAround
@@ -192,12 +191,11 @@ module Data.Text
192
191
193 -- * Low level operations
192 -- * Low level operations
194 , copy
193 , copy
195− , unpackCString#
196 ) where
194 ) where
197
195
198import Prelude (Char, Bool(..), Int, Maybe(..), String,
196import Prelude (Char, Bool(..), Int, Maybe(..), String,
199 Eq(..), Ord(..), Ordering(..), (++),
197 Eq(..), Ord(..), Ordering(..), (++),
200− Read(..),
198+ Read(..), Show(..),
201 (&&), (||), (+), (-), (.), ($), ($!), (>>),
199 (&&), (||), (+), (-), (.), ($), ($!), (>>),
202 not, return, otherwise, quot)
200 not, return, otherwise, quot)
203#if defined(HAVE_DEEPSEQ)
201#if defined(HAVE_DEEPSEQ)
@@ -213,23 +211,17 @@ import Control.Monad (foldM)
213import Control.Monad.ST (ST)
211import Control.Monad.ST (ST)
214import qualified Data.Text.Array as A
212import qualified Data.Text.Array as A
215import qualified Data.List as L
213import qualified Data.List as L
216−import Data.Binary (Binary(get, put))
217import Data.Monoid (Monoid(..))
214import Data.Monoid (Monoid(..))
218−#if MIN_VERSION_base(4,9,0)
219−import Data.Semigroup (Semigroup(..))
220−#endif
221import Data.String (IsString(..))
215import Data.String (IsString(..))
222import qualified Data.Text.Internal.Fusion as S
216import qualified Data.Text.Internal.Fusion as S
223import qualified Data.Text.Internal.Fusion.Common as S
217import qualified Data.Text.Internal.Fusion.Common as S
224−import Data.Text.Encoding (decodeUtf8', encodeUtf8)
225import Data.Text.Internal.Fusion (stream, reverseStream, unstream)
218import Data.Text.Internal.Fusion (stream, reverseStream, unstream)
226import Data.Text.Internal.Private (span_)
219import Data.Text.Internal.Private (span_)
227−import Data.Text.Internal (Text(..), empty, firstf, mul, safe, text)
220+import Data.Text.Internal (Text(..), empty, empty_, firstf, mul, safe, text)
228−import Data.Text.Show (singleton, unpack, unpackCString#)
229import qualified Prelude as P
221import qualified Prelude as P
230import Data.Text.Unsafe (Iter(..), iter, iter_, lengthWord16, reverseIter,
222import Data.Text.Unsafe (Iter(..), iter, iter_, lengthWord16, reverseIter,
231 reverseIter_, unsafeHead, unsafeTail)
223 reverseIter_, unsafeHead, unsafeTail)
232−import Data.Text.Internal.Unsafe.Char (unsafeChr)
224+import Data.Text.Internal.Unsafe.Char (unsafeChr, unsafeWrite)
233import qualified Data.Text.Internal.Functions as F
225import qualified Data.Text.Internal.Functions as F
234import qualified Data.Text.Internal.Encoding.Utf16 as U16
226import qualified Data.Text.Internal.Encoding.Utf16 as U16
235import Data.Text.Internal.Search (indices)
227import Data.Text.Internal.Search (indices)
@@ -238,13 +230,15 @@ import Data.ByteString (ByteString)
238import qualified Data.Text.Lazy as L
230import qualified Data.Text.Lazy as L
239import Data.Int (Int64)
231import Data.Int (Int64)
240#endif
232#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
242#if __GLASGOW_HASKELL__ >= 708
238#if __GLASGOW_HASKELL__ >= 708
243import qualified GHC.Exts as Exts
239import qualified GHC.Exts as Exts
244#endif
240#endif
245−#if MIN_VERSION_base(4,7,0)
241+import GHC.Prim (Addr#)
246−import Text.Printf (PrintfArg, formatArg, formatString)
247−#endif
248
242
249-- $strict
243-- $strict
250--
244--
@@ -330,24 +324,15 @@ instance Eq Text where
330instance Ord Text where
324instance Ord Text where
331 compare = compareText
325 compare = compareText
332
326
327+instance Show Text where
328+ showsPrec p ps r = showsPrec p (unpack ps) r
329+
333instance Read Text where
330instance Read Text where
334 readsPrec p str = [(pack x,y) | (x,y) <- readsPrec p str]
331 readsPrec p str = [(pack x,y) | (x,y) <- readsPrec p str]
335
332
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−
344instance Monoid Text where
333instance Monoid Text where
345 mempty = empty
334 mempty = empty
346−#if MIN_VERSION_base(4,9,0)
347− mappend = (<>) -- future-proof definition
348−#else
349 mappend = append
335 mappend = append
350−#endif
351 mconcat = concat
336 mconcat = concat
352
337
353instance IsString Text where
338instance IsString Text where
@@ -364,14 +349,6 @@ instance Exts.IsList Text where
364instance NFData Text where rnf !_ = ()
349instance NFData Text where rnf !_ = ()
365#endif
350#endif
366
351
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−
375-- | This instance preserves data abstraction at the cost of inefficiency.
352-- | This instance preserves data abstraction at the cost of inefficiency.
376-- We omit reflection services for the sake of data abstraction.
353-- We omit reflection services for the sake of data abstraction.
377--
354--
@@ -395,12 +372,6 @@ instance Data Text where
395 _ -> P.error "gunfold"
372 _ -> P.error "gunfold"
396 dataTypeOf _ = textDataType
373 dataTypeOf _ = textDataType
397
374
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−
404packConstr :: Constr
375packConstr :: Constr
405packConstr = mkConstr textDataType "pack" [] Prefix
376packConstr = mkConstr textDataType "pack" [] Prefix
406
377
@@ -430,6 +401,54 @@ pack :: String -> Text
430pack = unstream . S.map safe . S.streamList
401pack = unstream . S.map safe . S.streamList
431{-# INLINE [1] pack #-}
402{-# INLINE [1] pack #-}
432
403
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+
433-- -----------------------------------------------------------------------------
452-- -----------------------------------------------------------------------------
434-- * Basic functions
453-- * Basic functions
435
454
@@ -486,8 +505,8 @@ head t = S.head (stream t)
486uncons :: Text -> Maybe (Char, Text)
505uncons :: Text -> Maybe (Char, Text)
487uncons t@(Text arr off len)
506uncons t@(Text arr off len)
488 | len <= 0 = Nothing
507 | 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
491{-# INLINE [1] uncons #-}
510{-# INLINE [1] uncons #-}
492
511
493-- | Lifted from Control.Arrow and specialized.
512-- | Lifted from Control.Arrow and specialized.
@@ -572,9 +591,7 @@ isSingleton = S.isSingleton . stream
572-- Subject to fusion.
591-- Subject to fusion.
573length :: Text -> Int
592length :: Text -> Int
574length t = S.length (stream t)
593length t = S.length (stream t)
575−{-# INLINE [0] length #-}
594+{-# INLINE 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.
578
595
579-- | /O(n)/ Compare the count of characters in a 'Text' to a number.
596-- | /O(n)/ Compare the count of characters in a 'Text' to a number.
580-- Subject to fusion.
597-- Subject to fusion.
@@ -593,32 +610,32 @@ compareLength t n = S.compareLengthI (stream t) n
593
610
594{-# RULES
611{-# RULES
595"TEXT ==N/length -> compareLength/==EQ" [~1] forall t n.
612"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
597 #-}
614 #-}
598
615
599{-# RULES
616{-# RULES
600"TEXT /=N/length -> compareLength//=EQ" [~1] forall t n.
617"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
602 #-}
619 #-}
603
620
604{-# RULES
621{-# RULES
605"TEXT <N/length -> compareLength/==LT" [~1] forall t n.
622"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
607 #-}
624 #-}
608
625
609{-# RULES
626{-# RULES
610"TEXT <=N/length -> compareLength//=GT" [~1] forall t n.
627"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
612 #-}
629 #-}
613
630
614{-# RULES
631{-# RULES
615"TEXT >N/length -> compareLength/==GT" [~1] forall t n.
632"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
617 #-}
634 #-}
618
635
619{-# RULES
636{-# RULES
620"TEXT >=N/length -> compareLength//=LT" [~1] forall t n.
637"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
622 #-}
639 #-}
623
640
624-- -----------------------------------------------------------------------------
641-- -----------------------------------------------------------------------------
@@ -741,7 +758,7 @@ replace needle@(Text _ _ neeLen)
741-- instead of itself.
758-- instead of itself.
742toCaseFold :: Text -> Text
759toCaseFold :: Text -> Text
743toCaseFold t = unstream (S.toCaseFold (stream t))
760toCaseFold t = unstream (S.toCaseFold (stream t))
744−{-# INLINE toCaseFold #-}
761+{-# INLINE [0] toCaseFold #-}
745
762
746-- | /O(n)/ Convert a string to lower case, using simple case
763-- | /O(n)/ Convert a string to lower case, using simple case
747-- conversion. Subject to fusion.
764-- conversion. Subject to fusion.
@@ -915,13 +932,13 @@ concatMap f = concat . foldr ((:) . f) []
915{-# INLINE concatMap #-}
932{-# INLINE concatMap #-}
916
933
917-- | /O(n)/ 'any' @p@ @t@ determines whether any character in the
934-- | /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.
919any :: (Char -> Bool) -> Text -> Bool
936any :: (Char -> Bool) -> Text -> Bool
920any p t = S.any p (stream t)
937any p t = S.any p (stream t)
921{-# INLINE any #-}
938{-# INLINE any #-}
922
939
923-- | /O(n)/ 'all' @p@ @t@ determines whether all characters in the
940-- | /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.
925all :: (Char -> Bool) -> Text -> Bool
942all :: (Char -> Bool) -> Text -> Bool
926all p t = S.all p (stream t)
943all p t = S.all p (stream t)
927{-# INLINE all #-}
944{-# INLINE all #-}
@@ -1152,27 +1169,6 @@ takeWhile p t@(Text arr off len) = loop 0
1152 unstream (S.takeWhile p (stream t)) = takeWhile p t
1169 unstream (S.takeWhile p (stream t)) = takeWhile p t
1153 #-}
1170 #-}
1154
1171
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−
1176-- | /O(n)/ 'dropWhile' @p@ @t@ returns the suffix remaining after
1172-- | /O(n)/ 'dropWhile' @p@ @t@ returns the suffix remaining after
1177-- 'takeWhile' @p@ @t@. Subject to fusion.
1173-- 'takeWhile' @p@ @t@. Subject to fusion.
1178dropWhile :: (Char -> Bool) -> Text -> Text
1174dropWhile :: (Char -> Bool) -> Text -> Text
@@ -1191,9 +1187,8 @@ dropWhile p t@(Text arr off len) = loop 0 0
1191 #-}
1187 #-}
1192
1188
1193-- | /O(n)/ 'dropWhileEnd' @p@ @t@ returns the prefix remaining after
1189-- | /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
1195-- @t@. Subject to fusion.
1191-- @t@. Subject to fusion.
1196−--
1197-- Examples:
1192-- Examples:
1198--
1193--
1199-- > dropWhileEnd (=='.') "foo..." == "foo"
1194-- > dropWhileEnd (=='.') "foo..." == "foo"
@@ -1213,7 +1208,7 @@ dropWhileEnd p t@(Text arr off len) = loop (len-1) len
1213 #-}
1208 #-}
1214
1209
1215-- | /O(n)/ 'dropAround' @p@ @t@ returns the substring remaining after
1210-- | /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
1217-- beginning and end of @t@. Subject to fusion.
1212-- beginning and end of @t@. Subject to fusion.
1218dropAround :: (Char -> Bool) -> Text -> Text
1213dropAround :: (Char -> Bool) -> Text -> Text
1219dropAround p = dropWhile p . dropWhileEnd p
1214dropAround p = dropWhile p . dropWhileEnd p
@@ -1540,7 +1535,7 @@ countChar c t = S.countChar c (stream t)
1540-- equivalent to a pair of 'unpack' operations.
1535-- equivalent to a pair of 'unpack' operations.
1541zip :: Text -> Text -> [(Char,Char)]
1536zip :: Text -> Text -> [(Char,Char)]
1542zip a b = S.unstreamList $ S.zipWith (,) (stream a) (stream b)
1537zip a b = S.unstreamList $ S.zipWith (,) (stream a) (stream b)
1543−{-# INLINE zip #-}
1538+{-# INLINE [0] zip #-}
1544
1539
1545-- | /O(n)/ 'zipWith' generalises 'zip' by zipping with the function
1540-- | /O(n)/ 'zipWith' generalises 'zip' by zipping with the function
1546-- given as the first argument, instead of a tupling function.
1541-- 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)
1548zipWith :: (Char -> Char -> Char) -> Text -> Text -> Text
1543zipWith :: (Char -> Char -> Char) -> Text -> Text -> Text
1549zipWith f t1 t2 = unstream (S.zipWith g (stream t1) (stream t2))
1544zipWith f t1 t2 = unstream (S.zipWith g (stream t1) (stream t2))
1550 where g a b = safe (f a b)
1545 where g a b = safe (f a b)
1551−{-# INLINE zipWith #-}
1546+{-# INLINE [0] zipWith #-}
1552
1547
1553-- | /O(n)/ Breaks a 'Text' up into a list of words, delimited by 'Char's
1548-- | /O(n)/ Breaks a 'Text' up into a list of words, delimited by 'Char's
1554-- representing white space.
1549-- representing white space.
Data/Text/Array.hs+4−5
@@ -20,7 +20,7 @@
20-- > import qualified Data.Text.Array as A
20-- > import qualified Data.Text.Array as A
21--
21--
22-- The names in this module resemble those in the 'Data.Array' family
22-- 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
24-- naming.
24-- naming.
25module Data.Text.Array
25module Data.Text.Array
26 (
26 (
@@ -74,7 +74,7 @@ import Foreign.C.Types (CInt, CSize)
74#endif
74#endif
75import GHC.Base (ByteArray#, MutableByteArray#, Int(..),
75import GHC.Base (ByteArray#, MutableByteArray#, Int(..),
76 indexWord16Array#, newByteArray#,
76 indexWord16Array#, newByteArray#,
77− unsafeFreezeByteArray#, writeWord16Array#)
77+ unsafeCoerce#, writeWord16Array#)
78import GHC.ST (ST(..), runST)
78import GHC.ST (ST(..), runST)
79import GHC.Word (Word16(..))
79import GHC.Word (Word16(..))
80import Prelude hiding (length, read)
80import Prelude hiding (length, read)
@@ -130,9 +130,8 @@ array_size_error = error "Data.Text.Array.new: size overflow"
130
130
131-- | Freeze a mutable array. Do not mutate the 'MArray' afterwards!
131-- | Freeze a mutable array. Do not mutate the 'MArray' afterwards!
132unsafeFreeze :: MArray s -> ST s Array
132unsafeFreeze :: MArray s -> ST s Array
133−unsafeFreeze MArray{..} = ST $ \s1# ->
133+unsafeFreeze MArray{..} = ST $ \s# ->
134− case unsafeFreezeByteArray# maBA s1# of
134+ (# s#, Array (unsafeCoerce# maBA)
135− (# s2#, ba# #) -> (# s2#, Array ba#
136#if defined(ASSERTS)
135#if defined(ASSERTS)
137 maLen
136 maLen
138#endif
137#endif
Data/Text/Encoding.hs+20−9
@@ -55,9 +55,13 @@ module Data.Text.Encoding
55 , encodeUtf32LE
55 , encodeUtf32LE
56 , encodeUtf32BE
56 , encodeUtf32BE
57
57
58+#if MIN_VERSION_bytestring(0,10,4)
58 -- * Encoding Text using ByteString Builders
59 -- * Encoding Text using ByteString Builders
60+ -- | /Note/ that these functions are only available if built against
61+ -- @bytestring >= 0.10.4.0@.
59 , encodeUtf8Builder
62 , encodeUtf8Builder
60 , encodeUtf8BuilderEscaped
63 , encodeUtf8BuilderEscaped
64+#endif
61 ) where
65 ) where
62
66
63#if __GLASGOW_HASKELL__ >= 702
67#if __GLASGOW_HASKELL__ >= 702
@@ -66,17 +70,26 @@ import Control.Monad.ST.Unsafe (unsafeIOToST, unsafeSTToIO)
66import Control.Monad.ST (unsafeIOToST, unsafeSTToIO)
70import Control.Monad.ST (unsafeIOToST, unsafeSTToIO)
67#endif
71#endif
68
72
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+
69import Control.Exception (evaluate, try)
83import Control.Exception (evaluate, try)
70import Control.Monad.ST (runST)
84import Control.Monad.ST (runST)
71−import Data.Bits ((.&.))
72import Data.ByteString as B
85import Data.ByteString as B
73import Data.ByteString.Internal as B hiding (c2w)
86import Data.ByteString.Internal as B hiding (c2w)
87+import Data.Text ()
74import Data.Text.Encoding.Error (OnDecodeError, UnicodeException, strictDecode)
88import Data.Text.Encoding.Error (OnDecodeError, UnicodeException, strictDecode)
75import Data.Text.Internal (Text(..), safe, text)
89import Data.Text.Internal (Text(..), safe, text)
76import Data.Text.Internal.Private (runText)
90import Data.Text.Internal.Private (runText)
77−import Data.Text.Internal.Unsafe.Char (ord, unsafeWrite)
91+import Data.Text.Internal.Unsafe.Char (unsafeWrite)
78import Data.Text.Internal.Unsafe.Shift (shiftR)
92import Data.Text.Internal.Unsafe.Shift (shiftR)
79−import Data.Text.Show ()
80import Data.Text.Unsafe (unsafeDupablePerformIO)
93import Data.Text.Unsafe (unsafeDupablePerformIO)
81import Data.Word (Word8, Word32)
94import Data.Word (Word8, Word32)
82import Foreign.C.Types (CSize(..))
95import Foreign.C.Types (CSize(..))
@@ -85,13 +98,8 @@ import Foreign.Marshal.Utils (with)
85import Foreign.Ptr (Ptr, minusPtr, nullPtr, plusPtr)
98import Foreign.Ptr (Ptr, minusPtr, nullPtr, plusPtr)
86import Foreign.Storable (Storable, peek, poke)
99import Foreign.Storable (Storable, peek, poke)
87import GHC.Base (ByteArray#, MutableByteArray#)
100import 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
92import qualified Data.Text.Array as A
101import qualified Data.Text.Array as A
93import qualified Data.Text.Internal.Encoding.Fusion as E
102import qualified Data.Text.Internal.Encoding.Fusion as E
94−import qualified Data.Text.Internal.Encoding.Utf16 as U16
95import qualified Data.Text.Internal.Fusion as F
103import qualified Data.Text.Internal.Fusion as F
96
104
97#include "text_cbits.h"
105#include "text_cbits.h"
@@ -278,7 +286,7 @@ streamDecodeUtf8With onErr = decodeChunk B.empty 0 0
278 return $! text arr 0 (fromIntegral n)
286 return $! text arr 0 (fromIntegral n)
279 lastPtr <- peek curPtrPtr
287 lastPtr <- peek curPtrPtr
280 let left = lastPtr `minusPtr` curPtr
288 let left = lastPtr `minusPtr` curPtr
281− !undecoded = case state of
289+ undecoded = case state of
282 UTF8_ACCEPT -> B.empty
290 UTF8_ACCEPT -> B.empty
283 _ -> B.append undecoded0 (B.drop left bs)
291 _ -> B.append undecoded0 (B.drop left bs)
284 return $ Some chunkText undecoded
292 return $ Some chunkText undecoded
@@ -307,6 +315,8 @@ decodeUtf8' :: ByteString -> Either UnicodeException Text
307decodeUtf8' = unsafeDupablePerformIO . try . evaluate . decodeUtf8With strictDecode
315decodeUtf8' = unsafeDupablePerformIO . try . evaluate . decodeUtf8With strictDecode
308{-# INLINE decodeUtf8' #-}
316{-# INLINE decodeUtf8' #-}
309
317
318+#if MIN_VERSION_bytestring(0,10,4)
319+
310-- | Encode text to a ByteString 'B.Builder' using UTF-8 encoding.
320-- | Encode text to a ByteString 'B.Builder' using UTF-8 encoding.
311encodeUtf8Builder :: Text -> B.Builder
321encodeUtf8Builder :: Text -> B.Builder
312encodeUtf8Builder = encodeUtf8BuilderEscaped (BP.liftFixedToBounded BP.word8)
322encodeUtf8Builder = encodeUtf8BuilderEscaped (BP.liftFixedToBounded BP.word8)
@@ -367,6 +377,7 @@ encodeUtf8BuilderEscaped be =
367 outerLoop i (B.BufferRange op ope)
377 outerLoop i (B.BufferRange op ope)
368 where
378 where
369 poke8 j v = poke (op `plusPtr` j) (fromIntegral v :: Word8)
379 poke8 j v = poke (op `plusPtr` j) (fromIntegral v :: Word8)
380+#endif
370
381
371-- | Encode text using UTF-8 encoding.
382-- | Encode text using UTF-8 encoding.
372encodeUtf8 :: Text -> ByteString
383encodeUtf8 :: Text -> ByteString
Data/Text/Encoding/Error.hs+1−3
@@ -1,7 +1,5 @@
1{-# LANGUAGE CPP, DeriveDataTypeable #-}
1{-# LANGUAGE CPP, DeriveDataTypeable #-}
2−#if __GLASGOW_HASKELL__ >= 704
2+#if __GLASGOW_HASKELL__ >= 702
3−{-# LANGUAGE Safe #-}
4−#elif __GLASGOW_HASKELL__ >= 702
5{-# LANGUAGE Trustworthy #-}
3{-# LANGUAGE Trustworthy #-}
6#endif
4#endif
7-- |
5-- |
Data/Text/Internal/Builder.hs+2−17
@@ -6,7 +6,7 @@
6-- Module : Data.Text.Internal.Builder
6-- Module : Data.Text.Internal.Builder
7-- Copyright : (c) 2013 Bryan O'Sullivan
7-- Copyright : (c) 2013 Bryan O'Sullivan
8-- (c) 2010 Johan Tibell
8-- (c) 2010 Johan Tibell
9−-- License : BSD-style (see LICENSE)
9+-- License : BSD3-style (see LICENSE)
10--
10--
11-- Maintainer : Johan Tibell <johan.tibell@gmail.com>
11-- Maintainer : Johan Tibell <johan.tibell@gmail.com>
12-- Stability : experimental
12-- Stability : experimental
@@ -59,9 +59,6 @@ module Data.Text.Internal.Builder
59
59
60import Control.Monad.ST (ST, runST)
60import Control.Monad.ST (ST, runST)
61import Data.Monoid (Monoid(..))
61import Data.Monoid (Monoid(..))
62−#if MIN_VERSION_base(4,9,0)
63−import Data.Semigroup (Semigroup(..))
64−#endif
65import Data.Text.Internal (Text(..))
62import Data.Text.Internal (Text(..))
66import Data.Text.Internal.Lazy (smallChunkSize)
63import Data.Text.Internal.Lazy (smallChunkSize)
67import Data.Text.Unsafe (inlineInterleaveST)
64import Data.Text.Unsafe (inlineInterleaveST)
@@ -92,22 +89,12 @@ newtype Builder = Builder {
92 -> ST s [S.Text]
89 -> ST s [S.Text]
93 }
90 }
94
91
95−#if MIN_VERSION_base(4,9,0)
96−instance Semigroup Builder where
97− (<>) = append
98− {-# INLINE (<>) #-}
99−#endif
100−
101instance Monoid Builder where
92instance Monoid Builder where
102 mempty = empty
93 mempty = empty
103 {-# INLINE mempty #-}
94 {-# INLINE mempty #-}
104−#if MIN_VERSION_base(4,9,0)
105− mappend = (<>) -- future-proof definition
106−#else
107 mappend = append
95 mappend = append
108−#endif
109 {-# INLINE mappend #-}
96 {-# INLINE mappend #-}
110− mconcat = foldr mappend Data.Monoid.mempty
97+ mconcat = foldr mappend mempty
111 {-# INLINE mconcat #-}
98 {-# INLINE mconcat #-}
112
99
113instance String.IsString Builder where
100instance String.IsString Builder where
@@ -242,8 +229,6 @@ flush = Builder $ \ k buf@(Buffer p o u l) ->
242 !t = Text arr o u
229 !t = Text arr o u
243 ts <- inlineInterleaveST (k b)
230 ts <- inlineInterleaveST (k b)
244 return $! t : ts
231 return $! t : ts
245−{-# INLINE [1] flush #-}
246−-- defer inlining so that flush/flush rule may fire.
247
232
248------------------------------------------------------------------------
233------------------------------------------------------------------------
249
234
Data/Text/Internal/Builder/Functions.hs+1−2
@@ -23,8 +23,7 @@ module Data.Text.Internal.Builder.Functions
23
23
24import Data.Monoid (mappend)
24import Data.Monoid (mappend)
25import Data.Text.Lazy.Builder (Builder)
25import Data.Text.Lazy.Builder (Builder)
26−import GHC.Base (chr#,ord#,(+#),Int(I#),Char(C#))
26+import GHC.Base
27−import Prelude ()
28
27
29-- | Unsafe conversion for decimal digits.
28-- | Unsafe conversion for decimal digits.
30{-# INLINE i2d #-}
29{-# INLINE i2d #-}
Data/Text/Internal/Builder/Int/Digits.hs+1−1
@@ -2,7 +2,7 @@
2
2
3-- Module: Data.Text.Internal.Builder.Int.Digits
3-- Module: Data.Text.Internal.Builder.Int.Digits
4-- Copyright: (c) 2013 Bryan O'Sullivan
4-- Copyright: (c) 2013 Bryan O'Sullivan
5−-- License: BSD-style
5+-- License: BSD3
6-- Maintainer: Bryan O'Sullivan <bos@serpentine.com>
6-- Maintainer: Bryan O'Sullivan <bos@serpentine.com>
7-- Stability: experimental
7-- Stability: experimental
8-- Portability: portable
8-- 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
98-- | /O(n)/ Convert a 'Stream Char' into a 'Text'.
98-- | /O(n)/ Convert a 'Stream Char' into a 'Text'.
99unstream :: Stream Char -> Text
99unstream :: Stream Char -> Text
100unstream (Stream next0 s0 len) = runText $ \done -> do
100unstream (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
106 arr0 <- A.new mlen
102 arr0 <- A.new mlen
107− let outer !arr !maxi = encode
103+ let outer arr top = loop
108 where
104 where
109− -- keep the common case loop as small as possible
105+ loop !s !i =
110− encode !si !di =
111− case next0 si of
106+ case next0 s of
112− Done -> done arr di
107+ Done -> done arr i
113− Skip si' -> encode si' di
108+ Skip s' -> loop s' i
114− Yield c si'
109+ Yield x s'
115− -- simply check for the worst case
110+ | j >= top -> {-# SCC "unstream/resize" #-} do
116− | maxi < di + 1 -> realloc si di
111+ let top' = (top + 1) `shiftL` 1
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
112+ arr' <- A.new top'
126− A.copyM arr' 0 arr 0 di
113+ A.copyM arr' 0 arr 0 top
127− outer arr' (newlen - 1) si di
114+ outer arr' top' s i
128−
115+ | otherwise -> do d <- unsafeWrite arr i x
116+ loop s' (i+d)
117+ where j | ord x < 0x10000 = i
118+ | otherwise = i + 1
129− outer arr0 (mlen - 1) s0 0
119+ outer arr0 mlen s0 0
130{-# INLINE [0] unstream #-}
120{-# INLINE [0] unstream #-}
131{-# RULES "STREAM stream/unstream fusion" forall s. stream (unstream s) = s #-}
121{-# RULES "STREAM stream/unstream fusion" forall s. stream (unstream s) = s #-}
132
122
@@ -176,15 +166,15 @@ reverse (Stream next s len0)
176-- | /O(n)/ Perform the equivalent of 'scanr' over a list, only with
166-- | /O(n)/ Perform the equivalent of 'scanr' over a list, only with
177-- the input and result reversed.
167-- the input and result reversed.
178reverseScanr :: (Char -> Char -> Char) -> Char -> Stream Char -> Stream Char
168reverseScanr :: (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
180 where
170 where
181 {-# INLINE next #-}
171 {-# INLINE next #-}
182− next (Scan1 z s) = Yield z (Scan2 z s)
172+ next (S1 :*: z :*: s) = Yield z (S2 :*: z :*: s)
183− next (Scan2 z s) = case next0 s of
173+ next (S2 :*: z :*: s) = case next0 s of
184− Yield x s' -> let !x' = f x z
174+ Yield x s' -> let !x' = f x z
185− in Yield x' (Scan2 x' s')
175+ in Yield x' (S2 :*: x' :*: s')
186− Skip s' -> Skip (Scan2 z s')
176+ Skip s' -> Skip (S2 :*: z :*: s')
187− Done -> Done
177+ Done -> Done
188{-# INLINE reverseScanr #-}
178{-# INLINE reverseScanr #-}
189
179
190-- | /O(n)/ Like 'unfoldr', 'unfoldrN' builds a stream from a seed
180-- | /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 #-}
2-- |
2-- |
3-- Module : Data.Text.Internal.Fusion.Common
3-- Module : Data.Text.Internal.Fusion.Common
4−-- Copyright : (c) Bryan O'Sullivan 2009, 2012
4+-- Copyright : (c) Bryan O'Sullivan 2009, 2012, 2015
5--
5--
6-- License : BSD-style
6-- License : BSD-style
7-- Maintainer : bos@serpentine.com
7-- Maintainer : bos@serpentine.com
@@ -71,6 +71,9 @@ module Data.Text.Internal.Fusion.Common
71 -- ** Scans
71 -- ** Scans
72 , scanl
72 , scanl
73
73
74+ -- ** Accumulating maps
75+ -- , mapAccumL
76+
74 -- ** Generation and unfolding
77 -- ** Generation and unfolding
75 , replicateCharI
78 , replicateCharI
76 , replicateI
79 , replicateI
@@ -101,20 +104,24 @@ module Data.Text.Internal.Fusion.Common
101 , zipWith
104 , zipWith
102 ) where
105 ) where
103
106
104−import Prelude (Bool(..), Char, Eq(..), Int, Integral, Maybe(..),
107+import Prelude (Bool(..), Char, Eq(..), IO, Int, Integral, Maybe(..),
105 Ord(..), Ordering(..), String, (.), ($), (+), (-), (*), (++),
108 Ord(..), Ordering(..), String, (.), ($), (+), (-), (*), (++),
106− (&&), fromIntegral, otherwise)
109+ (&&), fmap, fromIntegral, otherwise, return)
107−import qualified Data.List as L
108−import qualified Prelude as P
109import Data.Bits (shiftL)
110import Data.Bits (shiftL)
110import Data.Char (isLetter)
111import Data.Char (isLetter)
111import Data.Int (Int64)
112import Data.Int (Int64)
112−import Data.Text.Internal.Fusion.Types
113−import Data.Text.Internal.Fusion.CaseMapping (foldMapping, lowerMapping, titleMapping,
114− upperMapping)
115import Data.Text.Internal.Fusion.Size
113import 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)
116import GHC.Prim (Addr#, chr#, indexCharOffAddr#, ord#)
120import GHC.Prim (Addr#, chr#, indexCharOffAddr#, ord#)
117import GHC.Types (Char(..), Int(..))
121import GHC.Types (Char(..), Int(..))
122+import qualified Data.Char as Char
123+import qualified Data.List as L
124+import qualified Prelude as P
118
125
119singleton :: Char -> Stream Char
126singleton :: Char -> Stream Char
120singleton c = Stream next False 1
127singleton c = Stream next False 1
@@ -184,9 +191,6 @@ cons !w (Stream next0 s0 len) = Stream next (C1 s0) (len+1)
184 Yield x s' -> Yield x (C0 s')
191 Yield x s' -> Yield x (C0 s')
185{-# INLINE [0] cons #-}
192{-# INLINE [0] cons #-}
186
193
187−data Snoc a = N
188− | J !a
189−
190-- | /O(n)/ Adds a character to the end of a stream.
194-- | /O(n)/ Adds a character to the end of a stream.
191snoc :: Stream Char -> Char -> Stream Char
195snoc :: Stream Char -> Char -> Stream Char
192snoc (Stream next0 xs0 len) w = Stream next (J xs0) (len+1)
196snoc (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
404 Yield c s' -> remap c s'
408 Yield c s' -> remap c s'
405 next (CC s a b) = Yield a (CC s b '\0')
409 next (CC s a b) = Yield a (CC s b '\0')
406
410
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+
407-- | /O(n)/ Convert a string to folded case. This function is mainly
427-- | /O(n)/ Convert a string to folded case. This function is mainly
408-- useful for performing caseless (or case insensitive) string
428-- useful for performing caseless (or case insensitive) string
409-- comparisons.
429-- comparisons.
@@ -419,7 +439,7 @@ caseConvert remap (Stream next0 s0 len) = Stream next (CC s0 '\0' '\0') len
419-- case folded to the Greek small letter letter mu (U+03BC) instead of
439-- case folded to the Greek small letter letter mu (U+03BC) instead of
420-- itself.
440-- itself.
421toCaseFold :: Stream Char -> Stream Char
441toCaseFold :: Stream Char -> Stream Char
422−toCaseFold = caseConvert foldMapping
442+toCaseFold = caseConvert (convert to_case_fold Char.toLower)
423{-# INLINE [0] toCaseFold #-}
443{-# INLINE [0] toCaseFold #-}
424
444
425-- | /O(n)/ Convert a string to upper case, using simple case
445-- | /O(n)/ Convert a string to upper case, using simple case
@@ -427,7 +447,7 @@ toCaseFold = caseConvert foldMapping
427-- For instance, the German eszett (U+00DF) maps to the two-letter
447-- For instance, the German eszett (U+00DF) maps to the two-letter
428-- sequence SS.
448-- sequence SS.
429toUpper :: Stream Char -> Stream Char
449toUpper :: Stream Char -> Stream Char
430−toUpper = caseConvert upperMapping
450+toUpper = caseConvert (convert to_upper Char.toUpper)
431{-# INLINE [0] toUpper #-}
451{-# INLINE [0] toUpper #-}
432
452
433-- | /O(n)/ Convert a string to lower case, using simple case
453-- | /O(n)/ Convert a string to lower case, using simple case
@@ -436,7 +456,7 @@ toUpper = caseConvert upperMapping
436-- maps to the sequence Latin small letter i (U+0069) followed by
456-- maps to the sequence Latin small letter i (U+0069) followed by
437-- combining dot above (U+0307).
457-- combining dot above (U+0307).
438toLower :: Stream Char -> Stream Char
458toLower :: Stream Char -> Stream Char
439−toLower = caseConvert lowerMapping
459+toLower = caseConvert (convert to_lower Char.toLower)
440{-# INLINE [0] toLower #-}
460{-# INLINE [0] toLower #-}
441
461
442-- | /O(n)/ Convert a string to title case, using simple case
462-- | /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
466 Skip s' -> Skip (CC (letter :*: s') '\0' '\0')
486 Skip s' -> Skip (CC (letter :*: s') '\0' '\0')
467 Yield c s'
487 Yield c s'
468 | letter' -> if letter
488 | letter' -> if letter
469− then lowerMapping c (letter' :*: s')
489+ then convert to_lower Char.toLower c (letter' :*: s')
470− else titleMapping c (letter' :*: s')
490+ else convert to_title Char.toTitle c (letter' :*: s')
471 | otherwise -> Yield c (CC (letter' :*: s') '\0' '\0')
491 | otherwise -> Yield c (CC (letter' :*: s') '\0' '\0')
472 where letter' = isLetter c
492 where letter' = isLetter c
473 next (CC s a b) = Yield a (CC s b '\0')
493 next (CC s a b) = Yield a (CC s b '\0')
474{-# INLINE [0] toTitle #-}
494{-# INLINE [0] toTitle #-}
475
495
476−data Justify i s = Just1 !i !s
477− | Just2 !i !s
478−
479justifyLeftI :: Integral a => a -> Char -> Stream Char -> Stream Char
496justifyLeftI :: Integral a => a -> Char -> Stream Char -> Stream Char
480justifyLeftI k c (Stream next0 s0 len) =
497justifyLeftI 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)
482 where
499 where
483− next (Just1 n s) =
500+ next (s :*: S1 :*: n) =
484 case next0 s of
501 case next0 s of
485− Done -> next (Just2 n s)
502+ Done -> next (s :*: S2 :*: n)
486− Skip s' -> Skip (Just1 n s')
503+ Skip s' -> Skip (s' :*: S1 :*: n)
487− Yield x s' -> Yield x (Just1 (n+1) s')
504+ Yield x s' -> Yield x (s' :*: S1 :*: n+1)
488− next (Just2 n s)
505+ next (s :*: S2 :*: n)
489− | n < k = Yield c (Just2 (n+1) s)
506+ | n < k = Yield c (s :*: S2 :*: n+1)
490 | otherwise = Done
507 | otherwise = Done
491 {-# INLINE next #-}
508 {-# INLINE next #-}
492{-# INLINE [0] justifyLeftI #-}
509{-# INLINE [0] justifyLeftI #-}
@@ -593,7 +610,7 @@ concatMap f = foldr (append . f) empty
593{-# INLINE [0] concatMap #-}
610{-# INLINE [0] concatMap #-}
594
611
595-- | /O(n)/ any @p @xs determines if any character in the stream
612-- | /O(n)/ any @p @xs determines if any character in the stream
596−-- @xs@ satisfies the predicate @p@.
613+-- @xs@ satisifes the predicate @p@.
597any :: (Char -> Bool) -> Stream Char -> Bool
614any :: (Char -> Bool) -> Stream Char -> Bool
598any p (Stream next0 s0 _len) = loop_any s0
615any p (Stream next0 s0 _len) = loop_any s0
599 where
616 where
@@ -605,7 +622,7 @@ any p (Stream next0 s0 _len) = loop_any s0
605{-# INLINE [0] any #-}
622{-# INLINE [0] any #-}
606
623
607-- | /O(n)/ all @p @xs determines if all characters in the 'Text'
624-- | /O(n)/ all @p @xs determines if all characters in the 'Text'
608−-- @xs@ satisfy the predicate @p@.
625+-- @xs@ satisify the predicate @p@.
609all :: (Char -> Bool) -> Stream Char -> Bool
626all :: (Char -> Bool) -> Stream Char -> Bool
610all p (Stream next0 s0 _len) = loop_all s0
627all p (Stream next0 s0 _len) = loop_all s0
611 where
628 where
@@ -654,27 +671,50 @@ minimum (Stream next0 s0 _len) = loop0_minimum s0
654-- * Building streams
671-- * Building streams
655
672
656scanl :: (Char -> Char -> Char) -> Char -> Stream Char -> Stream Char
673scanl :: (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
658 where
675 where
659 {-# INLINE next #-}
676 {-# INLINE next #-}
660− next (Scan1 z s) = Yield z (Scan2 z s)
677+ next (S1 :*: z :*: s) = Yield z (S2 :*: z :*: s)
661− next (Scan2 z s) = case next0 s of
678+ next (S2 :*: z :*: s) = case next0 s of
662− Yield x s' -> let !x' = f z x
679+ Yield x s' -> let !x' = f z x
663− in Yield x' (Scan2 x' s')
680+ in Yield x' (S2 :*: x' :*: s')
664− Skip s' -> Skip (Scan2 z s')
681+ Skip s' -> Skip (S2 :*: z :*: s')
665− Done -> Done
682+ Done -> Done
666{-# INLINE [0] scanl #-}
683{-# INLINE [0] scanl #-}
667
684
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+
668-- -----------------------------------------------------------------------------
708-- -----------------------------------------------------------------------------
669-- ** Generating and unfolding streams
709-- ** Generating and unfolding streams
670
710
671replicateCharI :: Integral a => a -> Char -> Stream Char
711replicateCharI :: Integral a => a -> Char -> Stream Char
672−replicateCharI !n !c
712+replicateCharI n c
673 | n < 0 = empty
713 | n < 0 = empty
674 | otherwise = Stream next 0 (fromIntegral n) -- HINT maybe too low
714 | otherwise = Stream next 0 (fromIntegral n) -- HINT maybe too low
675 where
715 where
676− next !i | i >= n = Done
716+ next i | i >= n = Done
677− | otherwise = Yield c (i + 1)
717+ | otherwise = Yield c (i + 1)
678{-# INLINE [0] replicateCharI #-}
718{-# INLINE [0] replicateCharI #-}
679
719
680data RI s = RI !s {-# UNPACK #-} !Int64
720data RI s = RI !s {-# UNPACK #-} !Int64
@@ -739,27 +779,24 @@ take n0 (Stream next0 s0 len) =
739 Yield x s' -> Yield x ((n-1) :*: s')
779 Yield x s' -> Yield x ((n-1) :*: s')
740{-# INLINE [0] take #-}
780{-# INLINE [0] take #-}
741
781
742−data Drop a s = NS !s
743− | JS !a !s
744−
745-- | /O(n)/ drop n, applied to a stream, returns the suffix of the
782-- | /O(n)/ drop n, applied to a stream, returns the suffix of the
746-- stream after the first @n@ characters, or the empty stream if @n@
783-- stream after the first @n@ characters, or the empty stream if @n@
747-- is greater than the length of the stream.
784-- is greater than the length of the stream.
748drop :: Integral a => a -> Stream Char -> Stream Char
785drop :: Integral a => a -> Stream Char -> Stream Char
749drop n0 (Stream next0 s0 len) =
786drop 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))
751 where
788 where
752 {-# INLINE next #-}
789 {-# INLINE next #-}
753− next (JS n s)
790+ next (J n :*: s)
754− | n <= 0 = Skip (NS s)
791+ | n <= 0 = Skip (N :*: s)
755 | otherwise = case next0 s of
792 | otherwise = case next0 s of
756 Done -> Done
793 Done -> Done
757− Skip s' -> Skip (JS n s')
794+ Skip s' -> Skip (J n :*: s')
758− Yield _ s' -> Skip (JS (n-1) s')
795+ Yield _ s' -> Skip (J (n-1) :*: s')
759− next (NS s) = case next0 s of
796+ next (N :*: s) = case next0 s of
760 Done -> Done
797 Done -> Done
761− Skip s' -> Skip (NS s')
798+ Skip s' -> Skip (N :*: s')
762− Yield x s' -> Yield x (NS s')
799+ Yield x s' -> Yield x (N :*: s')
763{-# INLINE [0] drop #-}
800{-# INLINE [0] drop #-}
764
801
765-- | takeWhile, applied to a predicate @p@ and a stream, returns the
802-- | 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
777
814
778-- | dropWhile @p @xs returns the suffix remaining after takeWhile @p @xs.
815-- | dropWhile @p @xs returns the suffix remaining after takeWhile @p @xs.
779dropWhile :: (Char -> Bool) -> Stream Char -> Stream Char
816dropWhile :: (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
781 where
818 where
782 {-# INLINE next #-}
819 {-# INLINE next #-}
783− next (L s) = case next0 s of
820+ next (S1 :*: s) = case next0 s of
784 Done -> Done
821 Done -> Done
785− Skip s' -> Skip (L s')
822+ Skip s' -> Skip (S1 :*: s')
786− Yield x s' | p x -> Skip (L s')
823+ Yield x s' | p x -> Skip (S1 :*: s')
787− | otherwise -> Yield x (R s')
824+ | otherwise -> Yield x (S2 :*: s')
788− next (R s) = case next0 s of
825+ next (S2 :*: s) = case next0 s of
789 Done -> Done
826 Done -> Done
790− Skip s' -> Skip (R s')
827+ Skip s' -> Skip (S2 :*: s')
791− Yield x s' -> Yield x (R s')
828+ Yield x s' -> Yield x (S2 :*: s')
792{-# INLINE [0] dropWhile #-}
829{-# INLINE [0] dropWhile #-}
793
830
794-- | /O(n)/ The 'isPrefixOf' function takes two 'Stream's and returns
831-- | /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
895-------------------------------------------------------------------------------
932-------------------------------------------------------------------------------
896-- * Zipping
933-- * Zipping
897
934
898−-- | Strict triple.
899−data Zip a b m = Z1 !a !b
900− | Z2 !a !b !m
901−
902-- | zipWith generalises 'zip' by zipping with the function given as
935-- | zipWith generalises 'zip' by zipping with the function given as
903-- the first argument, instead of a tupling function.
936-- the first argument, instead of a tupling function.
904zipWith :: (a -> a -> b) -> Stream a -> Stream a -> Stream b
937zipWith :: (a -> a -> b) -> Stream a -> Stream a -> Stream b
905zipWith f (Stream next0 sa0 len1) (Stream next1 sb0 len2) =
938zipWith 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)
907 where
940 where
908− next (Z1 sa sb) = case next0 sa of
941+ next (sa :*: sb :*: N) = case next0 sa of
909− Done -> Done
942+ Done -> Done
910− Skip sa' -> Skip (Z1 sa' sb)
943+ Skip sa' -> Skip (sa' :*: sb :*: N)
911− Yield a sa' -> Skip (Z2 sa' sb a)
944+ Yield a sa' -> Skip (sa' :*: sb :*: J a)
912−
945+
913− next (Z2 sa' sb a) = case next1 sb of
946+ next (sa' :*: sb :*: J a) = case next1 sb of
914− Done -> Done
947+ Done -> Done
915− Skip sb' -> Skip (Z2 sa' sb' a)
948+ Skip sb' -> Skip (sa' :*: sb' :*: J a)
916− Yield b sb' -> Yield (f a b) (Z1 sa' sb')
949+ Yield b sb' -> Yield (f a b) (sa' :*: sb' :*: N)
917{-# INLINE [0] zipWith #-}
950{-# INLINE [0] zipWith #-}
918
951
919-- | /O(n)/ The 'countCharI' function returns the number of times the
952-- | /O(n)/ The 'countCharI' function returns the number of times the
@@ -936,3 +969,15 @@ emptyError func = internalError func "Empty input"
936
969
937internalError :: String -> a
970internalError :: String -> a
938internalError func = streamError func "Internal error"
971internalError 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 @@
20module Data.Text.Internal.Fusion.Types
20module Data.Text.Internal.Fusion.Types
21 (
21 (
22 CC(..)
22 CC(..)
23+ , M(..)
24+ , M8
23 , PairS(..)
25 , PairS(..)
24− , Scan(..)
25 , RS(..)
26 , RS(..)
26 , Step(..)
27 , Step(..)
27 , Stream(..)
28 , Stream(..)
29+ , Switch(..)
28 , empty
30 , empty
29 ) where
31 ) where
30
32
@@ -34,23 +36,26 @@ import Data.Word (Word8)
34-- | Specialised tuple for case conversion.
36-- | Specialised tuple for case conversion.
35data CC s = CC !s {-# UNPACK #-} !Char {-# UNPACK #-} !Char
37data CC s = CC !s {-# UNPACK #-} !Char {-# UNPACK #-} !Char
36
38
39+-- | Specialised, strict Maybe-like type.
40+data M a = N
41+ | J !a
42+
43+type M8 = M Word8
44+
37−-- | Restreaming state.
45+-- Restreaming state.
38data RS s
46data RS s
39 = RS0 !s
47 = RS0 !s
40 | RS1 !s {-# UNPACK #-} !Word8
48 | RS1 !s {-# UNPACK #-} !Word8
41 | RS2 !s {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8
49 | RS2 !s {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8
42 | RS3 !s {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8
50 | RS3 !s {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8
43
51
44−-- | Strict pair.
52+infixl 2 :*:
45data PairS a b = !a :*: !b
53data PairS a b = !a :*: !b
46 -- deriving (Eq, Ord, Show)
54 -- deriving (Eq, Ord, Show)
47−infixl 2 :*:
48
55
49−-- | An intermediate result in a scan.
56+-- | Allow a function over a stream to switch between two states.
50−data Scan s = Scan1 {-# UNPACK #-} !Char !s
57+data Switch = S1 | S2
51− | Scan2 {-# UNPACK #-} !Char !s
52
58
53−-- | Intermediate result in a processing pipeline.
54data Step s a = Done
59data Step s a = Done
55 | Skip !s
60 | Skip !s
56 | Yield !a !s
61 | Yield !a !s
Data/Text/Internal/Read.hs+3−3
@@ -7,7 +7,7 @@
7-- Stability : experimental
7-- Stability : experimental
8-- Portability : GHC
8-- Portability : GHC
9--
9--
10−-- Common internal functions for reading textual data.
10+-- Common internal functiopns for reading textual data.
11module Data.Text.Internal.Read
11module Data.Text.Internal.Read
12 (
12 (
13 IReader
13 IReader
@@ -18,7 +18,7 @@ module Data.Text.Internal.Read
18 , perhaps
18 , perhaps
19 ) where
19 ) where
20
20
21−import Control.Applicative as App (Applicative(..))
21+import Control.Applicative (Applicative(..))
22import Control.Arrow (first)
22import Control.Arrow (first)
23import Control.Monad (ap)
23import Control.Monad (ap)
24import Data.Char (ord)
24import Data.Char (ord)
@@ -38,7 +38,7 @@ instance Applicative (IParser t) where
38 (<*>) = ap
38 (<*>) = ap
39
39
40instance Monad (IParser t) where
40instance Monad (IParser t) where
41− return = App.pure
41+ return = pure
42 m >>= k = P $ \t -> case runP m t of
42 m >>= k = P $ \t -> case runP m t of
43 Left err -> Left err
43 Left err -> Left err
44 Right (a,t') -> runP (k a) t'
44 Right (a,t') -> runP (k a) t'
Data/Text/Lazy.hs+12−76
@@ -140,7 +140,6 @@ module Data.Text.Lazy
140 , drop
140 , drop
141 , dropEnd
141 , dropEnd
142 , takeWhile
142 , takeWhile
143− , takeWhileEnd
144 , dropWhile
143 , dropWhile
145 , dropWhileEnd
144 , dropWhileEnd
146 , dropAround
145 , dropAround
@@ -211,13 +210,9 @@ import Control.DeepSeq (NFData(..))
211import Data.Int (Int64)
210import Data.Int (Int64)
212import qualified Data.List as L
211import qualified Data.List as L
213import Data.Char (isSpace)
212import Data.Char (isSpace)
214−import Data.Data (Data(gfoldl, toConstr, gunfold, dataTypeOf), constrIndex,
213+import Data.Data (Data(gfoldl, toConstr, gunfold, dataTypeOf))
215− Constr, mkConstr, DataType, mkDataType, Fixity(Prefix))
214+import Data.Data (mkNoRepType)
216−import Data.Binary (Binary(get, put))
217import Data.Monoid (Monoid(..))
215import Data.Monoid (Monoid(..))
218−#if MIN_VERSION_base(4,9,0)
219−import Data.Semigroup (Semigroup(..))
220−#endif
221import Data.String (IsString(..))
216import Data.String (IsString(..))
222import qualified Data.Text as T
217import qualified Data.Text as T
223import qualified Data.Text.Internal as T
218import qualified Data.Text.Internal as T
@@ -229,7 +224,6 @@ import Data.Text.Internal.Lazy.Fusion (stream, unstream)
229import Data.Text.Internal.Lazy (Text(..), chunk, empty, foldlChunks,
224import Data.Text.Internal.Lazy (Text(..), chunk, empty, foldlChunks,
230 foldrChunks, smallChunkSize)
225 foldrChunks, smallChunkSize)
231import Data.Text.Internal (firstf, safe, text)
226import Data.Text.Internal (firstf, safe, text)
232−import Data.Text.Lazy.Encoding (decodeUtf8', encodeUtf8)
233import qualified Data.Text.Internal.Functions as F
227import qualified Data.Text.Internal.Functions as F
234import Data.Text.Internal.Lazy.Search (indices)
228import Data.Text.Internal.Lazy.Search (indices)
235#if __GLASGOW_HASKELL__ >= 702
229#if __GLASGOW_HASKELL__ >= 702
@@ -241,9 +235,6 @@ import qualified GHC.Base as GHC
241import qualified GHC.Exts as Exts
235import qualified GHC.Exts as Exts
242#endif
236#endif
243import GHC.Prim (Addr#)
237import GHC.Prim (Addr#)
244−#if MIN_VERSION_base(4,7,0)
245−import Text.Printf (PrintfArg, formatArg, formatString)
246−#endif
247
238
248-- $fusion
239-- $fusion
249--
240--
@@ -341,21 +332,9 @@ instance Show Text where
341instance Read Text where
332instance Read Text where
342 readsPrec p str = [(pack x,y) | (x,y) <- readsPrec p str]
333 readsPrec p str = [(pack x,y) | (x,y) <- readsPrec p str]
343
334
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−
352instance Monoid Text where
335instance Monoid Text where
353 mempty = empty
336 mempty = empty
354−#if MIN_VERSION_base(4,9,0)
355− mappend = (<>) -- future-proof definition
356−#else
357 mappend = append
337 mappend = append
358−#endif
359 mconcat = concat
338 mconcat = concat
360
339
361instance IsString Text where
340instance IsString Text where
@@ -374,38 +353,11 @@ instance NFData Text where
374 rnf (Chunk _ ts) = rnf ts
353 rnf (Chunk _ ts) = rnf ts
375#endif
354#endif
376
355
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'
390instance Data Text where
356instance Data Text where
391 gfoldl f z txt = z pack `f` (unpack txt)
357 gfoldl f z txt = z pack `f` (unpack txt)
392− toConstr _ = packConstr
358+ toConstr _ = error "Data.Text.Lazy.Text.toConstr"
393− gunfold k z c = case constrIndex c of
394− 1 -> k (z pack)
395− _ -> error "Data.Text.Lazy.Text.gunfold"
359+ gunfold _ _ = error "Data.Text.Lazy.Text.gunfold"
396− dataTypeOf _ = textDataType
360+ dataTypeOf _ = mkNoRepType "Data.Text.Lazy.Text"
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]
409
361
410-- | /O(n)/ Convert a 'String' into a 'Text'.
362-- | /O(n)/ Convert a 'String' into a 'Text'.
411--
363--
@@ -545,7 +497,7 @@ tail Empty = emptyError "tail"
545 unstream (S.tail (stream t)) = tail t
497 unstream (S.tail (stream t)) = tail t
546 #-}
498 #-}
547
499
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
549-- be non-empty. Subject to fusion.
501-- be non-empty. Subject to fusion.
550init :: Text -> Text
502init :: Text -> Text
551init (Chunk t0 ts0) = go t0 ts0
503init (Chunk t0 ts0) = go t0 ts0
@@ -581,7 +533,7 @@ isSingleton :: Text -> Bool
581isSingleton = S.isSingleton . stream
533isSingleton = S.isSingleton . stream
582{-# INLINE isSingleton #-}
534{-# INLINE isSingleton #-}
583
535
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
585-- non-empty. Subject to fusion.
537-- non-empty. Subject to fusion.
586last :: Text -> Char
538last :: Text -> Char
587last Empty = emptyError "last"
539last Empty = emptyError "last"
@@ -881,13 +833,13 @@ concatMap f = concat . foldr ((:) . f) []
881{-# INLINE concatMap #-}
833{-# INLINE concatMap #-}
882
834
883-- | /O(n)/ 'any' @p@ @t@ determines whether any character in the
835-- | /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.
885any :: (Char -> Bool) -> Text -> Bool
837any :: (Char -> Bool) -> Text -> Bool
886any p t = S.any p (stream t)
838any p t = S.any p (stream t)
887{-# INLINE any #-}
839{-# INLINE any #-}
888
840
889-- | /O(n)/ 'all' @p@ @t@ determines whether all characters in the
841-- | /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.
891all :: (Char -> Bool) -> Text -> Bool
843all :: (Char -> Bool) -> Text -> Bool
892all p t = S.all p (stream t)
844all p t = S.all p (stream t)
893{-# INLINE all #-}
845{-# INLINE all #-}
@@ -996,7 +948,7 @@ cycle t = let t' = foldrChunks Chunk t' t
996
948
997-- | @'iterate' f x@ returns an infinite 'Text' of repeated applications
949-- | @'iterate' f x@ returns an infinite 'Text' of repeated applications
998-- of @f@ to @x@:
950-- of @f@ to @x@:
999−--
951+--
1000-- > iterate f x == [x, f x, f (f x), ...]
952-- > iterate f x == [x, f x, f (f x), ...]
1001iterate :: (Char -> Char) -> Char -> Text
953iterate :: (Char -> Char) -> Char -> Text
1002iterate f c = let t c' = Chunk (T.singleton c') (t (f c'))
954iterate f c = let t c' = Chunk (T.singleton c') (t (f c'))
@@ -1144,20 +1096,6 @@ takeWhile p t0 = takeWhile' t0
1144"LAZY TEXT takeWhile -> unfused" [1] forall p t.
1096"LAZY TEXT takeWhile -> unfused" [1] forall p t.
1145 unstream (S.takeWhile p (stream t)) = takeWhile p t
1097 unstream (S.takeWhile p (stream t)) = takeWhile p t
1146 #-}
1098 #-}
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 #-}
1161
1099
1162-- | /O(n)/ 'dropWhile' @p@ @t@ returns the suffix remaining after
1100-- | /O(n)/ 'dropWhile' @p@ @t@ returns the suffix remaining after
1163-- 'takeWhile' @p@ @t@. Subject to fusion.
1101-- 'takeWhile' @p@ @t@. Subject to fusion.
@@ -1176,11 +1114,9 @@ dropWhile p t0 = dropWhile' t0
1176"LAZY TEXT dropWhile -> unfused" [1] forall p t.
1114"LAZY TEXT dropWhile -> unfused" [1] forall p t.
1177 unstream (S.dropWhile p (stream t)) = dropWhile p t
1115 unstream (S.dropWhile p (stream t)) = dropWhile p t
1178 #-}
1116 #-}
1179−
1180-- | /O(n)/ 'dropWhileEnd' @p@ @t@ returns the prefix remaining after
1117-- | /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
1182-- @t@.
1119-- @t@.
1183−--
1184-- Examples:
1120-- Examples:
1185--
1121--
1186-- > dropWhileEnd (=='.') "foo..." == "foo"
1122-- > dropWhileEnd (=='.') "foo..." == "foo"
@@ -1197,7 +1133,7 @@ dropWhileEnd p = go
1197{-# INLINE dropWhileEnd #-}
1133{-# INLINE dropWhileEnd #-}
1198
1134
1199-- | /O(n)/ 'dropAround' @p@ @t@ returns the substring remaining after
1135-- | /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
1201-- beginning and end of @t@. Subject to fusion.
1137-- beginning and end of @t@. Subject to fusion.
1202dropAround :: (Char -> Bool) -> Text -> Text
1138dropAround :: (Char -> Bool) -> Text -> Text
1203dropAround p = dropWhile p . dropWhileEnd p
1139dropAround p = dropWhile p . dropWhileEnd p
Data/Text/Lazy/Builder.hs+1−1
@@ -8,7 +8,7 @@
8-- Module : Data.Text.Lazy.Builder
8-- Module : Data.Text.Lazy.Builder
9-- Copyright : (c) 2013 Bryan O'Sullivan
9-- Copyright : (c) 2013 Bryan O'Sullivan
10-- (c) 2010 Johan Tibell
10-- (c) 2010 Johan Tibell
11−-- License : BSD-style (see LICENSE)
11+-- License : BSD3-style (see LICENSE)
12--
12--
13-- Maintainer : Johan Tibell <johan.tibell@gmail.com>
13-- Maintainer : Johan Tibell <johan.tibell@gmail.com>
14-- Stability : experimental
14-- Stability : experimental
Data/Text/Lazy/Builder/Int.hs+4−4
@@ -7,7 +7,7 @@
7-- Module: Data.Text.Lazy.Builder.Int
7-- Module: Data.Text.Lazy.Builder.Int
8-- Copyright: (c) 2013 Bryan O'Sullivan
8-- Copyright: (c) 2013 Bryan O'Sullivan
9-- (c) 2011 MailRank, Inc.
9-- (c) 2011 MailRank, Inc.
10−-- License: BSD-style
10+-- License: BSD3
11-- Maintainer: Bryan O'Sullivan <bos@serpentine.com>
11-- Maintainer: Bryan O'Sullivan <bos@serpentine.com>
12-- Stability: experimental
12-- Stability: experimental
13-- Portability: portable
13-- Portability: portable
@@ -35,7 +35,7 @@ import Control.Monad.ST
35
35
36#ifdef __GLASGOW_HASKELL__
36#ifdef __GLASGOW_HASKELL__
37# if defined(INTEGER_GMP)
37# if defined(INTEGER_GMP)
38−import GHC.Integer.GMP.Internals (Integer(S#))
38+import GHC.Integer.GMP.Internals
39# elif defined(INTEGER_SIMPLE)
39# elif defined(INTEGER_SIMPLE)
40import GHC.Integer
40import GHC.Integer
41# else
41# else
@@ -55,7 +55,7 @@ decimal :: Integral a => a -> Builder
55{-# RULES "decimal/Int16" decimal = boundedDecimal :: Int16 -> Builder #-}
55{-# RULES "decimal/Int16" decimal = boundedDecimal :: Int16 -> Builder #-}
56{-# RULES "decimal/Int32" decimal = boundedDecimal :: Int32 -> Builder #-}
56{-# RULES "decimal/Int32" decimal = boundedDecimal :: Int32 -> Builder #-}
57{-# RULES "decimal/Int64" decimal = boundedDecimal :: Int64 -> Builder #-}
57{-# 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 #-}
59{-# RULES "decimal/Word8" decimal = positive :: Word8 -> Builder #-}
59{-# RULES "decimal/Word8" decimal = positive :: Word8 -> Builder #-}
60{-# RULES "decimal/Word16" decimal = positive :: Word16 -> Builder #-}
60{-# RULES "decimal/Word16" decimal = positive :: Word16 -> Builder #-}
61{-# RULES "decimal/Word32" decimal = positive :: Word32 -> Builder #-}
61{-# RULES "decimal/Word32" decimal = positive :: Word32 -> Builder #-}
@@ -247,7 +247,7 @@ integer base i
247 PAIR(x,y) -> pblock q <> pblock r <> putB ns
247 PAIR(x,y) -> pblock q <> pblock r <> putB ns
248 where q = fromInteger x
248 where q = fromInteger x
249 r = fromInteger y
249 r = fromInteger y
250− putB _ = Data.Monoid.mempty
250+ putB _ = mempty
251
251
252 int :: Int -> Builder
252 int :: Int -> Builder
253 int x | base == 10 = decimal x
253 int x | base == 10 = decimal x
Data/Text/Lazy/Encoding.hs+18−7
@@ -46,25 +46,30 @@ module Data.Text.Lazy.Encoding
46 , encodeUtf32LE
46 , encodeUtf32LE
47 , encodeUtf32BE
47 , encodeUtf32BE
48
48
49+#if MIN_VERSION_bytestring(0,10,4)
49 -- * Encoding Text using ByteString Builders
50 -- * Encoding Text using ByteString Builders
50 , encodeUtf8Builder
51 , encodeUtf8Builder
51 , encodeUtf8BuilderEscaped
52 , encodeUtf8BuilderEscaped
53+#endif
52 ) where
54 ) where
53
55
54import Control.Exception (evaluate, try)
56import Control.Exception (evaluate, try)
55−import Data.Monoid (Monoid(..))
56import Data.Text.Encoding.Error (OnDecodeError, UnicodeException, strictDecode)
57import Data.Text.Encoding.Error (OnDecodeError, UnicodeException, strictDecode)
57import Data.Text.Internal.Lazy (Text(..), chunk, empty, foldrChunks)
58import Data.Text.Internal.Lazy (Text(..), chunk, empty, foldrChunks)
58−import Data.Word (Word8)
59import qualified Data.ByteString as S
59import 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
63import qualified Data.ByteString.Lazy as B
60import qualified Data.ByteString.Lazy as B
64import qualified Data.ByteString.Lazy.Internal as B
61import qualified Data.ByteString.Lazy.Internal as B
65import qualified Data.ByteString.Unsafe as B
62import 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
66import qualified Data.Text as T
69import qualified Data.Text as T
70+#endif
67import qualified Data.Text.Encoding as TE
71import qualified Data.Text.Encoding as TE
72+import qualified Data.Text.Lazy as L
68import qualified Data.Text.Internal.Lazy.Encoding.Fusion as E
73import qualified Data.Text.Internal.Lazy.Encoding.Fusion as E
69import qualified Data.Text.Internal.Lazy.Fusion as F
74import qualified Data.Text.Internal.Lazy.Fusion as F
70import Data.Text.Unsafe (unsafeDupablePerformIO)
75import Data.Text.Unsafe (unsafeDupablePerformIO)
@@ -105,7 +110,7 @@ decodeUtf8With onErr (B.Chunk b0 bs0) =
105 | S.null l = empty
110 | S.null l = empty
106 | otherwise = case onErr desc (Just (B.unsafeHead l)) of
111 | otherwise = case onErr desc (Just (B.unsafeHead l)) of
107 Nothing -> empty
112 Nothing -> empty
108− Just c -> Chunk (T.singleton c) Empty
113+ Just c -> L.singleton c
109 desc = "Data.Text.Lazy.Encoding.decodeUtf8With: Invalid UTF-8 stream"
114 desc = "Data.Text.Lazy.Encoding.decodeUtf8With: Invalid UTF-8 stream"
110decodeUtf8With _ _ = empty
115decodeUtf8With _ _ = empty
111
116
@@ -142,6 +147,7 @@ decodeUtf8' bs = unsafeDupablePerformIO $ do
142{-# INLINE decodeUtf8' #-}
147{-# INLINE decodeUtf8' #-}
143
148
144encodeUtf8 :: Text -> B.ByteString
149encodeUtf8 :: Text -> B.ByteString
150+#if MIN_VERSION_bytestring(0,10,4)
145encodeUtf8 Empty = B.empty
151encodeUtf8 Empty = B.empty
146encodeUtf8 lt@(Chunk t _) =
152encodeUtf8 lt@(Chunk t _) =
147 B.toLazyByteStringWith strategy B.empty $ encodeUtf8Builder lt
153 B.toLazyByteStringWith strategy B.empty $ encodeUtf8Builder lt
@@ -156,13 +162,18 @@ encodeUtf8 lt@(Chunk t _) =
156
162
157encodeUtf8Builder :: Text -> B.Builder
163encodeUtf8Builder :: Text -> B.Builder
158encodeUtf8Builder =
164encodeUtf8Builder =
159− foldrChunks (\c b -> TE.encodeUtf8Builder c `mappend` b) Data.Monoid.mempty
165+ foldrChunks (\c b -> TE.encodeUtf8Builder c `mappend` b) mempty
160
166
161{-# INLINE encodeUtf8BuilderEscaped #-}
167{-# INLINE encodeUtf8BuilderEscaped #-}
162encodeUtf8BuilderEscaped :: BP.BoundedPrim Word8 -> Text -> B.Builder
168encodeUtf8BuilderEscaped :: BP.BoundedPrim Word8 -> Text -> B.Builder
163encodeUtf8BuilderEscaped prim =
169encodeUtf8BuilderEscaped prim =
164 foldrChunks (\c b -> TE.encodeUtf8BuilderEscaped prim c `mappend` b) mempty
170 foldrChunks (\c b -> TE.encodeUtf8BuilderEscaped prim c `mappend` b) mempty
165
171
172+#else
173+encodeUtf8 (Chunk c cs) = B.Chunk (TE.encodeUtf8 c) (encodeUtf8 cs)
174+encodeUtf8 Empty = B.Empty
175+#endif
176+
166-- | Decode text from little endian UTF-16 encoding.
177-- | Decode text from little endian UTF-16 encoding.
167decodeUtf16LEWith :: OnDecodeError -> B.ByteString -> Text
178decodeUtf16LEWith :: OnDecodeError -> B.ByteString -> Text
168decodeUtf16LEWith onErr bs = F.unstream (E.streamUtf16LE onErr bs)
179decodeUtf16LEWith onErr bs = F.unstream (E.streamUtf16LE onErr bs)
Data/Text/Lazy/Read.hs+2−4
@@ -1,7 +1,5 @@
1{-# LANGUAGE OverloadedStrings, CPP #-}
1{-# LANGUAGE OverloadedStrings, CPP #-}
2−#if __GLASGOW_HASKELL__ >= 704
2+#if __GLASGOW_HASKELL__ >= 702
3−{-# LANGUAGE Safe #-}
4−#elif __GLASGOW_HASKELL__ >= 702
5{-# LANGUAGE Trustworthy #-}
3{-# LANGUAGE Trustworthy #-}
6#endif
4#endif
7
5
@@ -56,7 +54,7 @@ decimal :: Integral a => Reader a
56{-# SPECIALIZE decimal :: Reader Int32 #-}
54{-# SPECIALIZE decimal :: Reader Int32 #-}
57{-# SPECIALIZE decimal :: Reader Int64 #-}
55{-# SPECIALIZE decimal :: Reader Int64 #-}
58{-# SPECIALIZE decimal :: Reader Integer #-}
56{-# SPECIALIZE decimal :: Reader Integer #-}
59−{-# SPECIALIZE decimal :: Reader Data.Word.Word #-}
57+{-# SPECIALIZE decimal :: Reader Word #-}
60{-# SPECIALIZE decimal :: Reader Word8 #-}
58{-# SPECIALIZE decimal :: Reader Word8 #-}
61{-# SPECIALIZE decimal :: Reader Word16 #-}
59{-# SPECIALIZE decimal :: Reader Word16 #-}
62{-# SPECIALIZE decimal :: Reader Word32 #-}
60{-# SPECIALIZE decimal :: Reader Word32 #-}
Data/Text/Read.hs+1−1
@@ -55,7 +55,7 @@ decimal :: Integral a => Reader a
55{-# SPECIALIZE decimal :: Reader Int32 #-}
55{-# SPECIALIZE decimal :: Reader Int32 #-}
56{-# SPECIALIZE decimal :: Reader Int64 #-}
56{-# SPECIALIZE decimal :: Reader Int64 #-}
57{-# SPECIALIZE decimal :: Reader Integer #-}
57{-# SPECIALIZE decimal :: Reader Integer #-}
58−{-# SPECIALIZE decimal :: Reader Data.Word.Word #-}
58+{-# SPECIALIZE decimal :: Reader Word #-}
59{-# SPECIALIZE decimal :: Reader Word8 #-}
59{-# SPECIALIZE decimal :: Reader Word8 #-}
60{-# SPECIALIZE decimal :: Reader Word16 #-}
60{-# SPECIALIZE decimal :: Reader Word16 #-}
61{-# SPECIALIZE decimal :: Reader Word32 #-}
61{-# 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
53 , Mul.benchmark
53 , Mul.benchmark
54 , Pure.benchmark "tiny" (tf "tiny.txt")
54 , Pure.benchmark "tiny" (tf "tiny.txt")
55 , Pure.benchmark "ascii" (tf "ascii-small.txt")
55 , Pure.benchmark "ascii" (tf "ascii-small.txt")
56− -- , Pure.benchmark "france" (tf "france.html")
56+ , Pure.benchmark "france" (tf "france.html")
57 , Pure.benchmark "russian" (tf "russian-small.txt")
57 , Pure.benchmark "russian" (tf "russian-small.txt")
58 , Pure.benchmark "japanese" (tf "japanese.txt")
58 , Pure.benchmark "japanese" (tf "japanese.txt")
59 , ReadNumbers.benchmark (tf "numbers.txt")
59 , ReadNumbers.benchmark (tf "numbers.txt")
benchmarks/haskell/Benchmarks/Pure.hs−7
@@ -262,13 +262,6 @@ benchmark kind fp = do
262 , benchBSL $ nf (BL.map toUpper) bla
262 , benchBSL $ nf (BL.map toUpper) bla
263 , benchS $ nf (L.map toUpper) sa
263 , benchS $ nf (L.map toUpper) sa
264 ]
264 ]
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− ]
272 , bgroup "words"
265 , bgroup "words"
273 [ benchT $ nf T.words ta
266 [ benchT $ nf T.words ta
274 , benchTL $ nf TL.words tla
267 , benchTL $ nf TL.words tla
benchmarks/haskell/Benchmarks/ReadNumbers.hs+5−2
@@ -25,7 +25,8 @@ import Data.List (foldl')
25import Numeric (readDec, readFloat, readHex)
25import Numeric (readDec, readFloat, readHex)
26import qualified Data.ByteString.Char8 as B
26import qualified Data.ByteString.Char8 as B
27import qualified Data.ByteString.Lazy.Char8 as BL
27import 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
29import qualified Data.Text as T
30import qualified Data.Text as T
30import qualified Data.Text.IO as T
31import qualified Data.Text.IO as T
31import qualified Data.Text.Lazy as TL
32import qualified Data.Text.Lazy as TL
@@ -62,10 +63,12 @@ benchmark fp = do
62 whnf (double . text TL.rational) tl
63 whnf (double . text TL.rational) tl
63
64
64 , bench "DecimalByteString" $ whnf (int . byteString B.readInt) b
65 , 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
66
67
67 , bench "DecimalLazyByteString" $
68 , bench "DecimalLazyByteString" $
68 whnf (int . byteString BL.readInt) bl
69 whnf (int . byteString BL.readInt) bl
70+ , bench "DoubleLazyByteString" $
71+ whnf (double . byteString BL.readDouble) bl
69 ]
72 ]
70 where
73 where
71 -- Used for fixing types
74 -- Used for fixing types
benchmarks/haskell/Benchmarks/Stream.hs+5−16
@@ -18,11 +18,11 @@ import qualified Data.Text.Encoding as T
18import qualified Data.Text.Encoding.Error as E
18import qualified Data.Text.Encoding.Error as E
19import qualified Data.Text.Internal.Encoding.Fusion as T
19import qualified Data.Text.Internal.Encoding.Fusion as T
20import qualified Data.Text.Internal.Encoding.Fusion.Common as F
20import 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
22import qualified Data.Text.IO as T
22import qualified Data.Text.IO as T
23import qualified Data.Text.Lazy.Encoding as TL
23import qualified Data.Text.Lazy.Encoding as TL
24import qualified Data.Text.Internal.Lazy.Encoding.Fusion as TL
24import 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
26import qualified Data.Text.Lazy.IO as TL
26import qualified Data.Text.Lazy.IO as TL
27
27
28instance NFData a => NFData (Stream a) where
28instance NFData a => NFData (Stream a) where
@@ -53,25 +53,14 @@ benchmark fp = do
53 !utf32beL = TL.encodeUtf32BE tl
53 !utf32beL = TL.encodeUtf32BE tl
54
54
55 -- For the functions which operate on streams
55 -- For the functions which operate on streams
56− let !s = F.stream t
56+ let !s = T.stream t
57
57
58 return $ bgroup "Stream"
58 return $ bgroup "Stream"
59
59
60 -- Fusion
60 -- Fusion
61 [ bgroup "stream" $
61 [ bgroup "stream" $
62− [ bench "Text" $ nf F.stream t
62+ [ bench "Text" $ nf T.stream t
63− , bench "LazyText" $ nf FL.stream tl
63+ , bench "LazyText" $ nf TL.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
75 ]
64 ]
76
65
77 -- Encoding.Fusion
66 -- Encoding.Fusion
benchmarks/text-benchmarks.cabal+4−14
@@ -3,7 +3,7 @@ version: 0.0.0.0
3synopsis: Benchmarks for the text package
3synopsis: Benchmarks for the text package
4description: Benchmarks for the text package
4description: Benchmarks for the text package
5homepage: https://bitbucket.org/bos/text
5homepage: https://bitbucket.org/bos/text
6−license: BSD2
6+license: BSD3
7license-file: ../LICENSE
7license-file: ../LICENSE
8author: Jasper Van der Jeugt <jaspervdj@gmail.com>,
8author: Jasper Van der Jeugt <jaspervdj@gmail.com>,
9 Bryan O'Sullivan <bos@serpentine.com>,
9 Bryan O'Sullivan <bos@serpentine.com>,
@@ -15,11 +15,6 @@ build-type: Simple
15
15
16cabal-version: >=1.2
16cabal-version: >=1.2
17
17
18−flag bytestring-builder
19− description: Depend on the bytestring-builder package for backwards compatibility.
20− default: False
21− manual: False
22−
23flag llvm
18flag llvm
24 description: use LLVM
19 description: use LLVM
25 default: False
20 default: False
@@ -27,7 +22,7 @@ flag llvm
27
22
28executable text-benchmarks
23executable text-benchmarks
29 hs-source-dirs: haskell ..
24 hs-source-dirs: haskell ..
30− c-sources: ../cbits/cbits.c
25+ c-sources: ../cbits/case_mapping.c ../cbits/cbits.c
31 cbits/time_iconv.c
26 cbits/time_iconv.c
32 include-dirs: ../include
27 include-dirs: ../include
33 main-is: Benchmarks.hs
28 main-is: Benchmarks.hs
@@ -38,7 +33,8 @@ executable text-benchmarks
38 build-depends: base == 4.*,
33 build-depends: base == 4.*,
39 binary,
34 binary,
40 blaze-builder,
35 blaze-builder,
41− bytestring-lexing >= 0.5.0,
36+ bytestring,
37+ bytestring-lexing,
42 containers,
38 containers,
43 criterion >= 0.10.0.0,
39 criterion >= 0.10.0.0,
44 deepseq,
40 deepseq,
@@ -50,12 +46,6 @@ executable text-benchmarks
50 utf8-string,
46 utf8-string,
51 vector
47 vector
52
48
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−
59executable text-multilang
49executable text-multilang
60 hs-source-dirs: haskell
50 hs-source-dirs: haskell
61 main-is: Multilang.hs
51 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,
309
309
310 *destp = dest;
310 *destp = dest;
311}
311}
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−
581.2.0.5
11.2.0.5
59
2
60−* Feature parity: repeat, cycle, iterate are now implemented for lazy
3+* Fixed a space explosion in the GHC inliner by changing how case
61− Text, and the Data instance is more complete
4+ mapping functions are implemented
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)
77
5
781.2.0.4
61.2.0.4
79
7
80−* Fixed an incompatibility with base < 4.5
8+* Resurrected compatibility with base < 4.5
81
9
821.2.0.3
101.2.0.3
83
11
scripts/Arsec.hs+17−4
@@ -3,7 +3,9 @@ module Arsec
3 Comment
3 Comment
4 , comment
4 , comment
5 , semi
5 , semi
6− , showC
6+ , showX
7+ , key
8+ , value
7 , unichar
9 , unichar
8 , unichars
10 , unichars
9 , module Control.Applicative
11 , module Control.Applicative
@@ -18,6 +20,7 @@ module Arsec
18import Control.Monad
20import Control.Monad
19import Control.Applicative
21import Control.Applicative
20import Data.Char
22import Data.Char
23+import Data.List (intercalate)
21import Numeric
24import Numeric
22import Text.ParserCombinators.Parsec.Char hiding (lower, upper)
25import Text.ParserCombinators.Parsec.Char hiding (lower, upper)
23import Text.ParserCombinators.Parsec.Combinator hiding (optional)
26import Text.ParserCombinators.Parsec.Combinator hiding (optional)
@@ -38,7 +41,17 @@ semi = char ';' *> spaces *> pure ()
38comment :: Parser Comment
41comment :: Parser Comment
39comment = (char '#' *> manyTill anyToken (char '\n')) <|> string "\n"
42comment = (char '#' *> manyTill anyToken (char '\n')) <|> string "\n"
40
43
41−showC :: Char -> String
44+showX :: Char -> String
42−showC c = "'\\x" ++ d ++ "'"
45+showX c
46+ | c > '\xffff' = error $ "U+" ++ h ++ " will not fit in 16 bits"
47+ | otherwise = "0x" ++ replicate (4 - length h) '0' ++ h
43 where h = showHex (ord c) ""
48 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
11 ) where
11 ) where
12
12
13import Arsec
13import Arsec
14+import Data.List (sort)
14
15
15data Fold = Fold {
16data Fold = Fold {
16 code :: Char
17 code :: Char
@@ -34,13 +35,16 @@ parseCF :: FilePath -> IO (Either ParseError CaseFolding)
34parseCF name = parse entries name <$> readFile name
35parseCF name = parse entries name <$> readFile name
35
36
36mapCF :: CaseFolding -> [String]
37mapCF :: 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+ ["};"]
38 where
46 where
39− typ = ["foldMapping :: forall s. Char -> s -> Step (CC s) Char"
47+ count = show (length mappings)
40− ,"{-# NOINLINE foldMapping #-}"]
48+ mappings = sort (filter p ms)
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')
45 p f = status f `elem` "CF" &&
49 p f = status f `elem` "CF" &&
46 mapping f /= [toLower (code f)]
50 mapping f /= [toLower (code f)]
scripts/CaseMapping.hs+10−9
@@ -8,7 +8,7 @@ import SpecialCasing
8main = do
8main = do
9 args <- getArgs
9 args <- getArgs
10 let oname = case args of
10 let oname = case args of
11− [] -> "../Data/Text/Internal/Fusion/CaseMapping.hs"
11+ [] -> "../cbits/case_mapping.c"
12 [o] -> o
12 [o] -> o
13 psc <- parseSC "SpecialCasing.txt"
13 psc <- parseSC "SpecialCasing.txt"
14 pcf <- parseCF "CaseFolding.txt"
14 pcf <- parseCF "CaseFolding.txt"
@@ -19,17 +19,18 @@ main = do
19 Left err -> print err >> return undefined
19 Left err -> print err >> return undefined
20 Right ms -> return ms
20 Right ms -> return ms
21 h <- openFile oname WriteMode
21 h <- openFile oname WriteMode
22− let comments = map ("--" ++) $
22+ let comments = map (" *" ++) $
23 take 2 (cfComments cfs) ++ take 2 (scComments scs)
23 take 2 (cfComments cfs) ++ take 2 (scComments scs)
24 mapM_ (hPutStrLn h) $
24 mapM_ (hPutStrLn h) $
25− ["{-# LANGUAGE Rank2Types #-}"
25+ ["/*"
26− ,"-- AUTOMATICALLY GENERATED - DO NOT EDIT"
26+ ," * AUTOMATICALLY GENERATED - DO NOT EDIT"
27− ,"-- Generated by scripts/CaseMapping.hs"] ++
27+ ," * Generated by scripts/CaseMapping.hs"
28+ ," *"] ++
28 comments ++
29 comments ++
29− [""
30+ [" */"
30− ,"module Data.Text.Internal.Fusion.CaseMapping where"
31+ ,""
31− ,"import Data.Char"
32+ ,"#include <stdint.h>"
32− ,"import Data.Text.Internal.Fusion.Types"
33+ ,"#include <sys/types.h>"
33 ,""]
34 ,""]
34 mapM_ (hPutStrLn h) (mapSC "upper" upper toUpper scs)
35 mapM_ (hPutStrLn h) (mapSC "upper" upper toUpper scs)
35 mapM_ (hPutStrLn h) (mapSC "lower" lower toLower scs)
36 mapM_ (hPutStrLn h) (mapSC "lower" lower toLower scs)
scripts/SpecialCasing.hs+10−7
@@ -11,6 +11,7 @@ module SpecialCasing
11 ) where
11 ) where
12
12
13import Arsec
13import Arsec
14+import Data.List (sort)
14
15
15data SpecialCasing = SC { scComments :: [Comment], scCasing :: [Case] }
16data SpecialCasing = SC { scComments :: [Comment], scCasing :: [Case] }
16 deriving (Show)
17 deriving (Show)
@@ -40,14 +41,16 @@ parseSC name = parse entries name <$> readFile name
40mapSC :: String -> (Case -> String) -> (Char -> Char) -> SpecialCasing
41mapSC :: String -> (Case -> String) -> (Char -> Char) -> SpecialCasing
41 -> [String]
42 -> [String]
42mapSC which access twiddle (SC _ ms) =
43mapSC 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+ ["};"]
44 where
51 where
45− typ = [which ++ "Mapping :: forall s. Char -> s -> Step (CC s) Char"
52+ count = show (length mappings)
46− ,"{-# NOINLINE " ++ which ++ "Mapping #-}"]
53+ mappings = sort (filter p ms)
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')
51 p c = [k] /= a && a /= [twiddle k] && null (conditions c)
54 p c = [k] /= a && a /= [twiddle k] && null (conditions c)
52 where a = access c
55 where a = access c
53 k = code c
56 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 @@
1count = 1000
1count = 1000
2
2
3−all: coverage literal-rule-test
4−
5−literal-rule-test:
6− ./literal-rule-test.sh
7−
8coverage: build coverage/hpc_index.html
3coverage: build coverage/hpc_index.html
9
4
10build: text-test-data
5build: text-test-data
@@ -37,4 +32,4 @@ coverage/hpc_index.html: coverage/coverage.tix
37clean:
32clean:
38 rm -rf dist coverage .hpc
33 rm -rf dist coverage .hpc
39
34
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`
516 (unpackS . S.takeWhile p . S.filter q)
516 (unpackS . S.takeWhile p . S.filter q)
517t_takeWhile p = L.takeWhile p `eqP` (unpackS . T.takeWhile p)
517t_takeWhile p = L.takeWhile p `eqP` (unpackS . T.takeWhile p)
518tl_takeWhile p = L.takeWhile p `eqP` (unpackS . TL.takeWhile p)
518tl_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)
523s_dropWhile p = L.dropWhile p `eqP` (unpackS . S.dropWhile p)
519s_dropWhile p = L.dropWhile p `eqP` (unpackS . S.dropWhile p)
524s_dropWhile_s p = L.dropWhile p `eqP` (unpackS . S.unstream . S.dropWhile p)
520s_dropWhile_s p = L.dropWhile p `eqP` (unpackS . S.unstream . S.dropWhile p)
525sf_dropWhile q p = (L.dropWhile p . L.filter q) `eqP`
521sf_dropWhile q p = (L.dropWhile p . L.filter q) `eqP`
@@ -1146,8 +1142,6 @@ tests =
1146 testProperty "sf_takeWhile" sf_takeWhile,
1142 testProperty "sf_takeWhile" sf_takeWhile,
1147 testProperty "t_takeWhile" t_takeWhile,
1143 testProperty "t_takeWhile" t_takeWhile,
1148 testProperty "tl_takeWhile" tl_takeWhile,
1144 testProperty "tl_takeWhile" tl_takeWhile,
1149− testProperty "t_takeWhileEnd" t_takeWhileEnd,
1150− testProperty "tl_takeWhileEnd" tl_takeWhileEnd,
1151 testProperty "sf_dropWhile" sf_dropWhile,
1145 testProperty "sf_dropWhile" sf_dropWhile,
1152 testProperty "s_dropWhile" s_dropWhile,
1146 testProperty "s_dropWhile" s_dropWhile,
1153 testProperty "s_dropWhile_s" s_dropWhile_s,
1147 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
3synopsis: Functional tests for the text package
3synopsis: Functional tests for the text package
4description: Functional tests for the text package
4description: Functional tests for the text package
5homepage: https://github.com/bos/text
5homepage: https://github.com/bos/text
6−license: BSD2
6+license: BSD3
7license-file: ../LICENSE
7license-file: ../LICENSE
8author: Jasper Van der Jeugt <jaspervdj@gmail.com>,
8author: Jasper Van der Jeugt <jaspervdj@gmail.com>,
9 Bryan O'Sullivan <bos@serpentine.com>,
9 Bryan O'Sullivan <bos@serpentine.com>,
@@ -114,7 +114,6 @@ library
114 Data.Text.Internal.Lazy.Search
114 Data.Text.Internal.Lazy.Search
115 Data.Text.Internal.Private
115 Data.Text.Internal.Private
116 Data.Text.Read
116 Data.Text.Read
117− Data.Text.Show
118 Data.Text.Internal.Read
117 Data.Text.Internal.Read
119 Data.Text.Internal.Search
118 Data.Text.Internal.Search
120 Data.Text.Unsafe
119 Data.Text.Unsafe
@@ -136,7 +135,6 @@ library
136 build-depends:
135 build-depends:
137 array,
136 array,
138 base == 4.*,
137 base == 4.*,
139− binary,
140 bytestring,
138 bytestring,
141 deepseq,
139 deepseq,
142 ghc-prim,
140 ghc-prim,
text.cabal+8−27
@@ -1,5 +1,5 @@
1name: text
1name: text
2−version: 1.2.2.1
2+version: 1.2.0.4
3homepage: https://github.com/bos/text
3homepage: https://github.com/bos/text
4bug-reports: https://github.com/bos/text/issues
4bug-reports: https://github.com/bos/text/issues
5synopsis: An efficient packed Unicode text type.
5synopsis: An efficient packed Unicode text type.
@@ -31,7 +31,7 @@ description:
31 the @text-icu@ package:
31 the @text-icu@ package:
32 <http://hackage.haskell.org/package/text-icu>
32 <http://hackage.haskell.org/package/text-icu>
33
33
34−license: BSD2
34+license: BSD3
35license-file: LICENSE
35license-file: LICENSE
36author: Bryan O'Sullivan <bos@serpentine.com>
36author: Bryan O'Sullivan <bos@serpentine.com>
37maintainer: Bryan O'Sullivan <bos@serpentine.com>
37maintainer: Bryan O'Sullivan <bos@serpentine.com>
@@ -64,11 +64,6 @@ extra-source-files:
64 tests/scripts/*.sh
64 tests/scripts/*.sh
65 tests/text-tests.cabal
65 tests/text-tests.cabal
66
66
67−flag bytestring-builder
68− description: Depend on the bytestring-builder package for backwards compatibility.
69− default: False
70− manual: False
71−
72flag developer
67flag developer
73 description: operate in developer mode
68 description: operate in developer mode
74 default: False
69 default: False
@@ -76,11 +71,9 @@ flag developer
76
71
77flag integer-simple
72flag integer-simple
78 description: Use the simple integer library instead of GMP
73 description: Use the simple integer library instead of GMP
79− default: False
80− manual: False
81
74
82library
75library
83− c-sources: cbits/cbits.c
76+ c-sources: cbits/case_mapping.c cbits/cbits.c
84 include-dirs: include
77 include-dirs: include
85
78
86 exposed-modules:
79 exposed-modules:
@@ -102,7 +95,6 @@ library
102 Data.Text.Internal.Encoding.Utf8
95 Data.Text.Internal.Encoding.Utf8
103 Data.Text.Internal.Functions
96 Data.Text.Internal.Functions
104 Data.Text.Internal.Fusion
97 Data.Text.Internal.Fusion
105− Data.Text.Internal.Fusion.CaseMapping
106 Data.Text.Internal.Fusion.Common
98 Data.Text.Internal.Fusion.Common
107 Data.Text.Internal.Fusion.Size
99 Data.Text.Internal.Fusion.Size
108 Data.Text.Internal.Fusion.Types
100 Data.Text.Internal.Fusion.Types
@@ -128,21 +120,16 @@ library
128 Data.Text.Read
120 Data.Text.Read
129 Data.Text.Unsafe
121 Data.Text.Unsafe
130
122
131− other-modules:
132− Data.Text.Show
133−
134 build-depends:
123 build-depends:
135 array >= 0.3,
124 array >= 0.3,
136 base >= 4.2 && < 5,
125 base >= 4.2 && < 5,
137− binary,
138 deepseq >= 1.1.0.0,
126 deepseq >= 1.1.0.0,
139 ghc-prim >= 0.2
127 ghc-prim >= 0.2
140
128
141− if flag(bytestring-builder)
129+ if impl(ghc >= 7.7)
142− build-depends: bytestring >= 0.9 && < 0.10.4,
130+ build-depends: bytestring >= 0.10.4.0
143− bytestring-builder >= 0.10.4
144 else
131 else
145− build-depends: bytestring >= 0.10.4
132+ build-depends: bytestring >= 0.9
146
133
147 cpp-options: -DHAVE_DEEPSEQ
134 cpp-options: -DHAVE_DEEPSEQ
148 ghc-options: -Wall -fwarn-tabs -funbox-strict-fields -O2
135 ghc-options: -Wall -fwarn-tabs -funbox-strict-fields -O2
@@ -162,7 +149,7 @@ test-suite tests
162 type: exitcode-stdio-1.0
149 type: exitcode-stdio-1.0
163 hs-source-dirs: tests .
150 hs-source-dirs: tests .
164 main-is: Tests.hs
151 main-is: Tests.hs
165− c-sources: cbits/cbits.c
152+ c-sources: cbits/case_mapping.c cbits/cbits.c
166 include-dirs: include
153 include-dirs: include
167
154
168 ghc-options:
155 ghc-options:
@@ -176,7 +163,7 @@ test-suite tests
176 QuickCheck >= 2.7,
163 QuickCheck >= 2.7,
177 array,
164 array,
178 base,
165 base,
179− binary,
166+ bytestring,
180 deepseq,
167 deepseq,
181 directory,
168 directory,
182 ghc-prim,
169 ghc-prim,
@@ -186,12 +173,6 @@ test-suite tests
186 test-framework-hunit >= 0.2,
173 test-framework-hunit >= 0.2,
187 test-framework-quickcheck2 >= 0.2
174 test-framework-quickcheck2 >= 0.2
188
175
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−
195 if flag(integer-simple)
176 if flag(integer-simple)
196 cpp-options: -DINTEGER_SIMPLE
177 cpp-options: -DINTEGER_SIMPLE
197 build-depends: integer-simple >= 0.1 && < 0.5
178 build-depends: integer-simple >= 0.1 && < 0.5