{-# LANGUAGE DataKinds        #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies     #-}
module Capnp.GenHelpers.New.Rpc
    ( module Capnp.New.Rpc.Server
    , module Capnp.Repr.Methods
    , parseCap
    , encodeCap
    ) where

import           Capnp.Message        (Mutability(..))
import qualified Capnp.Message        as M
import           Capnp.New.Rpc.Server
import qualified Capnp.Repr           as R
import           Capnp.Repr.Methods
import qualified Capnp.Untyped        as U

parseCap :: (R.IsCap a, U.ReadCtx m 'Const) => R.Raw a 'Const -> m (Client a)
parseCap :: Raw a 'Const -> m (Client a)
parseCap (R.Raw Unwrapped (Untyped (ReprFor a) 'Const)
cap) = Client -> Client a
forall a. Client -> Client a
Client (Client -> Client a) -> m Client -> m (Client a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Cap 'Const -> m Client
forall (m :: * -> *) (mut :: Mutability).
ReadCtx m mut =>
Cap mut -> m Client
U.getClient Unwrapped (Untyped (ReprFor a) 'Const)
Cap 'Const
cap

encodeCap :: (R.IsCap a, U.RWCtx m s) => M.Message ('Mut s) -> Client a -> m (R.Raw a ('Mut s))
encodeCap :: Message ('Mut s) -> Client a -> m (Raw a ('Mut s))
encodeCap Message ('Mut s)
msg (Client Client
c) = Cap ('Mut s) -> Raw a ('Mut s)
forall a (mut :: Mutability).
Unwrapped (Untyped (ReprFor a) mut) -> Raw a mut
R.Raw (Cap ('Mut s) -> Raw a ('Mut s))
-> m (Cap ('Mut s)) -> m (Raw a ('Mut s))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Message ('Mut s) -> Client -> m (Cap ('Mut s))
forall (m :: * -> *) s.
WriteCtx m s =>
Message ('Mut s) -> Client -> m (Cap ('Mut s))
U.appendCap Message ('Mut s)
msg Client
c