on master help sign in
.hgtags+2
since splitsnapshots
unifiedsplit
@@ -62,3 +62,5 @@ f8a60279237c1c28e094868740d9188dd94fcc9e 1.2.0.0
6278227a84740b70dcd4cf7a65f3bcf603d87e48e2 1.2.1.1
6278227a84740b70dcd4cf7a65f3bcf603d87e48e2 1.2.1.1
6340f268e6735749ef36f487e1d928eaa957bb431d 1.2.1.2
6340f268e6735749ef36f487e1d928eaa957bb431d 1.2.1.2
64631fd055e27fa10983e17e9ad36d1b285b85c661 1.2.1.3
64631fd055e27fa10983e17e9ad36d1b285b85c661 1.2.1.3
65+8221a68ed5ec37028357df9c6c25f52320e54ad9 1.2.2.0
66+ce1c5ac65eb9f5580114b4e380092b05a485e95d 1.2.2.1
Data/Text.hs+23−15
@@ -221,7 +221,7 @@ import Data.Semigroup (Semigroup(..))
221import Data.String (IsString(..))
221import Data.String (IsString(..))
222import qualified Data.Text.Internal.Fusion as S
222import qualified Data.Text.Internal.Fusion as S
223import qualified Data.Text.Internal.Fusion.Common as S
223import qualified Data.Text.Internal.Fusion.Common as S
224−import Data.Text.Encoding (decodeUtf8, encodeUtf8)
224+import Data.Text.Encoding (decodeUtf8', encodeUtf8)
225import Data.Text.Internal.Fusion (stream, reverseStream, unstream)
225import Data.Text.Internal.Fusion (stream, reverseStream, unstream)
226import Data.Text.Internal.Private (span_)
226import Data.Text.Internal.Private (span_)
227import Data.Text.Internal (Text(..), empty, firstf, mul, safe, text)
227import Data.Text.Internal (Text(..), empty, firstf, mul, safe, text)
@@ -238,6 +238,7 @@ import Data.ByteString (ByteString)
238import qualified Data.Text.Lazy as L
238import qualified Data.Text.Lazy as L
239import Data.Int (Int64)
239import Data.Int (Int64)
240#endif
240#endif
241+import GHC.Base (eqInt, neInt, gtInt, geInt, ltInt, leInt)
241#if __GLASGOW_HASKELL__ >= 708
242#if __GLASGOW_HASKELL__ >= 708
242import qualified GHC.Exts as Exts
243import qualified GHC.Exts as Exts
243#endif
244#endif
@@ -365,7 +366,11 @@ instance NFData Text where rnf !_ = ()
365
366
366instance Binary Text where
367instance Binary Text where
367 put t = put (encodeUtf8 t)
368 put t = put (encodeUtf8 t)
369+ get = do
370+ bs <- get
368− get = P.fmap decodeUtf8 get
371+ case decodeUtf8' bs of
372+ P.Left exn -> P.fail (P.show exn)
373+ P.Right a -> P.return a
369
374
370-- | This instance preserves data abstraction at the cost of inefficiency.
375-- | This instance preserves data abstraction at the cost of inefficiency.
371-- We omit reflection services for the sake of data abstraction.
376-- We omit reflection services for the sake of data abstraction.
@@ -481,8 +486,8 @@ head t = S.head (stream t)
481uncons :: Text -> Maybe (Char, Text)
486uncons :: Text -> Maybe (Char, Text)
482uncons t@(Text arr off len)
487uncons t@(Text arr off len)
483 | len <= 0 = Nothing
488 | len <= 0 = Nothing
489+ | otherwise = Just $ let !(Iter c d) = iter t 0
484− | otherwise = Just (c, text arr (off+d) (len-d))
490+ in (c, text arr (off+d) (len-d))
485− where Iter c d = iter t 0
486{-# INLINE [1] uncons #-}
491{-# INLINE [1] uncons #-}
487
492
488-- | Lifted from Control.Arrow and specialized.
493-- | Lifted from Control.Arrow and specialized.
@@ -567,7 +572,9 @@ isSingleton = S.isSingleton . stream
567-- Subject to fusion.
572-- Subject to fusion.
568length :: Text -> Int
573length :: Text -> Int
569length t = S.length (stream t)
574length t = S.length (stream t)
570−{-# 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.
571
578
572-- | /O(n)/ Compare the count of characters in a 'Text' to a number.
579-- | /O(n)/ Compare the count of characters in a 'Text' to a number.
573-- Subject to fusion.
580-- Subject to fusion.
@@ -586,32 +593,32 @@ compareLength t n = S.compareLengthI (stream t) n
586
593
587{-# RULES
594{-# RULES
588"TEXT ==N/length -> compareLength/==EQ" [~1] forall t n.
595"TEXT ==N/length -> compareLength/==EQ" [~1] forall t n.
589− (==) (length t) n = compareLength t n == EQ
596+ eqInt (length t) n = compareLength t n == EQ
590 #-}
597 #-}
591
598
592{-# RULES
599{-# RULES
593"TEXT /=N/length -> compareLength//=EQ" [~1] forall t n.
600"TEXT /=N/length -> compareLength//=EQ" [~1] forall t n.
594− (/=) (length t) n = compareLength t n /= EQ
601+ neInt (length t) n = compareLength t n /= EQ
595 #-}
602 #-}
596
603
597{-# RULES
604{-# RULES
598"TEXT <N/length -> compareLength/==LT" [~1] forall t n.
605"TEXT <N/length -> compareLength/==LT" [~1] forall t n.
599− (<) (length t) n = compareLength t n == LT
606+ ltInt (length t) n = compareLength t n == LT
600 #-}
607 #-}
601
608
602{-# RULES
609{-# RULES
603"TEXT <=N/length -> compareLength//=GT" [~1] forall t n.
610"TEXT <=N/length -> compareLength//=GT" [~1] forall t n.
604− (<=) (length t) n = compareLength t n /= GT
611+ leInt (length t) n = compareLength t n /= GT
605 #-}
612 #-}
606
613
607{-# RULES
614{-# RULES
608"TEXT >N/length -> compareLength/==GT" [~1] forall t n.
615"TEXT >N/length -> compareLength/==GT" [~1] forall t n.
609− (>) (length t) n = compareLength t n == GT
616+ gtInt (length t) n = compareLength t n == GT
610 #-}
617 #-}
611
618
612{-# RULES
619{-# RULES
613"TEXT >=N/length -> compareLength//=LT" [~1] forall t n.
620"TEXT >=N/length -> compareLength//=LT" [~1] forall t n.
614− (>=) (length t) n = compareLength t n /= LT
621+ geInt (length t) n = compareLength t n /= LT
615 #-}
622 #-}
616
623
617-- -----------------------------------------------------------------------------
624-- -----------------------------------------------------------------------------
@@ -908,13 +915,13 @@ concatMap f = concat . foldr ((:) . f) []
908{-# INLINE concatMap #-}
915{-# INLINE concatMap #-}
909
916
910-- | /O(n)/ 'any' @p@ @t@ determines whether any character in the
917-- | /O(n)/ 'any' @p@ @t@ determines whether any character in the
911−-- 'Text' @t@ satisifes the predicate @p@. Subject to fusion.
918+-- 'Text' @t@ satisfies the predicate @p@. Subject to fusion.
912any :: (Char -> Bool) -> Text -> Bool
919any :: (Char -> Bool) -> Text -> Bool
913any p t = S.any p (stream t)
920any p t = S.any p (stream t)
914{-# INLINE any #-}
921{-# INLINE any #-}
915
922
916-- | /O(n)/ 'all' @p@ @t@ determines whether all characters in the
923-- | /O(n)/ 'all' @p@ @t@ determines whether all characters in the
917−-- 'Text' @t@ satisify the predicate @p@. Subject to fusion.
924+-- 'Text' @t@ satisfy the predicate @p@. Subject to fusion.
918all :: (Char -> Bool) -> Text -> Bool
925all :: (Char -> Bool) -> Text -> Bool
919all p t = S.all p (stream t)
926all p t = S.all p (stream t)
920{-# INLINE all #-}
927{-# INLINE all #-}
@@ -1184,8 +1191,9 @@ dropWhile p t@(Text arr off len) = loop 0 0
1184 #-}
1191 #-}
1185
1192
1186-- | /O(n)/ 'dropWhileEnd' @p@ @t@ returns the prefix remaining after
1193-- | /O(n)/ 'dropWhileEnd' @p@ @t@ returns the prefix remaining after
1187−-- dropping characters that fail the predicate @p@ from the end of
1194+-- dropping characters that satisfy the predicate @p@ from the end of
1188-- @t@. Subject to fusion.
1195-- @t@. Subject to fusion.
1196+--
1189-- Examples:
1197-- Examples:
1190--
1198--
1191-- > dropWhileEnd (=='.') "foo..." == "foo"
1199-- > dropWhileEnd (=='.') "foo..." == "foo"
@@ -1205,7 +1213,7 @@ dropWhileEnd p t@(Text arr off len) = loop (len-1) len
1205 #-}
1213 #-}
1206
1214
1207-- | /O(n)/ 'dropAround' @p@ @t@ returns the substring remaining after
1215-- | /O(n)/ 'dropAround' @p@ @t@ returns the substring remaining after
1208−-- dropping characters that fail the predicate @p@ from both the
1216+-- dropping characters that satisfy the predicate @p@ from both the
1209-- beginning and end of @t@. Subject to fusion.
1217-- beginning and end of @t@. Subject to fusion.
1210dropAround :: (Char -> Bool) -> Text -> Text
1218dropAround :: (Char -> Bool) -> Text -> Text
1211dropAround p = dropWhile p . dropWhileEnd p
1219dropAround p = dropWhile p . dropWhileEnd p
Data/Text/Array.hs+5−4
@@ -20,7 +20,7 @@
20-- > import qualified Data.Text.Array as A
20-- > import qualified Data.Text.Array as A
21--
21--
22-- The names in this module resemble those in the 'Data.Array' family
22-- The names in this module resemble those in the 'Data.Array' family
23−-- of modules, but are shorter due to the assumption of qualifid
23+-- of modules, but are shorter due to the assumption of qualified
24-- naming.
24-- naming.
25module Data.Text.Array
25module Data.Text.Array
26 (
26 (
@@ -74,7 +74,7 @@ import Foreign.C.Types (CInt, CSize)
74#endif
74#endif
75import GHC.Base (ByteArray#, MutableByteArray#, Int(..),
75import GHC.Base (ByteArray#, MutableByteArray#, Int(..),
76 indexWord16Array#, newByteArray#,
76 indexWord16Array#, newByteArray#,
77− unsafeCoerce#, writeWord16Array#)
77+ unsafeFreezeByteArray#, writeWord16Array#)
78import GHC.ST (ST(..), runST)
78import GHC.ST (ST(..), runST)
79import GHC.Word (Word16(..))
79import GHC.Word (Word16(..))
80import Prelude hiding (length, read)
80import Prelude hiding (length, read)
@@ -130,8 +130,9 @@ array_size_error = error "Data.Text.Array.new: size overflow"
130
130
131-- | Freeze a mutable array. Do not mutate the 'MArray' afterwards!
131-- | Freeze a mutable array. Do not mutate the 'MArray' afterwards!
132unsafeFreeze :: MArray s -> ST s Array
132unsafeFreeze :: MArray s -> ST s Array
133−unsafeFreeze MArray{..} = ST $ \s# ->
133+unsafeFreeze MArray{..} = ST $ \s1# ->
134− (# s#, Array (unsafeCoerce# maBA)
134+ case unsafeFreezeByteArray# maBA s1# of
135+ (# s2#, ba# #) -> (# s2#, Array ba#
135#if defined(ASSERTS)
136#if defined(ASSERTS)
136 maLen
137 maLen
137#endif
138#endif
Data/Text/Encoding.hs+7−18
@@ -55,13 +55,9 @@ module Data.Text.Encoding
55 , encodeUtf32LE
55 , encodeUtf32LE
56 , encodeUtf32BE
56 , encodeUtf32BE
57
57
58−#if MIN_VERSION_bytestring(0,10,4)
59 -- * Encoding Text using ByteString Builders
58 -- * Encoding Text using ByteString Builders
60− -- | /Note/ that these functions are only available if built against
61− -- @bytestring >= 0.10.4.0@.
62 , encodeUtf8Builder
59 , encodeUtf8Builder
63 , encodeUtf8BuilderEscaped
60 , encodeUtf8BuilderEscaped
64−#endif
65 ) where
61 ) where
66
62
67#if __GLASGOW_HASKELL__ >= 702
63#if __GLASGOW_HASKELL__ >= 702
@@ -70,24 +66,15 @@ import Control.Monad.ST.Unsafe (unsafeIOToST, unsafeSTToIO)
70import Control.Monad.ST (unsafeIOToST, unsafeSTToIO)
66import Control.Monad.ST (unsafeIOToST, unsafeSTToIO)
71#endif
67#endif
72
68
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−
83import Control.Exception (evaluate, try)
69import Control.Exception (evaluate, try)
84import Control.Monad.ST (runST)
70import Control.Monad.ST (runST)
71+import Data.Bits ((.&.))
85import Data.ByteString as B
72import Data.ByteString as B
86import Data.ByteString.Internal as B hiding (c2w)
73import Data.ByteString.Internal as B hiding (c2w)
87import Data.Text.Encoding.Error (OnDecodeError, UnicodeException, strictDecode)
74import Data.Text.Encoding.Error (OnDecodeError, UnicodeException, strictDecode)
88import Data.Text.Internal (Text(..), safe, text)
75import Data.Text.Internal (Text(..), safe, text)
89import Data.Text.Internal.Private (runText)
76import Data.Text.Internal.Private (runText)
90−import Data.Text.Internal.Unsafe.Char (unsafeWrite)
77+import Data.Text.Internal.Unsafe.Char (ord, unsafeWrite)
91import Data.Text.Internal.Unsafe.Shift (shiftR)
78import Data.Text.Internal.Unsafe.Shift (shiftR)
92import Data.Text.Show ()
79import Data.Text.Show ()
93import Data.Text.Unsafe (unsafeDupablePerformIO)
80import Data.Text.Unsafe (unsafeDupablePerformIO)
@@ -98,8 +85,13 @@ import Foreign.Marshal.Utils (with)
98import Foreign.Ptr (Ptr, minusPtr, nullPtr, plusPtr)
85import Foreign.Ptr (Ptr, minusPtr, nullPtr, plusPtr)
99import Foreign.Storable (Storable, peek, poke)
86import Foreign.Storable (Storable, peek, poke)
100import GHC.Base (ByteArray#, MutableByteArray#)
87import 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
101import qualified Data.Text.Array as A
92import qualified Data.Text.Array as A
102import qualified Data.Text.Internal.Encoding.Fusion as E
93import qualified Data.Text.Internal.Encoding.Fusion as E
94+import qualified Data.Text.Internal.Encoding.Utf16 as U16
103import qualified Data.Text.Internal.Fusion as F
95import qualified Data.Text.Internal.Fusion as F
104
96
105#include "text_cbits.h"
97#include "text_cbits.h"
@@ -315,8 +307,6 @@ decodeUtf8' :: ByteString -> Either UnicodeException Text
315decodeUtf8' = unsafeDupablePerformIO . try . evaluate . decodeUtf8With strictDecode
307decodeUtf8' = unsafeDupablePerformIO . try . evaluate . decodeUtf8With strictDecode
316{-# INLINE decodeUtf8' #-}
308{-# INLINE decodeUtf8' #-}
317
309
318−#if MIN_VERSION_bytestring(0,10,4)
319−
320-- | Encode text to a ByteString 'B.Builder' using UTF-8 encoding.
310-- | Encode text to a ByteString 'B.Builder' using UTF-8 encoding.
321encodeUtf8Builder :: Text -> B.Builder
311encodeUtf8Builder :: Text -> B.Builder
322encodeUtf8Builder = encodeUtf8BuilderEscaped (BP.liftFixedToBounded BP.word8)
312encodeUtf8Builder = encodeUtf8BuilderEscaped (BP.liftFixedToBounded BP.word8)
@@ -377,7 +367,6 @@ encodeUtf8BuilderEscaped be =
377 outerLoop i (B.BufferRange op ope)
367 outerLoop i (B.BufferRange op ope)
378 where
368 where
379 poke8 j v = poke (op `plusPtr` j) (fromIntegral v :: Word8)
369 poke8 j v = poke (op `plusPtr` j) (fromIntegral v :: Word8)
380−#endif
381
370
382-- | Encode text using UTF-8 encoding.
371-- | Encode text using UTF-8 encoding.
383encodeUtf8 :: Text -> ByteString
372encodeUtf8 :: Text -> ByteString
Data/Text/Internal/Builder.hs+3−1
@@ -6,7 +6,7 @@
6-- Module : Data.Text.Internal.Builder
6-- Module : Data.Text.Internal.Builder
7-- Copyright : (c) 2013 Bryan O'Sullivan
7-- Copyright : (c) 2013 Bryan O'Sullivan
8-- (c) 2010 Johan Tibell
8-- (c) 2010 Johan Tibell
9−-- License : BSD3-style (see LICENSE)
9+-- License : BSD-style (see LICENSE)
10--
10--
11-- Maintainer : Johan Tibell <johan.tibell@gmail.com>
11-- Maintainer : Johan Tibell <johan.tibell@gmail.com>
12-- Stability : experimental
12-- Stability : experimental
@@ -242,6 +242,8 @@ flush = Builder $ \ k buf@(Buffer p o u l) ->
242 !t = Text arr o u
242 !t = Text arr o u
243 ts <- inlineInterleaveST (k b)
243 ts <- inlineInterleaveST (k b)
244 return $! t : ts
244 return $! t : ts
245+{-# INLINE [1] flush #-}
246+-- defer inlining so that flush/flush rule may fire.
245
247
246------------------------------------------------------------------------
248------------------------------------------------------------------------
247
249
Data/Text/Internal/Builder/Int/Digits.hs+1−1
@@ -2,7 +2,7 @@
2
2
3-- Module: Data.Text.Internal.Builder.Int.Digits
3-- Module: Data.Text.Internal.Builder.Int.Digits
4-- Copyright: (c) 2013 Bryan O'Sullivan
4-- Copyright: (c) 2013 Bryan O'Sullivan
5−-- License: BSD3
5+-- License: BSD-style
6-- Maintainer: Bryan O'Sullivan <bos@serpentine.com>
6-- Maintainer: Bryan O'Sullivan <bos@serpentine.com>
7-- Stability: experimental
7-- Stability: experimental
8-- Portability: portable
8-- Portability: portable
Data/Text/Internal/Fusion.hs+27−17
@@ -98,25 +98,35 @@ reverseStream (Text arr off len) = Stream next (off+len-1) (betweenSize (len `sh
98-- | /O(n)/ Convert a 'Stream Char' into a 'Text'.
98-- | /O(n)/ Convert a 'Stream Char' into a 'Text'.
99unstream :: Stream Char -> Text
99unstream :: Stream Char -> Text
100unstream (Stream next0 s0 len) = runText $ \done -> do
100unstream (Stream next0 s0 len) = runText $ \done -> do
101+ -- Before encoding each char we perform a buffer realloc check assuming
102+ -- worst case encoding size of two 16-bit units for the char. Just add an
103+ -- extra space to the buffer so that we do not end up reallocating even when
104+ -- all the chars are encoded as single unit.
101− let mlen = upperBound 4 len
105+ let mlen = upperBound 4 len + 1
102 arr0 <- A.new mlen
106 arr0 <- A.new mlen
103− let outer arr top = loop
107+ let outer !arr !maxi = encode
104 where
108 where
105− loop !s !i =
109+ -- keep the common case loop as small as possible
110+ encode !si !di =
106− case next0 s of
111+ case next0 si of
107− Done -> done arr i
112+ Done -> done arr di
108− Skip s' -> loop s' i
113+ Skip si' -> encode si' di
109− Yield x s'
114+ Yield c si'
110− | j >= top -> {-# SCC "unstream/resize" #-} do
115+ -- simply check for the worst case
111− let top' = (top + 1) `shiftL` 1
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
112− arr' <- A.new top'
125+ arr' <- A.new newlen
113− A.copyM arr' 0 arr 0 top
126+ A.copyM arr' 0 arr 0 di
114− outer arr' top' s i
127+ outer arr' (newlen - 1) si di
115− | otherwise -> do d <- unsafeWrite arr i x
128+
116− loop s' (i+d)
117− where j | ord x < 0x10000 = i
118− | otherwise = i + 1
119− outer arr0 mlen s0 0
129+ outer arr0 (mlen - 1) s0 0
120{-# INLINE [0] unstream #-}
130{-# INLINE [0] unstream #-}
121{-# RULES "STREAM stream/unstream fusion" forall s. stream (unstream s) = s #-}
131{-# RULES "STREAM stream/unstream fusion" forall s. stream (unstream s) = s #-}
122
132
Data/Text/Internal/Fusion/CaseMapping.hs+286−112
@@ -1,10 +1,10 @@
1{-# LANGUAGE Rank2Types #-}
1{-# LANGUAGE Rank2Types #-}
2-- AUTOMATICALLY GENERATED - DO NOT EDIT
2-- AUTOMATICALLY GENERATED - DO NOT EDIT
3-- Generated by scripts/CaseMapping.hs
3-- Generated by scripts/CaseMapping.hs
4−-- CaseFolding-7.0.0.txt
4+-- CaseFolding-8.0.0.txt
5−-- Date: 2014-04-09, 20:00:56 GMT [MD]
5+-- Date: 2015-01-13, 18:16:36 GMT [MD]
6−-- SpecialCasing-7.0.0.txt
6+-- SpecialCasing-8.0.0.txt
7−-- Date: 2014-03-18, 07:18:02 GMT [MD]
7+-- Date: 2014-12-16, 23:08:04 GMT [MD]
8
8
9module Data.Text.Internal.Fusion.CaseMapping where
9module Data.Text.Internal.Fusion.CaseMapping where
10import Data.Char
10import Data.Char
@@ -337,8 +337,6 @@ foldMapping '\x017f' s = Yield '\x0073' (CC s '\x0000' '\x0000')
337foldMapping '\x01f0' s = Yield '\x006a' (CC s '\x030c' '\x0000')
337foldMapping '\x01f0' s = Yield '\x006a' (CC s '\x030c' '\x0000')
338-- COMBINING GREEK YPOGEGRAMMENI
338-- COMBINING GREEK YPOGEGRAMMENI
339foldMapping '\x0345' s = Yield '\x03b9' (CC s '\x0000' '\x0000')
339foldMapping '\x0345' s = Yield '\x03b9' (CC s '\x0000' '\x0000')
340−-- GREEK CAPITAL LETTER YOT
341−foldMapping '\x037f' s = Yield '\x03f3' (CC s '\x0000' '\x0000')
342-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
340-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
343foldMapping '\x0390' s = Yield '\x03b9' (CC s '\x0308' '\x0301')
341foldMapping '\x0390' s = Yield '\x03b9' (CC s '\x0308' '\x0301')
344-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
342-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
@@ -359,20 +357,20 @@ foldMapping '\x03f0' s = Yield '\x03ba' (CC s '\x0000' '\x0000')
359foldMapping '\x03f1' s = Yield '\x03c1' (CC s '\x0000' '\x0000')
357foldMapping '\x03f1' s = Yield '\x03c1' (CC s '\x0000' '\x0000')
360-- GREEK LUNATE EPSILON SYMBOL
358-- GREEK LUNATE EPSILON SYMBOL
361foldMapping '\x03f5' s = Yield '\x03b5' (CC s '\x0000' '\x0000')
359foldMapping '\x03f5' s = Yield '\x03b5' (CC s '\x0000' '\x0000')
362−-- CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK
363−foldMapping '\x0528' s = Yield '\x0529' (CC s '\x0000' '\x0000')
364−-- CYRILLIC CAPITAL LETTER DZZHE
365−foldMapping '\x052a' s = Yield '\x052b' (CC s '\x0000' '\x0000')
366−-- CYRILLIC CAPITAL LETTER DCHE
367−foldMapping '\x052c' s = Yield '\x052d' (CC s '\x0000' '\x0000')
368−-- CYRILLIC CAPITAL LETTER EL WITH DESCENDER
369−foldMapping '\x052e' s = Yield '\x052f' (CC s '\x0000' '\x0000')
370-- ARMENIAN SMALL LIGATURE ECH YIWN
360-- ARMENIAN SMALL LIGATURE ECH YIWN
371foldMapping '\x0587' s = Yield '\x0565' (CC s '\x0582' '\x0000')
361foldMapping '\x0587' s = Yield '\x0565' (CC s '\x0582' '\x0000')
372−-- GEORGIAN CAPITAL LETTER YN
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
373−foldMapping '\x10c7' s = Yield '\x2d27' (CC s '\x0000' '\x0000')
371+foldMapping '\x13fc' s = Yield '\x13f4' (CC s '\x0000' '\x0000')
374−-- GEORGIAN CAPITAL LETTER AEN
372+-- CHEROKEE SMALL LETTER MV
375−foldMapping '\x10cd' s = Yield '\x2d2d' (CC s '\x0000' '\x0000')
373+foldMapping '\x13fd' s = Yield '\x13f5' (CC s '\x0000' '\x0000')
376-- LATIN SMALL LETTER H WITH LINE BELOW
374-- LATIN SMALL LETTER H WITH LINE BELOW
377foldMapping '\x1e96' s = Yield '\x0068' (CC s '\x0331' '\x0000')
375foldMapping '\x1e96' s = Yield '\x0068' (CC s '\x0331' '\x0000')
378-- LATIN SMALL LETTER T WITH DIAERESIS
376-- LATIN SMALL LETTER T WITH DIAERESIS
@@ -547,36 +545,174 @@ foldMapping '\x1ff6' s = Yield '\x03c9' (CC s '\x0342' '\x0000')
547foldMapping '\x1ff7' s = Yield '\x03c9' (CC s '\x0342' '\x03b9')
545foldMapping '\x1ff7' s = Yield '\x03c9' (CC s '\x0342' '\x03b9')
548-- GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
546-- GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
549foldMapping '\x1ffc' s = Yield '\x03c9' (CC s '\x03b9' '\x0000')
547foldMapping '\x1ffc' s = Yield '\x03c9' (CC s '\x03b9' '\x0000')
550−-- COPTIC CAPITAL LETTER BOHAIRIC KHEI
548+-- LATIN CAPITAL LETTER J WITH CROSSED-TAIL
551−foldMapping '\x2cf2' s = Yield '\x2cf3' (CC s '\x0000' '\x0000')
552−-- CYRILLIC CAPITAL LETTER DOUBLE O
553−foldMapping '\xa698' s = Yield '\xa699' (CC s '\x0000' '\x0000')
554−-- CYRILLIC CAPITAL LETTER CROSSED O
555−foldMapping '\xa69a' s = Yield '\xa69b' (CC s '\x0000' '\x0000')
556−-- LATIN CAPITAL LETTER C WITH BAR
557−foldMapping '\xa792' s = Yield '\xa793' (CC s '\x0000' '\x0000')
549+foldMapping '\xa7b2' s = Yield '\x029d' (CC s '\x0000' '\x0000')
558−-- LATIN CAPITAL LETTER B WITH FLOURISH
550+-- LATIN CAPITAL LETTER CHI
559−foldMapping '\xa796' s = Yield '\xa797' (CC s '\x0000' '\x0000')
551+foldMapping '\xa7b3' s = Yield '\xab53' (CC s '\x0000' '\x0000')
560−-- LATIN CAPITAL LETTER F WITH STROKE
552+-- LATIN CAPITAL LETTER BETA
561−foldMapping '\xa798' s = Yield '\xa799' (CC s '\x0000' '\x0000')
553+foldMapping '\xa7b4' s = Yield '\xa7b5' (CC s '\x0000' '\x0000')
562−-- LATIN CAPITAL LETTER VOLAPUK AE
554+-- LATIN CAPITAL LETTER OMEGA
563−foldMapping '\xa79a' s = Yield '\xa79b' (CC s '\x0000' '\x0000')
555+foldMapping '\xa7b6' s = Yield '\xa7b7' (CC s '\x0000' '\x0000')
564−-- LATIN CAPITAL LETTER VOLAPUK OE
556+-- CHEROKEE SMALL LETTER A
565−foldMapping '\xa79c' s = Yield '\xa79d' (CC s '\x0000' '\x0000')
557+foldMapping '\xab70' s = Yield '\x13a0' (CC s '\x0000' '\x0000')
566−-- LATIN CAPITAL LETTER VOLAPUK UE
558+-- CHEROKEE SMALL LETTER E
567−foldMapping '\xa79e' s = Yield '\xa79f' (CC s '\x0000' '\x0000')
559+foldMapping '\xab71' s = Yield '\x13a1' (CC s '\x0000' '\x0000')
568−-- LATIN CAPITAL LETTER H WITH HOOK
560+-- CHEROKEE SMALL LETTER I
569−foldMapping '\xa7aa' s = Yield '\x0266' (CC s '\x0000' '\x0000')
561+foldMapping '\xab72' s = Yield '\x13a2' (CC s '\x0000' '\x0000')
570−-- LATIN CAPITAL LETTER REVERSED OPEN E
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
571−foldMapping '\xa7ab' s = Yield '\x025c' (CC s '\x0000' '\x0000')
699+foldMapping '\xabb7' s = Yield '\x13e7' (CC s '\x0000' '\x0000')
572−-- LATIN CAPITAL LETTER SCRIPT G
700+-- CHEROKEE SMALL LETTER TSV
701+foldMapping '\xabb8' s = Yield '\x13e8' (CC s '\x0000' '\x0000')
702+-- CHEROKEE SMALL LETTER WA
573−foldMapping '\xa7ac' s = Yield '\x0261' (CC s '\x0000' '\x0000')
703+foldMapping '\xabb9' s = Yield '\x13e9' (CC s '\x0000' '\x0000')
574−-- LATIN CAPITAL LETTER L WITH BELT
704+-- CHEROKEE SMALL LETTER WE
705+foldMapping '\xabba' s = Yield '\x13ea' (CC s '\x0000' '\x0000')
706+-- CHEROKEE SMALL LETTER WI
575−foldMapping '\xa7ad' s = Yield '\x026c' (CC s '\x0000' '\x0000')
707+foldMapping '\xabbb' s = Yield '\x13eb' (CC s '\x0000' '\x0000')
576−-- LATIN CAPITAL LETTER TURNED K
708+-- CHEROKEE SMALL LETTER WO
709+foldMapping '\xabbc' s = Yield '\x13ec' (CC s '\x0000' '\x0000')
710+-- CHEROKEE SMALL LETTER WU
577−foldMapping '\xa7b0' s = Yield '\x029e' (CC s '\x0000' '\x0000')
711+foldMapping '\xabbd' s = Yield '\x13ed' (CC s '\x0000' '\x0000')
578−-- LATIN CAPITAL LETTER TURNED T
712+-- CHEROKEE SMALL LETTER WV
713+foldMapping '\xabbe' s = Yield '\x13ee' (CC s '\x0000' '\x0000')
714+-- CHEROKEE SMALL LETTER YA
579−foldMapping '\xa7b1' s = Yield '\x0287' (CC s '\x0000' '\x0000')
715+foldMapping '\xabbf' s = Yield '\x13ef' (CC s '\x0000' '\x0000')
580-- LATIN SMALL LIGATURE FF
716-- LATIN SMALL LIGATURE FF
581foldMapping '\xfb00' s = Yield '\x0066' (CC s '\x0066' '\x0000')
717foldMapping '\xfb00' s = Yield '\x0066' (CC s '\x0066' '\x0000')
582-- LATIN SMALL LIGATURE FI
718-- LATIN SMALL LIGATURE FI
@@ -601,68 +737,106 @@ foldMapping '\xfb15' s = Yield '\x0574' (CC s '\x056b' '\x0000')
601foldMapping '\xfb16' s = Yield '\x057e' (CC s '\x0576' '\x0000')
737foldMapping '\xfb16' s = Yield '\x057e' (CC s '\x0576' '\x0000')
602-- ARMENIAN SMALL LIGATURE MEN XEH
738-- ARMENIAN SMALL LIGATURE MEN XEH
603foldMapping '\xfb17' s = Yield '\x0574' (CC s '\x056d' '\x0000')
739foldMapping '\xfb17' s = Yield '\x0574' (CC s '\x056d' '\x0000')
604−-- WARANG CITI CAPITAL LETTER NGAA
605−foldMapping '\x118a0' s = Yield '\x118c0' (CC s '\x0000' '\x0000')
606−-- WARANG CITI CAPITAL LETTER A
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
607−foldMapping '\x118a1' s = Yield '\x118c1' (CC s '\x0000' '\x0000')
765+foldMapping '\x10c8c' s = Yield '\x10ccc' (CC s '\x0000' '\x0000')
608−-- WARANG CITI CAPITAL LETTER WI
766+-- OLD HUNGARIAN CAPITAL LETTER EG
609−foldMapping '\x118a2' s = Yield '\x118c2' (CC s '\x0000' '\x0000')
767+foldMapping '\x10c8d' s = Yield '\x10ccd' (CC s '\x0000' '\x0000')
610−-- WARANG CITI CAPITAL LETTER YU
768+-- OLD HUNGARIAN CAPITAL LETTER EGY
611−foldMapping '\x118a3' s = Yield '\x118c3' (CC s '\x0000' '\x0000')
769+foldMapping '\x10c8e' s = Yield '\x10cce' (CC s '\x0000' '\x0000')
612−-- WARANG CITI CAPITAL LETTER YA
770+-- OLD HUNGARIAN CAPITAL LETTER EH
613−foldMapping '\x118a4' s = Yield '\x118c4' (CC s '\x0000' '\x0000')
771+foldMapping '\x10c8f' s = Yield '\x10ccf' (CC s '\x0000' '\x0000')
614−-- WARANG CITI CAPITAL LETTER YO
772+-- OLD HUNGARIAN CAPITAL LETTER I
615−foldMapping '\x118a5' s = Yield '\x118c5' (CC s '\x0000' '\x0000')
773+foldMapping '\x10c90' s = Yield '\x10cd0' (CC s '\x0000' '\x0000')
616−-- WARANG CITI CAPITAL LETTER II
774+-- OLD HUNGARIAN CAPITAL LETTER II
617−foldMapping '\x118a6' s = Yield '\x118c6' (CC s '\x0000' '\x0000')
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')
618−-- WARANG CITI CAPITAL LETTER UU
826+-- OLD HUNGARIAN CAPITAL LETTER UU
619−foldMapping '\x118a7' s = Yield '\x118c7' (CC s '\x0000' '\x0000')
620−-- WARANG CITI CAPITAL LETTER E
621−foldMapping '\x118a8' s = Yield '\x118c8' (CC s '\x0000' '\x0000')
622−-- WARANG CITI CAPITAL LETTER O
623−foldMapping '\x118a9' s = Yield '\x118c9' (CC s '\x0000' '\x0000')
624−-- WARANG CITI CAPITAL LETTER ANG
625−foldMapping '\x118aa' s = Yield '\x118ca' (CC s '\x0000' '\x0000')
626−-- WARANG CITI CAPITAL LETTER GA
627−foldMapping '\x118ab' s = Yield '\x118cb' (CC s '\x0000' '\x0000')
628−-- WARANG CITI CAPITAL LETTER KO
629−foldMapping '\x118ac' s = Yield '\x118cc' (CC s '\x0000' '\x0000')
630−-- WARANG CITI CAPITAL LETTER ENY
631−foldMapping '\x118ad' s = Yield '\x118cd' (CC s '\x0000' '\x0000')
632−-- WARANG CITI CAPITAL LETTER YUJ
633−foldMapping '\x118ae' s = Yield '\x118ce' (CC s '\x0000' '\x0000')
634−-- WARANG CITI CAPITAL LETTER UC
635−foldMapping '\x118af' s = Yield '\x118cf' (CC s '\x0000' '\x0000')
636−-- WARANG CITI CAPITAL LETTER ENN
637−foldMapping '\x118b0' s = Yield '\x118d0' (CC s '\x0000' '\x0000')
638−-- WARANG CITI CAPITAL LETTER ODD
639−foldMapping '\x118b1' s = Yield '\x118d1' (CC s '\x0000' '\x0000')
640−-- WARANG CITI CAPITAL LETTER TTE
641−foldMapping '\x118b2' s = Yield '\x118d2' (CC s '\x0000' '\x0000')
642−-- WARANG CITI CAPITAL LETTER NUNG
643−foldMapping '\x118b3' s = Yield '\x118d3' (CC s '\x0000' '\x0000')
644−-- WARANG CITI CAPITAL LETTER DA
645−foldMapping '\x118b4' s = Yield '\x118d4' (CC s '\x0000' '\x0000')
646−-- WARANG CITI CAPITAL LETTER AT
647−foldMapping '\x118b5' s = Yield '\x118d5' (CC s '\x0000' '\x0000')
827+foldMapping '\x10cab' s = Yield '\x10ceb' (CC s '\x0000' '\x0000')
648−-- WARANG CITI CAPITAL LETTER AM
828+-- OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE
649−foldMapping '\x118b6' s = Yield '\x118d6' (CC s '\x0000' '\x0000')
650−-- WARANG CITI CAPITAL LETTER BU
651−foldMapping '\x118b7' s = Yield '\x118d7' (CC s '\x0000' '\x0000')
829+foldMapping '\x10cac' s = Yield '\x10cec' (CC s '\x0000' '\x0000')
652−-- WARANG CITI CAPITAL LETTER PU
830+-- OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE
653−foldMapping '\x118b8' s = Yield '\x118d8' (CC s '\x0000' '\x0000')
654−-- WARANG CITI CAPITAL LETTER HIYO
655−foldMapping '\x118b9' s = Yield '\x118d9' (CC s '\x0000' '\x0000')
831+foldMapping '\x10cad' s = Yield '\x10ced' (CC s '\x0000' '\x0000')
656−-- WARANG CITI CAPITAL LETTER HOLO
832+-- OLD HUNGARIAN CAPITAL LETTER EV
657−foldMapping '\x118ba' s = Yield '\x118da' (CC s '\x0000' '\x0000')
833+foldMapping '\x10cae' s = Yield '\x10cee' (CC s '\x0000' '\x0000')
658−-- WARANG CITI CAPITAL LETTER HORR
834+-- OLD HUNGARIAN CAPITAL LETTER EZ
659−foldMapping '\x118bb' s = Yield '\x118db' (CC s '\x0000' '\x0000')
835+foldMapping '\x10caf' s = Yield '\x10cef' (CC s '\x0000' '\x0000')
660−-- WARANG CITI CAPITAL LETTER HAR
836+-- OLD HUNGARIAN CAPITAL LETTER EZS
661−foldMapping '\x118bc' s = Yield '\x118dc' (CC s '\x0000' '\x0000')
837+foldMapping '\x10cb0' s = Yield '\x10cf0' (CC s '\x0000' '\x0000')
662−-- WARANG CITI CAPITAL LETTER SSUU
838+-- OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN
663−foldMapping '\x118bd' s = Yield '\x118dd' (CC s '\x0000' '\x0000')
664−-- WARANG CITI CAPITAL LETTER SII
665−foldMapping '\x118be' s = Yield '\x118de' (CC s '\x0000' '\x0000')
839+foldMapping '\x10cb1' s = Yield '\x10cf1' (CC s '\x0000' '\x0000')
666−-- WARANG CITI CAPITAL LETTER VIYO
840+-- OLD HUNGARIAN CAPITAL LETTER US
667−foldMapping '\x118bf' s = Yield '\x118df' (CC s '\x0000' '\x0000')
841+foldMapping '\x10cb2' s = Yield '\x10cf2' (CC s '\x0000' '\x0000')
668foldMapping c s = Yield (toLower c) (CC s '\0' '\0')
842foldMapping c s = Yield (toLower c) (CC s '\0' '\0')
Data/Text/Internal/Fusion/Common.hs+5−5
@@ -593,7 +593,7 @@ concatMap f = foldr (append . f) empty
593{-# INLINE [0] concatMap #-}
593{-# INLINE [0] concatMap #-}
594
594
595-- | /O(n)/ any @p @xs determines if any character in the stream
595-- | /O(n)/ any @p @xs determines if any character in the stream
596−-- @xs@ satisifes the predicate @p@.
596+-- @xs@ satisfies the predicate @p@.
597any :: (Char -> Bool) -> Stream Char -> Bool
597any :: (Char -> Bool) -> Stream Char -> Bool
598any p (Stream next0 s0 _len) = loop_any s0
598any p (Stream next0 s0 _len) = loop_any s0
599 where
599 where
@@ -605,7 +605,7 @@ any p (Stream next0 s0 _len) = loop_any s0
605{-# INLINE [0] any #-}
605{-# INLINE [0] any #-}
606
606
607-- | /O(n)/ all @p @xs determines if all characters in the 'Text'
607-- | /O(n)/ all @p @xs determines if all characters in the 'Text'
608−-- @xs@ satisify the predicate @p@.
608+-- @xs@ satisfy the predicate @p@.
609all :: (Char -> Bool) -> Stream Char -> Bool
609all :: (Char -> Bool) -> Stream Char -> Bool
610all p (Stream next0 s0 _len) = loop_all s0
610all p (Stream next0 s0 _len) = loop_all s0
611 where
611 where
@@ -669,12 +669,12 @@ scanl f z0 (Stream next0 s0 len) = Stream next (Scan1 z0 s0) (len+1) -- HINT may
669-- ** Generating and unfolding streams
669-- ** Generating and unfolding streams
670
670
671replicateCharI :: Integral a => a -> Char -> Stream Char
671replicateCharI :: Integral a => a -> Char -> Stream Char
672−replicateCharI n c
672+replicateCharI !n !c
673 | n < 0 = empty
673 | n < 0 = empty
674 | otherwise = Stream next 0 (fromIntegral n) -- HINT maybe too low
674 | otherwise = Stream next 0 (fromIntegral n) -- HINT maybe too low
675 where
675 where
676− next i | i >= n = Done
676+ next !i | i >= n = Done
677− | otherwise = Yield c (i + 1)
677+ | otherwise = Yield c (i + 1)
678{-# INLINE [0] replicateCharI #-}
678{-# INLINE [0] replicateCharI #-}
679
679
680data RI s = RI !s {-# UNPACK #-} !Int64
680data RI s = RI !s {-# UNPACK #-} !Int64
Data/Text/Lazy.hs+14−8
@@ -229,7 +229,7 @@ import Data.Text.Internal.Lazy.Fusion (stream, unstream)
229import Data.Text.Internal.Lazy (Text(..), chunk, empty, foldlChunks,
229import Data.Text.Internal.Lazy (Text(..), chunk, empty, foldlChunks,
230 foldrChunks, smallChunkSize)
230 foldrChunks, smallChunkSize)
231import Data.Text.Internal (firstf, safe, text)
231import Data.Text.Internal (firstf, safe, text)
232−import Data.Text.Lazy.Encoding (decodeUtf8, encodeUtf8)
232+import Data.Text.Lazy.Encoding (decodeUtf8', encodeUtf8)
233import qualified Data.Text.Internal.Functions as F
233import qualified Data.Text.Internal.Functions as F
234import Data.Text.Internal.Lazy.Search (indices)
234import Data.Text.Internal.Lazy.Search (indices)
235#if __GLASGOW_HASKELL__ >= 702
235#if __GLASGOW_HASKELL__ >= 702
@@ -376,7 +376,11 @@ instance NFData Text where
376
376
377instance Binary Text where
377instance Binary Text where
378 put t = put (encodeUtf8 t)
378 put t = put (encodeUtf8 t)
379+ get = do
380+ bs <- get
379− get = P.fmap decodeUtf8 get
381+ case decodeUtf8' bs of
382+ P.Left exn -> P.fail (P.show exn)
383+ P.Right a -> P.return a
380
384
381-- | This instance preserves data abstraction at the cost of inefficiency.
385-- | This instance preserves data abstraction at the cost of inefficiency.
382-- We omit reflection services for the sake of data abstraction.
386-- We omit reflection services for the sake of data abstraction.
@@ -541,7 +545,7 @@ tail Empty = emptyError "tail"
541 unstream (S.tail (stream t)) = tail t
545 unstream (S.tail (stream t)) = tail t
542 #-}
546 #-}
543
547
544−-- | /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
545-- be non-empty. Subject to fusion.
549-- be non-empty. Subject to fusion.
546init :: Text -> Text
550init :: Text -> Text
547init (Chunk t0 ts0) = go t0 ts0
551init (Chunk t0 ts0) = go t0 ts0
@@ -577,7 +581,7 @@ isSingleton :: Text -> Bool
577isSingleton = S.isSingleton . stream
581isSingleton = S.isSingleton . stream
578{-# INLINE isSingleton #-}
582{-# INLINE isSingleton #-}
579
583
580−-- | /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
581-- non-empty. Subject to fusion.
585-- non-empty. Subject to fusion.
582last :: Text -> Char
586last :: Text -> Char
583last Empty = emptyError "last"
587last Empty = emptyError "last"
@@ -877,13 +881,13 @@ concatMap f = concat . foldr ((:) . f) []
877{-# INLINE concatMap #-}
881{-# INLINE concatMap #-}
878
882
879-- | /O(n)/ 'any' @p@ @t@ determines whether any character in the
883-- | /O(n)/ 'any' @p@ @t@ determines whether any character in the
880−-- 'Text' @t@ satisifes the predicate @p@. Subject to fusion.
884+-- 'Text' @t@ satisfies the predicate @p@. Subject to fusion.
881any :: (Char -> Bool) -> Text -> Bool
885any :: (Char -> Bool) -> Text -> Bool
882any p t = S.any p (stream t)
886any p t = S.any p (stream t)
883{-# INLINE any #-}
887{-# INLINE any #-}
884
888
885-- | /O(n)/ 'all' @p@ @t@ determines whether all characters in the
889-- | /O(n)/ 'all' @p@ @t@ determines whether all characters in the
886−-- 'Text' @t@ satisify the predicate @p@. Subject to fusion.
890+-- 'Text' @t@ satisfy the predicate @p@. Subject to fusion.
887all :: (Char -> Bool) -> Text -> Bool
891all :: (Char -> Bool) -> Text -> Bool
888all p t = S.all p (stream t)
892all p t = S.all p (stream t)
889{-# INLINE all #-}
893{-# INLINE all #-}
@@ -1172,9 +1176,11 @@ dropWhile p t0 = dropWhile' t0
1172"LAZY TEXT dropWhile -> unfused" [1] forall p t.
1176"LAZY TEXT dropWhile -> unfused" [1] forall p t.
1173 unstream (S.dropWhile p (stream t)) = dropWhile p t
1177 unstream (S.dropWhile p (stream t)) = dropWhile p t
1174 #-}
1178 #-}
1179+
1175-- | /O(n)/ 'dropWhileEnd' @p@ @t@ returns the prefix remaining after
1180-- | /O(n)/ 'dropWhileEnd' @p@ @t@ returns the prefix remaining after
1176−-- dropping characters that fail the predicate @p@ from the end of
1181+-- dropping characters that satisfy the predicate @p@ from the end of
1177-- @t@.
1182-- @t@.
1183+--
1178-- Examples:
1184-- Examples:
1179--
1185--
1180-- > dropWhileEnd (=='.') "foo..." == "foo"
1186-- > dropWhileEnd (=='.') "foo..." == "foo"
@@ -1191,7 +1197,7 @@ dropWhileEnd p = go
1191{-# INLINE dropWhileEnd #-}
1197{-# INLINE dropWhileEnd #-}
1192
1198
1193-- | /O(n)/ 'dropAround' @p@ @t@ returns the substring remaining after
1199-- | /O(n)/ 'dropAround' @p@ @t@ returns the substring remaining after
1194−-- dropping characters that fail the predicate @p@ from both the
1200+-- dropping characters that satisfy the predicate @p@ from both the
1195-- beginning and end of @t@. Subject to fusion.
1201-- beginning and end of @t@. Subject to fusion.
1196dropAround :: (Char -> Bool) -> Text -> Text
1202dropAround :: (Char -> Bool) -> Text -> Text
1197dropAround p = dropWhile p . dropWhileEnd p
1203dropAround p = dropWhile p . dropWhileEnd p
Data/Text/Lazy/Builder.hs+1−1
@@ -8,7 +8,7 @@
8-- Module : Data.Text.Lazy.Builder
8-- Module : Data.Text.Lazy.Builder
9-- Copyright : (c) 2013 Bryan O'Sullivan
9-- Copyright : (c) 2013 Bryan O'Sullivan
10-- (c) 2010 Johan Tibell
10-- (c) 2010 Johan Tibell
11−-- License : BSD3-style (see LICENSE)
11+-- License : BSD-style (see LICENSE)
12--
12--
13-- Maintainer : Johan Tibell <johan.tibell@gmail.com>
13-- Maintainer : Johan Tibell <johan.tibell@gmail.com>
14-- Stability : experimental
14-- Stability : experimental
Data/Text/Lazy/Builder/Int.hs+1−1
@@ -7,7 +7,7 @@
7-- Module: Data.Text.Lazy.Builder.Int
7-- Module: Data.Text.Lazy.Builder.Int
8-- Copyright: (c) 2013 Bryan O'Sullivan
8-- Copyright: (c) 2013 Bryan O'Sullivan
9-- (c) 2011 MailRank, Inc.
9-- (c) 2011 MailRank, Inc.
10−-- License: BSD3
10+-- License: BSD-style
11-- Maintainer: Bryan O'Sullivan <bos@serpentine.com>
11-- Maintainer: Bryan O'Sullivan <bos@serpentine.com>
12-- Stability: experimental
12-- Stability: experimental
13-- Portability: portable
13-- Portability: portable
Data/Text/Lazy/Encoding.hs+5−15
@@ -46,27 +46,23 @@ module Data.Text.Lazy.Encoding
46 , encodeUtf32LE
46 , encodeUtf32LE
47 , encodeUtf32BE
47 , encodeUtf32BE
48
48
49−#if MIN_VERSION_bytestring(0,10,4)
50 -- * Encoding Text using ByteString Builders
49 -- * Encoding Text using ByteString Builders
51 , encodeUtf8Builder
50 , encodeUtf8Builder
52 , encodeUtf8BuilderEscaped
51 , encodeUtf8BuilderEscaped
53−#endif
54 ) where
52 ) where
55
53
56import Control.Exception (evaluate, try)
54import Control.Exception (evaluate, try)
55+import Data.Monoid (Monoid(..))
57import Data.Text.Encoding.Error (OnDecodeError, UnicodeException, strictDecode)
56import Data.Text.Encoding.Error (OnDecodeError, UnicodeException, strictDecode)
58import Data.Text.Internal.Lazy (Text(..), chunk, empty, foldrChunks)
57import 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)
64import Data.Word (Word8)
58import Data.Word (Word8)
65−import Data.Monoid (Monoid(..))
59+import qualified Data.ByteString as S
66import qualified Data.ByteString.Builder as B
60import qualified Data.ByteString.Builder as B
67import qualified Data.ByteString.Builder.Extra as B (safeStrategy, toLazyByteStringWith)
61import qualified Data.ByteString.Builder.Extra as B (safeStrategy, toLazyByteStringWith)
68import qualified Data.ByteString.Builder.Prim as BP
62import qualified Data.ByteString.Builder.Prim as BP
69−#endif
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
70import qualified Data.Text as T
66import qualified Data.Text as T
71import qualified Data.Text.Encoding as TE
67import qualified Data.Text.Encoding as TE
72import qualified Data.Text.Internal.Lazy.Encoding.Fusion as E
68import qualified Data.Text.Internal.Lazy.Encoding.Fusion as E
@@ -146,7 +142,6 @@ decodeUtf8' bs = unsafeDupablePerformIO $ do
146{-# INLINE decodeUtf8' #-}
142{-# INLINE decodeUtf8' #-}
147
143
148encodeUtf8 :: Text -> B.ByteString
144encodeUtf8 :: Text -> B.ByteString
149−#if MIN_VERSION_bytestring(0,10,4)
150encodeUtf8 Empty = B.empty
145encodeUtf8 Empty = B.empty
151encodeUtf8 lt@(Chunk t _) =
146encodeUtf8 lt@(Chunk t _) =
152 B.toLazyByteStringWith strategy B.empty $ encodeUtf8Builder lt
147 B.toLazyByteStringWith strategy B.empty $ encodeUtf8Builder lt
@@ -168,11 +163,6 @@ encodeUtf8BuilderEscaped :: BP.BoundedPrim Word8 -> Text -> B.Builder
168encodeUtf8BuilderEscaped prim =
163encodeUtf8BuilderEscaped prim =
169 foldrChunks (\c b -> TE.encodeUtf8BuilderEscaped prim c `mappend` b) mempty
164 foldrChunks (\c b -> TE.encodeUtf8BuilderEscaped prim c `mappend` b) mempty
170
165
171−#else
172−encodeUtf8 (Chunk c cs) = B.Chunk (TE.encodeUtf8 c) (encodeUtf8 cs)
173−encodeUtf8 Empty = B.Empty
174−#endif
175−
176-- | Decode text from little endian UTF-16 encoding.
166-- | Decode text from little endian UTF-16 encoding.
177decodeUtf16LEWith :: OnDecodeError -> B.ByteString -> Text
167decodeUtf16LEWith :: OnDecodeError -> B.ByteString -> Text
178decodeUtf16LEWith onErr bs = F.unstream (E.streamUtf16LE onErr bs)
168decodeUtf16LEWith onErr bs = F.unstream (E.streamUtf16LE onErr bs)
benchmarks/haskell/Benchmarks.hs+1−1
@@ -53,7 +53,7 @@ benchmarks = do
53 , Mul.benchmark
53 , Mul.benchmark
54 , Pure.benchmark "tiny" (tf "tiny.txt")
54 , Pure.benchmark "tiny" (tf "tiny.txt")
55 , Pure.benchmark "ascii" (tf "ascii-small.txt")
55 , Pure.benchmark "ascii" (tf "ascii-small.txt")
56− , Pure.benchmark "france" (tf "france.html")
56+ -- , Pure.benchmark "france" (tf "france.html")
57 , Pure.benchmark "russian" (tf "russian-small.txt")
57 , Pure.benchmark "russian" (tf "russian-small.txt")
58 , Pure.benchmark "japanese" (tf "japanese.txt")
58 , Pure.benchmark "japanese" (tf "japanese.txt")
59 , ReadNumbers.benchmark (tf "numbers.txt")
59 , ReadNumbers.benchmark (tf "numbers.txt")
benchmarks/haskell/Benchmarks/Pure.hs+7
@@ -262,6 +262,13 @@ benchmark kind fp = do
262 , benchBSL $ nf (BL.map toUpper) bla
262 , benchBSL $ nf (BL.map toUpper) bla
263 , benchS $ nf (L.map toUpper) sa
263 , benchS $ nf (L.map toUpper) sa
264 ]
264 ]
265+ , bgroup "uncons"
266+ [ benchT $ nf T.uncons ta
267+ , benchTL $ nf TL.uncons tla
268+ , benchBS $ nf BS.uncons bsa
269+ , benchBSL $ nf BL.uncons bla
270+ , benchS $ nf L.uncons sa
271+ ]
265 , bgroup "words"
272 , bgroup "words"
266 [ benchT $ nf T.words ta
273 [ benchT $ nf T.words ta
267 , benchTL $ nf TL.words tla
274 , benchTL $ nf TL.words tla
benchmarks/haskell/Benchmarks/ReadNumbers.hs+2−5
@@ -25,8 +25,7 @@ import Data.List (foldl')
25import Numeric (readDec, readFloat, readHex)
25import Numeric (readDec, readFloat, readHex)
26import qualified Data.ByteString.Char8 as B
26import qualified Data.ByteString.Char8 as B
27import qualified Data.ByteString.Lazy.Char8 as BL
27import qualified Data.ByteString.Lazy.Char8 as BL
28−import qualified Data.ByteString.Lex.Double as B
28+import qualified Data.ByteString.Lex.Fractional as B
29−import qualified Data.ByteString.Lex.Lazy.Double as BL
30import qualified Data.Text as T
29import qualified Data.Text as T
31import qualified Data.Text.IO as T
30import qualified Data.Text.IO as T
32import qualified Data.Text.Lazy as TL
31import qualified Data.Text.Lazy as TL
@@ -63,12 +62,10 @@ benchmark fp = do
63 whnf (double . text TL.rational) tl
62 whnf (double . text TL.rational) tl
64
63
65 , bench "DecimalByteString" $ whnf (int . byteString B.readInt) b
64 , 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
67
66
68 , bench "DecimalLazyByteString" $
67 , bench "DecimalLazyByteString" $
69 whnf (int . byteString BL.readInt) bl
68 whnf (int . byteString BL.readInt) bl
70− , bench "DoubleLazyByteString" $
71− whnf (double . byteString BL.readDouble) bl
72 ]
69 ]
73 where
70 where
74 -- Used for fixing types
71 -- Used for fixing types
benchmarks/haskell/Benchmarks/Stream.hs+16−5
@@ -18,11 +18,11 @@ import qualified Data.Text.Encoding as T
18import qualified Data.Text.Encoding.Error as E
18import qualified Data.Text.Encoding.Error as E
19import qualified Data.Text.Internal.Encoding.Fusion as T
19import qualified Data.Text.Internal.Encoding.Fusion as T
20import qualified Data.Text.Internal.Encoding.Fusion.Common as F
20import qualified Data.Text.Internal.Encoding.Fusion.Common as F
21−import qualified Data.Text.Internal.Fusion as T
21+import qualified Data.Text.Internal.Fusion as F
22import qualified Data.Text.IO as T
22import qualified Data.Text.IO as T
23import qualified Data.Text.Lazy.Encoding as TL
23import qualified Data.Text.Lazy.Encoding as TL
24import qualified Data.Text.Internal.Lazy.Encoding.Fusion as TL
24import qualified Data.Text.Internal.Lazy.Encoding.Fusion as TL
25−import qualified Data.Text.Internal.Lazy.Fusion as TL
25+import qualified Data.Text.Internal.Lazy.Fusion as FL
26import qualified Data.Text.Lazy.IO as TL
26import qualified Data.Text.Lazy.IO as TL
27
27
28instance NFData a => NFData (Stream a) where
28instance NFData a => NFData (Stream a) where
@@ -53,14 +53,25 @@ benchmark fp = do
53 !utf32beL = TL.encodeUtf32BE tl
53 !utf32beL = TL.encodeUtf32BE tl
54
54
55 -- For the functions which operate on streams
55 -- For the functions which operate on streams
56− let !s = T.stream t
56+ let !s = F.stream t
57
57
58 return $ bgroup "Stream"
58 return $ bgroup "Stream"
59
59
60 -- Fusion
60 -- Fusion
61 [ bgroup "stream" $
61 [ bgroup "stream" $
62− [ bench "Text" $ nf T.stream t
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
63− , bench "LazyText" $ nf TL.stream tl
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
64 ]
75 ]
65
76
66 -- Encoding.Fusion
77 -- Encoding.Fusion
benchmarks/text-benchmarks.cabal+13−3
@@ -3,7 +3,7 @@ version: 0.0.0.0
3synopsis: Benchmarks for the text package
3synopsis: Benchmarks for the text package
4description: Benchmarks for the text package
4description: Benchmarks for the text package
5homepage: https://bitbucket.org/bos/text
5homepage: https://bitbucket.org/bos/text
6−license: BSD3
6+license: BSD2
7license-file: ../LICENSE
7license-file: ../LICENSE
8author: Jasper Van der Jeugt <jaspervdj@gmail.com>,
8author: Jasper Van der Jeugt <jaspervdj@gmail.com>,
9 Bryan O'Sullivan <bos@serpentine.com>,
9 Bryan O'Sullivan <bos@serpentine.com>,
@@ -15,6 +15,11 @@ build-type: Simple
15
15
16cabal-version: >=1.2
16cabal-version: >=1.2
17
17
18+flag bytestring-builder
19+ description: Depend on the bytestring-builder package for backwards compatibility.
20+ default: False
21+ manual: False
22+
18flag llvm
23flag llvm
19 description: use LLVM
24 description: use LLVM
20 default: False
25 default: False
@@ -33,8 +38,7 @@ executable text-benchmarks
33 build-depends: base == 4.*,
38 build-depends: base == 4.*,
34 binary,
39 binary,
35 blaze-builder,
40 blaze-builder,
36− bytestring,
41+ bytestring-lexing >= 0.5.0,
37− bytestring-lexing,
38 containers,
42 containers,
39 criterion >= 0.10.0.0,
43 criterion >= 0.10.0.0,
40 deepseq,
44 deepseq,
@@ -46,6 +50,12 @@ executable text-benchmarks
46 utf8-string,
50 utf8-string,
47 vector
51 vector
48
52
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+
49executable text-multilang
59executable text-multilang
50 hs-source-dirs: haskell
60 hs-source-dirs: haskell
51 main-is: Multilang.hs
61 main-is: Multilang.hs
changelog.md+28−1
@@ -1,6 +1,33 @@
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+
11.2.1.3
281.2.1.3
2
29
3−* Bug fix: As it turns out, moving the literal rewrite rules to simplifier
30+* Bug fix: As it turns out, moving the literal rewrite rules to simplifier
4 phase 2 does not prevent competition with the `unpack` rule, which is
31 phase 2 does not prevent competition with the `unpack` rule, which is
5 also active in this phase. Unfortunately this was hidden due to a silly
32 also active in this phase. Unfortunately this was hidden due to a silly
6 test environment mistake. Moving literal rules back to phase 1 finally
33 test environment mistake. Moving literal rules back to phase 1 finally
tests/literal-rule-test.sh+1−1
@@ -6,7 +6,7 @@ function check_firings() {
6 rule=$1
6 rule=$1
7 expected=$2
7 expected=$2
8 build="ghc -O -ddump-rule-firings LiteralRuleTest.hs"
8 build="ghc -O -ddump-rule-firings LiteralRuleTest.hs"
9− build="$build -i.. -I../include -DMIN_VERSION_bytestring(a,b,c)=1"
9+ build="$build -i.. -I../include"
10 touch LiteralRuleTest.hs
10 touch LiteralRuleTest.hs
11 echo -n "Want to see $expected firings of rule $rule... " >&2
11 echo -n "Want to see $expected firings of rule $rule... " >&2
12 firings=$($build 2>&1 | grep "Rule fired: $rule\$" | wc -l)
12 firings=$($build 2>&1 | grep "Rule fired: $rule\$" | wc -l)
tests/text-tests.cabal+1−1
@@ -3,7 +3,7 @@ version: 0.0.0.0
3synopsis: Functional tests for the text package
3synopsis: Functional tests for the text package
4description: Functional tests for the text package
4description: Functional tests for the text package
5homepage: https://github.com/bos/text
5homepage: https://github.com/bos/text
6−license: BSD3
6+license: BSD2
7license-file: ../LICENSE
7license-file: ../LICENSE
8author: Jasper Van der Jeugt <jaspervdj@gmail.com>,
8author: Jasper Van der Jeugt <jaspervdj@gmail.com>,
9 Bryan O'Sullivan <bos@serpentine.com>,
9 Bryan O'Sullivan <bos@serpentine.com>,
text.cabal+19−6
@@ -1,5 +1,5 @@
1name: text
1name: text
2−version: 1.2.1.3
2+version: 1.2.2.1
3homepage: https://github.com/bos/text
3homepage: https://github.com/bos/text
4bug-reports: https://github.com/bos/text/issues
4bug-reports: https://github.com/bos/text/issues
5synopsis: An efficient packed Unicode text type.
5synopsis: An efficient packed Unicode text type.
@@ -31,7 +31,7 @@ description:
31 the @text-icu@ package:
31 the @text-icu@ package:
32 <http://hackage.haskell.org/package/text-icu>
32 <http://hackage.haskell.org/package/text-icu>
33
33
34−license: BSD3
34+license: BSD2
35license-file: LICENSE
35license-file: LICENSE
36author: Bryan O'Sullivan <bos@serpentine.com>
36author: Bryan O'Sullivan <bos@serpentine.com>
37maintainer: Bryan O'Sullivan <bos@serpentine.com>
37maintainer: Bryan O'Sullivan <bos@serpentine.com>
@@ -64,6 +64,11 @@ extra-source-files:
64 tests/scripts/*.sh
64 tests/scripts/*.sh
65 tests/text-tests.cabal
65 tests/text-tests.cabal
66
66
67+flag bytestring-builder
68+ description: Depend on the bytestring-builder package for backwards compatibility.
69+ default: False
70+ manual: False
71+
67flag developer
72flag developer
68 description: operate in developer mode
73 description: operate in developer mode
69 default: False
74 default: False
@@ -71,6 +76,8 @@ flag developer
71
76
72flag integer-simple
77flag integer-simple
73 description: Use the simple integer library instead of GMP
78 description: Use the simple integer library instead of GMP
79+ default: False
80+ manual: False
74
81
75library
82library
76 c-sources: cbits/cbits.c
83 c-sources: cbits/cbits.c
@@ -131,10 +138,11 @@ library
131 deepseq >= 1.1.0.0,
138 deepseq >= 1.1.0.0,
132 ghc-prim >= 0.2
139 ghc-prim >= 0.2
133
140
134− if impl(ghc >= 7.7)
141+ if flag(bytestring-builder)
135− build-depends: bytestring >= 0.10.4.0
142+ build-depends: bytestring >= 0.9 && < 0.10.4,
143+ bytestring-builder >= 0.10.4
136 else
144 else
137− build-depends: bytestring >= 0.9
145+ build-depends: bytestring >= 0.10.4
138
146
139 cpp-options: -DHAVE_DEEPSEQ
147 cpp-options: -DHAVE_DEEPSEQ
140 ghc-options: -Wall -fwarn-tabs -funbox-strict-fields -O2
148 ghc-options: -Wall -fwarn-tabs -funbox-strict-fields -O2
@@ -169,7 +177,6 @@ test-suite tests
169 array,
177 array,
170 base,
178 base,
171 binary,
179 binary,
172− bytestring,
173 deepseq,
180 deepseq,
174 directory,
181 directory,
175 ghc-prim,
182 ghc-prim,
@@ -179,6 +186,12 @@ test-suite tests
179 test-framework-hunit >= 0.2,
186 test-framework-hunit >= 0.2,
180 test-framework-quickcheck2 >= 0.2
187 test-framework-quickcheck2 >= 0.2
181
188
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+
182 if flag(integer-simple)
195 if flag(integer-simple)
183 cpp-options: -DINTEGER_SIMPLE
196 cpp-options: -DINTEGER_SIMPLE
184 build-depends: integer-simple >= 0.1 && < 0.5
197 build-depends: integer-simple >= 0.1 && < 0.5