git.iko.soy/typeable/attoparsec
on master help sign in
Optimize scan
76d6eb6Johan Tibell
Data/Attoparsec/ByteString/Internal.hs+5−5
@@ -76,7 +76,7 @@ import Foreign.ForeignPtr (withForeignPtr)
76import Foreign.Ptr (castPtr, minusPtr, plusPtr)
76import Foreign.Ptr (castPtr, minusPtr, plusPtr)
77import Foreign.Storable (Storable(peek, sizeOf))
77import Foreign.Storable (Storable(peek, sizeOf))
78import Prelude hiding (getChar, take, takeWhile)
78import Prelude hiding (getChar, take, takeWhile)
79−import System.IO.Unsafe (unsafePerformIO)
79+import System.IO.Unsafe (unsafeDupablePerformIO)
80import qualified Data.Attoparsec.Internal.Types as T
80import qualified Data.Attoparsec.Internal.Types as T
81import qualified Data.ByteString as B8
81import qualified Data.ByteString as B8
82import qualified Data.ByteString.Char8 as B
82import qualified Data.ByteString.Char8 as B
@@ -345,7 +345,7 @@ scan s0 p = do
345 chunks <- go [] s0
345 chunks <- go [] s0
346 case chunks of
346 case chunks of
347 [x] -> return x
347 [x] -> return x
348− xs -> return . B.concat . reverse $ xs
348+ xs -> return $! B.concat $ reverse xs
349 where
349 where
350 go acc s1 = do
350 go acc s1 = do
351 let scanner (B.PS fp off len) =
351 let scanner (B.PS fp off len) =
@@ -362,9 +362,9 @@ scan s0 p = do
362 done !i !s = return (T i s)
362 done !i !s = return (T i s)
363 inner start s1
363 inner start s1
364 bs <- get
364 bs <- get
365− let T i s' = unsafePerformIO $ scanner bs
365+ let T i s' = unsafeDupablePerformIO $ scanner bs
366− h = B.unsafeTake i bs
366+ !h = B.unsafeTake i bs
367− t = B.unsafeDrop i bs
367+ !t = B.unsafeDrop i bs
368 put t
368 put t
369 if B.null t
369 if B.null t
370 then do
370 then do