{-# LANGUAGE GADTs #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE ImpredicativeTypes #-} {-# LANGUAGE TypeOperators #-} module Thermoprint.Server.QMConfig ( QMConfig(..) ) where import Control.Monad.Trans.Resource import Control.Monad.Trans.Control import Control.Monad.Trans.Identity import Control.Monad.Logger import Control.Monad.Reader import Control.Monad.IO.Class import Control.Monad.Morph import Control.Category import Prelude hiding (id, (.)) import Servant.Server.Internal.Enter (enter, (:~>)(..)) import Data.Default.Class import Control.Concurrent.STM import Thermoprint.Server.Queue data QMConfig m where QMConfig :: ( MonadTrans t , MFunctor t , Monad (t STM) , MonadIO (t IO) ) => QueueManager t -> (t IO) :~> m -> QMConfig m QMConfig' :: ( MonadIO m ) => ( forall t. ( MonadTrans t , MFunctor t , Monad (t STM) , MonadIO (t IO) ) => QueueManager t ) -> QMConfig m instance MonadIO m => Default (QMConfig m) where def = QMConfig idQM $ Nat (liftIO . runIdentityT)