{-# LANGUAGE UndecidableInstances #-}

module Blucontrol.Gamma.Const (
  GammaConstT
, runGammaConstT
) where

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

import Blucontrol.Gamma
import Blucontrol.RGB

newtype GammaConstT m a = GammaConstT { GammaConstT m a -> ReaderT Trichromaticity m a
unGammaConstT :: ReaderT Trichromaticity m a }
  deriving (Functor (GammaConstT m)
a -> GammaConstT m a
Functor (GammaConstT m)
-> (forall a. a -> GammaConstT m a)
-> (forall a b.
    GammaConstT m (a -> b) -> GammaConstT m a -> GammaConstT m b)
-> (forall a b c.
    (a -> b -> c)
    -> GammaConstT m a -> GammaConstT m b -> GammaConstT m c)
-> (forall a b.
    GammaConstT m a -> GammaConstT m b -> GammaConstT m b)
-> (forall a b.
    GammaConstT m a -> GammaConstT m b -> GammaConstT m a)
-> Applicative (GammaConstT m)
GammaConstT m a -> GammaConstT m b -> GammaConstT m b
GammaConstT m a -> GammaConstT m b -> GammaConstT m a
GammaConstT m (a -> b) -> GammaConstT m a -> GammaConstT m b
(a -> b -> c)
-> GammaConstT m a -> GammaConstT m b -> GammaConstT m c
forall a. a -> GammaConstT m a
forall a b. GammaConstT m a -> GammaConstT m b -> GammaConstT m a
forall a b. GammaConstT m a -> GammaConstT m b -> GammaConstT m b
forall a b.
GammaConstT m (a -> b) -> GammaConstT m a -> GammaConstT m b
forall a b c.
(a -> b -> c)
-> GammaConstT m a -> GammaConstT m b -> GammaConstT m c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
forall (m :: * -> *). Applicative m => Functor (GammaConstT m)
forall (m :: * -> *) a. Applicative m => a -> GammaConstT m a
forall (m :: * -> *) a b.
Applicative m =>
GammaConstT m a -> GammaConstT m b -> GammaConstT m a
forall (m :: * -> *) a b.
Applicative m =>
GammaConstT m a -> GammaConstT m b -> GammaConstT m b
forall (m :: * -> *) a b.
Applicative m =>
GammaConstT m (a -> b) -> GammaConstT m a -> GammaConstT m b
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> c)
-> GammaConstT m a -> GammaConstT m b -> GammaConstT m c
<* :: GammaConstT m a -> GammaConstT m b -> GammaConstT m a
$c<* :: forall (m :: * -> *) a b.
Applicative m =>
GammaConstT m a -> GammaConstT m b -> GammaConstT m a
*> :: GammaConstT m a -> GammaConstT m b -> GammaConstT m b
$c*> :: forall (m :: * -> *) a b.
Applicative m =>
GammaConstT m a -> GammaConstT m b -> GammaConstT m b
liftA2 :: (a -> b -> c)
-> GammaConstT m a -> GammaConstT m b -> GammaConstT m c
$cliftA2 :: forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> c)
-> GammaConstT m a -> GammaConstT m b -> GammaConstT m c
<*> :: GammaConstT m (a -> b) -> GammaConstT m a -> GammaConstT m b
$c<*> :: forall (m :: * -> *) a b.
Applicative m =>
GammaConstT m (a -> b) -> GammaConstT m a -> GammaConstT m b
pure :: a -> GammaConstT m a
$cpure :: forall (m :: * -> *) a. Applicative m => a -> GammaConstT m a
$cp1Applicative :: forall (m :: * -> *). Applicative m => Functor (GammaConstT m)
Applicative, a -> GammaConstT m b -> GammaConstT m a
(a -> b) -> GammaConstT m a -> GammaConstT m b
(forall a b. (a -> b) -> GammaConstT m a -> GammaConstT m b)
-> (forall a b. a -> GammaConstT m b -> GammaConstT m a)
-> Functor (GammaConstT m)
forall a b. a -> GammaConstT m b -> GammaConstT m a
forall a b. (a -> b) -> GammaConstT m a -> GammaConstT m b
forall (m :: * -> *) a b.
Functor m =>
a -> GammaConstT m b -> GammaConstT m a
forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> GammaConstT m a -> GammaConstT m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> GammaConstT m b -> GammaConstT m a
$c<$ :: forall (m :: * -> *) a b.
Functor m =>
a -> GammaConstT m b -> GammaConstT m a
fmap :: (a -> b) -> GammaConstT m a -> GammaConstT m b
$cfmap :: forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> GammaConstT m a -> GammaConstT m b
Functor, Applicative (GammaConstT m)
a -> GammaConstT m a
Applicative (GammaConstT m)
-> (forall a b.
    GammaConstT m a -> (a -> GammaConstT m b) -> GammaConstT m b)
-> (forall a b.
    GammaConstT m a -> GammaConstT m b -> GammaConstT m b)
-> (forall a. a -> GammaConstT m a)
-> Monad (GammaConstT m)
GammaConstT m a -> (a -> GammaConstT m b) -> GammaConstT m b
GammaConstT m a -> GammaConstT m b -> GammaConstT m b
forall a. a -> GammaConstT m a
forall a b. GammaConstT m a -> GammaConstT m b -> GammaConstT m b
forall a b.
GammaConstT m a -> (a -> GammaConstT m b) -> GammaConstT m b
forall (m :: * -> *). Monad m => Applicative (GammaConstT m)
forall (m :: * -> *) a. Monad m => a -> GammaConstT m a
forall (m :: * -> *) a b.
Monad m =>
GammaConstT m a -> GammaConstT m b -> GammaConstT m b
forall (m :: * -> *) a b.
Monad m =>
GammaConstT m a -> (a -> GammaConstT m b) -> GammaConstT m b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: a -> GammaConstT m a
$creturn :: forall (m :: * -> *) a. Monad m => a -> GammaConstT m a
>> :: GammaConstT m a -> GammaConstT m b -> GammaConstT m b
$c>> :: forall (m :: * -> *) a b.
Monad m =>
GammaConstT m a -> GammaConstT m b -> GammaConstT m b
>>= :: GammaConstT m a -> (a -> GammaConstT m b) -> GammaConstT m b
$c>>= :: forall (m :: * -> *) a b.
Monad m =>
GammaConstT m a -> (a -> GammaConstT m b) -> GammaConstT m b
$cp1Monad :: forall (m :: * -> *). Monad m => Applicative (GammaConstT m)
Monad, MonadBase b, MonadBaseControl b, m a -> GammaConstT m a
(forall (m :: * -> *) a. Monad m => m a -> GammaConstT m a)
-> MonadTrans GammaConstT
forall (m :: * -> *) a. Monad m => m a -> GammaConstT m a
forall (t :: (* -> *) -> * -> *).
(forall (m :: * -> *) a. Monad m => m a -> t m a) -> MonadTrans t
lift :: m a -> GammaConstT m a
$clift :: forall (m :: * -> *) a. Monad m => m a -> GammaConstT m a
MonadTrans, MonadTrans GammaConstT
m (StT GammaConstT a) -> GammaConstT m a
MonadTrans GammaConstT
-> (forall (m :: * -> *) a.
    Monad m =>
    (Run GammaConstT -> m a) -> GammaConstT m a)
-> (forall (m :: * -> *) a.
    Monad m =>
    m (StT GammaConstT a) -> GammaConstT m a)
-> MonadTransControl GammaConstT
(Run GammaConstT -> m a) -> GammaConstT m a
forall (m :: * -> *) a.
Monad m =>
m (StT GammaConstT a) -> GammaConstT m a
forall (m :: * -> *) a.
Monad m =>
(Run GammaConstT -> m a) -> GammaConstT m a
forall (t :: (* -> *) -> * -> *).
MonadTrans t
-> (forall (m :: * -> *) a. Monad m => (Run t -> m a) -> t m a)
-> (forall (m :: * -> *) a. Monad m => m (StT t a) -> t m a)
-> MonadTransControl t
restoreT :: m (StT GammaConstT a) -> GammaConstT m a
$crestoreT :: forall (m :: * -> *) a.
Monad m =>
m (StT GammaConstT a) -> GammaConstT m a
liftWith :: (Run GammaConstT -> m a) -> GammaConstT m a
$cliftWith :: forall (m :: * -> *) a.
Monad m =>
(Run GammaConstT -> m a) -> GammaConstT m a
$cp1MonadTransControl :: MonadTrans GammaConstT
MonadTransControl)

instance Monad m => MonadGamma (GammaConstT m) where
  gamma :: GammaConstT m Trichromaticity
gamma = ReaderT Trichromaticity m Trichromaticity
-> GammaConstT m Trichromaticity
forall (m :: * -> *) a.
ReaderT Trichromaticity m a -> GammaConstT m a
GammaConstT ReaderT Trichromaticity m Trichromaticity
forall r (m :: * -> *). MonadReader r m => m r
ask

instance MonadReader r m => MonadReader r (GammaConstT m) where
  ask :: GammaConstT m r
ask = m r -> GammaConstT m r
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m r
forall r (m :: * -> *). MonadReader r m => m r
ask
  local :: (r -> r) -> GammaConstT m a -> GammaConstT m a
local r -> r
f GammaConstT m a
tma = (Run GammaConstT -> m a) -> GammaConstT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTransControl t, Monad m) =>
(Run t -> m a) -> t m a
liftWith ((Run GammaConstT -> m a) -> GammaConstT m a)
-> (Run GammaConstT -> m a) -> GammaConstT m a
forall a b. (a -> b) -> a -> b
$ \ Run GammaConstT
run ->
    (r -> r) -> m a -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local r -> r
f (m a -> m a) -> m a -> m a
forall a b. (a -> b) -> a -> b
$ GammaConstT m a -> m (StT GammaConstT a)
Run GammaConstT
run GammaConstT m a
tma

runGammaConstT :: Trichromaticity -> GammaConstT m a -> m a
runGammaConstT :: Trichromaticity -> GammaConstT m a -> m a
runGammaConstT Trichromaticity
rgb GammaConstT m a
tma = ReaderT Trichromaticity m a -> Trichromaticity -> m a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT (GammaConstT m a -> ReaderT Trichromaticity m a
forall (m :: * -> *) a.
GammaConstT m a -> ReaderT Trichromaticity m a
unGammaConstT GammaConstT m a
tma) Trichromaticity
rgb