blucontrol-0.4.0.0: src/Blucontrol/Gamma/Modifier.hs
{-# LANGUAGE UndecidableInstances #-}
module Blucontrol.Gamma.Modifier (
GammaModifierT
, runGammaModifierT
) where
import Control.Monad.Base
import Control.Monad.Except
import Control.Monad.Reader
import Control.Monad.Trans.Control
import Blucontrol.Gamma
newtype GammaModifierT m a = GammaModifierT { unGammaModifierT :: ReaderT (GammaValue m -> IO (GammaValue m)) m a }
deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b)
-- TODO: A `MonadTransControl` instance seems to be impossible
instance MonadTrans GammaModifierT where
lift = GammaModifierT . lift
instance (MonadBase IO m, MonadGamma m) => MonadGamma (GammaModifierT m) where
type GammaValue (GammaModifierT m) = GammaValue m
gamma = do oldGamma <- lift gamma
modifyGamma <- GammaModifierT ask
liftBase $ modifyGamma oldGamma
runGammaModifierT :: (GammaValue m -> IO (GammaValue m)) -> GammaModifierT m a -> m a
runGammaModifierT modify tma = runReaderT (unGammaModifierT tma) modify