packages feed

blucontrol-0.3.1.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 c m a = GammaModifierT { unGammaModifierT :: ReaderT (c -> IO c) m a }
  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b, MonadTrans, MonadTransControl)

instance MonadReader r m => MonadReader r (GammaModifierT c m) where
  ask = lift ask
  local f tma = liftWith $ \ run ->
    local f $ run tma

instance (MonadBase IO m, MonadGamma c m) => MonadGamma c (GammaModifierT c m) where
  gamma = do oldGamma <- lift gamma
             modifyGamma <- GammaModifierT ask
             liftBase $ modifyGamma oldGamma

runGammaModifierT :: (c -> IO c) -> GammaModifierT c m a -> m a
runGammaModifierT modify tma = runReaderT (unGammaModifierT tma) modify