module Data.Vector.Storable.MMap (
System.IO.MMap.Mode(..),
unsafeMMapMVector,
unsafeMMapVector
) where
import System.IO.MMap
import Foreign.Storable
import qualified Data.Vector.Storable as I
import qualified Data.Vector.Storable.Mutable as M
import Data.Int
import Control.Monad.Primitive
unsafeMMapMVector :: forall s a. Storable a => FilePath
-> Mode
-> Maybe (Int64, Int)
-> IO (M.MVector (PrimState IO) a)
unsafeMMapMVector path mode range =
do (foreignPtr, offset, size) <- mmapFileForeignPtr path mode $
case range of
Nothing -> Nothing
Just (start, length) -> Just (start, length * sizeOf (undefined :: a))
return $ M.unsafeFromForeignPtr foreignPtr offset (size `div` sizeOf (undefined :: a))
unsafeMMapVector :: forall a. Storable a => FilePath
-> Maybe (Int64, Int)
-> IO (I.Vector a)
unsafeMMapVector path range =
do (foreignPtr, offset, size) <- mmapFileForeignPtr path ReadOnly $
case range of
Nothing -> Nothing
Just (start, length) -> Just (start, length * sizeOf (undefined :: a))
return $ I.unsafeFromForeignPtr foreignPtr offset (size `div` sizeOf (undefined :: a))