on master help sign in
8 files changed+20−89
since splitsnapshots
unifiedsplit
Data/Text.hs−12 Data/Text/Internal/Fusion/Common.hs+9−10 Data/Text/Lazy.hs−10 Data/Text/Lazy/Read.hs+3−3 Data/Text/Read.hs+3−3 changelog.md−11 tests/Tests/Properties.hs+3−23 tests/text-tests.cabal+2−17
Data/Text.hs−12
@@ -60,7 +60,6 @@ module Data.Text
6060 , snoc
6161 , append
6262 , uncons
63− , unsnoc
6463 , head
6564 , last
6665 , tail
@@ -546,17 +545,6 @@ init (Text arr off len) | len <= 0 = emptyError "init"
546545 unstream (S.init (stream t)) = init t
547546 #-}
548547
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−
560548-- | /O(1)/ Tests whether a 'Text' is empty or not. Subject to
561549-- fusion.
562550null :: Text -> Bool
Data/Text/Internal/Fusion/Common.hs+9−10
@@ -107,7 +107,7 @@ import Prelude (Bool(..), Char, Eq(..), Int, Integral, Maybe(..),
107107import qualified Data.List as L
108108import qualified Prelude as P
109109import Data.Bits (shiftL)
110−import Data.Char (isLetter, isSpace)
110+import Data.Char (isLetter)
111111import Data.Int (Int64)
112112import Data.Text.Internal.Fusion.Types
113113import 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
462462 where
463463 next (CC (letter :*: s) '\0' _) =
464464 case next0 s of
465− Done -> Done
466− Skip s' -> Skip (CC (letter :*: s') '\0' '\0')
465+ Done -> Done
466+ Skip s' -> Skip (CC (letter :*: s') '\0' '\0')
467467 Yield c s'
468− | nonSpace -> if letter
469− then lowerMapping c (nonSpace :*: s')
470− else titleMapping c (letter' :*: s')
471− | otherwise -> Yield c (CC (letter' :*: s') '\0' '\0')
472− where nonSpace = P.not (isSpace c)
473− letter' = isLetter c
474− next (CC s a b) = Yield a (CC s b '\0')
468+ | letter' -> if letter
469+ then lowerMapping c (letter' :*: s')
470+ else titleMapping c (letter' :*: s')
471+ | otherwise -> Yield c (CC (letter' :*: s') '\0' '\0')
472+ where letter' = isLetter c
473+ next (CC s a b) = Yield a (CC s b '\0')
475474{-# INLINE [0] toTitle #-}
476475
477476data Justify i s = Just1 !i !s
Data/Text/Lazy.hs−10
@@ -68,7 +68,6 @@ module Data.Text.Lazy
6868 , snoc
6969 , append
7070 , uncons
71− , unsnoc
7271 , head
7372 , last
7473 , tail
@@ -562,15 +561,6 @@ init Empty = emptyError "init"
562561 unstream (S.init (stream t)) = init t
563562 #-}
564563
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−
574564-- | /O(1)/ Tests whether a 'Text' is empty or not. Subject to
575565-- fusion.
576566null :: Text -> Bool
Data/Text/Lazy/Read.hs+3−3
@@ -68,9 +68,9 @@ decimal txt
6868 go n d = (n * 10 + fromIntegral (digitToInt d))
6969
7070-- | Read a hexadecimal integer, consisting of an optional leading
71−-- @\"0x\"@ followed by at least one hexadecimal digit. Input is
72−-- consumed until a non-hex-digit or end of string is reached.
73−-- This function is case insensitive.
71+-- @\"0x\"@ followed by at least one decimal digit. Input is consumed
72+-- until a non-hex-digit or end of string is reached. This function
73+-- is case insensitive.
7474--
7575-- This function does not handle leading sign characters. If you need
7676-- to handle signed input, use @'signed' 'hexadecimal'@.
Data/Text/Read.hs+3−3
@@ -67,9 +67,9 @@ decimal txt
6767 go n d = (n * 10 + fromIntegral (digitToInt d))
6868
6969-- | Read a hexadecimal integer, consisting of an optional leading
70−-- @\"0x\"@ followed by at least one hexadecimal digit. Input is
71−-- consumed until a non-hex-digit or end of string is reached.
72−-- This function is case insensitive.
70+-- @\"0x\"@ followed by at least one decimal digit. Input is consumed
71+-- until a non-hex-digit or end of string is reached. This function
72+-- is case insensitive.
7373--
7474-- This function does not handle leading sign characters. If you need
7575-- 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−
1211.2.2.1
132
143* 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
99 ) where
1010
1111import Control.Applicative ((<$>), (<*>))
12−import Control.Arrow ((***), first, second)
12+import Control.Arrow ((***), second)
1313import 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)
1515import Data.Int (Int8, Int16, Int32, Int64)
1616import Data.Monoid (Monoid(..))
1717import Data.String (IsString(fromString))
@@ -23,7 +23,6 @@ import Data.Text.Internal.Search (indices)
2323import Data.Text.Lazy.Read as TL
2424import Data.Text.Read as T
2525import Data.Word (Word, Word8, Word16, Word32, Word64)
26−import Data.Maybe (mapMaybe)
2726import Numeric (showEFloat, showFFloat, showGFloat, showHex)
2827import Prelude hiding (replicate)
2928import Test.Framework (Test, testGroup)
@@ -230,13 +229,6 @@ sf_uncons p = (uncons . L.filter p) `eqP`
230229 (fmap (second unpackS) . S.uncons . S.filter p)
231230t_uncons = uncons `eqP` (fmap (second unpackS) . T.uncons)
232231tl_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−
240232s_head = head `eqP` S.head
241233sf_head p = (head . L.filter p) `eqP` (S.head . S.filter p)
242234t_head = head `eqP` T.head
@@ -334,14 +326,6 @@ t_toUpper_upper t = p (T.toUpper t) >= p t
334326 where p = T.length . T.filter isUpper
335327tl_toUpper_upper t = p (TL.toUpper t) >= p t
336328 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'
345329
346330justifyLeft k c xs = xs ++ L.replicate (k - length xs) c
347331justifyRight m n xs = L.replicate (m - length xs) n ++ xs
@@ -983,8 +967,6 @@ tests =
983967 testProperty "sf_uncons" sf_uncons,
984968 testProperty "t_uncons" t_uncons,
985969 testProperty "tl_uncons" tl_uncons,
986− testProperty "t_unsnoc" t_unsnoc,
987− testProperty "tl_unsnoc" tl_unsnoc,
988970 testProperty "s_head" s_head,
989971 testProperty "sf_head" sf_head,
990972 testProperty "t_head" t_head,
@@ -1048,9 +1030,7 @@ tests =
10481030 testProperty "tl_toLower_lower" tl_toLower_lower,
10491031 testProperty "t_toUpper_length" t_toUpper_length,
10501032 testProperty "t_toUpper_upper" t_toUpper_upper,
1051− testProperty "tl_toUpper_upper" tl_toUpper_upper,
1052− testProperty "t_toTitle_title" t_toTitle_title,
1053− testProperty "t_toTitle_1stNotLower" t_toTitle_1stNotLower
1033+ testProperty "tl_toUpper_upper" tl_toUpper_upper
10541034 ],
10551035
10561036 testGroup "justification" [
tests/text-tests.cabal+2−17
@@ -20,11 +20,6 @@ flag hpc
2020 default: False
2121 manual: True
2222
23−flag bytestring-builder
24− description: Depend on the bytestring-builder package for backwards compatibility.
25− default: False
26− manual: False
27−
2823executable text-tests
2924 main-is: Tests.hs
3025
@@ -53,6 +48,7 @@ executable text-tests
5348 HUnit >= 1.2,
5449 QuickCheck >= 2.7,
5550 base == 4.*,
51+ bytestring,
5652 deepseq,
5753 directory,
5854 quickcheck-unicode,
@@ -62,12 +58,6 @@ executable text-tests
6258 test-framework-quickcheck2 >= 0.2,
6359 text-tests
6460
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−
7161executable text-tests-stdio
7262 main-is: Tests/IO.hs
7363
@@ -147,12 +137,7 @@ library
147137 array,
148138 base == 4.*,
149139 binary,
140+ bytestring,
150141 deepseq,
151142 ghc-prim,
152143 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