on master help sign in
Merge
commitd651007dd212c36ede22264ebaff23b58168a5ef authorBryan O'Sullivan <bryano@fb.com> dateTue 19 Jun 2012, 00:38 (14 years ago) parentd59ba29d52fb2a
2 files changed+17−7
Data/Text/Fusion.hs+6−5 Data/Text/Private.hs+11−2
Data/Text/Fusion.hs+6−5
@@ -51,6 +51,7 @@ import Prelude (Bool(..), Char, Maybe(..), Monad(..), Int,
5151 fromIntegral, otherwise)
5252import Data.Bits ((.&.))
5353import Data.Text.Internal (Text(..))
54+import Data.Text.Private (runText)
5455import Data.Text.UnsafeChar (ord, unsafeChr, unsafeWrite)
5556import Data.Text.UnsafeShift (shiftL, shiftR)
5657import qualified Data.Text.Array as A
@@ -94,22 +95,22 @@ reverseStream (Text arr off len) = Stream next (off+len-1) (maxSize len)
9495
9596-- | /O(n)/ Convert a 'Stream Char' into a 'Text'.
9697unstream :: 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
9899 where
99− a = A.run2 (A.new mlen >>= \arr -> outer arr mlen s0 0)
100+ a = runText (\done -> A.new mlen >>= \arr -> outer done arr mlen s0 0)
100101 where mlen = upperBound 4 len
101− outer arr top = loop
102+ outer done arr top = loop
102103 where
103104 loop !s !i =
104105 case next0 s of
105− Done -> return (arr, i)
106+ Done -> done arr i
106107 Skip s' -> loop s' i
107108 Yield x s'
108109 | j >= top -> {-# SCC "unstream/resize" #-} do
109110 let top' = (top + 1) `shiftL` 1
110111 arr' <- A.new top'
111112 A.copyM arr' 0 arr 0 top
112− outer arr' top' s i
113+ outer done arr' top' s i
113114 | otherwise -> do d <- unsafeWrite arr i x
114115 loop s' (i+d)
115116 where j | ord x < 0x10000 = i
Data/Text/Private.hs+11−2
@@ -1,4 +1,4 @@
1−{-# LANGUAGE BangPatterns, UnboxedTuples #-}
1+{-# LANGUAGE BangPatterns, Rank2Types, UnboxedTuples #-}
22
33-- |
44-- Module : Data.Text.Private
@@ -11,11 +11,14 @@
1111
1212module Data.Text.Private
1313 (
14− span_
14+ runText
15+ , span_
1516 ) where
1617
18+import Control.Monad.ST (ST, runST)
1719import Data.Text.Internal (Text(..), textP)
1820import Data.Text.Unsafe (Iter(..), iter)
21+import qualified Data.Text.Array as A
1922
2023span_ :: (Char -> Bool) -> Text -> (# Text, Text #)
2124span_ p t@(Text arr off len) = (# hd,tl #)
@@ -26,3 +29,9 @@ span_ p t@(Text arr off len) = (# hd,tl #)
2629 | otherwise = i
2730 where Iter c d = iter t i
2831{-# INLINE span_ #-}
32+
33+runText :: (forall s. (A.MArray s -> Int -> ST s Text) -> ST s Text) -> Text
34+runText act = runST (act $ \ !marr !len -> do
35+ arr <- A.unsafeFreeze marr
36+ return $! textP arr 0 len)
37+{-# INLINE runText #-}