module Montis.Foreign.Marshal where import Control.Monad.State import Data.Word import Foreign (Ptr, Storable (peek, sizeOf), castPtr, plusPtr) type Offset = Word32 newtype Demarshal a = Demarshal (StateT (Ptr ()) IO a) deriving (Functor, Monad, Applicative, MonadState (Ptr ())) runDemarshal :: Ptr b -> Demarshal a -> IO a runDemarshal p (Demarshal dm) = evalStateT dm (castPtr p) demarshal :: (Storable a) => Demarshal a demarshal = do ptr <- get val <- Demarshal $ lift $ peek $ castPtr ptr put (plusPtr ptr (sizeOf val)) return val