on master help sign in
Data/Text.hs−12
since splitsnapshots
unifiedsplit
@@ -60,7 +60,6 @@ module Data.Text
60 , snoc
60 , snoc
61 , append
61 , append
62 , uncons
62 , uncons
63− , unsnoc
64 , head
63 , head
65 , last
64 , last
66 , tail
65 , tail
@@ -546,17 +545,6 @@ init (Text arr off len) | len <= 0 = emptyError "init"
546 unstream (S.init (stream t)) = init t
545 unstream (S.init (stream t)) = init t
547 #-}
546 #-}
548
547
549−-- | /O(1)/ Returns all but the last character and the last character of a
550−-- 'Text', or 'Nothing' if empty.
551−unsnoc :: Text -> Maybe (Text, Char)
552−unsnoc (Text arr off len)
553− | len <= 0 = Nothing
554− | n < 0xDC00 || n > 0xDFFF = Just (text arr off (len-1), unsafeChr n)
555− | otherwise = Just (text arr off (len-2), U16.chr2 n0 n)
556− where n = A.unsafeIndex arr (off+len-1)
557− n0 = A.unsafeIndex arr (off+len-2)
558−{-# INLINE [1] unsnoc #-}
559−
560-- | /O(1)/ Tests whether a 'Text' is empty or not. Subject to
548-- | /O(1)/ Tests whether a 'Text' is empty or not. Subject to
561-- fusion.
549-- fusion.
562null :: Text -> Bool
550null :: Text -> Bool
Data/Text/Internal/Fusion/Common.hs+9−10
@@ -107,7 +107,7 @@ import Prelude (Bool(..), Char, Eq(..), Int, Integral, Maybe(..),
107import qualified Data.List as L
107import qualified Data.List as L
108import qualified Prelude as P
108import qualified Prelude as P
109import Data.Bits (shiftL)
109import Data.Bits (shiftL)
110−import Data.Char (isLetter, isSpace)
110+import Data.Char (isLetter)
111import Data.Int (Int64)
111import Data.Int (Int64)
112import Data.Text.Internal.Fusion.Types
112import Data.Text.Internal.Fusion.Types
113import Data.Text.Internal.Fusion.CaseMapping (foldMapping, lowerMapping, titleMapping,
113import Data.Text.Internal.Fusion.CaseMapping (foldMapping, lowerMapping, titleMapping,
@@ -462,16 +462,15 @@ toTitle (Stream next0 s0 len) = Stream next (CC (False :*: s0) '\0' '\0') len
462 where
462 where
463 next (CC (letter :*: s) '\0' _) =
463 next (CC (letter :*: s) '\0' _) =
464 case next0 s of
464 case next0 s of
465− Done -> Done
465+ Done -> Done
466− Skip s' -> Skip (CC (letter :*: s') '\0' '\0')
466+ Skip s' -> Skip (CC (letter :*: s') '\0' '\0')
467 Yield c s'
467 Yield c s'
468− | nonSpace -> if letter
468+ | letter' -> if letter
469− then lowerMapping c (nonSpace :*: s')
469+ then lowerMapping c (letter' :*: s')
470− else titleMapping c (letter' :*: s')
470+ else titleMapping c (letter' :*: s')
471− | otherwise -> Yield c (CC (letter' :*: s') '\0' '\0')
471+ | otherwise -> Yield c (CC (letter' :*: s') '\0' '\0')
472− where nonSpace = P.not (isSpace c)
473− letter' = isLetter c
472+ where letter' = isLetter c
474− next (CC s a b) = Yield a (CC s b '\0')
473+ next (CC s a b) = Yield a (CC s b '\0')
475{-# INLINE [0] toTitle #-}
474{-# INLINE [0] toTitle #-}
476
475
477data Justify i s = Just1 !i !s
476data Justify i s = Just1 !i !s
Data/Text/Lazy.hs−10
@@ -68,7 +68,6 @@ module Data.Text.Lazy
68 , snoc
68 , snoc
69 , append
69 , append
70 , uncons
70 , uncons
71− , unsnoc
72 , head
71 , head
73 , last
72 , last
74 , tail
73 , tail
@@ -562,15 +561,6 @@ init Empty = emptyError "init"
562 unstream (S.init (stream t)) = init t
561 unstream (S.init (stream t)) = init t
563 #-}
562 #-}
564
563
565−-- | /O(n\/c)/ Returns the 'init' and 'last' of a 'Text', or 'Nothing' if
566−-- empty.
567−--
568−-- * It is no faster than using 'init' and 'last'.
569−unsnoc :: Text -> Maybe (Text, Char)
570−unsnoc Empty = Nothing
571−unsnoc ts@(Chunk _ _) = Just (init ts, last ts)
572−{-# INLINE unsnoc #-}
573−
574-- | /O(1)/ Tests whether a 'Text' is empty or not. Subject to
564-- | /O(1)/ Tests whether a 'Text' is empty or not. Subject to
575-- fusion.
565-- fusion.
576null :: Text -> Bool
566null :: Text -> Bool
Data/Text/Lazy/Read.hs+3−3
@@ -68,9 +68,9 @@ decimal txt
68 go n d = (n * 10 + fromIntegral (digitToInt d))
68 go n d = (n * 10 + fromIntegral (digitToInt d))
69
69
70-- | Read a hexadecimal integer, consisting of an optional leading
70-- | Read a hexadecimal integer, consisting of an optional leading
71−-- @\"0x\"@ followed by at least one hexadecimal digit. Input is
71+-- @\"0x\"@ followed by at least one decimal digit. Input is consumed
72−-- consumed until a non-hex-digit or end of string is reached.
72+-- until a non-hex-digit or end of string is reached. This function
73−-- This function is case insensitive.
73+-- is case insensitive.
74--
74--
75-- This function does not handle leading sign characters. If you need
75-- This function does not handle leading sign characters. If you need
76-- to handle signed input, use @'signed' 'hexadecimal'@.
76-- to handle signed input, use @'signed' 'hexadecimal'@.
Data/Text/Read.hs+3−3
@@ -67,9 +67,9 @@ decimal txt
67 go n d = (n * 10 + fromIntegral (digitToInt d))
67 go n d = (n * 10 + fromIntegral (digitToInt d))
68
68
69-- | Read a hexadecimal integer, consisting of an optional leading
69-- | Read a hexadecimal integer, consisting of an optional leading
70−-- @\"0x\"@ followed by at least one hexadecimal digit. Input is
70+-- @\"0x\"@ followed by at least one decimal digit. Input is consumed
71−-- consumed until a non-hex-digit or end of string is reached.
71+-- until a non-hex-digit or end of string is reached. This function
72−-- This function is case insensitive.
72+-- is case insensitive.
73--
73--
74-- This function does not handle leading sign characters. If you need
74-- This function does not handle leading sign characters. If you need
75-- to handle signed input, use @'signed' 'hexadecimal'@.
75-- to handle signed input, use @'signed' 'hexadecimal'@.
changelog.md−11
@@ -1,14 +1,3 @@
1−* The `toTitle` function now correctly handles letters that
2− immediately follow puncutation. Before, `"there's"` would turn into
3− `"There'S"`. Now, it becomes `"There's"`.
4−
5−* The implementation of unstreaming is faster, resulting in operations
6− such as `map` and `intersperse` speeding up by up to 30%, with
7− smaller code generated.
8−
9−* The optimised length comparison function is now more likely to be
10− used after some rewrite rule tweaking.
11−
121.2.2.1
11.2.2.1
13
2
14* The switch to `integer-pure` in 1.2.2.0 was apparently mistaken.
3* The switch to `integer-pure` in 1.2.2.0 was apparently mistaken.
tests/Tests/Properties.hs+3−23
@@ -9,9 +9,9 @@ module Tests.Properties
9 ) where
9 ) where
10
10
11import Control.Applicative ((<$>), (<*>))
11import Control.Applicative ((<$>), (<*>))
12−import Control.Arrow ((***), first, second)
12+import Control.Arrow ((***), second)
13import Data.Bits ((.&.))
13import Data.Bits ((.&.))
14−import Data.Char (chr, isDigit, isHexDigit, isLower, isSpace, isLetter, isUpper, ord)
14+import Data.Char (chr, isDigit, isHexDigit, isLower, isSpace, isUpper, ord)
15import Data.Int (Int8, Int16, Int32, Int64)
15import Data.Int (Int8, Int16, Int32, Int64)
16import Data.Monoid (Monoid(..))
16import Data.Monoid (Monoid(..))
17import Data.String (IsString(fromString))
17import Data.String (IsString(fromString))
@@ -23,7 +23,6 @@ import Data.Text.Internal.Search (indices)
23import Data.Text.Lazy.Read as TL
23import Data.Text.Lazy.Read as TL
24import Data.Text.Read as T
24import Data.Text.Read as T
25import Data.Word (Word, Word8, Word16, Word32, Word64)
25import Data.Word (Word, Word8, Word16, Word32, Word64)
26−import Data.Maybe (mapMaybe)
27import Numeric (showEFloat, showFFloat, showGFloat, showHex)
26import Numeric (showEFloat, showFFloat, showGFloat, showHex)
28import Prelude hiding (replicate)
27import Prelude hiding (replicate)
29import Test.Framework (Test, testGroup)
28import Test.Framework (Test, testGroup)
@@ -230,13 +229,6 @@ sf_uncons p = (uncons . L.filter p) `eqP`
230 (fmap (second unpackS) . S.uncons . S.filter p)
229 (fmap (second unpackS) . S.uncons . S.filter p)
231t_uncons = uncons `eqP` (fmap (second unpackS) . T.uncons)
230t_uncons = uncons `eqP` (fmap (second unpackS) . T.uncons)
232tl_uncons = uncons `eqP` (fmap (second unpackS) . TL.uncons)
231tl_uncons = uncons `eqP` (fmap (second unpackS) . TL.uncons)
233−
234−unsnoc xs@(_:_) = Just (init xs, last xs)
235−unsnoc [] = Nothing
236−
237−t_unsnoc = unsnoc `eqP` (fmap (first unpackS) . T.unsnoc)
238−tl_unsnoc = unsnoc `eqP` (fmap (first unpackS) . TL.unsnoc)
239−
240s_head = head `eqP` S.head
232s_head = head `eqP` S.head
241sf_head p = (head . L.filter p) `eqP` (S.head . S.filter p)
233sf_head p = (head . L.filter p) `eqP` (S.head . S.filter p)
242t_head = head `eqP` T.head
234t_head = head `eqP` T.head
@@ -334,14 +326,6 @@ t_toUpper_upper t = p (T.toUpper t) >= p t
334 where p = T.length . T.filter isUpper
326 where p = T.length . T.filter isUpper
335tl_toUpper_upper t = p (TL.toUpper t) >= p t
327tl_toUpper_upper t = p (TL.toUpper t) >= p t
336 where p = TL.length . TL.filter isUpper
328 where p = TL.length . TL.filter isUpper
337−t_toTitle_title t = all (<= 1) (caps t)
338− where caps = fmap (T.length . T.filter isUpper) . T.words . T.toTitle
339−t_toTitle_1stNotLower = and . notLow . T.toTitle . T.filter stable
340− where notLow = mapMaybe (fmap (not . isLower) . (T.find isLetter)) . T.words
341− -- Surprise! The Spanish/Portuguese ordinal indicators changed
342− -- from category Ll (letter, lowercase) to Lo (letter, other)
343− -- in Unicode 7.0
344− stable c = c /= '\170' && c /= '\186'
345
329
346justifyLeft k c xs = xs ++ L.replicate (k - length xs) c
330justifyLeft k c xs = xs ++ L.replicate (k - length xs) c
347justifyRight m n xs = L.replicate (m - length xs) n ++ xs
331justifyRight m n xs = L.replicate (m - length xs) n ++ xs
@@ -983,8 +967,6 @@ tests =
983 testProperty "sf_uncons" sf_uncons,
967 testProperty "sf_uncons" sf_uncons,
984 testProperty "t_uncons" t_uncons,
968 testProperty "t_uncons" t_uncons,
985 testProperty "tl_uncons" tl_uncons,
969 testProperty "tl_uncons" tl_uncons,
986− testProperty "t_unsnoc" t_unsnoc,
987− testProperty "tl_unsnoc" tl_unsnoc,
988 testProperty "s_head" s_head,
970 testProperty "s_head" s_head,
989 testProperty "sf_head" sf_head,
971 testProperty "sf_head" sf_head,
990 testProperty "t_head" t_head,
972 testProperty "t_head" t_head,
@@ -1048,9 +1030,7 @@ tests =
1048 testProperty "tl_toLower_lower" tl_toLower_lower,
1030 testProperty "tl_toLower_lower" tl_toLower_lower,
1049 testProperty "t_toUpper_length" t_toUpper_length,
1031 testProperty "t_toUpper_length" t_toUpper_length,
1050 testProperty "t_toUpper_upper" t_toUpper_upper,
1032 testProperty "t_toUpper_upper" t_toUpper_upper,
1051− testProperty "tl_toUpper_upper" tl_toUpper_upper,
1033+ testProperty "tl_toUpper_upper" tl_toUpper_upper
1052− testProperty "t_toTitle_title" t_toTitle_title,
1053− testProperty "t_toTitle_1stNotLower" t_toTitle_1stNotLower
1054 ],
1034 ],
1055
1035
1056 testGroup "justification" [
1036 testGroup "justification" [
tests/text-tests.cabal+2−17
@@ -20,11 +20,6 @@ flag hpc
20 default: False
20 default: False
21 manual: True
21 manual: True
22
22
23−flag bytestring-builder
24− description: Depend on the bytestring-builder package for backwards compatibility.
25− default: False
26− manual: False
27−
28executable text-tests
23executable text-tests
29 main-is: Tests.hs
24 main-is: Tests.hs
30
25
@@ -53,6 +48,7 @@ executable text-tests
53 HUnit >= 1.2,
48 HUnit >= 1.2,
54 QuickCheck >= 2.7,
49 QuickCheck >= 2.7,
55 base == 4.*,
50 base == 4.*,
51+ bytestring,
56 deepseq,
52 deepseq,
57 directory,
53 directory,
58 quickcheck-unicode,
54 quickcheck-unicode,
@@ -62,12 +58,6 @@ executable text-tests
62 test-framework-quickcheck2 >= 0.2,
58 test-framework-quickcheck2 >= 0.2,
63 text-tests
59 text-tests
64
60
65− if flag(bytestring-builder)
66− build-depends: bytestring >= 0.9 && < 0.10.4,
67− bytestring-builder >= 0.10.4
68− else
69− build-depends: bytestring >= 0.10.4
70−
71executable text-tests-stdio
61executable text-tests-stdio
72 main-is: Tests/IO.hs
62 main-is: Tests/IO.hs
73
63
@@ -147,12 +137,7 @@ library
147 array,
137 array,
148 base == 4.*,
138 base == 4.*,
149 binary,
139 binary,
140+ bytestring,
150 deepseq,
141 deepseq,
151 ghc-prim,
142 ghc-prim,
152 integer-gmp
143 integer-gmp
153−
154− if flag(bytestring-builder)
155− build-depends: bytestring >= 0.9 && < 0.10.4,
156− bytestring-builder >= 0.10.4
157− else
158− build-depends: bytestring >= 0.10.4