git.iko.soy/typeable/attoparsec
on master help sign in
Optimize scan
commit76d6eb63fcf86baf325f75f78d54a6242cdef727 authorJohan Tibell <johan.tibell@gmail.com> dateTue 13 Nov 2012, 14:45 (14 years ago) parent0bd7464
1 file changed+5−5
Data/Attoparsec/ByteString/Internal.hs+5−5
Data/Attoparsec/ByteString/Internal.hs+5−5
@@ -76,7 +76,7 @@ import Foreign.ForeignPtr (withForeignPtr)
7676import Foreign.Ptr (castPtr, minusPtr, plusPtr)
7777import Foreign.Storable (Storable(peek, sizeOf))
7878import Prelude hiding (getChar, take, takeWhile)
79−import System.IO.Unsafe (unsafePerformIO)
79+import System.IO.Unsafe (unsafeDupablePerformIO)
8080import qualified Data.Attoparsec.Internal.Types as T
8181import qualified Data.ByteString as B8
8282import qualified Data.ByteString.Char8 as B
@@ -345,7 +345,7 @@ scan s0 p = do
345345 chunks <- go [] s0
346346 case chunks of
347347 [x] -> return x
348− xs -> return . B.concat . reverse $ xs
348+ xs -> return $! B.concat $ reverse xs
349349 where
350350 go acc s1 = do
351351 let scanner (B.PS fp off len) =
@@ -362,9 +362,9 @@ scan s0 p = do
362362 done !i !s = return (T i s)
363363 inner start s1
364364 bs <- get
365− let T i s' = unsafePerformIO $ scanner bs
366− h = B.unsafeTake i bs
367− t = B.unsafeDrop i bs
365+ let T i s' = unsafeDupablePerformIO $ scanner bs
366+ !h = B.unsafeTake i bs
367+ !t = B.unsafeDrop i bs
368368 put t
369369 if B.null t
370370 then do