{-# LANGUAGE FlexibleContexts,
             KindSignatures,
             MultiParamTypeClasses,
             ImplicitParams  
 #-}

module AOP.Internal.OpenApp (
 OpenApp   (..),
 TaggedApp (..),
) where

import AOP.Internal.Typeable1Monad
import AOP.Internal.JoinpointModel (FunctionTag)

class Typeable1Monad m => OpenApp m where
  (#) :: (PolyTypeable (a -> m b)) => (a -> m b) -> a -> m b

class Typeable1Monad m => TaggedApp m where
  taggedApp :: (PolyTypeable (a -> m b)) => FunctionTag -> (a -> m b) -> a -> m b