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