aboutsummaryrefslogtreecommitdiff
path: root/montis/src/Montis/Foreign/Marshal.hs
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