on master help sign in
Depend on bytestring-builder for API backwards compatibility
commit54e45df22d54e33caa7bbaec6d893a6670f484e3 authorRyan Scott <ryan.gl.scott@gmail.com> dateSat 2 Jul 2016, 12:28 (10 years ago) parent18f9a7b
5 files changed+39−39
Data/Text/Encoding.hs+7−18 Data/Text/Lazy/Encoding.hs+5−15 benchmarks/text-benchmarks.cabal+11−1 tests/literal-rule-test.sh+1−1 text.cabal+15−4
Data/Text/Encoding.hs+7−18
@@ -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,24 +66,15 @@ 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)
8774import Data.Text.Encoding.Error (OnDecodeError, UnicodeException, strictDecode)
8875import Data.Text.Internal (Text(..), safe, text)
8976import Data.Text.Internal.Private (runText)
90−import Data.Text.Internal.Unsafe.Char (unsafeWrite)
77+import Data.Text.Internal.Unsafe.Char (ord, unsafeWrite)
9178import Data.Text.Internal.Unsafe.Shift (shiftR)
9279import Data.Text.Show ()
9380import Data.Text.Unsafe (unsafeDupablePerformIO)
@@ -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"
@@ -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/Lazy/Encoding.hs+5−15
@@ -46,27 +46,23 @@ 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 (Monoid(..))
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
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
7066import qualified Data.Text as T
7167import qualified Data.Text.Encoding as TE
7268import qualified Data.Text.Internal.Lazy.Encoding.Fusion as E
@@ -146,7 +142,6 @@ decodeUtf8' bs = unsafeDupablePerformIO $ do
146142{-# INLINE decodeUtf8' #-}
147143
148144encodeUtf8 :: Text -> B.ByteString
149−#if MIN_VERSION_bytestring(0,10,4)
150145encodeUtf8 Empty = B.empty
151146encodeUtf8 lt@(Chunk t _) =
152147 B.toLazyByteStringWith strategy B.empty $ encodeUtf8Builder lt
@@ -168,11 +163,6 @@ encodeUtf8BuilderEscaped :: BP.BoundedPrim Word8 -> Text -> B.Builder
168163encodeUtf8BuilderEscaped prim =
169164 foldrChunks (\c b -> TE.encodeUtf8BuilderEscaped prim c `mappend` b) mempty
170165
171−#else
172−encodeUtf8 (Chunk c cs) = B.Chunk (TE.encodeUtf8 c) (encodeUtf8 cs)
173−encodeUtf8 Empty = B.Empty
174−#endif
175−
176166-- | Decode text from little endian UTF-16 encoding.
177167decodeUtf16LEWith :: OnDecodeError -> B.ByteString -> Text
178168decodeUtf16LEWith onErr bs = F.unstream (E.streamUtf16LE onErr bs)
benchmarks/text-benchmarks.cabal+11−1
@@ -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
@@ -33,7 +38,6 @@ executable text-benchmarks
3338 build-depends: base == 4.*,
3439 binary,
3540 blaze-builder,
36− bytestring,
3741 bytestring-lexing >= 0.5.0,
3842 containers,
3943 criterion >= 0.10.0.0,
@@ -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
tests/literal-rule-test.sh+1−1
@@ -6,7 +6,7 @@ function check_firings() {
66 rule=$1
77 expected=$2
88 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"
1010 touch LiteralRuleTest.hs
1111 echo -n "Want to see $expected firings of rule $rule... " >&2
1212 firings=$($build 2>&1 | grep "Rule fired: $rule\$" | wc -l)
text.cabal+15−4
@@ -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
@@ -133,10 +138,11 @@ library
133138 deepseq >= 1.1.0.0,
134139 ghc-prim >= 0.2
135140
136− if impl(ghc >= 7.7)
137− 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
138144 else
139− build-depends: bytestring >= 0.9
145+ build-depends: bytestring >= 0.10.4
140146
141147 cpp-options: -DHAVE_DEEPSEQ
142148 ghc-options: -Wall -fwarn-tabs -funbox-strict-fields -O2
@@ -171,7 +177,6 @@ test-suite tests
171177 array,
172178 base,
173179 binary,
174− bytestring,
175180 deepseq,
176181 directory,
177182 ghc-prim,
@@ -181,6 +186,12 @@ test-suite tests
181186 test-framework-hunit >= 0.2,
182187 test-framework-quickcheck2 >= 0.2
183188
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+
184195 if flag(integer-simple)
185196 cpp-options: -DINTEGER_SIMPLE
186197 build-depends: integer-simple >= 0.1 && < 0.5