{-# OPTIONS -O #-}
import qualified Data.ByteString as P
import Data.ByteString.Base
import System.IO.Unsafe
import Data.Word
import Foreign
import GHC.Base (build)
--
-- head (my_unpack ..) should fail in 6.5 due to some rules issue, I think
--
main = do
print x
print $ (my_unpack x)
print $ last (my_unpack x)
print $ head (my_unpack x) -- should be '1', but bug causes an exception
where
x = P.pack [1..10]
--
-- a list-fuseable unpack
--
my_unpack ps = build (unpackFoldr ps)
{-# INLINE my_unpack #-}
unpackFoldr :: ByteString -> (Word8 -> a -> a) -> a -> a
unpackFoldr (PS fp off len) f ch =
unsafePerformIO $ withForeignPtr fp $ \p -> do
let loop a b c | a `seq` b `seq` False = undefined -- needs the strictness
loop _ (-1) acc = return acc
loop q n acc = do
a <- peekByteOff q n
loop q (n-1) (a `f` acc)
loop (p `plusPtr` off) (len-1) ch