module Clang.Internal.Monad
( ClangT
, ClangBase
, ClangValue(..)
, ClangValueList(..)
, Proxy
, runClangT
, clangScope
, clangAllocate
, mkProxy
) where
import Control.Monad.Base
import Control.Monad.Trans
import Control.Monad.Trans.Resource
import qualified Data.Vector.Storable as DVS
import Unsafe.Coerce (unsafeCoerce)
newtype ClangT s m a = ClangT
{ unClangT :: ResourceT m a
} deriving (Applicative, Functor, Monad, MonadIO, MonadThrow, MonadTrans)
instance MonadBase b m => MonadBase b (ClangT s m) where
liftBase = lift . liftBase
instance ClangBase m => MonadResource (ClangT s m) where
liftResourceT = transClangT liftIO
transClangT :: (m a -> n b) -> ResourceT m a -> ClangT s n b
transClangT f rt = ClangT $ transResourceT f rt
type ClangBase m = MonadResourceBase m
data Proxy s
runClangT :: ClangBase m => (forall s. ClangT s m a) -> m a
runClangT f = runResourceT . unClangT $ f
clangScope :: ClangBase m => (forall s. ClangT s m a) -> ClangT s' m a
clangScope = lift . runClangT
clangAllocate :: ClangBase m => IO a -> (a -> IO ()) -> ClangT s m (ReleaseKey, a)
clangAllocate = allocate
mkProxy :: Proxy s
mkProxy = undefined
class ClangValue v where
fromOuterScope :: ClangBase m => v s' -> ClangT s m (v s)
fromOuterScope = return . unsafeCoerce
class ClangValueList v where
listFromOuterScope :: ClangBase m => DVS.Vector (v s') -> ClangT s m (DVS.Vector (v s))
listFromOuterScope = return . unsafeCoerce