blob: 157d928dacddd034bfcb98f960003b231d0de30a (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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
|