mirror of
https://github.com/zap-proto/haskell.git
synced 2026-10-30 15:05:00 +00:00
34 lines
977 B
Haskell
34 lines
977 B
Haskell
{-# LANGUAGE DataKinds #-}
|
|
{-# LANGUAGE FlexibleContexts #-}
|
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
|
{-# LANGUAGE TypeFamilies #-}
|
|
module Codec.Capnp
|
|
( newRoot
|
|
, setRoot
|
|
, getRoot
|
|
) where
|
|
|
|
import Capnp.Classes
|
|
|
|
import Capnp.Message (Mutability (..))
|
|
|
|
import qualified Capnp.Message as M
|
|
import qualified Capnp.Untyped as U
|
|
|
|
-- | 'newRoot' allocates and returns a new value inside the message, setting
|
|
-- it as the root object of the message.
|
|
newRoot :: (ToStruct ('Mut s) a, Allocate s a, M.WriteCtx m s)
|
|
=> M.Message ('Mut s) -> m a
|
|
newRoot msg = do
|
|
ret <- new msg
|
|
setRoot ret
|
|
pure ret
|
|
|
|
-- | 'setRoot' sets its argument to be the root object in its message.
|
|
setRoot :: (ToStruct ('Mut s) a, M.WriteCtx m s) => a -> m ()
|
|
setRoot = U.setRoot . toStruct
|
|
|
|
-- | 'getRoot' returns the root object of a message.
|
|
getRoot :: (FromStruct mut a, U.ReadCtx m mut) => M.Message mut -> m a
|
|
getRoot msg = U.rootPtr msg >>= fromStruct
|