{-# LANGUAGE MultiParamTypeClasses, FlexibleContexts #-} module AOP.Internal.AOPMonad ( AOPMonad(..), MonadDeploy(..), ) where import AOP.Internal.JoinpointModel import AOP.Internal.OpenApp -- A monad that does top-level deploy/undeploy class (Typeable1Monad m, OpenApp m) => AOPMonad m where deploy :: LessGen (a -> b) (c -> m d) => Aspect m a b c d -> m () undeploy :: LessGen (a -> b) (c -> m d) => Aspect m a b c d -> m () -- A MonadDeploy monad defines how to deploy and undeploy aspects class (Typeable1Monad m, Typeable1Monad (t m)) => MonadDeploy t m where deployInEnv :: LessGen (a -> b) (c -> t m d) => Aspect (t m) a b c d -> AspectEnv (t m) -> m (AspectEnv (t m)) undeployInEnv :: LessGen (a -> b) (c -> t m d) => Aspect (t m) a b c d -> AspectEnv (t m) -> m (AspectEnv (t m))