@@ -136,34 +136,29 @@ stream (Text arr off len) = Stream next off len
136136unstream :: Stream Char -> Text
137137unstream (Stream next0 s0 len) = Text (fst a) 0 (snd a)
138138 where
139− a :: ((A.Array Word16),Int)
140− a = runST ((A.unsafeNew len :: ST s (A.MArray s Word16))
141− >>= (\arr -> loop arr 0 len s0))
139+ a = runST (A.unsafeNew len >>= (\arr -> loop arr 0 len s0))
142140 loop arr !i !top !s
143− | i + 1 > top = do arr' <- A.unsafeNew (top*2)
144− case next0 s of
145− Done -> liftM2 (,) (A.unsafeFreeze arr) (return i)
146− _ -> copy arr arr' >> loop arr' i (top*2) s
141+ | i + 1 > top = case next0 s of
142+ Done -> liftM2 (,) (A.unsafeFreeze arr) (return i)
143+ _ -> do
144+ arr' <- A.unsafeNew (top*2)
145+ copy arr arr' >> loop arr' i (top*2) s
147146 | otherwise = case next0 s of
148147 Done -> liftM2 (,) (A.unsafeFreeze arr) (return i)
149148 Skip s' -> loop arr i top s'
150149 Yield x s'
151150 | n < 0x10000 -> do
152− A.unsafeWrite arr i (fromIntegral n :: Word16)
151+ A.unsafeWrite arr i (fromIntegral n)
153152 loop arr (i+1) top s'
154153 | otherwise -> do
155154 A.unsafeWrite arr i l
156155 A.unsafeWrite arr (i + 1) r
157156 loop arr (i+2) top s'
158157 where
159− n :: Int
160158 n = ord x
161− m :: Int
162159 m = n - 0x10000
163− l :: Word16
164− l = fromIntegral $ (shiftR m 10) + (0xD800 :: Int)
165− r :: Word16
166− r = fromIntegral $ (m .&. (0x3FF :: Int)) + (0xDC00 :: Int)
160+ l = fromIntegral $ (m `shiftR` 10) + 0xD800
161+ r = fromIntegral $ (m .&. 0x3FF) + 0xDC00
167162{-# INLINE [0] unstream #-}
168163{-# RULES "STREAM stream/unstream fusion" forall s. stream (unstream s) = s #-}
169164