{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE StandaloneDeriving #-} module Data.Markup.Types where import Data.Monoid import Control.Applicative import Control.Monad import Control.Monad.Trans import Control.Monad.Reader.Class newtype InlineMarkupT m a = InlineMarkupT { runInlineMarkupT :: m a } deriving (Functor) deriving instance Monoid (m a) => Monoid (InlineMarkupT m a) deriving instance Applicative f => Applicative (InlineMarkupT f) deriving instance Monad m => Monad (InlineMarkupT m) instance MonadTrans InlineMarkupT where lift = InlineMarkupT newtype HostedMarkupT m a = HostedMarkupT { runHostedMarkupT :: m a } deriving (Functor) deriving instance Monoid (m a) => Monoid (HostedMarkupT m a) deriving instance Applicative f => Applicative (HostedMarkupT f) deriving instance Monad m => Monad (HostedMarkupT m) instance MonadTrans HostedMarkupT where lift = HostedMarkupT newtype LocalMarkupT m a = LocalMarkupT { runLocalMarkupT :: m a } deriving (Functor) deriving instance Monoid (m a) => Monoid (LocalMarkupT m a) deriving instance Applicative f => Applicative (LocalMarkupT f) deriving instance Monad m => Monad (LocalMarkupT m) instance MonadTrans LocalMarkupT where lift = LocalMarkupT newtype InlineMarkupM a = InlineMarkupM {runInlineMarkupM :: a} deriving (Functor) deriving instance Monoid a => Monoid (InlineMarkupM a) instance Applicative InlineMarkupM where (<*>) f x = InlineMarkupM $ runInlineMarkupM f (runInlineMarkupM x) pure = InlineMarkupM instance Monad InlineMarkupM where return = InlineMarkupM x >>= f = f $ runInlineMarkupM x instance Monad w => Monoid (InlineMarkupM (w a)) where x `mappend` y = InlineMarkupM $ do runInlineMarkupM x runInlineMarkupM y newtype HostedMarkupM a = HostedMarkupM {runHostedMarkupM :: a} deriving (Functor) deriving instance Monoid a => Monoid (HostedMarkupM a) instance Applicative HostedMarkupM where (<*>) f x = HostedMarkupM $ runHostedMarkupM f (runHostedMarkupM x) pure = HostedMarkupM instance Monad HostedMarkupM where return = HostedMarkupM x >>= f = f $ runHostedMarkupM x instance Monad w => Monoid (HostedMarkupM (w a)) where x `mappend` y = HostedMarkupM $ do runHostedMarkupM x runHostedMarkupM y newtype LocalMarkupM a = LocalMarkupM {runLocalMarkupM :: a} deriving (Functor) deriving instance Monoid a => Monoid (LocalMarkupM a) instance Applicative LocalMarkupM where (<*>) f x = LocalMarkupM $ runLocalMarkupM f (runLocalMarkupM x) pure = LocalMarkupM instance Monad LocalMarkupM where return = LocalMarkupM x >>= f = f $ runLocalMarkupM x instance Monad w => Monoid (LocalMarkupM (w a)) where x `mappend` y = LocalMarkupM $ do runLocalMarkupM x runLocalMarkupM y