module Cgm.System.Mem.Alloc (
mallocArrayLen,
copyArrayLen,
advancePtrLen,
minusPtrLen,
pokeLenOff,
peekLenOff,
hPutBufLen,
hGetBufLen
) where
import Debug.Trace
import Data.Functor
import Data.Word
import Foreign.Ptr
import Foreign.Storable
import Foreign.Marshal.Array
import System.IO
import Cgm.Data.Len
import Cgm.Control.Combinators
mallocArrayLen :: (Storable a, Integral b) => Len a b -> IO (Ptr a)
mallocArrayLen = mallocArray . fromIntegral . getLen
copyArrayLen :: (Storable a, Integral b) => Ptr a -> Ptr a -> Len a b -> IO ()
copyArrayLen dest src = copyArray dest src . fromIntegral . getLen
advancePtrLen :: (Storable a, Integral b) => Ptr a -> Len a b -> Ptr a
advancePtrLen p = advancePtr p . fromIntegral . getLen
minusPtrLen :: (LgMultiple a Word8) => Ptr a -> Ptr a -> Len a Int
minusPtrLen a b = fst $ coarseRem (unsafeLen $ a `minusPtr` b :: Len Word8 Int)
pokeLenOff :: (Show a, Storable a, Integral b) => Ptr a -> Len a b -> a -> IO ()
pokeLenOff ptr = pokeElemOff ptr . fromIntegral . getLen
peekLenOff :: (Storable a, Integral b) => Ptr a -> Len a b -> IO a
peekLenOff ptr = peekElemOff ptr . fromIntegral . getLen
hPutBufLen :: (Storable a, Integral b) => Handle -> Ptr a -> Len a b -> IO ()
hPutBufLen h ptr = hPutBuf h ptr . fromIntegral . getLen
hGetBufLen :: (Storable a, Integral b) => Handle -> Ptr a -> Len a b -> IO (Len a b)
hGetBufLen h ptr = ((unsafeLen . fromIntegral) <$>) . hGetBuf h ptr . fromIntegral . getLen