on master help sign in
Merge
9dd4488Bryan O'Sullivan
Data/Text/Fusion.hs+4−3
@@ -51,6 +51,7 @@ import Prelude (Bool(..), Char, Maybe(..), Monad(..), Int,
51 fromIntegral, otherwise)
51 fromIntegral, otherwise)
52import Data.Bits ((.&.))
52import Data.Bits ((.&.))
53import Data.Text.Internal (Text(..))
53import Data.Text.Internal (Text(..))
54+import Data.Text.Private (Run(..), runText)
54import Data.Text.UnsafeChar (ord, unsafeChr, unsafeWrite)
55import Data.Text.UnsafeChar (ord, unsafeChr, unsafeWrite)
55import Data.Text.UnsafeShift (shiftL, shiftR)
56import Data.Text.UnsafeShift (shiftL, shiftR)
56import qualified Data.Text.Array as A
57import qualified Data.Text.Array as A
@@ -94,15 +95,15 @@ reverseStream (Text arr off len) = Stream next (off+len-1) (maxSize len)
94
95
95-- | /O(n)/ Convert a 'Stream Char' into a 'Text'.
96-- | /O(n)/ Convert a 'Stream Char' into a 'Text'.
96unstream :: Stream Char -> Text
97unstream :: Stream Char -> Text
97−unstream (Stream next0 s0 len) = I.textP (P.fst a) 0 (P.snd a)
98+unstream (Stream next0 s0 len) = a
98 where
99 where
99− a = A.run2 (A.new mlen >>= \arr -> outer arr mlen s0 0)
100+ a = runText (A.new mlen >>= \arr -> outer arr mlen s0 0)
100 where mlen = upperBound 4 len
101 where mlen = upperBound 4 len
101 outer arr top = loop
102 outer arr top = loop
102 where
103 where
103 loop !s !i =
104 loop !s !i =
104 case next0 s of
105 case next0 s of
105− Done -> return (arr, i)
106+ Done -> return (Run arr i)
106 Skip s' -> loop s' i
107 Skip s' -> loop s' i
107 Yield x s'
108 Yield x s'
108 | j >= top -> {-# SCC "unstream/resize" #-} do
109 | j >= top -> {-# SCC "unstream/resize" #-} do
Data/Text/Private.hs+14−2
@@ -1,4 +1,4 @@
1−{-# LANGUAGE BangPatterns, UnboxedTuples #-}
1+{-# LANGUAGE BangPatterns, Rank2Types, UnboxedTuples #-}
2
2
3-- |
3-- |
4-- Module : Data.Text.Private
4-- Module : Data.Text.Private
@@ -11,11 +11,15 @@
11
11
12module Data.Text.Private
12module Data.Text.Private
13 (
13 (
14+ Run(..)
15+ , runText
14− span_
16+ , span_
15 ) where
17 ) where
16
18
19+import Control.Monad.ST (ST, runST)
17import Data.Text.Internal (Text(..), textP)
20import Data.Text.Internal (Text(..), textP)
18import Data.Text.Unsafe (Iter(..), iter)
21import Data.Text.Unsafe (Iter(..), iter)
22+import qualified Data.Text.Array as A
19
23
20span_ :: (Char -> Bool) -> Text -> (# Text, Text #)
24span_ :: (Char -> Bool) -> Text -> (# Text, Text #)
21span_ p t@(Text arr off len) = (# hd,tl #)
25span_ p t@(Text arr off len) = (# hd,tl #)
@@ -26,3 +30,11 @@ span_ p t@(Text arr off len) = (# hd,tl #)
26 | otherwise = i
30 | otherwise = i
27 where Iter c d = iter t i
31 where Iter c d = iter t i
28{-# INLINE span_ #-}
32{-# INLINE span_ #-}
33+
34+data Run s = Run !(A.MArray s) !Int
35+
36+runText :: (forall s. ST s (Run s)) -> Text
37+runText act = runST (do Run marr len <- act
38+ arr <- A.unsafeFreeze marr
39+ return (textP arr 0 len))
40+{-# INLINE runText #-}