File: fast-cp.hs

package info (click to toggle)
haskell-bytestring-mmap 0.2.2-13
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 116 kB
  • sloc: haskell: 230; ansic: 11; sh: 7; makefile: 2
file content (29 lines) | stat: -rw-r--r-- 1,001 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import qualified System.IO.Posix.MMap.Lazy     as L
import qualified Data.ByteString.Lazy          as L
import qualified Data.ByteString.Lazy.Internal as L
import qualified Data.ByteString.Internal      as S
import qualified Data.ByteString               as S

import Foreign.ForeignPtr
import System.Environment
import System.IO
import Control.Exception

main = do
    [f,g] <- getArgs
    writeFile' g =<< L.unsafeMMapFile f

--
-- An implementation of writeFile for bytestrings that 
-- that finalises chunks as they go out the door.
--
writeFile' :: FilePath -> L.ByteString -> IO ()
writeFile' f txt = bracket (openBinaryFile f WriteMode) hClose (\hdl -> hPut hdl txt)

hPut :: Handle -> L.ByteString -> IO ()
hPut h cs = L.foldrChunks (\chunk rest -> do S.hPut h chunk
                                             unmap chunk
                                             rest)
                          (return ()) cs

    where unmap c = finalizeForeignPtr fp where (fp,_,_) = S.toForeignPtr c