packages feed

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