Skip to content

Instantly share code, notes, and snippets.

@hasufell
Created January 2, 2020 15:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hasufell/337ce3f09221cc9905d2eb26f17ad396 to your computer and use it in GitHub Desktop.
Save hasufell/337ce3f09221cc9905d2eb26f17ad396 to your computer and use it in GitHub Desktop.
module Foo where
import Control.Monad.IO.Class
import Control.Monad.Trans.Resource
import Data.ByteString (ByteString)
import Data.ByteString.Unsafe
import Data.Functor
import Data.Word8
import Foreign.ForeignPtr
import Foreign.ForeignPtr.Unsafe
import Foreign.Ptr
import Streamly
import System.FilePath
import System.IO
import qualified Data.ByteString as BS
import qualified Streamly.Data.Fold as FL
import qualified Streamly.FileSystem.Handle as FH
import qualified Streamly.Internal.Data.Stream.StreamD.Type as D
import qualified Streamly.Internal.FileSystem.Handle as IFH
import qualified Streamly.Internal.Memory.Array.Types as AI
import qualified Streamly.Internal.Prelude as S
import qualified Streamly.Memory.Array as A
import qualified Streamly.Prelude as S
myFileStream :: MonadIO m => FilePath -> ResIO (SerialT m (A.Array Word8))
myFileStream fp = do
(_, fh) <- allocate (openFile fp ReadMode) hClose
pure $ IFH.toChunksWithBufferOf (256*1024) fh
entireFile :: FilePath -> IO ByteString
entireFile fp =
runResourceT $ (myFileStream fp) >>= \stream ->
S.fold FL.mconcat stream >>= arrayToByteString
arrayToByteString :: MonadIO m => A.Array Word8 -> m ByteString
arrayToByteString arr
| A.length arr == 0 = return mempty
arrayToByteString AI.Array {..} =
liftIO $
withForeignPtr aStart $ \ptr ->
unsafePackCStringFinalizer ptr aLen (return ())
where
aLen =
let p = unsafeForeignPtrToPtr aStart
in aEnd `minusPtr` p
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment