packages feed

bludigon-0.1.0.0: src/Bludigon/Control/Print.hs

{-# LANGUAGE UndecidableInstances #-}

module Bludigon.Control.Print (
  ControlPrintT
, runControlPrintT
) where

import Control.Monad.Base
import Control.Monad.Trans
import Control.Monad.Trans.Control

import Bludigon.Control

newtype ControlPrintT m a = ControlPrintT { unControlPrintT :: m a }
  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b)

instance MonadTrans ControlPrintT where
  lift = ControlPrintT

instance MonadTransControl ControlPrintT where
  type StT ControlPrintT a = a
  liftWith inner = ControlPrintT $ inner unControlPrintT
  restoreT = ControlPrintT

instance MonadControl m => MonadControl (ControlPrintT m) where
  type ControlConstraint (ControlPrintT m) a = (ControlConstraint m a, Show a)
  doInbetween a = do liftBase $ print a
                     lift $ doInbetween a

runControlPrintT :: ControlPrintT m a -> m a
runControlPrintT = unControlPrintT