@@ -48,8 +48,6 @@ stream text = Stream next (text :*: 0) unknownSize
4848 where Iter c d = iter t i
4949{-# INLINE [0] stream #-}
5050
51−data UC s = UC I.Text s
52−
5351-- | /O(n)/ Convert a 'Stream Char' into a 'Text', using the given
5452-- chunk size.
5553unstreamChunks :: Int -> Stream Char -> Text
@@ -57,33 +55,32 @@ unstreamChunks !chunkSize (Stream next s0 len0)
5755 | isEmpty len0 = Empty
5856 | otherwise = outer s0
5957 where
60− outer s = {-# SCC "unstreamChunks/outer" #-}
61− case next s of
58+ outer so = {-# SCC "unstreamChunks/outer" #-}
59+ case next so of
6260 Done -> Empty
6361 Skip s' -> outer s'
64− Yield x s' -> t `Chunk` outer s''
65− where UC t s'' = runST fill
66− fill = do a <- A.new unknownLength
67− unsafeWrite a 0 x >>= inner a unknownLength s'
68− unknownLength = 4
69− finish marr len s = do
70− arr <- A.unsafeFreeze marr
71− let !t = I.Text arr 0 len
72− return (UC t s)
73− inner marr !len s !i
74− | i + 1 >= chunkSize = finish marr i s
75− | i + 1 >= len = {-# SCC "unstreamChunks/resize" #-} do
76− let newLen = min (len `shiftL` 1) chunkSize
77− marr' <- A.new newLen
78− A.copyM marr' 0 marr 0 len
79− inner marr' newLen s i
80− | otherwise =
81− {-# SCC "unstreamChunks/inner" #-}
82− case next s of
83− Done -> finish marr i s
84− Skip s' -> inner marr len s' i
85− Yield x s' -> do d <- unsafeWrite marr i x
86− inner marr len s' (i+d)
62+ Yield x s' -> runST $ do
63+ a <- A.new unknownLength
64+ unsafeWrite a 0 x >>= inner a unknownLength s'
65+ where unknownLength = 4
66+ where
67+ inner marr !len s !i
68+ | i + 1 >= chunkSize = finish marr i s
69+ | i + 1 >= len = {-# SCC "unstreamChunks/resize" #-} do
70+ let newLen = min (len `shiftL` 1) chunkSize
71+ marr' <- A.new newLen
72+ A.copyM marr' 0 marr 0 len
73+ inner marr' newLen s i
74+ | otherwise =
75+ {-# SCC "unstreamChunks/inner" #-}
76+ case next s of
77+ Done -> finish marr i s
78+ Skip s' -> inner marr len s' i
79+ Yield x s' -> do d <- unsafeWrite marr i x
80+ inner marr len s' (i+d)
81+ finish marr len s' = do
82+ arr <- A.unsafeFreeze marr
83+ return (I.Text arr 0 len `Chunk` outer s')
8784{-# INLINE [0] unstreamChunks #-}
8885
8986-- | /O(n)/ Convert a 'Stream Char' into a 'Text', using