on master help sign in
39 files changed+1503−1322
since splitsnapshots
unifiedsplit
.gitignore+1 .hgtags+9 Data/Text.hs+81−76 Data/Text/Array.hs+5−4 Data/Text/Encoding.hs+9−20 Data/Text/Encoding/Error.hs+3−1 Data/Text/Internal/Builder.hs+17−2 Data/Text/Internal/Builder/Functions.hs+2−1 Data/Text/Internal/Builder/Int/Digits.hs+1−1 Data/Text/Internal/Fusion.hs+34−24 Data/Text/Internal/Fusion/CaseMapping.hs+842 Data/Text/Internal/Fusion/Common.hs+72−117 Data/Text/Internal/Fusion/Types.hs+8−13 Data/Text/Internal/Read.hs+3−3 Data/Text/Lazy.hs+76−12 Data/Text/Lazy/Builder.hs+1−1 Data/Text/Lazy/Builder/Int.hs+4−4 Data/Text/Lazy/Encoding.hs+7−18 Data/Text/Lazy/Read.hs+4−2 Data/Text/Read.hs+1−1 Data/Text/Show.hs+89 benchmarks/haskell/Benchmarks.hs+1−1 benchmarks/haskell/Benchmarks/Pure.hs+7 benchmarks/haskell/Benchmarks/ReadNumbers.hs+2−5 benchmarks/haskell/Benchmarks/Stream.hs+16−5 benchmarks/text-benchmarks.cabal+14−4 cbits/case_mapping.c−852 cbits/cbits.c−94 changelog.md+75−3 scripts/Arsec.hs+4−17 scripts/CaseFolding.hs+7−11 scripts/CaseMapping.hs+9−10 scripts/SpecialCasing.hs+7−10 tests/LiteralRuleTest.hs+21 tests/Makefile+6−1 tests/Tests/Properties.hs+6 tests/literal-rule-test.sh+29 tests/text-tests.cabal+3−1 text.cabal+27−8
.gitignore+1
@@ -1,2 +1,3 @@
11dist
22cabal-dev
3+cabal.sandbox.config
.hgtags+9
@@ -50,8 +50,17 @@ d99cd091cdf71ce807a4255f6cc509c3154f51ea 0.11.3.1
5050fb7299f22449750c653ac64dee4bd63c13ea6e4c 1.1.1.1
5151eb170cb533b63534d166b5fd5344b36676adf140 1.1.1.2
5252e749e05f715d02445803f653cd3d97d5395d7c6f 1.1.1.3
53+b0dff8ca1142595bab489a768ca62e6a6805aac4 1.1.1.4
5354f8a60279237c1c28e094868740d9188dd94fcc9e 1.2.0.0
54556231451979b2d33e28038b75f2dab19c9731f5c3 1.2.0.1
555699a3503b4ad001fc1894e90286e96d7dea1e9195 1.2.0.2
565747f138edf15576b9adaeed64784e30811099f202 1.2.0.3
57580b064b0c69106bbcd13cb0099e72ae5fa2347bf0 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+81−76
@@ -129,6 +129,7 @@ module Data.Text
129129 , drop
130130 , dropEnd
131131 , takeWhile
132+ , takeWhileEnd
132133 , dropWhile
133134 , dropWhileEnd
134135 , dropAround
@@ -191,11 +192,12 @@ module Data.Text
191192
192193 -- * Low level operations
193194 , copy
195+ , unpackCString#
194196 ) where
195197
196198import Prelude (Char, Bool(..), Int, Maybe(..), String,
197199 Eq(..), Ord(..), Ordering(..), (++),
198− Read(..), Show(..),
200+ Read(..),
199201 (&&), (||), (+), (-), (.), ($), ($!), (>>),
200202 not, return, otherwise, quot)
201203#if defined(HAVE_DEEPSEQ)
@@ -211,17 +213,23 @@ import Control.Monad (foldM)
211213import Control.Monad.ST (ST)
212214import qualified Data.Text.Array as A
213215import qualified Data.List as L
216+import Data.Binary (Binary(get, put))
214217import Data.Monoid (Monoid(..))
218+#if MIN_VERSION_base(4,9,0)
219+import Data.Semigroup (Semigroup(..))
220+#endif
215221import Data.String (IsString(..))
216222import qualified Data.Text.Internal.Fusion as S
217223import qualified Data.Text.Internal.Fusion.Common as S
224+import Data.Text.Encoding (decodeUtf8', encodeUtf8)
218225import Data.Text.Internal.Fusion (stream, reverseStream, unstream)
219226import Data.Text.Internal.Private (span_)
220−import Data.Text.Internal (Text(..), empty, empty_, firstf, mul, safe, text)
227+import Data.Text.Internal (Text(..), empty, firstf, mul, safe, text)
228+import Data.Text.Show (singleton, unpack, unpackCString#)
221229import qualified Prelude as P
222230import Data.Text.Unsafe (Iter(..), iter, iter_, lengthWord16, reverseIter,
223231 reverseIter_, unsafeHead, unsafeTail)
224−import Data.Text.Internal.Unsafe.Char (unsafeChr, unsafeWrite)
232+import Data.Text.Internal.Unsafe.Char (unsafeChr)
225233import qualified Data.Text.Internal.Functions as F
226234import qualified Data.Text.Internal.Encoding.Utf16 as U16
227235import Data.Text.Internal.Search (indices)
@@ -230,15 +238,13 @@ import Data.ByteString (ByteString)
230238import qualified Data.Text.Lazy as L
231239import Data.Int (Int64)
232240#endif
233−#if __GLASGOW_HASKELL__ >= 702
234−import qualified GHC.CString as GHC
235−#else
236−import qualified GHC.Base as GHC
237−#endif
241+import GHC.Base (eqInt, neInt, gtInt, geInt, ltInt, leInt)
238242#if __GLASGOW_HASKELL__ >= 708
239243import qualified GHC.Exts as Exts
240244#endif
241−import GHC.Prim (Addr#)
245+#if MIN_VERSION_base(4,7,0)
246+import Text.Printf (PrintfArg, formatArg, formatString)
247+#endif
242248
243249-- $strict
244250--
@@ -324,15 +330,24 @@ instance Eq Text where
324330instance Ord Text where
325331 compare = compareText
326332
327−instance Show Text where
328− showsPrec p ps r = showsPrec p (unpack ps) r
329−
330333instance Read Text where
331334 readsPrec p str = [(pack x,y) | (x,y) <- readsPrec p str]
332335
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+
333344instance Monoid Text where
334345 mempty = empty
346+#if MIN_VERSION_base(4,9,0)
347+ mappend = (<>) -- future-proof definition
348+#else
335349 mappend = append
350+#endif
336351 mconcat = concat
337352
338353instance IsString Text where
@@ -349,6 +364,14 @@ instance Exts.IsList Text where
349364instance NFData Text where rnf !_ = ()
350365#endif
351366
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+
352375-- | This instance preserves data abstraction at the cost of inefficiency.
353376-- We omit reflection services for the sake of data abstraction.
354377--
@@ -372,6 +395,12 @@ instance Data Text where
372395 _ -> P.error "gunfold"
373396 dataTypeOf _ = textDataType
374397
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+
375404packConstr :: Constr
376405packConstr = mkConstr textDataType "pack" [] Prefix
377406
@@ -401,54 +430,6 @@ pack :: String -> Text
401430pack = unstream . S.map safe . S.streamList
402431{-# INLINE [1] pack #-}
403432
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−
452433-- -----------------------------------------------------------------------------
453434-- * Basic functions
454435
@@ -505,8 +486,8 @@ head t = S.head (stream t)
505486uncons :: Text -> Maybe (Char, Text)
506487uncons t@(Text arr off len)
507488 | len <= 0 = Nothing
508− | otherwise = Just (c, text arr (off+d) (len-d))
509− where Iter c d = iter t 0
489+ | otherwise = Just $ let !(Iter c d) = iter t 0
490+ in (c, text arr (off+d) (len-d))
510491{-# INLINE [1] uncons #-}
511492
512493-- | Lifted from Control.Arrow and specialized.
@@ -591,7 +572,9 @@ isSingleton = S.isSingleton . stream
591572-- Subject to fusion.
592573length :: Text -> Int
593574length t = S.length (stream t)
594−{-# INLINE length #-}
575+{-# INLINE [0] length #-}
576+-- length needs to be phased after the compareN/length rules otherwise
577+-- it may inline before the rules have an opportunity to fire.
595578
596579-- | /O(n)/ Compare the count of characters in a 'Text' to a number.
597580-- Subject to fusion.
@@ -610,32 +593,32 @@ compareLength t n = S.compareLengthI (stream t) n
610593
611594{-# RULES
612595"TEXT ==N/length -> compareLength/==EQ" [~1] forall t n.
613− (==) (length t) n = compareLength t n == EQ
596+ eqInt (length t) n = compareLength t n == EQ
614597 #-}
615598
616599{-# RULES
617600"TEXT /=N/length -> compareLength//=EQ" [~1] forall t n.
618− (/=) (length t) n = compareLength t n /= EQ
601+ neInt (length t) n = compareLength t n /= EQ
619602 #-}
620603
621604{-# RULES
622605"TEXT <N/length -> compareLength/==LT" [~1] forall t n.
623− (<) (length t) n = compareLength t n == LT
606+ ltInt (length t) n = compareLength t n == LT
624607 #-}
625608
626609{-# RULES
627610"TEXT <=N/length -> compareLength//=GT" [~1] forall t n.
628− (<=) (length t) n = compareLength t n /= GT
611+ leInt (length t) n = compareLength t n /= GT
629612 #-}
630613
631614{-# RULES
632615"TEXT >N/length -> compareLength/==GT" [~1] forall t n.
633− (>) (length t) n = compareLength t n == GT
616+ gtInt (length t) n = compareLength t n == GT
634617 #-}
635618
636619{-# RULES
637620"TEXT >=N/length -> compareLength//=LT" [~1] forall t n.
638− (>=) (length t) n = compareLength t n /= LT
621+ geInt (length t) n = compareLength t n /= LT
639622 #-}
640623
641624-- -----------------------------------------------------------------------------
@@ -758,7 +741,7 @@ replace needle@(Text _ _ neeLen)
758741-- instead of itself.
759742toCaseFold :: Text -> Text
760743toCaseFold t = unstream (S.toCaseFold (stream t))
761−{-# INLINE [0] toCaseFold #-}
744+{-# INLINE toCaseFold #-}
762745
763746-- | /O(n)/ Convert a string to lower case, using simple case
764747-- conversion. Subject to fusion.
@@ -932,13 +915,13 @@ concatMap f = concat . foldr ((:) . f) []
932915{-# INLINE concatMap #-}
933916
934917-- | /O(n)/ 'any' @p@ @t@ determines whether any character in the
935−-- 'Text' @t@ satisifes the predicate @p@. Subject to fusion.
918+-- 'Text' @t@ satisfies the predicate @p@. Subject to fusion.
936919any :: (Char -> Bool) -> Text -> Bool
937920any p t = S.any p (stream t)
938921{-# INLINE any #-}
939922
940923-- | /O(n)/ 'all' @p@ @t@ determines whether all characters in the
941−-- 'Text' @t@ satisify the predicate @p@. Subject to fusion.
924+-- 'Text' @t@ satisfy the predicate @p@. Subject to fusion.
942925all :: (Char -> Bool) -> Text -> Bool
943926all p t = S.all p (stream t)
944927{-# INLINE all #-}
@@ -1169,6 +1152,27 @@ takeWhile p t@(Text arr off len) = loop 0
11691152 unstream (S.takeWhile p (stream t)) = takeWhile p t
11701153 #-}
11711154
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+
11721176-- | /O(n)/ 'dropWhile' @p@ @t@ returns the suffix remaining after
11731177-- 'takeWhile' @p@ @t@. Subject to fusion.
11741178dropWhile :: (Char -> Bool) -> Text -> Text
@@ -1187,8 +1191,9 @@ dropWhile p t@(Text arr off len) = loop 0 0
11871191 #-}
11881192
11891193-- | /O(n)/ 'dropWhileEnd' @p@ @t@ returns the prefix remaining after
1190−-- dropping characters that fail the predicate @p@ from the end of
1194+-- dropping characters that satisfy the predicate @p@ from the end of
11911195-- @t@. Subject to fusion.
1196+--
11921197-- Examples:
11931198--
11941199-- > dropWhileEnd (=='.') "foo..." == "foo"
@@ -1208,7 +1213,7 @@ dropWhileEnd p t@(Text arr off len) = loop (len-1) len
12081213 #-}
12091214
12101215-- | /O(n)/ 'dropAround' @p@ @t@ returns the substring remaining after
1211−-- dropping characters that fail the predicate @p@ from both the
1216+-- dropping characters that satisfy the predicate @p@ from both the
12121217-- beginning and end of @t@. Subject to fusion.
12131218dropAround :: (Char -> Bool) -> Text -> Text
12141219dropAround p = dropWhile p . dropWhileEnd p
@@ -1535,7 +1540,7 @@ countChar c t = S.countChar c (stream t)
15351540-- equivalent to a pair of 'unpack' operations.
15361541zip :: Text -> Text -> [(Char,Char)]
15371542zip a b = S.unstreamList $ S.zipWith (,) (stream a) (stream b)
1538−{-# INLINE [0] zip #-}
1543+{-# INLINE zip #-}
15391544
15401545-- | /O(n)/ 'zipWith' generalises 'zip' by zipping with the function
15411546-- given as the first argument, instead of a tupling function.
@@ -1543,7 +1548,7 @@ zip a b = S.unstreamList $ S.zipWith (,) (stream a) (stream b)
15431548zipWith :: (Char -> Char -> Char) -> Text -> Text -> Text
15441549zipWith f t1 t2 = unstream (S.zipWith g (stream t1) (stream t2))
15451550 where g a b = safe (f a b)
1546−{-# INLINE [0] zipWith #-}
1551+{-# INLINE zipWith #-}
15471552
15481553-- | /O(n)/ Breaks a 'Text' up into a list of words, delimited by 'Char's
15491554-- representing white space.
Data/Text/Array.hs+5−4
@@ -20,7 +20,7 @@
2020-- > import qualified Data.Text.Array as A
2121--
2222-- The names in this module resemble those in the 'Data.Array' family
23−-- of modules, but are shorter due to the assumption of qualifid
23+-- of modules, but are shorter due to the assumption of qualified
2424-- naming.
2525module Data.Text.Array
2626 (
@@ -74,7 +74,7 @@ import Foreign.C.Types (CInt, CSize)
7474#endif
7575import GHC.Base (ByteArray#, MutableByteArray#, Int(..),
7676 indexWord16Array#, newByteArray#,
77− unsafeCoerce#, writeWord16Array#)
77+ unsafeFreezeByteArray#, writeWord16Array#)
7878import GHC.ST (ST(..), runST)
7979import GHC.Word (Word16(..))
8080import Prelude hiding (length, read)
@@ -130,8 +130,9 @@ array_size_error = error "Data.Text.Array.new: size overflow"
130130
131131-- | Freeze a mutable array. Do not mutate the 'MArray' afterwards!
132132unsafeFreeze :: MArray s -> ST s Array
133−unsafeFreeze MArray{..} = ST $ \s# ->
134− (# s#, Array (unsafeCoerce# maBA)
133+unsafeFreeze MArray{..} = ST $ \s1# ->
134+ case unsafeFreezeByteArray# maBA s1# of
135+ (# s2#, ba# #) -> (# s2#, Array ba#
135136#if defined(ASSERTS)
136137 maLen
137138#endif
Data/Text/Encoding.hs+9−20
@@ -55,13 +55,9 @@ module Data.Text.Encoding
5555 , encodeUtf32LE
5656 , encodeUtf32BE
5757
58−#if MIN_VERSION_bytestring(0,10,4)
5958 -- * Encoding Text using ByteString Builders
60− -- | /Note/ that these functions are only available if built against
61− -- @bytestring >= 0.10.4.0@.
6259 , encodeUtf8Builder
6360 , encodeUtf8BuilderEscaped
64−#endif
6561 ) where
6662
6763#if __GLASGOW_HASKELL__ >= 702
@@ -70,26 +66,17 @@ import Control.Monad.ST.Unsafe (unsafeIOToST, unsafeSTToIO)
7066import Control.Monad.ST (unsafeIOToST, unsafeSTToIO)
7167#endif
7268
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−
8369import Control.Exception (evaluate, try)
8470import Control.Monad.ST (runST)
71+import Data.Bits ((.&.))
8572import Data.ByteString as B
8673import Data.ByteString.Internal as B hiding (c2w)
87−import Data.Text ()
8874import Data.Text.Encoding.Error (OnDecodeError, UnicodeException, strictDecode)
8975import Data.Text.Internal (Text(..), safe, text)
9076import Data.Text.Internal.Private (runText)
91−import Data.Text.Internal.Unsafe.Char (unsafeWrite)
77+import Data.Text.Internal.Unsafe.Char (ord, unsafeWrite)
9278import Data.Text.Internal.Unsafe.Shift (shiftR)
79+import Data.Text.Show ()
9380import Data.Text.Unsafe (unsafeDupablePerformIO)
9481import Data.Word (Word8, Word32)
9582import Foreign.C.Types (CSize(..))
@@ -98,8 +85,13 @@ import Foreign.Marshal.Utils (with)
9885import Foreign.Ptr (Ptr, minusPtr, nullPtr, plusPtr)
9986import Foreign.Storable (Storable, peek, poke)
10087import 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
10192import qualified Data.Text.Array as A
10293import qualified Data.Text.Internal.Encoding.Fusion as E
94+import qualified Data.Text.Internal.Encoding.Utf16 as U16
10395import qualified Data.Text.Internal.Fusion as F
10496
10597#include "text_cbits.h"
@@ -286,7 +278,7 @@ streamDecodeUtf8With onErr = decodeChunk B.empty 0 0
286278 return $! text arr 0 (fromIntegral n)
287279 lastPtr <- peek curPtrPtr
288280 let left = lastPtr `minusPtr` curPtr
289− undecoded = case state of
281+ !undecoded = case state of
290282 UTF8_ACCEPT -> B.empty
291283 _ -> B.append undecoded0 (B.drop left bs)
292284 return $ Some chunkText undecoded
@@ -315,8 +307,6 @@ decodeUtf8' :: ByteString -> Either UnicodeException Text
315307decodeUtf8' = unsafeDupablePerformIO . try . evaluate . decodeUtf8With strictDecode
316308{-# INLINE decodeUtf8' #-}
317309
318−#if MIN_VERSION_bytestring(0,10,4)
319−
320310-- | Encode text to a ByteString 'B.Builder' using UTF-8 encoding.
321311encodeUtf8Builder :: Text -> B.Builder
322312encodeUtf8Builder = encodeUtf8BuilderEscaped (BP.liftFixedToBounded BP.word8)
@@ -377,7 +367,6 @@ encodeUtf8BuilderEscaped be =
377367 outerLoop i (B.BufferRange op ope)
378368 where
379369 poke8 j v = poke (op `plusPtr` j) (fromIntegral v :: Word8)
380−#endif
381370
382371-- | Encode text using UTF-8 encoding.
383372encodeUtf8 :: Text -> ByteString
Data/Text/Encoding/Error.hs+3−1
@@ -1,5 +1,7 @@
11{-# LANGUAGE CPP, DeriveDataTypeable #-}
2−#if __GLASGOW_HASKELL__ >= 702
2+#if __GLASGOW_HASKELL__ >= 704
3+{-# LANGUAGE Safe #-}
4+#elif __GLASGOW_HASKELL__ >= 702
35{-# LANGUAGE Trustworthy #-}
46#endif
57-- |
Data/Text/Internal/Builder.hs+17−2
@@ -6,7 +6,7 @@
66-- Module : Data.Text.Internal.Builder
77-- Copyright : (c) 2013 Bryan O'Sullivan
88-- (c) 2010 Johan Tibell
9−-- License : BSD3-style (see LICENSE)
9+-- License : BSD-style (see LICENSE)
1010--
1111-- Maintainer : Johan Tibell <johan.tibell@gmail.com>
1212-- Stability : experimental
@@ -59,6 +59,9 @@ module Data.Text.Internal.Builder
5959
6060import Control.Monad.ST (ST, runST)
6161import Data.Monoid (Monoid(..))
62+#if MIN_VERSION_base(4,9,0)
63+import Data.Semigroup (Semigroup(..))
64+#endif
6265import Data.Text.Internal (Text(..))
6366import Data.Text.Internal.Lazy (smallChunkSize)
6467import Data.Text.Unsafe (inlineInterleaveST)
@@ -89,12 +92,22 @@ newtype Builder = Builder {
8992 -> ST s [S.Text]
9093 }
9194
95+#if MIN_VERSION_base(4,9,0)
96+instance Semigroup Builder where
97+ (<>) = append
98+ {-# INLINE (<>) #-}
99+#endif
100+
92101instance Monoid Builder where
93102 mempty = empty
94103 {-# INLINE mempty #-}
104+#if MIN_VERSION_base(4,9,0)
105+ mappend = (<>) -- future-proof definition
106+#else
95107 mappend = append
108+#endif
96109 {-# INLINE mappend #-}
97− mconcat = foldr mappend mempty
110+ mconcat = foldr mappend Data.Monoid.mempty
98111 {-# INLINE mconcat #-}
99112
100113instance String.IsString Builder where
@@ -229,6 +242,8 @@ flush = Builder $ \ k buf@(Buffer p o u l) ->
229242 !t = Text arr o u
230243 ts <- inlineInterleaveST (k b)
231244 return $! t : ts
245+{-# INLINE [1] flush #-}
246+-- defer inlining so that flush/flush rule may fire.
232247
233248------------------------------------------------------------------------
234249
Data/Text/Internal/Builder/Functions.hs+2−1
@@ -23,7 +23,8 @@ module Data.Text.Internal.Builder.Functions
2323
2424import Data.Monoid (mappend)
2525import Data.Text.Lazy.Builder (Builder)
26−import GHC.Base
26+import GHC.Base (chr#,ord#,(+#),Int(I#),Char(C#))
27+import Prelude ()
2728
2829-- | Unsafe conversion for decimal digits.
2930{-# INLINE i2d #-}
Data/Text/Internal/Builder/Int/Digits.hs+1−1
@@ -2,7 +2,7 @@
22
33-- Module: Data.Text.Internal.Builder.Int.Digits
44-- Copyright: (c) 2013 Bryan O'Sullivan
5−-- License: BSD3
5+-- License: BSD-style
66-- Maintainer: Bryan O'Sullivan <bos@serpentine.com>
77-- Stability: experimental
88-- Portability: portable
Data/Text/Internal/Fusion.hs+34−24
@@ -98,25 +98,35 @@ reverseStream (Text arr off len) = Stream next (off+len-1) (betweenSize (len `sh
9898-- | /O(n)/ Convert a 'Stream Char' into a 'Text'.
9999unstream :: Stream Char -> Text
100100unstream (Stream next0 s0 len) = runText $ \done -> do
101− let mlen = upperBound 4 len
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
102106 arr0 <- A.new mlen
103− let outer arr top = loop
107+ let outer !arr !maxi = encode
104108 where
105− loop !s !i =
106− case next0 s of
107− Done -> done arr i
108− Skip s' -> loop s' i
109− Yield x s'
110− | j >= top -> {-# SCC "unstream/resize" #-} do
111− let top' = (top + 1) `shiftL` 1
112− arr' <- A.new top'
113− A.copyM arr' 0 arr 0 top
114− outer arr' top' s i
115− | otherwise -> do d <- unsafeWrite arr i x
116− loop s' (i+d)
117− where j | ord x < 0x10000 = i
118− | otherwise = i + 1
119− outer arr0 mlen s0 0
109+ -- keep the common case loop as small as possible
110+ encode !si !di =
111+ case next0 si of
112+ Done -> done arr di
113+ Skip si' -> encode si' di
114+ Yield c si'
115+ -- simply check for the worst case
116+ | maxi < di + 1 -> realloc si di
117+ | otherwise -> do
118+ n <- unsafeWrite arr di c
119+ encode si' (di + n)
120+
121+ -- keep uncommon case separate from the common case code
122+ {-# NOINLINE realloc #-}
123+ realloc !si !di = do
124+ let newlen = (maxi + 1) * 2
125+ arr' <- A.new newlen
126+ A.copyM arr' 0 arr 0 di
127+ outer arr' (newlen - 1) si di
128+
129+ outer arr0 (mlen - 1) s0 0
120130{-# INLINE [0] unstream #-}
121131{-# RULES "STREAM stream/unstream fusion" forall s. stream (unstream s) = s #-}
122132
@@ -166,15 +176,15 @@ reverse (Stream next s len0)
166176-- | /O(n)/ Perform the equivalent of 'scanr' over a list, only with
167177-- the input and result reversed.
168178reverseScanr :: (Char -> Char -> Char) -> Char -> Stream Char -> Stream Char
169−reverseScanr f z0 (Stream next0 s0 len) = Stream next (S1 :*: z0 :*: s0) (len+1) -- HINT maybe too low
179+reverseScanr f z0 (Stream next0 s0 len) = Stream next (Scan1 z0 s0) (len+1) -- HINT maybe too low
170180 where
171181 {-# INLINE next #-}
172− next (S1 :*: z :*: s) = Yield z (S2 :*: z :*: s)
173− next (S2 :*: z :*: s) = case next0 s of
174− Yield x s' -> let !x' = f x z
175− in Yield x' (S2 :*: x' :*: s')
176− Skip s' -> Skip (S2 :*: z :*: s')
177− Done -> Done
182+ next (Scan1 z s) = Yield z (Scan2 z s)
183+ next (Scan2 z s) = case next0 s of
184+ Yield x s' -> let !x' = f x z
185+ in Yield x' (Scan2 x' s')
186+ Skip s' -> Skip (Scan2 z s')
187+ Done -> Done
178188{-# INLINE reverseScanr #-}
179189
180190-- | /O(n)/ Like 'unfoldr', 'unfoldrN' builds a stream from a seed
Data/Text/Internal/Fusion/CaseMapping.hsnew file+842
@@ -0,0 +1,842 @@
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+72−117
@@ -1,7 +1,7 @@
1−{-# LANGUAGE BangPatterns, ForeignFunctionInterface, MagicHash, Rank2Types #-}
1+{-# LANGUAGE BangPatterns, MagicHash, Rank2Types #-}
22-- |
33-- Module : Data.Text.Internal.Fusion.Common
4−-- Copyright : (c) Bryan O'Sullivan 2009, 2012, 2015
4+-- Copyright : (c) Bryan O'Sullivan 2009, 2012
55--
66-- License : BSD-style
77-- Maintainer : bos@serpentine.com
@@ -71,9 +71,6 @@ module Data.Text.Internal.Fusion.Common
7171 -- ** Scans
7272 , scanl
7373
74− -- ** Accumulating maps
75− -- , mapAccumL
76−
7774 -- ** Generation and unfolding
7875 , replicateCharI
7976 , replicateI
@@ -104,24 +101,20 @@ module Data.Text.Internal.Fusion.Common
104101 , zipWith
105102 ) where
106103
107−import Prelude (Bool(..), Char, Eq(..), IO, Int, Integral, Maybe(..),
104+import Prelude (Bool(..), Char, Eq(..), Int, Integral, Maybe(..),
108105 Ord(..), Ordering(..), String, (.), ($), (+), (-), (*), (++),
109− (&&), fmap, fromIntegral, otherwise, return)
106+ (&&), fromIntegral, otherwise)
107+import qualified Data.List as L
108+import qualified Prelude as P
110109import Data.Bits (shiftL)
111110import Data.Char (isLetter)
112111import Data.Int (Int64)
113−import Data.Text.Internal.Fusion.Size
114112import 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)
113+import Data.Text.Internal.Fusion.CaseMapping (foldMapping, lowerMapping, titleMapping,
114+ upperMapping)
115+import Data.Text.Internal.Fusion.Size
120116import GHC.Prim (Addr#, chr#, indexCharOffAddr#, ord#)
121117import GHC.Types (Char(..), Int(..))
122−import qualified Data.Char as Char
123−import qualified Data.List as L
124−import qualified Prelude as P
125118
126119singleton :: Char -> Stream Char
127120singleton c = Stream next False 1
@@ -191,6 +184,9 @@ cons !w (Stream next0 s0 len) = Stream next (C1 s0) (len+1)
191184 Yield x s' -> Yield x (C0 s')
192185{-# INLINE [0] cons #-}
193186
187+data Snoc a = N
188+ | J !a
189+
194190-- | /O(n)/ Adds a character to the end of a stream.
195191snoc :: Stream Char -> Char -> Stream Char
196192snoc (Stream next0 xs0 len) w = Stream next (J xs0) (len+1)
@@ -408,22 +404,6 @@ caseConvert remap (Stream next0 s0 len) = Stream next (CC s0 '\0' '\0') len
408404 Yield c s' -> remap c s'
409405 next (CC s a b) = Yield a (CC s b '\0')
410406
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−
427407-- | /O(n)/ Convert a string to folded case. This function is mainly
428408-- useful for performing caseless (or case insensitive) string
429409-- comparisons.
@@ -439,7 +419,7 @@ convert lookup f c s
439419-- case folded to the Greek small letter letter mu (U+03BC) instead of
440420-- itself.
441421toCaseFold :: Stream Char -> Stream Char
442−toCaseFold = caseConvert (convert to_case_fold Char.toLower)
422+toCaseFold = caseConvert foldMapping
443423{-# INLINE [0] toCaseFold #-}
444424
445425-- | /O(n)/ Convert a string to upper case, using simple case
@@ -447,7 +427,7 @@ toCaseFold = caseConvert (convert to_case_fold Char.toLower)
447427-- For instance, the German eszett (U+00DF) maps to the two-letter
448428-- sequence SS.
449429toUpper :: Stream Char -> Stream Char
450−toUpper = caseConvert (convert to_upper Char.toUpper)
430+toUpper = caseConvert upperMapping
451431{-# INLINE [0] toUpper #-}
452432
453433-- | /O(n)/ Convert a string to lower case, using simple case
@@ -456,7 +436,7 @@ toUpper = caseConvert (convert to_upper Char.toUpper)
456436-- maps to the sequence Latin small letter i (U+0069) followed by
457437-- combining dot above (U+0307).
458438toLower :: Stream Char -> Stream Char
459−toLower = caseConvert (convert to_lower Char.toLower)
439+toLower = caseConvert lowerMapping
460440{-# INLINE [0] toLower #-}
461441
462442-- | /O(n)/ Convert a string to title case, using simple case
@@ -486,24 +466,27 @@ toTitle (Stream next0 s0 len) = Stream next (CC (False :*: s0) '\0' '\0') len
486466 Skip s' -> Skip (CC (letter :*: s') '\0' '\0')
487467 Yield c s'
488468 | letter' -> if letter
489− then convert to_lower Char.toLower c (letter' :*: s')
490− else convert to_title Char.toTitle c (letter' :*: s')
469+ then lowerMapping c (letter' :*: s')
470+ else titleMapping c (letter' :*: s')
491471 | otherwise -> Yield c (CC (letter' :*: s') '\0' '\0')
492472 where letter' = isLetter c
493473 next (CC s a b) = Yield a (CC s b '\0')
494474{-# INLINE [0] toTitle #-}
495475
476+data Justify i s = Just1 !i !s
477+ | Just2 !i !s
478+
496479justifyLeftI :: Integral a => a -> Char -> Stream Char -> Stream Char
497480justifyLeftI k c (Stream next0 s0 len) =
498− Stream next (s0 :*: S1 :*: 0) (larger (fromIntegral k) len)
481+ Stream next (Just1 0 s0) (larger (fromIntegral k) len)
499482 where
500− next (s :*: S1 :*: n) =
483+ next (Just1 n s) =
501484 case next0 s of
502− Done -> next (s :*: S2 :*: n)
503− Skip s' -> Skip (s' :*: S1 :*: n)
504− Yield x s' -> Yield x (s' :*: S1 :*: n+1)
505− next (s :*: S2 :*: n)
506− | n < k = Yield c (s :*: S2 :*: n+1)
485+ Done -> next (Just2 n s)
486+ Skip s' -> Skip (Just1 n s')
487+ Yield x s' -> Yield x (Just1 (n+1) s')
488+ next (Just2 n s)
489+ | n < k = Yield c (Just2 (n+1) s)
507490 | otherwise = Done
508491 {-# INLINE next #-}
509492{-# INLINE [0] justifyLeftI #-}
@@ -610,7 +593,7 @@ concatMap f = foldr (append . f) empty
610593{-# INLINE [0] concatMap #-}
611594
612595-- | /O(n)/ any @p @xs determines if any character in the stream
613−-- @xs@ satisifes the predicate @p@.
596+-- @xs@ satisfies the predicate @p@.
614597any :: (Char -> Bool) -> Stream Char -> Bool
615598any p (Stream next0 s0 _len) = loop_any s0
616599 where
@@ -622,7 +605,7 @@ any p (Stream next0 s0 _len) = loop_any s0
622605{-# INLINE [0] any #-}
623606
624607-- | /O(n)/ all @p @xs determines if all characters in the 'Text'
625−-- @xs@ satisify the predicate @p@.
608+-- @xs@ satisfy the predicate @p@.
626609all :: (Char -> Bool) -> Stream Char -> Bool
627610all p (Stream next0 s0 _len) = loop_all s0
628611 where
@@ -671,50 +654,27 @@ minimum (Stream next0 s0 _len) = loop0_minimum s0
671654-- * Building streams
672655
673656scanl :: (Char -> Char -> Char) -> Char -> Stream Char -> Stream Char
674−scanl f z0 (Stream next0 s0 len) = Stream next (S1 :*: z0 :*: s0) (len+1) -- HINT maybe too low
657+scanl f z0 (Stream next0 s0 len) = Stream next (Scan1 z0 s0) (len+1) -- HINT maybe too low
675658 where
676659 {-# INLINE next #-}
677− next (S1 :*: z :*: s) = Yield z (S2 :*: z :*: s)
678− next (S2 :*: z :*: s) = case next0 s of
679− Yield x s' -> let !x' = f z x
680− in Yield x' (S2 :*: x' :*: s')
681− Skip s' -> Skip (S2 :*: z :*: s')
682− Done -> Done
660+ next (Scan1 z s) = Yield z (Scan2 z s)
661+ next (Scan2 z s) = case next0 s of
662+ Yield x s' -> let !x' = f z x
663+ in Yield x' (Scan2 x' s')
664+ Skip s' -> Skip (Scan2 z s')
665+ Done -> Done
683666{-# INLINE [0] scanl #-}
684667
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−
708668-- -----------------------------------------------------------------------------
709669-- ** Generating and unfolding streams
710670
711671replicateCharI :: Integral a => a -> Char -> Stream Char
712−replicateCharI n c
672+replicateCharI !n !c
713673 | n < 0 = empty
714674 | otherwise = Stream next 0 (fromIntegral n) -- HINT maybe too low
715675 where
716− next i | i >= n = Done
717− | otherwise = Yield c (i + 1)
676+ next !i | i >= n = Done
677+ | otherwise = Yield c (i + 1)
718678{-# INLINE [0] replicateCharI #-}
719679
720680data RI s = RI !s {-# UNPACK #-} !Int64
@@ -779,24 +739,27 @@ take n0 (Stream next0 s0 len) =
779739 Yield x s' -> Yield x ((n-1) :*: s')
780740{-# INLINE [0] take #-}
781741
742+data Drop a s = NS !s
743+ | JS !a !s
744+
782745-- | /O(n)/ drop n, applied to a stream, returns the suffix of the
783746-- stream after the first @n@ characters, or the empty stream if @n@
784747-- is greater than the length of the stream.
785748drop :: Integral a => a -> Stream Char -> Stream Char
786749drop n0 (Stream next0 s0 len) =
787− Stream next (J n0 :*: s0) (len - fromIntegral (max 0 n0))
750+ Stream next (JS n0 s0) (len - fromIntegral (max 0 n0))
788751 where
789752 {-# INLINE next #-}
790− next (J n :*: s)
791− | n <= 0 = Skip (N :*: s)
753+ next (JS n s)
754+ | n <= 0 = Skip (NS s)
792755 | otherwise = case next0 s of
793756 Done -> Done
794− Skip s' -> Skip (J n :*: s')
795− Yield _ s' -> Skip (J (n-1) :*: s')
796− next (N :*: s) = case next0 s of
757+ Skip s' -> Skip (JS n s')
758+ Yield _ s' -> Skip (JS (n-1) s')
759+ next (NS s) = case next0 s of
797760 Done -> Done
798− Skip s' -> Skip (N :*: s')
799− Yield x s' -> Yield x (N :*: s')
761+ Skip s' -> Skip (NS s')
762+ Yield x s' -> Yield x (NS s')
800763{-# INLINE [0] drop #-}
801764
802765-- | takeWhile, applied to a predicate @p@ and a stream, returns the
@@ -814,18 +777,18 @@ takeWhile p (Stream next0 s0 len) = Stream next s0 len -- HINT maybe too high
814777
815778-- | dropWhile @p @xs returns the suffix remaining after takeWhile @p @xs.
816779dropWhile :: (Char -> Bool) -> Stream Char -> Stream Char
817−dropWhile p (Stream next0 s0 len) = Stream next (S1 :*: s0) len -- HINT maybe too high
780+dropWhile p (Stream next0 s0 len) = Stream next (L s0) len -- HINT maybe too high
818781 where
819782 {-# INLINE next #-}
820− next (S1 :*: s) = case next0 s of
783+ next (L s) = case next0 s of
821784 Done -> Done
822− Skip s' -> Skip (S1 :*: s')
823− Yield x s' | p x -> Skip (S1 :*: s')
824− | otherwise -> Yield x (S2 :*: s')
825− next (S2 :*: s) = case next0 s of
785+ Skip s' -> Skip (L s')
786+ Yield x s' | p x -> Skip (L s')
787+ | otherwise -> Yield x (R s')
788+ next (R s) = case next0 s of
826789 Done -> Done
827− Skip s' -> Skip (S2 :*: s')
828− Yield x s' -> Yield x (S2 :*: s')
790+ Skip s' -> Skip (R s')
791+ Yield x s' -> Yield x (R s')
829792{-# INLINE [0] dropWhile #-}
830793
831794-- | /O(n)/ The 'isPrefixOf' function takes two 'Stream's and returns
@@ -932,21 +895,25 @@ findIndicesI p (Stream next s0 _len) = loop_findIndex 0 s0
932895-------------------------------------------------------------------------------
933896-- * Zipping
934897
898+-- | Strict triple.
899+data Zip a b m = Z1 !a !b
900+ | Z2 !a !b !m
901+
935902-- | zipWith generalises 'zip' by zipping with the function given as
936903-- the first argument, instead of a tupling function.
937904zipWith :: (a -> a -> b) -> Stream a -> Stream a -> Stream b
938905zipWith f (Stream next0 sa0 len1) (Stream next1 sb0 len2) =
939− Stream next (sa0 :*: sb0 :*: N) (smaller len1 len2)
906+ Stream next (Z1 sa0 sb0) (smaller len1 len2)
940907 where
941− next (sa :*: sb :*: N) = case next0 sa of
942− Done -> Done
943− Skip sa' -> Skip (sa' :*: sb :*: N)
944− Yield a sa' -> Skip (sa' :*: sb :*: J a)
945−
946− next (sa' :*: sb :*: J a) = case next1 sb of
947− Done -> Done
948− Skip sb' -> Skip (sa' :*: sb' :*: J a)
949− Yield b sb' -> Yield (f a b) (sa' :*: sb' :*: N)
908+ next (Z1 sa sb) = case next0 sa of
909+ Done -> Done
910+ Skip sa' -> Skip (Z1 sa' sb)
911+ Yield a sa' -> Skip (Z2 sa' sb a)
912+
913+ next (Z2 sa' sb a) = case next1 sb of
914+ Done -> Done
915+ Skip sb' -> Skip (Z2 sa' sb' a)
916+ Yield b sb' -> Yield (f a b) (Z1 sa' sb')
950917{-# INLINE [0] zipWith #-}
951918
952919-- | /O(n)/ The 'countCharI' function returns the number of times the
@@ -969,15 +936,3 @@ emptyError func = internalError func "Empty input"
969936
970937internalError :: String -> a
971938internalError 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+8−13
@@ -20,13 +20,11 @@
2020module Data.Text.Internal.Fusion.Types
2121 (
2222 CC(..)
23− , M(..)
24− , M8
2523 , PairS(..)
24+ , Scan(..)
2625 , RS(..)
2726 , Step(..)
2827 , Stream(..)
29− , Switch(..)
3028 , empty
3129 ) where
3230
@@ -36,26 +34,23 @@ import Data.Word (Word8)
3634-- | Specialised tuple for case conversion.
3735data CC s = CC !s {-# UNPACK #-} !Char {-# UNPACK #-} !Char
3836
39−-- | Specialised, strict Maybe-like type.
40−data M a = N
41− | J !a
42−
43−type M8 = M Word8
44−
45−-- Restreaming state.
37+-- | Restreaming state.
4638data RS s
4739 = RS0 !s
4840 | RS1 !s {-# UNPACK #-} !Word8
4941 | RS2 !s {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8
5042 | RS3 !s {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8
5143
52−infixl 2 :*:
44+-- | Strict pair.
5345data PairS a b = !a :*: !b
5446 -- deriving (Eq, Ord, Show)
47+infixl 2 :*:
5548
56−-- | Allow a function over a stream to switch between two states.
57−data Switch = S1 | S2
49+-- | An intermediate result in a scan.
50+data Scan s = Scan1 {-# UNPACK #-} !Char !s
51+ | Scan2 {-# UNPACK #-} !Char !s
5852
53+-- | Intermediate result in a processing pipeline.
5954data Step s a = Done
6055 | Skip !s
6156 | Yield !a !s
Data/Text/Internal/Read.hs+3−3
@@ -7,7 +7,7 @@
77-- Stability : experimental
88-- Portability : GHC
99--
10−-- Common internal functiopns for reading textual data.
10+-- Common internal functions for reading textual data.
1111module Data.Text.Internal.Read
1212 (
1313 IReader
@@ -18,7 +18,7 @@ module Data.Text.Internal.Read
1818 , perhaps
1919 ) where
2020
21−import Control.Applicative (Applicative(..))
21+import Control.Applicative as App (Applicative(..))
2222import Control.Arrow (first)
2323import Control.Monad (ap)
2424import Data.Char (ord)
@@ -38,7 +38,7 @@ instance Applicative (IParser t) where
3838 (<*>) = ap
3939
4040instance Monad (IParser t) where
41− return = pure
41+ return = App.pure
4242 m >>= k = P $ \t -> case runP m t of
4343 Left err -> Left err
4444 Right (a,t') -> runP (k a) t'
Data/Text/Lazy.hs+76−12
@@ -140,6 +140,7 @@ module Data.Text.Lazy
140140 , drop
141141 , dropEnd
142142 , takeWhile
143+ , takeWhileEnd
143144 , dropWhile
144145 , dropWhileEnd
145146 , dropAround
@@ -210,9 +211,13 @@ import Control.DeepSeq (NFData(..))
210211import Data.Int (Int64)
211212import qualified Data.List as L
212213import Data.Char (isSpace)
213−import Data.Data (Data(gfoldl, toConstr, gunfold, dataTypeOf))
214−import Data.Data (mkNoRepType)
214+import Data.Data (Data(gfoldl, toConstr, gunfold, dataTypeOf), constrIndex,
215+ Constr, mkConstr, DataType, mkDataType, Fixity(Prefix))
216+import Data.Binary (Binary(get, put))
215217import Data.Monoid (Monoid(..))
218+#if MIN_VERSION_base(4,9,0)
219+import Data.Semigroup (Semigroup(..))
220+#endif
216221import Data.String (IsString(..))
217222import qualified Data.Text as T
218223import qualified Data.Text.Internal as T
@@ -224,6 +229,7 @@ import Data.Text.Internal.Lazy.Fusion (stream, unstream)
224229import Data.Text.Internal.Lazy (Text(..), chunk, empty, foldlChunks,
225230 foldrChunks, smallChunkSize)
226231import Data.Text.Internal (firstf, safe, text)
232+import Data.Text.Lazy.Encoding (decodeUtf8', encodeUtf8)
227233import qualified Data.Text.Internal.Functions as F
228234import Data.Text.Internal.Lazy.Search (indices)
229235#if __GLASGOW_HASKELL__ >= 702
@@ -235,6 +241,9 @@ import qualified GHC.Base as GHC
235241import qualified GHC.Exts as Exts
236242#endif
237243import GHC.Prim (Addr#)
244+#if MIN_VERSION_base(4,7,0)
245+import Text.Printf (PrintfArg, formatArg, formatString)
246+#endif
238247
239248-- $fusion
240249--
@@ -332,9 +341,21 @@ instance Show Text where
332341instance Read Text where
333342 readsPrec p str = [(pack x,y) | (x,y) <- readsPrec p str]
334343
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+
335352instance Monoid Text where
336353 mempty = empty
354+#if MIN_VERSION_base(4,9,0)
355+ mappend = (<>) -- future-proof definition
356+#else
337357 mappend = append
358+#endif
338359 mconcat = concat
339360
340361instance IsString Text where
@@ -353,11 +374,38 @@ instance NFData Text where
353374 rnf (Chunk _ ts) = rnf ts
354375#endif
355376
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'
356390instance Data Text where
357391 gfoldl f z txt = z pack `f` (unpack txt)
358− toConstr _ = error "Data.Text.Lazy.Text.toConstr"
359− gunfold _ _ = error "Data.Text.Lazy.Text.gunfold"
360− dataTypeOf _ = mkNoRepType "Data.Text.Lazy.Text"
392+ toConstr _ = packConstr
393+ gunfold k z c = case constrIndex c of
394+ 1 -> k (z pack)
395+ _ -> error "Data.Text.Lazy.Text.gunfold"
396+ dataTypeOf _ = textDataType
397+
398+#if MIN_VERSION_base(4,7,0)
399+-- | Only defined for @base-4.7.0.0@ and later
400+instance PrintfArg Text where
401+ formatArg txt = formatString $ unpack txt
402+#endif
403+
404+packConstr :: Constr
405+packConstr = mkConstr textDataType "pack" [] Prefix
406+
407+textDataType :: DataType
408+textDataType = mkDataType "Data.Text.Lazy.Text" [packConstr]
361409
362410-- | /O(n)/ Convert a 'String' into a 'Text'.
363411--
@@ -497,7 +545,7 @@ tail Empty = emptyError "tail"
497545 unstream (S.tail (stream t)) = tail t
498546 #-}
499547
500−-- | /O(1)/ Returns all but the last character of a 'Text', which must
548+-- | /O(n\/c)/ Returns all but the last character of a 'Text', which must
501549-- be non-empty. Subject to fusion.
502550init :: Text -> Text
503551init (Chunk t0 ts0) = go t0 ts0
@@ -533,7 +581,7 @@ isSingleton :: Text -> Bool
533581isSingleton = S.isSingleton . stream
534582{-# INLINE isSingleton #-}
535583
536−-- | /O(1)/ Returns the last character of a 'Text', which must be
584+-- | /O(n\/c)/ Returns the last character of a 'Text', which must be
537585-- non-empty. Subject to fusion.
538586last :: Text -> Char
539587last Empty = emptyError "last"
@@ -833,13 +881,13 @@ concatMap f = concat . foldr ((:) . f) []
833881{-# INLINE concatMap #-}
834882
835883-- | /O(n)/ 'any' @p@ @t@ determines whether any character in the
836−-- 'Text' @t@ satisifes the predicate @p@. Subject to fusion.
884+-- 'Text' @t@ satisfies the predicate @p@. Subject to fusion.
837885any :: (Char -> Bool) -> Text -> Bool
838886any p t = S.any p (stream t)
839887{-# INLINE any #-}
840888
841889-- | /O(n)/ 'all' @p@ @t@ determines whether all characters in the
842−-- 'Text' @t@ satisify the predicate @p@. Subject to fusion.
890+-- 'Text' @t@ satisfy the predicate @p@. Subject to fusion.
843891all :: (Char -> Bool) -> Text -> Bool
844892all p t = S.all p (stream t)
845893{-# INLINE all #-}
@@ -948,7 +996,7 @@ cycle t = let t' = foldrChunks Chunk t' t
948996
949997-- | @'iterate' f x@ returns an infinite 'Text' of repeated applications
950998-- of @f@ to @x@:
951−--
999+--
9521000-- > iterate f x == [x, f x, f (f x), ...]
9531001iterate :: (Char -> Char) -> Char -> Text
9541002iterate f c = let t c' = Chunk (T.singleton c') (t (f c'))
@@ -1096,6 +1144,20 @@ takeWhile p t0 = takeWhile' t0
10961144"LAZY TEXT takeWhile -> unfused" [1] forall p t.
10971145 unstream (S.takeWhile p (stream t)) = takeWhile p t
10981146 #-}
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 #-}
10991161
11001162-- | /O(n)/ 'dropWhile' @p@ @t@ returns the suffix remaining after
11011163-- 'takeWhile' @p@ @t@. Subject to fusion.
@@ -1114,9 +1176,11 @@ dropWhile p t0 = dropWhile' t0
11141176"LAZY TEXT dropWhile -> unfused" [1] forall p t.
11151177 unstream (S.dropWhile p (stream t)) = dropWhile p t
11161178 #-}
1179+
11171180-- | /O(n)/ 'dropWhileEnd' @p@ @t@ returns the prefix remaining after
1118−-- dropping characters that fail the predicate @p@ from the end of
1181+-- dropping characters that satisfy the predicate @p@ from the end of
11191182-- @t@.
1183+--
11201184-- Examples:
11211185--
11221186-- > dropWhileEnd (=='.') "foo..." == "foo"
@@ -1133,7 +1197,7 @@ dropWhileEnd p = go
11331197{-# INLINE dropWhileEnd #-}
11341198
11351199-- | /O(n)/ 'dropAround' @p@ @t@ returns the substring remaining after
1136−-- dropping characters that fail the predicate @p@ from both the
1200+-- dropping characters that satisfy the predicate @p@ from both the
11371201-- beginning and end of @t@. Subject to fusion.
11381202dropAround :: (Char -> Bool) -> Text -> Text
11391203dropAround p = dropWhile p . dropWhileEnd p
Data/Text/Lazy/Builder.hs+1−1
@@ -8,7 +8,7 @@
88-- Module : Data.Text.Lazy.Builder
99-- Copyright : (c) 2013 Bryan O'Sullivan
1010-- (c) 2010 Johan Tibell
11−-- License : BSD3-style (see LICENSE)
11+-- License : BSD-style (see LICENSE)
1212--
1313-- Maintainer : Johan Tibell <johan.tibell@gmail.com>
1414-- Stability : experimental
Data/Text/Lazy/Builder/Int.hs+4−4
@@ -7,7 +7,7 @@
77-- Module: Data.Text.Lazy.Builder.Int
88-- Copyright: (c) 2013 Bryan O'Sullivan
99-- (c) 2011 MailRank, Inc.
10−-- License: BSD3
10+-- License: BSD-style
1111-- Maintainer: Bryan O'Sullivan <bos@serpentine.com>
1212-- Stability: experimental
1313-- Portability: portable
@@ -35,7 +35,7 @@ import Control.Monad.ST
3535
3636#ifdef __GLASGOW_HASKELL__
3737# if defined(INTEGER_GMP)
38−import GHC.Integer.GMP.Internals
38+import GHC.Integer.GMP.Internals (Integer(S#))
3939# elif defined(INTEGER_SIMPLE)
4040import GHC.Integer
4141# else
@@ -55,7 +55,7 @@ decimal :: Integral a => a -> Builder
5555{-# RULES "decimal/Int16" decimal = boundedDecimal :: Int16 -> Builder #-}
5656{-# RULES "decimal/Int32" decimal = boundedDecimal :: Int32 -> Builder #-}
5757{-# RULES "decimal/Int64" decimal = boundedDecimal :: Int64 -> Builder #-}
58−{-# RULES "decimal/Word" decimal = positive :: Word -> Builder #-}
58+{-# RULES "decimal/Word" decimal = positive :: Data.Word.Word -> Builder #-}
5959{-# RULES "decimal/Word8" decimal = positive :: Word8 -> Builder #-}
6060{-# RULES "decimal/Word16" decimal = positive :: Word16 -> Builder #-}
6161{-# RULES "decimal/Word32" decimal = positive :: Word32 -> Builder #-}
@@ -247,7 +247,7 @@ integer base i
247247 PAIR(x,y) -> pblock q <> pblock r <> putB ns
248248 where q = fromInteger x
249249 r = fromInteger y
250− putB _ = mempty
250+ putB _ = Data.Monoid.mempty
251251
252252 int :: Int -> Builder
253253 int x | base == 10 = decimal x
Data/Text/Lazy/Encoding.hs+7−18
@@ -46,30 +46,25 @@ module Data.Text.Lazy.Encoding
4646 , encodeUtf32LE
4747 , encodeUtf32BE
4848
49−#if MIN_VERSION_bytestring(0,10,4)
5049 -- * Encoding Text using ByteString Builders
5150 , encodeUtf8Builder
5251 , encodeUtf8BuilderEscaped
53−#endif
5452 ) where
5553
5654import Control.Exception (evaluate, try)
55+import Data.Monoid (Monoid(..))
5756import Data.Text.Encoding.Error (OnDecodeError, UnicodeException, strictDecode)
5857import Data.Text.Internal.Lazy (Text(..), chunk, empty, foldrChunks)
59−import qualified Data.ByteString as S
60−import qualified Data.ByteString.Lazy as B
61−import qualified Data.ByteString.Lazy.Internal as B
62−import qualified Data.ByteString.Unsafe as B
63−#if MIN_VERSION_bytestring(0,10,4)
6458import Data.Word (Word8)
65−import Data.Monoid (mappend, mempty)
59+import qualified Data.ByteString as S
6660import qualified Data.ByteString.Builder as B
6761import qualified Data.ByteString.Builder.Extra as B (safeStrategy, toLazyByteStringWith)
6862import qualified Data.ByteString.Builder.Prim as BP
63+import qualified Data.ByteString.Lazy as B
64+import qualified Data.ByteString.Lazy.Internal as B
65+import qualified Data.ByteString.Unsafe as B
6966import qualified Data.Text as T
70−#endif
7167import qualified Data.Text.Encoding as TE
72−import qualified Data.Text.Lazy as L
7368import qualified Data.Text.Internal.Lazy.Encoding.Fusion as E
7469import qualified Data.Text.Internal.Lazy.Fusion as F
7570import Data.Text.Unsafe (unsafeDupablePerformIO)
@@ -110,7 +105,7 @@ decodeUtf8With onErr (B.Chunk b0 bs0) =
110105 | S.null l = empty
111106 | otherwise = case onErr desc (Just (B.unsafeHead l)) of
112107 Nothing -> empty
113− Just c -> L.singleton c
108+ Just c -> Chunk (T.singleton c) Empty
114109 desc = "Data.Text.Lazy.Encoding.decodeUtf8With: Invalid UTF-8 stream"
115110decodeUtf8With _ _ = empty
116111
@@ -147,7 +142,6 @@ decodeUtf8' bs = unsafeDupablePerformIO $ do
147142{-# INLINE decodeUtf8' #-}
148143
149144encodeUtf8 :: Text -> B.ByteString
150−#if MIN_VERSION_bytestring(0,10,4)
151145encodeUtf8 Empty = B.empty
152146encodeUtf8 lt@(Chunk t _) =
153147 B.toLazyByteStringWith strategy B.empty $ encodeUtf8Builder lt
@@ -162,18 +156,13 @@ encodeUtf8 lt@(Chunk t _) =
162156
163157encodeUtf8Builder :: Text -> B.Builder
164158encodeUtf8Builder =
165− foldrChunks (\c b -> TE.encodeUtf8Builder c `mappend` b) mempty
159+ foldrChunks (\c b -> TE.encodeUtf8Builder c `mappend` b) Data.Monoid.mempty
166160
167161{-# INLINE encodeUtf8BuilderEscaped #-}
168162encodeUtf8BuilderEscaped :: BP.BoundedPrim Word8 -> Text -> B.Builder
169163encodeUtf8BuilderEscaped prim =
170164 foldrChunks (\c b -> TE.encodeUtf8BuilderEscaped prim c `mappend` b) mempty
171165
172−#else
173−encodeUtf8 (Chunk c cs) = B.Chunk (TE.encodeUtf8 c) (encodeUtf8 cs)
174−encodeUtf8 Empty = B.Empty
175−#endif
176−
177166-- | Decode text from little endian UTF-16 encoding.
178167decodeUtf16LEWith :: OnDecodeError -> B.ByteString -> Text
179168decodeUtf16LEWith onErr bs = F.unstream (E.streamUtf16LE onErr bs)
Data/Text/Lazy/Read.hs+4−2
@@ -1,5 +1,7 @@
11{-# LANGUAGE OverloadedStrings, CPP #-}
2−#if __GLASGOW_HASKELL__ >= 702
2+#if __GLASGOW_HASKELL__ >= 704
3+{-# LANGUAGE Safe #-}
4+#elif __GLASGOW_HASKELL__ >= 702
35{-# LANGUAGE Trustworthy #-}
46#endif
57
@@ -54,7 +56,7 @@ decimal :: Integral a => Reader a
5456{-# SPECIALIZE decimal :: Reader Int32 #-}
5557{-# SPECIALIZE decimal :: Reader Int64 #-}
5658{-# SPECIALIZE decimal :: Reader Integer #-}
57−{-# SPECIALIZE decimal :: Reader Word #-}
59+{-# SPECIALIZE decimal :: Reader Data.Word.Word #-}
5860{-# SPECIALIZE decimal :: Reader Word8 #-}
5961{-# SPECIALIZE decimal :: Reader Word16 #-}
6062{-# SPECIALIZE decimal :: Reader Word32 #-}
Data/Text/Read.hs+1−1
@@ -55,7 +55,7 @@ decimal :: Integral a => Reader a
5555{-# SPECIALIZE decimal :: Reader Int32 #-}
5656{-# SPECIALIZE decimal :: Reader Int64 #-}
5757{-# SPECIALIZE decimal :: Reader Integer #-}
58−{-# SPECIALIZE decimal :: Reader Word #-}
58+{-# SPECIALIZE decimal :: Reader Data.Word.Word #-}
5959{-# SPECIALIZE decimal :: Reader Word8 #-}
6060{-# SPECIALIZE decimal :: Reader Word16 #-}
6161{-# SPECIALIZE decimal :: Reader Word32 #-}
Data/Text/Show.hsnew file+89
@@ -0,0 +1,89 @@
1+{-# LANGUAGE CPP, MagicHash #-}
2+{-# OPTIONS_GHC -fno-warn-orphans #-}
3+#if __GLASGOW_HASKELL__ >= 702
4+{-# LANGUAGE Trustworthy #-}
5+#endif
6+
7+-- |
8+-- Module : Data.Text.Show
9+-- Copyright : (c) 2009-2015 Bryan O'Sullivan
10+--
11+-- License : BSD-style
12+-- Maintainer : bos@serpentine.com
13+-- Stability : experimental
14+-- Portability : GHC
15+
16+module Data.Text.Show
17+ (
18+ singleton
19+ , unpack
20+ , unpackCString#
21+ ) where
22+
23+import Control.Monad.ST (ST)
24+import Data.Text.Internal (Text(..), empty_, safe)
25+import Data.Text.Internal.Fusion (stream, unstream)
26+import Data.Text.Internal.Unsafe.Char (unsafeWrite)
27+import GHC.Prim (Addr#)
28+import qualified Data.Text.Array as A
29+import qualified Data.Text.Internal.Fusion.Common as S
30+
31+#if __GLASGOW_HASKELL__ >= 702
32+import qualified GHC.CString as GHC
33+#else
34+import qualified GHC.Base as GHC
35+#endif
36+
37+instance Show Text where
38+ showsPrec p ps r = showsPrec p (unpack ps) r
39+
40+-- | /O(n)/ Convert a 'Text' into a 'String'. Subject to fusion.
41+unpack :: Text -> String
42+unpack = S.unstreamList . stream
43+{-# INLINE [1] unpack #-}
44+
45+-- | /O(n)/ Convert a literal string into a 'Text'. Subject to
46+-- fusion.
47+--
48+-- This is exposed solely for people writing GHC rewrite rules.
49+unpackCString# :: Addr# -> Text
50+unpackCString# addr# = unstream (S.streamCString# addr#)
51+{-# NOINLINE unpackCString# #-}
52+
53+{-# RULES "TEXT literal" [1] forall a.
54+ unstream (S.map safe (S.streamList (GHC.unpackCString# a)))
55+ = unpackCString# a #-}
56+
57+{-# RULES "TEXT literal UTF8" [1] forall a.
58+ unstream (S.map safe (S.streamList (GHC.unpackCStringUtf8# a)))
59+ = unpackCString# a #-}
60+
61+{-# RULES "TEXT empty literal" [1]
62+ unstream (S.map safe (S.streamList []))
63+ = empty_ #-}
64+
65+{-# RULES "TEXT singleton literal" [1] forall a.
66+ unstream (S.map safe (S.streamList [a]))
67+ = singleton_ a #-}
68+
69+-- | /O(1)/ Convert a character into a Text. Subject to fusion.
70+-- Performs replacement on invalid scalar values.
71+singleton :: Char -> Text
72+singleton = unstream . S.singleton . safe
73+{-# INLINE [1] singleton #-}
74+
75+{-# RULES "TEXT singleton" forall a.
76+ unstream (S.singleton (safe a))
77+ = singleton_ a #-}
78+
79+-- This is intended to reduce inlining bloat.
80+singleton_ :: Char -> Text
81+singleton_ c = Text (A.run x) 0 len
82+ where x :: ST s (A.MArray s)
83+ x = do arr <- A.new len
84+ _ <- unsafeWrite arr 0 d
85+ return arr
86+ len | d < '\x10000' = 1
87+ | otherwise = 2
88+ d = safe c
89+{-# NOINLINE singleton_ #-}
benchmarks/haskell/Benchmarks.hs+1−1
@@ -53,7 +53,7 @@ benchmarks = do
5353 , Mul.benchmark
5454 , Pure.benchmark "tiny" (tf "tiny.txt")
5555 , Pure.benchmark "ascii" (tf "ascii-small.txt")
56− , Pure.benchmark "france" (tf "france.html")
56+ -- , Pure.benchmark "france" (tf "france.html")
5757 , Pure.benchmark "russian" (tf "russian-small.txt")
5858 , Pure.benchmark "japanese" (tf "japanese.txt")
5959 , ReadNumbers.benchmark (tf "numbers.txt")
benchmarks/haskell/Benchmarks/Pure.hs+7
@@ -262,6 +262,13 @@ benchmark kind fp = do
262262 , benchBSL $ nf (BL.map toUpper) bla
263263 , benchS $ nf (L.map toUpper) sa
264264 ]
265+ , bgroup "uncons"
266+ [ benchT $ nf T.uncons ta
267+ , benchTL $ nf TL.uncons tla
268+ , benchBS $ nf BS.uncons bsa
269+ , benchBSL $ nf BL.uncons bla
270+ , benchS $ nf L.uncons sa
271+ ]
265272 , bgroup "words"
266273 [ benchT $ nf T.words ta
267274 , benchTL $ nf TL.words tla
benchmarks/haskell/Benchmarks/ReadNumbers.hs+2−5
@@ -25,8 +25,7 @@ import Data.List (foldl')
2525import Numeric (readDec, readFloat, readHex)
2626import qualified Data.ByteString.Char8 as B
2727import qualified Data.ByteString.Lazy.Char8 as BL
28−import qualified Data.ByteString.Lex.Double as B
29−import qualified Data.ByteString.Lex.Lazy.Double as BL
28+import qualified Data.ByteString.Lex.Fractional as B
3029import qualified Data.Text as T
3130import qualified Data.Text.IO as T
3231import qualified Data.Text.Lazy as TL
@@ -63,12 +62,10 @@ benchmark fp = do
6362 whnf (double . text TL.rational) tl
6463
6564 , bench "DecimalByteString" $ whnf (int . byteString B.readInt) b
66− , bench "DoubleByteString" $ whnf (double . byteString B.readDouble) b
65+ , bench "DoubleByteString" $ whnf (double . byteString B.readDecimal) b
6766
6867 , bench "DecimalLazyByteString" $
6968 whnf (int . byteString BL.readInt) bl
70− , bench "DoubleLazyByteString" $
71− whnf (double . byteString BL.readDouble) bl
7269 ]
7370 where
7471 -- Used for fixing types
benchmarks/haskell/Benchmarks/Stream.hs+16−5
@@ -18,11 +18,11 @@ import qualified Data.Text.Encoding as T
1818import qualified Data.Text.Encoding.Error as E
1919import qualified Data.Text.Internal.Encoding.Fusion as T
2020import qualified Data.Text.Internal.Encoding.Fusion.Common as F
21−import qualified Data.Text.Internal.Fusion as T
21+import qualified Data.Text.Internal.Fusion as F
2222import qualified Data.Text.IO as T
2323import qualified Data.Text.Lazy.Encoding as TL
2424import qualified Data.Text.Internal.Lazy.Encoding.Fusion as TL
25−import qualified Data.Text.Internal.Lazy.Fusion as TL
25+import qualified Data.Text.Internal.Lazy.Fusion as FL
2626import qualified Data.Text.Lazy.IO as TL
2727
2828instance NFData a => NFData (Stream a) where
@@ -53,14 +53,25 @@ benchmark fp = do
5353 !utf32beL = TL.encodeUtf32BE tl
5454
5555 -- For the functions which operate on streams
56− let !s = T.stream t
56+ let !s = F.stream t
5757
5858 return $ bgroup "Stream"
5959
6060 -- Fusion
6161 [ bgroup "stream" $
62− [ bench "Text" $ nf T.stream t
63− , bench "LazyText" $ nf TL.stream tl
62+ [ bench "Text" $ nf F.stream t
63+ , bench "LazyText" $ nf FL.stream tl
64+ ]
65+ -- must perform exactly the same as stream above due to
66+ -- stream/unstream (i.e. stream after unstream) fusion
67+ , bgroup "stream-fusion" $
68+ [ bench "Text" $ nf (F.stream . F.unstream . F.stream) t
69+ , bench "LazyText" $ nf (FL.stream . FL.unstream . FL.stream) tl
70+ ]
71+ -- measure the overhead of unstream after stream
72+ , bgroup "stream-unstream" $
73+ [ bench "Text" $ nf (F.unstream . F.stream) t
74+ , bench "LazyText" $ nf (FL.unstream . FL.stream) tl
6475 ]
6576
6677 -- Encoding.Fusion
benchmarks/text-benchmarks.cabal+14−4
@@ -3,7 +3,7 @@ version: 0.0.0.0
33synopsis: Benchmarks for the text package
44description: Benchmarks for the text package
55homepage: https://bitbucket.org/bos/text
6−license: BSD3
6+license: BSD2
77license-file: ../LICENSE
88author: Jasper Van der Jeugt <jaspervdj@gmail.com>,
99 Bryan O'Sullivan <bos@serpentine.com>,
@@ -15,6 +15,11 @@ build-type: Simple
1515
1616cabal-version: >=1.2
1717
18+flag bytestring-builder
19+ description: Depend on the bytestring-builder package for backwards compatibility.
20+ default: False
21+ manual: False
22+
1823flag llvm
1924 description: use LLVM
2025 default: False
@@ -22,7 +27,7 @@ flag llvm
2227
2328executable text-benchmarks
2429 hs-source-dirs: haskell ..
25− c-sources: ../cbits/case_mapping.c ../cbits/cbits.c
30+ c-sources: ../cbits/cbits.c
2631 cbits/time_iconv.c
2732 include-dirs: ../include
2833 main-is: Benchmarks.hs
@@ -33,8 +38,7 @@ executable text-benchmarks
3338 build-depends: base == 4.*,
3439 binary,
3540 blaze-builder,
36− bytestring,
37− bytestring-lexing,
41+ bytestring-lexing >= 0.5.0,
3842 containers,
3943 criterion >= 0.10.0.0,
4044 deepseq,
@@ -46,6 +50,12 @@ executable text-benchmarks
4650 utf8-string,
4751 vector
4852
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+
4959executable text-multilang
5060 hs-source-dirs: haskell
5161 main-is: Multilang.hs
cbits/case_mapping.cdeleted−852
@@ -1,852 +0,0 @@
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,97 +309,3 @@ _hs_text_encode_utf8(uint8_t **destp, const uint16_t *src, size_t srcoff,
309309
310310 *destp = dest;
311311}
312−
313−/*
314− * Case mapping works as follows. We binary search a dense sorted
315− * table of characters. If we find a match, we return the address of
316− * a three-character sequence which represents the mapping of that
317− * character. Short sequences are padded on the end with nulls.
318− *
319− * We can get away with a dense encoding, representing characters in
320− * these tables as 16-bit values, until whenever the Unicode
321− * consortium defines funky case mappings for code points above
322− * U+FFFF. (The table generator scripts/CaseMapping.hs checks for
323− * this.)
324− */
325−
326−/*
327− * Binary search through a case mapping table.
328− */
329−static ssize_t case_map_search(const uint16_t *table, size_t len, uint16_t key)
330−{
331− ssize_t max = len - 1;
332− ssize_t min = 0;
333−
334− while (max >= min) {
335− ssize_t mid = min + (max - min) / 2;
336−
337− if (table[mid] == key)
338− return mid;
339− if (table[mid] < key)
340− min = mid + 1;
341− else
342− max = mid - 1;
343− }
344− return -1;
345−}
346−
347−extern const uint16_t _hs_text_to_upper_keys[];
348−extern const uint16_t _hs_text_to_upper_values[][3];
349−extern const size_t _hs_text_to_upper_len;
350−
351−const uint16_t *_hs_text_to_upper(uint16_t c)
352−{
353− ssize_t idx = case_map_search(_hs_text_to_upper_keys,
354− _hs_text_to_upper_len,
355− c);
356−
357− if (idx == -1)
358− return NULL;
359− return _hs_text_to_upper_values[idx];
360−}
361−
362−extern const uint16_t _hs_text_to_lower_keys[];
363−extern const uint16_t _hs_text_to_lower_values[][3];
364−extern const size_t _hs_text_to_lower_len;
365−
366−const uint16_t *_hs_text_to_lower(uint16_t c)
367−{
368− ssize_t idx = case_map_search(_hs_text_to_lower_keys,
369− _hs_text_to_lower_len,
370− c);
371−
372− if (idx == -1)
373− return NULL;
374− return _hs_text_to_lower_values[idx];
375−}
376−
377−extern const uint16_t _hs_text_to_case_fold_keys[];
378−extern const uint16_t _hs_text_to_case_fold_values[][3];
379−extern const size_t _hs_text_to_case_fold_len;
380−
381−const uint16_t *_hs_text_to_case_fold(uint16_t c)
382−{
383− ssize_t idx = case_map_search(_hs_text_to_case_fold_keys,
384− _hs_text_to_case_fold_len,
385− c);
386−
387− if (idx == -1)
388− return NULL;
389− return _hs_text_to_case_fold_values[idx];
390−}
391−
392−extern const uint16_t _hs_text_to_title_keys[];
393−extern const uint16_t _hs_text_to_title_values[][3];
394−extern const size_t _hs_text_to_title_len;
395−
396−const uint16_t *_hs_text_to_title(uint16_t c)
397−{
398− ssize_t idx = case_map_search(_hs_text_to_title_keys,
399− _hs_text_to_title_len,
400− c);
401−
402− if (idx == -1)
403− return NULL;
404− return _hs_text_to_title_values[idx];
405−}
changelog.md+75−3
@@ -1,11 +1,83 @@
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+
1581.2.0.5
259
3−* Fixed a space explosion in the GHC inliner by changing how case
4− mapping functions are implemented
60+* Feature parity: repeat, cycle, iterate are now implemented for lazy
61+ Text, and the Data instance is more complete
62+
63+* Build speed: an inliner space explosion has been fixed with toCaseFold
64+
65+* Bug fix: encoding Int to a Builder would infinite-loop if the
66+ integer-simple package was used
67+
68+* Deprecation: OnEncodeError and EncodeError are deprecated, as they
69+ are never used
70+
71+* Internals: some types that are used internally in fusion-related
72+ functions have moved around, been renamed, or been deleted (we don't
73+ bump the major version if .Internal modules change)
74+
75+* Spec compliance: toCaseFold now follows the Unicode 7.0 spec
76+ (updated from 6.3)
577
6781.2.0.4
779
8−* Resurrected compatibility with base < 4.5
80+* Fixed an incompatibility with base < 4.5
981
10821.2.0.3
1183
scripts/Arsec.hs+4−17
@@ -3,9 +3,7 @@ module Arsec
33 Comment
44 , comment
55 , semi
6− , showX
7− , key
8− , value
6+ , showC
97 , unichar
108 , unichars
119 , module Control.Applicative
@@ -20,7 +18,6 @@ module Arsec
2018import Control.Monad
2119import Control.Applicative
2220import Data.Char
23−import Data.List (intercalate)
2421import Numeric
2522import Text.ParserCombinators.Parsec.Char hiding (lower, upper)
2623import Text.ParserCombinators.Parsec.Combinator hiding (optional)
@@ -41,17 +38,7 @@ semi = char ';' *> spaces *> pure ()
4138comment :: Parser Comment
4239comment = (char '#' *> manyTill anyToken (char '\n')) <|> string "\n"
4340
44−showX :: Char -> String
45−showX c
46− | c > '\xffff' = error $ "U+" ++ h ++ " will not fit in 16 bits"
47− | otherwise = "0x" ++ replicate (4 - length h) '0' ++ h
41+showC :: Char -> String
42+showC c = "'\\x" ++ d ++ "'"
4843 where h = showHex (ord c) ""
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"])
44+ d = replicate (4 - length h) '0' ++ h
scripts/CaseFolding.hs+7−11
@@ -11,7 +11,6 @@ module CaseFolding
1111 ) where
1212
1313import Arsec
14−import Data.List (sort)
1514
1615data Fold = Fold {
1716 code :: Char
@@ -35,16 +34,13 @@ parseCF :: FilePath -> IO (Either ParseError CaseFolding)
3534parseCF name = parse entries name <$> readFile name
3635
3736mapCF :: CaseFolding -> [String]
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− ["};"]
37+mapCF (CF _ ms) = typ ++ (map nice . filter p $ ms) ++ [last]
4638 where
47− count = show (length mappings)
48− mappings = sort (filter p ms)
39+ typ = ["foldMapping :: forall s. Char -> s -> Step (CC s) Char"
40+ ,"{-# NOINLINE foldMapping #-}"]
41+ last = "foldMapping c s = Yield (toLower c) (CC s '\\0' '\\0')"
42+ nice c = "-- " ++ name c ++ "\n" ++
43+ "foldMapping " ++ showC (code c) ++ " s = Yield " ++ x ++ " (CC s " ++ y ++ " " ++ z ++ ")"
44+ where [x,y,z] = (map showC . take 3) (mapping c ++ repeat '\0')
4945 p f = status f `elem` "CF" &&
5046 mapping f /= [toLower (code f)]
scripts/CaseMapping.hs+9−10
@@ -8,7 +8,7 @@ import SpecialCasing
88main = do
99 args <- getArgs
1010 let oname = case args of
11− [] -> "../cbits/case_mapping.c"
11+ [] -> "../Data/Text/Internal/Fusion/CaseMapping.hs"
1212 [o] -> o
1313 psc <- parseSC "SpecialCasing.txt"
1414 pcf <- parseCF "CaseFolding.txt"
@@ -19,18 +19,17 @@ main = do
1919 Left err -> print err >> return undefined
2020 Right ms -> return ms
2121 h <- openFile oname WriteMode
22− let comments = map (" *" ++) $
22+ let comments = map ("--" ++) $
2323 take 2 (cfComments cfs) ++ take 2 (scComments scs)
2424 mapM_ (hPutStrLn h) $
25− ["/*"
26− ," * AUTOMATICALLY GENERATED - DO NOT EDIT"
27− ," * Generated by scripts/CaseMapping.hs"
28− ," *"] ++
25+ ["{-# LANGUAGE Rank2Types #-}"
26+ ,"-- AUTOMATICALLY GENERATED - DO NOT EDIT"
27+ ,"-- Generated by scripts/CaseMapping.hs"] ++
2928 comments ++
30− [" */"
31− ,""
32− ,"#include <stdint.h>"
33− ,"#include <sys/types.h>"
29+ [""
30+ ,"module Data.Text.Internal.Fusion.CaseMapping where"
31+ ,"import Data.Char"
32+ ,"import Data.Text.Internal.Fusion.Types"
3433 ,""]
3534 mapM_ (hPutStrLn h) (mapSC "upper" upper toUpper scs)
3635 mapM_ (hPutStrLn h) (mapSC "lower" lower toLower scs)
scripts/SpecialCasing.hs+7−10
@@ -11,7 +11,6 @@ module SpecialCasing
1111 ) where
1212
1313import Arsec
14−import Data.List (sort)
1514
1615data SpecialCasing = SC { scComments :: [Comment], scCasing :: [Case] }
1716 deriving (Show)
@@ -41,16 +40,14 @@ parseSC name = parse entries name <$> readFile name
4140mapSC :: String -> (Case -> String) -> (Char -> Char) -> SpecialCasing
4241 -> [String]
4342mapSC which access twiddle (SC _ ms) =
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− ["};"]
43+ typ ++ (map nice . filter p $ ms) ++ [last]
5144 where
52− count = show (length mappings)
53− mappings = sort (filter p ms)
45+ typ = [which ++ "Mapping :: forall s. Char -> s -> Step (CC s) Char"
46+ ,"{-# NOINLINE " ++ which ++ "Mapping #-}"]
47+ last = which ++ "Mapping c s = Yield (to" ++ ucFirst which ++ " c) (CC s '\\0' '\\0')"
48+ nice c = "-- " ++ name c ++ "\n" ++
49+ which ++ "Mapping " ++ showC (code c) ++ " s = Yield " ++ x ++ " (CC s " ++ y ++ " " ++ z ++ ")"
50+ where [x,y,z] = (map showC . take 3) (access c ++ repeat '\0')
5451 p c = [k] /= a && a /= [twiddle k] && null (conditions c)
5552 where a = access c
5653 k = code c
tests/LiteralRuleTest.hsnew file+21
@@ -0,0 +1,21 @@
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+6−1
@@ -1,5 +1,10 @@
11count = 1000
22
3+all: coverage literal-rule-test
4+
5+literal-rule-test:
6+ ./literal-rule-test.sh
7+
38coverage: build coverage/hpc_index.html
49
510build: text-test-data
@@ -32,4 +37,4 @@ coverage/hpc_index.html: coverage/coverage.tix
3237clean:
3338 rm -rf dist coverage .hpc
3439
35−.PHONY: build coverage
40+.PHONY: build coverage all literal-rule-test
tests/Tests/Properties.hs+6
@@ -516,6 +516,10 @@ sf_takeWhile q p = (L.takeWhile p . L.filter q) `eqP`
516516 (unpackS . S.takeWhile p . S.filter q)
517517t_takeWhile p = L.takeWhile p `eqP` (unpackS . T.takeWhile p)
518518tl_takeWhile p = L.takeWhile p `eqP` (unpackS . TL.takeWhile p)
519+t_takeWhileEnd p = (L.reverse . L.takeWhile p . L.reverse) `eqP`
520+ (unpackS . T.takeWhileEnd p)
521+tl_takeWhileEnd p = (L.reverse . L.takeWhile p . L.reverse) `eqP`
522+ (unpackS . TL.takeWhileEnd p)
519523s_dropWhile p = L.dropWhile p `eqP` (unpackS . S.dropWhile p)
520524s_dropWhile_s p = L.dropWhile p `eqP` (unpackS . S.unstream . S.dropWhile p)
521525sf_dropWhile q p = (L.dropWhile p . L.filter q) `eqP`
@@ -1142,6 +1146,8 @@ tests =
11421146 testProperty "sf_takeWhile" sf_takeWhile,
11431147 testProperty "t_takeWhile" t_takeWhile,
11441148 testProperty "tl_takeWhile" tl_takeWhile,
1149+ testProperty "t_takeWhileEnd" t_takeWhileEnd,
1150+ testProperty "tl_takeWhileEnd" tl_takeWhileEnd,
11451151 testProperty "sf_dropWhile" sf_dropWhile,
11461152 testProperty "s_dropWhile" s_dropWhile,
11471153 testProperty "s_dropWhile_s" s_dropWhile_s,
tests/literal-rule-test.shnew file+29
@@ -0,0 +1,29 @@
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+3−1
@@ -3,7 +3,7 @@ version: 0.0.0.0
33synopsis: Functional tests for the text package
44description: Functional tests for the text package
55homepage: https://github.com/bos/text
6−license: BSD3
6+license: BSD2
77license-file: ../LICENSE
88author: Jasper Van der Jeugt <jaspervdj@gmail.com>,
99 Bryan O'Sullivan <bos@serpentine.com>,
@@ -114,6 +114,7 @@ library
114114 Data.Text.Internal.Lazy.Search
115115 Data.Text.Internal.Private
116116 Data.Text.Read
117+ Data.Text.Show
117118 Data.Text.Internal.Read
118119 Data.Text.Internal.Search
119120 Data.Text.Unsafe
@@ -135,6 +136,7 @@ library
135136 build-depends:
136137 array,
137138 base == 4.*,
139+ binary,
138140 bytestring,
139141 deepseq,
140142 ghc-prim,
text.cabal+27−8
@@ -1,5 +1,5 @@
11name: text
2−version: 1.2.0.4
2+version: 1.2.2.1
33homepage: https://github.com/bos/text
44bug-reports: https://github.com/bos/text/issues
55synopsis: An efficient packed Unicode text type.
@@ -31,7 +31,7 @@ description:
3131 the @text-icu@ package:
3232 <http://hackage.haskell.org/package/text-icu>
3333
34−license: BSD3
34+license: BSD2
3535license-file: LICENSE
3636author: Bryan O'Sullivan <bos@serpentine.com>
3737maintainer: Bryan O'Sullivan <bos@serpentine.com>
@@ -64,6 +64,11 @@ extra-source-files:
6464 tests/scripts/*.sh
6565 tests/text-tests.cabal
6666
67+flag bytestring-builder
68+ description: Depend on the bytestring-builder package for backwards compatibility.
69+ default: False
70+ manual: False
71+
6772flag developer
6873 description: operate in developer mode
6974 default: False
@@ -71,9 +76,11 @@ flag developer
7176
7277flag integer-simple
7378 description: Use the simple integer library instead of GMP
79+ default: False
80+ manual: False
7481
7582library
76− c-sources: cbits/case_mapping.c cbits/cbits.c
83+ c-sources: cbits/cbits.c
7784 include-dirs: include
7885
7986 exposed-modules:
@@ -95,6 +102,7 @@ library
95102 Data.Text.Internal.Encoding.Utf8
96103 Data.Text.Internal.Functions
97104 Data.Text.Internal.Fusion
105+ Data.Text.Internal.Fusion.CaseMapping
98106 Data.Text.Internal.Fusion.Common
99107 Data.Text.Internal.Fusion.Size
100108 Data.Text.Internal.Fusion.Types
@@ -120,16 +128,21 @@ library
120128 Data.Text.Read
121129 Data.Text.Unsafe
122130
131+ other-modules:
132+ Data.Text.Show
133+
123134 build-depends:
124135 array >= 0.3,
125136 base >= 4.2 && < 5,
137+ binary,
126138 deepseq >= 1.1.0.0,
127139 ghc-prim >= 0.2
128140
129− if impl(ghc >= 7.7)
130− build-depends: bytestring >= 0.10.4.0
141+ if flag(bytestring-builder)
142+ build-depends: bytestring >= 0.9 && < 0.10.4,
143+ bytestring-builder >= 0.10.4
131144 else
132− build-depends: bytestring >= 0.9
145+ build-depends: bytestring >= 0.10.4
133146
134147 cpp-options: -DHAVE_DEEPSEQ
135148 ghc-options: -Wall -fwarn-tabs -funbox-strict-fields -O2
@@ -149,7 +162,7 @@ test-suite tests
149162 type: exitcode-stdio-1.0
150163 hs-source-dirs: tests .
151164 main-is: Tests.hs
152− c-sources: cbits/case_mapping.c cbits/cbits.c
165+ c-sources: cbits/cbits.c
153166 include-dirs: include
154167
155168 ghc-options:
@@ -163,7 +176,7 @@ test-suite tests
163176 QuickCheck >= 2.7,
164177 array,
165178 base,
166− bytestring,
179+ binary,
167180 deepseq,
168181 directory,
169182 ghc-prim,
@@ -173,6 +186,12 @@ test-suite tests
173186 test-framework-hunit >= 0.2,
174187 test-framework-quickcheck2 >= 0.2
175188
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+
176195 if flag(integer-simple)
177196 cpp-options: -DINTEGER_SIMPLE
178197 build-depends: integer-simple >= 0.1 && < 0.5