packages feed

blucontrol 0.4.1.0 → 0.5.0.0

raw patch · 45 files changed

+878/−872 lines, 45 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Blucontrol.CompatibleValues: class CompatibleValues a b
- Blucontrol.CompatibleValues: convertValue :: CompatibleValues a b => a -> b
- Blucontrol.CompatibleValues: instance Blucontrol.CompatibleValues.CompatibleValues a a
- Blucontrol.Control: -- <a>StM</a> from running <a>MonadGamma</a> and <a>MonadRecolor</a>.
- Blucontrol.Control: -- argument. This is usfeul to allow arguments wrapped in monadic state
- Blucontrol.Control: -- | Give a constraint to allow <a>doInbetween</a> to handle a polymorphic
- Blucontrol.Control: class MonadBaseControl IO m => MonadControl m where {
- Blucontrol.Control: doInbetween :: (MonadControl m, ControlConstraint m a) => a -> m ()
- Blucontrol.Control: instance Blucontrol.Control.MonadControl GHC.Types.IO
- Blucontrol.Control: type family ControlConstraint m a :: Constraint;
- Blucontrol.Control: }
- Blucontrol.Control.Concat: (!>) :: (t1 m a -> m a) -> (t2 (t1 m) a -> t1 m a) -> ControlConcatT t1 t2 m a -> m a
- Blucontrol.Control.Concat: data ControlConcatT (t1 :: (Type -> Type) -> Type -> Type) (t2 :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) a
- Blucontrol.Control.Concat: infixr 5 !>
- Blucontrol.Control.Concat: instance (Blucontrol.Control.MonadControl (t1 m), Blucontrol.Control.MonadControl (t2 (t1 m)), Control.Monad.Trans.Class.MonadTrans t2) => Blucontrol.Control.MonadControl (Blucontrol.Control.Concat.ControlConcatT t1 t2 m)
- Blucontrol.Control.Concat: instance (forall (m :: * -> *). GHC.Base.Monad m => GHC.Base.Monad (t1 m), Control.Monad.Trans.Class.MonadTrans t1, Control.Monad.Trans.Class.MonadTrans t2) => Control.Monad.Trans.Class.MonadTrans (Blucontrol.Control.Concat.ControlConcatT t1 t2)
- Blucontrol.Control.Concat: instance (forall (m :: * -> *). GHC.Base.Monad m => GHC.Base.Monad (t1 m), Control.Monad.Trans.Control.MonadTransControl t1, Control.Monad.Trans.Control.MonadTransControl t2) => Control.Monad.Trans.Control.MonadTransControl (Blucontrol.Control.Concat.ControlConcatT t1 t2)
- Blucontrol.Control.Concat: instance Control.Monad.Base.MonadBase b (t2 (t1 m)) => Control.Monad.Base.MonadBase b (Blucontrol.Control.Concat.ControlConcatT t1 t2 m)
- Blucontrol.Control.Concat: instance Control.Monad.Trans.Control.MonadBaseControl b (t2 (t1 m)) => Control.Monad.Trans.Control.MonadBaseControl b (Blucontrol.Control.Concat.ControlConcatT t1 t2 m)
- Blucontrol.Control.Concat: instance GHC.Base.Applicative (t2 (t1 m)) => GHC.Base.Applicative (Blucontrol.Control.Concat.ControlConcatT t1 t2 m)
- Blucontrol.Control.Concat: instance GHC.Base.Functor (t2 (t1 m)) => GHC.Base.Functor (Blucontrol.Control.Concat.ControlConcatT t1 t2 m)
- Blucontrol.Control.Concat: instance GHC.Base.Monad (t2 (t1 m)) => GHC.Base.Monad (Blucontrol.Control.Concat.ControlConcatT t1 t2 m)
- Blucontrol.Control.Concat: runControlConcatT :: (t1 m a -> m a) -> (t2 (t1 m) a -> t1 m a) -> ControlConcatT t1 t2 m a -> m a
- Blucontrol.Control.Count: ConfigCount :: Natural -> ConfigCount
- Blucontrol.Control.Count: [maxCount] :: ConfigCount -> Natural
- Blucontrol.Control.Count: class CountableException a
- Blucontrol.Control.Count: data ControlCountT m a
- Blucontrol.Control.Count: instance Blucontrol.Control.Count.CountableException ()
- Blucontrol.Control.Count: instance Blucontrol.Control.Count.CountableException a => Blucontrol.Control.Count.CountableException (Data.Either.Either b a)
- Blucontrol.Control.Count: instance Blucontrol.Control.Count.CountableException a => Blucontrol.Control.Count.CountableException (GHC.Maybe.Maybe a)
- Blucontrol.Control.Count: instance Control.DeepSeq.NFData Blucontrol.Control.Count.ConfigCount
- Blucontrol.Control.Count: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Blucontrol.Control.Count.ControlCountT m)
- Blucontrol.Control.Count: instance Control.Monad.Trans.Class.MonadTrans Blucontrol.Control.Count.ControlCountT
- Blucontrol.Control.Count: instance Control.Monad.Trans.Control.MonadBaseControl GHC.Types.IO m => Blucontrol.Control.MonadControl (Blucontrol.Control.Count.ControlCountT m)
- Blucontrol.Control.Count: instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Blucontrol.Control.Count.ControlCountT m)
- Blucontrol.Control.Count: instance Control.Monad.Trans.Control.MonadTransControl Blucontrol.Control.Count.ControlCountT
- Blucontrol.Control.Count: instance Data.Default.Class.Default Blucontrol.Control.Count.ConfigCount
- Blucontrol.Control.Count: instance GHC.Base.Functor m => GHC.Base.Functor (Blucontrol.Control.Count.ControlCountT m)
- Blucontrol.Control.Count: instance GHC.Base.Monad m => GHC.Base.Applicative (Blucontrol.Control.Count.ControlCountT m)
- Blucontrol.Control.Count: instance GHC.Base.Monad m => GHC.Base.Monad (Blucontrol.Control.Count.ControlCountT m)
- Blucontrol.Control.Count: instance GHC.Classes.Eq Blucontrol.Control.Count.ConfigCount
- Blucontrol.Control.Count: instance GHC.Classes.Ord Blucontrol.Control.Count.ConfigCount
- Blucontrol.Control.Count: instance GHC.Generics.Generic Blucontrol.Control.Count.ConfigCount
- Blucontrol.Control.Count: instance GHC.Read.Read Blucontrol.Control.Count.ConfigCount
- Blucontrol.Control.Count: instance GHC.Show.Show Blucontrol.Control.Count.ConfigCount
- Blucontrol.Control.Count: isException :: CountableException a => a -> Bool
- Blucontrol.Control.Count: newtype ConfigCount
- Blucontrol.Control.Count: runControlCountT :: Monad m => ConfigCount -> ControlCountT m a -> m a
- Blucontrol.Control.Print: data ControlPrintT m a
- Blucontrol.Control.Print: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Blucontrol.Control.Print.ControlPrintT m)
- Blucontrol.Control.Print: instance Control.Monad.Trans.Class.MonadTrans Blucontrol.Control.Print.ControlPrintT
- Blucontrol.Control.Print: instance Control.Monad.Trans.Control.MonadBaseControl GHC.Types.IO m => Blucontrol.Control.MonadControl (Blucontrol.Control.Print.ControlPrintT m)
- Blucontrol.Control.Print: instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Blucontrol.Control.Print.ControlPrintT m)
- Blucontrol.Control.Print: instance Control.Monad.Trans.Control.MonadTransControl Blucontrol.Control.Print.ControlPrintT
- Blucontrol.Control.Print: instance GHC.Base.Applicative m => GHC.Base.Applicative (Blucontrol.Control.Print.ControlPrintT m)
- Blucontrol.Control.Print: instance GHC.Base.Functor m => GHC.Base.Functor (Blucontrol.Control.Print.ControlPrintT m)
- Blucontrol.Control.Print: instance GHC.Base.Monad m => GHC.Base.Monad (Blucontrol.Control.Print.ControlPrintT m)
- Blucontrol.Control.Print: runControlPrintT :: ControlPrintT m a -> m a
- Blucontrol.Control.Wait: ConfigWait :: Microseconds -> ConfigWait
- Blucontrol.Control.Wait: [interval] :: ConfigWait -> Microseconds
- Blucontrol.Control.Wait: data ControlWaitT m a
- Blucontrol.Control.Wait: instance Control.DeepSeq.NFData Blucontrol.Control.Wait.ConfigWait
- Blucontrol.Control.Wait: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Blucontrol.Control.Wait.ControlWaitT m)
- Blucontrol.Control.Wait: instance Control.Monad.Trans.Class.MonadTrans Blucontrol.Control.Wait.ControlWaitT
- Blucontrol.Control.Wait: instance Control.Monad.Trans.Control.MonadBaseControl GHC.Types.IO m => Blucontrol.Control.MonadControl (Blucontrol.Control.Wait.ControlWaitT m)
- Blucontrol.Control.Wait: instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Blucontrol.Control.Wait.ControlWaitT m)
- Blucontrol.Control.Wait: instance Control.Monad.Trans.Control.MonadTransControl Blucontrol.Control.Wait.ControlWaitT
- Blucontrol.Control.Wait: instance Data.Default.Class.Default Blucontrol.Control.Wait.ConfigWait
- Blucontrol.Control.Wait: instance GHC.Base.Applicative m => GHC.Base.Applicative (Blucontrol.Control.Wait.ControlWaitT m)
- Blucontrol.Control.Wait: instance GHC.Base.Functor m => GHC.Base.Functor (Blucontrol.Control.Wait.ControlWaitT m)
- Blucontrol.Control.Wait: instance GHC.Base.Monad m => GHC.Base.Monad (Blucontrol.Control.Wait.ControlWaitT m)
- Blucontrol.Control.Wait: instance GHC.Classes.Eq Blucontrol.Control.Wait.ConfigWait
- Blucontrol.Control.Wait: instance GHC.Classes.Ord Blucontrol.Control.Wait.ConfigWait
- Blucontrol.Control.Wait: instance GHC.Generics.Generic Blucontrol.Control.Wait.ConfigWait
- Blucontrol.Control.Wait: instance GHC.Read.Read Blucontrol.Control.Wait.ConfigWait
- Blucontrol.Control.Wait: instance GHC.Show.Show Blucontrol.Control.Wait.ConfigWait
- Blucontrol.Control.Wait: newtype ConfigWait
- Blucontrol.Control.Wait: runControlWaitT :: ConfigWait -> ControlWaitT m a -> m a
- Blucontrol.Control.Wait: type Microseconds = Int
- Blucontrol.Gamma: class Monad m => MonadGamma m where {
- Blucontrol.Gamma: gamma :: MonadGamma m => m (GammaValue m)
- Blucontrol.Gamma: type family GammaValue m;
- Blucontrol.Gamma: }
- Blucontrol.Gamma.Const: data GammaConstT c m a
- Blucontrol.Gamma.Const: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Blucontrol.Gamma.Const.GammaConstT c m)
- Blucontrol.Gamma.Const: instance Control.Monad.Reader.Class.MonadReader r m => Control.Monad.Reader.Class.MonadReader r (Blucontrol.Gamma.Const.GammaConstT c m)
- Blucontrol.Gamma.Const: instance Control.Monad.Trans.Class.MonadTrans (Blucontrol.Gamma.Const.GammaConstT c)
- Blucontrol.Gamma.Const: instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Blucontrol.Gamma.Const.GammaConstT c m)
- Blucontrol.Gamma.Const: instance Control.Monad.Trans.Control.MonadTransControl (Blucontrol.Gamma.Const.GammaConstT c)
- Blucontrol.Gamma.Const: instance GHC.Base.Applicative m => GHC.Base.Applicative (Blucontrol.Gamma.Const.GammaConstT c m)
- Blucontrol.Gamma.Const: instance GHC.Base.Functor m => GHC.Base.Functor (Blucontrol.Gamma.Const.GammaConstT c m)
- Blucontrol.Gamma.Const: instance GHC.Base.Monad m => Blucontrol.Gamma.MonadGamma (Blucontrol.Gamma.Const.GammaConstT c m)
- Blucontrol.Gamma.Const: instance GHC.Base.Monad m => GHC.Base.Monad (Blucontrol.Gamma.Const.GammaConstT c m)
- Blucontrol.Gamma.Const: runGammaConstT :: c -> GammaConstT c m a -> m a
- Blucontrol.Gamma.Linear: (:.) :: Hour -> Minute -> Time
- Blucontrol.Gamma.Linear: (:|) :: a -> [a] -> NonEmpty a
- Blucontrol.Gamma.Linear: (==>) :: Time -> c -> (TimeOfDay, c)
- Blucontrol.Gamma.Linear: calculateValue :: Monad m => (Rational -> c -> c -> c) -> LocalTime -> GammaLinearT c m c
- Blucontrol.Gamma.Linear: data GammaLinearT c m a
- Blucontrol.Gamma.Linear: data Hour
- Blucontrol.Gamma.Linear: data Minute
- Blucontrol.Gamma.Linear: data NonEmpty a
- Blucontrol.Gamma.Linear: data Time
- Blucontrol.Gamma.Linear: infix 6 ==>
- Blucontrol.Gamma.Linear: infix 7 :.
- Blucontrol.Gamma.Linear: infixr 5 :|
- Blucontrol.Gamma.Linear: instance (Control.Monad.Base.MonadBase GHC.Types.IO m, Blucontrol.Gamma.MonadGamma (Blucontrol.Gamma.Linear.GammaLinearT c m)) => Blucontrol.Gamma.MonadGamma (Blucontrol.Gamma.Linear.GammaLinearT (Blucontrol.RGB.Brightness.WithBrightness c) m)
- Blucontrol.Gamma.Linear: instance Control.DeepSeq.NFData Blucontrol.Gamma.Linear.Hour
- Blucontrol.Gamma.Linear: instance Control.DeepSeq.NFData Blucontrol.Gamma.Linear.Minute
- Blucontrol.Gamma.Linear: instance Control.DeepSeq.NFData Blucontrol.Gamma.Linear.Time
- Blucontrol.Gamma.Linear: instance Control.Monad.Base.MonadBase GHC.Types.IO m => Blucontrol.Gamma.MonadGamma (Blucontrol.Gamma.Linear.GammaLinearT (Blucontrol.RGB.RGB GHC.Word.Word8) m)
- Blucontrol.Gamma.Linear: instance Control.Monad.Base.MonadBase GHC.Types.IO m => Blucontrol.Gamma.MonadGamma (Blucontrol.Gamma.Linear.GammaLinearT Blucontrol.RGB.Temperature.Temperature m)
- Blucontrol.Gamma.Linear: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Blucontrol.Gamma.Linear.GammaLinearT c m)
- Blucontrol.Gamma.Linear: instance Control.Monad.Reader.Class.MonadReader r m => Control.Monad.Reader.Class.MonadReader r (Blucontrol.Gamma.Linear.GammaLinearT c m)
- Blucontrol.Gamma.Linear: instance Control.Monad.Trans.Class.MonadTrans (Blucontrol.Gamma.Linear.GammaLinearT c)
- Blucontrol.Gamma.Linear: instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Blucontrol.Gamma.Linear.GammaLinearT c m)
- Blucontrol.Gamma.Linear: instance Control.Monad.Trans.Control.MonadTransControl (Blucontrol.Gamma.Linear.GammaLinearT c)
- Blucontrol.Gamma.Linear: instance GHC.Base.Applicative m => GHC.Base.Applicative (Blucontrol.Gamma.Linear.GammaLinearT c m)
- Blucontrol.Gamma.Linear: instance GHC.Base.Functor m => GHC.Base.Functor (Blucontrol.Gamma.Linear.GammaLinearT c m)
- Blucontrol.Gamma.Linear: instance GHC.Base.Monad m => GHC.Base.Monad (Blucontrol.Gamma.Linear.GammaLinearT c m)
- Blucontrol.Gamma.Linear: instance GHC.Classes.Eq Blucontrol.Gamma.Linear.Hour
- Blucontrol.Gamma.Linear: instance GHC.Classes.Eq Blucontrol.Gamma.Linear.Minute
- Blucontrol.Gamma.Linear: instance GHC.Classes.Eq Blucontrol.Gamma.Linear.Time
- Blucontrol.Gamma.Linear: instance GHC.Classes.Ord Blucontrol.Gamma.Linear.Hour
- Blucontrol.Gamma.Linear: instance GHC.Classes.Ord Blucontrol.Gamma.Linear.Minute
- Blucontrol.Gamma.Linear: instance GHC.Classes.Ord Blucontrol.Gamma.Linear.Time
- Blucontrol.Gamma.Linear: instance GHC.Enum.Bounded Blucontrol.Gamma.Linear.Hour
- Blucontrol.Gamma.Linear: instance GHC.Enum.Bounded Blucontrol.Gamma.Linear.Minute
- Blucontrol.Gamma.Linear: instance GHC.Enum.Bounded Blucontrol.Gamma.Linear.Time
- Blucontrol.Gamma.Linear: instance GHC.Enum.Enum Blucontrol.Gamma.Linear.Hour
- Blucontrol.Gamma.Linear: instance GHC.Enum.Enum Blucontrol.Gamma.Linear.Minute
- Blucontrol.Gamma.Linear: instance GHC.Enum.Enum Blucontrol.Gamma.Linear.Time
- Blucontrol.Gamma.Linear: instance GHC.Generics.Generic Blucontrol.Gamma.Linear.Hour
- Blucontrol.Gamma.Linear: instance GHC.Generics.Generic Blucontrol.Gamma.Linear.Minute
- Blucontrol.Gamma.Linear: instance GHC.Generics.Generic Blucontrol.Gamma.Linear.Time
- Blucontrol.Gamma.Linear: instance GHC.Num.Num Blucontrol.Gamma.Linear.Hour
- Blucontrol.Gamma.Linear: instance GHC.Num.Num Blucontrol.Gamma.Linear.Minute
- Blucontrol.Gamma.Linear: instance GHC.Read.Read Blucontrol.Gamma.Linear.Hour
- Blucontrol.Gamma.Linear: instance GHC.Read.Read Blucontrol.Gamma.Linear.Minute
- Blucontrol.Gamma.Linear: instance GHC.Read.Read Blucontrol.Gamma.Linear.Time
- Blucontrol.Gamma.Linear: instance GHC.Real.Integral Blucontrol.Gamma.Linear.Hour
- Blucontrol.Gamma.Linear: instance GHC.Real.Integral Blucontrol.Gamma.Linear.Minute
- Blucontrol.Gamma.Linear: instance GHC.Real.Real Blucontrol.Gamma.Linear.Hour
- Blucontrol.Gamma.Linear: instance GHC.Real.Real Blucontrol.Gamma.Linear.Minute
- Blucontrol.Gamma.Linear: instance GHC.Show.Show Blucontrol.Gamma.Linear.Hour
- Blucontrol.Gamma.Linear: instance GHC.Show.Show Blucontrol.Gamma.Linear.Minute
- Blucontrol.Gamma.Linear: instance GHC.Show.Show Blucontrol.Gamma.Linear.Time
- Blucontrol.Gamma.Linear: runGammaLinearT :: NonEmpty (TimeOfDay, c) -> GammaLinearT c m a -> m a
- Blucontrol.Gamma.Linear: weightedAverageRGB :: Rational -> RGB Word8 -> RGB Word8 -> RGB Word8
- Blucontrol.Gamma.Modifier: data GammaModifierT m a
- Blucontrol.Gamma.Modifier: instance (Control.Monad.Base.MonadBase GHC.Types.IO m, Blucontrol.Gamma.MonadGamma m) => Blucontrol.Gamma.MonadGamma (Blucontrol.Gamma.Modifier.GammaModifierT m)
- Blucontrol.Gamma.Modifier: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Blucontrol.Gamma.Modifier.GammaModifierT m)
- Blucontrol.Gamma.Modifier: instance Control.Monad.Trans.Class.MonadTrans Blucontrol.Gamma.Modifier.GammaModifierT
- Blucontrol.Gamma.Modifier: instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Blucontrol.Gamma.Modifier.GammaModifierT m)
- Blucontrol.Gamma.Modifier: instance GHC.Base.Applicative m => GHC.Base.Applicative (Blucontrol.Gamma.Modifier.GammaModifierT m)
- Blucontrol.Gamma.Modifier: instance GHC.Base.Functor m => GHC.Base.Functor (Blucontrol.Gamma.Modifier.GammaModifierT m)
- Blucontrol.Gamma.Modifier: instance GHC.Base.Monad m => GHC.Base.Monad (Blucontrol.Gamma.Modifier.GammaModifierT m)
- Blucontrol.Gamma.Modifier: runGammaModifierT :: (GammaValue m -> IO (GammaValue m)) -> GammaModifierT m a -> m a
- Blucontrol.RGB: RGB :: a -> a -> a -> RGB a
- Blucontrol.RGB: [blue] :: RGB a -> a
- Blucontrol.RGB: [green] :: RGB a -> a
- Blucontrol.RGB: [red] :: RGB a -> a
- Blucontrol.RGB: data RGB a
- Blucontrol.RGB: instance (GHC.Enum.Bounded a, GHC.Enum.Enum a) => GHC.Enum.Enum (Blucontrol.RGB.RGB a)
- Blucontrol.RGB: instance Blucontrol.CompatibleValues.CompatibleValues (Blucontrol.RGB.RGB GHC.Word.Word8) (Blucontrol.RGB.RGB GHC.Types.Float)
- Blucontrol.RGB: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Blucontrol.RGB.RGB a)
- Blucontrol.RGB: instance Data.Default.Class.Default (Blucontrol.RGB.RGB GHC.Word.Word8)
- Blucontrol.RGB: instance GHC.Classes.Eq a => GHC.Classes.Eq (Blucontrol.RGB.RGB a)
- Blucontrol.RGB: instance GHC.Classes.Ord a => GHC.Classes.Ord (Blucontrol.RGB.RGB a)
- Blucontrol.RGB: instance GHC.Enum.Bounded a => GHC.Enum.Bounded (Blucontrol.RGB.RGB a)
- Blucontrol.RGB: instance GHC.Generics.Generic (Blucontrol.RGB.RGB a)
- Blucontrol.RGB: instance GHC.Read.Read a => GHC.Read.Read (Blucontrol.RGB.RGB a)
- Blucontrol.RGB: instance GHC.Show.Show a => GHC.Show.Show (Blucontrol.RGB.RGB a)
- Blucontrol.RGB.Brightness: WithBrightness :: Brightness -> a -> WithBrightness a
- Blucontrol.RGB.Brightness: [brightness] :: WithBrightness a -> Brightness
- Blucontrol.RGB.Brightness: [color] :: WithBrightness a -> a
- Blucontrol.RGB.Brightness: data Brightness
- Blucontrol.RGB.Brightness: data WithBrightness a
- Blucontrol.RGB.Brightness: instance Control.DeepSeq.NFData Blucontrol.RGB.Brightness.Brightness
- Blucontrol.RGB.Brightness: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Blucontrol.RGB.Brightness.WithBrightness a)
- Blucontrol.RGB.Brightness: instance Data.Default.Class.Default Blucontrol.RGB.Brightness.Brightness
- Blucontrol.RGB.Brightness: instance Data.Default.Class.Default a => Data.Default.Class.Default (Blucontrol.RGB.Brightness.WithBrightness a)
- Blucontrol.RGB.Brightness: instance GHC.Classes.Eq Blucontrol.RGB.Brightness.Brightness
- Blucontrol.RGB.Brightness: instance GHC.Classes.Eq a => GHC.Classes.Eq (Blucontrol.RGB.Brightness.WithBrightness a)
- Blucontrol.RGB.Brightness: instance GHC.Classes.Ord Blucontrol.RGB.Brightness.Brightness
- Blucontrol.RGB.Brightness: instance GHC.Classes.Ord a => GHC.Classes.Ord (Blucontrol.RGB.Brightness.WithBrightness a)
- Blucontrol.RGB.Brightness: instance GHC.Enum.Bounded Blucontrol.RGB.Brightness.Brightness
- Blucontrol.RGB.Brightness: instance GHC.Enum.Enum Blucontrol.RGB.Brightness.Brightness
- Blucontrol.RGB.Brightness: instance GHC.Generics.Generic (Blucontrol.RGB.Brightness.WithBrightness a)
- Blucontrol.RGB.Brightness: instance GHC.Generics.Generic Blucontrol.RGB.Brightness.Brightness
- Blucontrol.RGB.Brightness: instance GHC.Num.Num Blucontrol.RGB.Brightness.Brightness
- Blucontrol.RGB.Brightness: instance GHC.Read.Read Blucontrol.RGB.Brightness.Brightness
- Blucontrol.RGB.Brightness: instance GHC.Read.Read a => GHC.Read.Read (Blucontrol.RGB.Brightness.WithBrightness a)
- Blucontrol.RGB.Brightness: instance GHC.Real.Fractional Blucontrol.RGB.Brightness.Brightness
- Blucontrol.RGB.Brightness: instance GHC.Real.Real Blucontrol.RGB.Brightness.Brightness
- Blucontrol.RGB.Brightness: instance GHC.Real.RealFrac Blucontrol.RGB.Brightness.Brightness
- Blucontrol.RGB.Brightness: instance GHC.Show.Show Blucontrol.RGB.Brightness.Brightness
- Blucontrol.RGB.Brightness: instance GHC.Show.Show a => GHC.Show.Show (Blucontrol.RGB.Brightness.WithBrightness a)
- Blucontrol.RGB.Temperature: data Temperature
- Blucontrol.RGB.Temperature: instance Blucontrol.CompatibleValues.CompatibleValues (Blucontrol.RGB.RGB GHC.Word.Word8) a => Blucontrol.CompatibleValues.CompatibleValues Blucontrol.RGB.Temperature.Temperature a
- Blucontrol.RGB.Temperature: instance Control.DeepSeq.NFData Blucontrol.RGB.Temperature.Temperature
- Blucontrol.RGB.Temperature: instance Data.Default.Class.Default Blucontrol.RGB.Temperature.Temperature
- Blucontrol.RGB.Temperature: instance GHC.Classes.Eq Blucontrol.RGB.Temperature.Temperature
- Blucontrol.RGB.Temperature: instance GHC.Classes.Ord Blucontrol.RGB.Temperature.Temperature
- Blucontrol.RGB.Temperature: instance GHC.Enum.Bounded Blucontrol.RGB.Temperature.Temperature
- Blucontrol.RGB.Temperature: instance GHC.Enum.Enum Blucontrol.RGB.Temperature.Temperature
- Blucontrol.RGB.Temperature: instance GHC.Generics.Generic Blucontrol.RGB.Temperature.Temperature
- Blucontrol.RGB.Temperature: instance GHC.Num.Num Blucontrol.RGB.Temperature.Temperature
- Blucontrol.RGB.Temperature: instance GHC.Read.Read Blucontrol.RGB.Temperature.Temperature
- Blucontrol.RGB.Temperature: instance GHC.Real.Fractional Blucontrol.RGB.Temperature.Temperature
- Blucontrol.RGB.Temperature: instance GHC.Real.Real Blucontrol.RGB.Temperature.Temperature
- Blucontrol.RGB.Temperature: instance GHC.Real.RealFrac Blucontrol.RGB.Temperature.Temperature
- Blucontrol.RGB.Temperature: instance GHC.Show.Show Blucontrol.RGB.Temperature.Temperature
- Blucontrol.Recolor: class Monad m => MonadRecolor m where {
- Blucontrol.Recolor: recolor :: MonadRecolor m => RecolorValue m -> m ()
- Blucontrol.Recolor: type family RecolorValue m;
- Blucontrol.Recolor: }
- Blucontrol.Recolor.Print: data RecolorPrintT c m a
- Blucontrol.Recolor.Print: instance (Control.Monad.Trans.Control.MonadBaseControl GHC.Types.IO m, GHC.Show.Show c) => Blucontrol.Recolor.MonadRecolor (Blucontrol.Recolor.Print.RecolorPrintT c m)
- Blucontrol.Recolor.Print: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Blucontrol.Recolor.Print.RecolorPrintT c m)
- Blucontrol.Recolor.Print: instance Control.Monad.Trans.Class.MonadTrans (Blucontrol.Recolor.Print.RecolorPrintT c)
- Blucontrol.Recolor.Print: instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Blucontrol.Recolor.Print.RecolorPrintT c m)
- Blucontrol.Recolor.Print: instance Control.Monad.Trans.Control.MonadTransControl (Blucontrol.Recolor.Print.RecolorPrintT c)
- Blucontrol.Recolor.Print: instance GHC.Base.Applicative m => GHC.Base.Applicative (Blucontrol.Recolor.Print.RecolorPrintT c m)
- Blucontrol.Recolor.Print: instance GHC.Base.Functor m => GHC.Base.Functor (Blucontrol.Recolor.Print.RecolorPrintT c m)
- Blucontrol.Recolor.Print: instance GHC.Base.Monad m => GHC.Base.Monad (Blucontrol.Recolor.Print.RecolorPrintT c m)
- Blucontrol.Recolor.Print: runRecolorPrintT :: RecolorPrintT c m a -> m a
- Blucontrol.Recolor.X: ConfigX :: Maybe Text -> Int -> Maybe Int -> ConfigX
- Blucontrol.Recolor.X: XErrorCloseDisplay :: XError
- Blucontrol.Recolor.X: XErrorOpenDisplay :: XError
- Blucontrol.Recolor.X: XErrorRead :: XError
- Blucontrol.Recolor.X: XErrorSetGamma :: XError
- Blucontrol.Recolor.X: [displayServer] :: ConfigX -> Int
- Blucontrol.Recolor.X: [hostName] :: ConfigX -> Maybe Text
- Blucontrol.Recolor.X: [screen] :: ConfigX -> Maybe Int
- Blucontrol.Recolor.X: data ConfigX
- Blucontrol.Recolor.X: data RecolorXT m a
- Blucontrol.Recolor.X: data XError
- Blucontrol.Recolor.X: instance Control.DeepSeq.NFData Blucontrol.Recolor.X.ConfigX
- Blucontrol.Recolor.X: instance Control.DeepSeq.NFData Blucontrol.Recolor.X.XError
- Blucontrol.Recolor.X: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Blucontrol.Recolor.X.RecolorXT m)
- Blucontrol.Recolor.X: instance Control.Monad.Trans.Class.MonadTrans Blucontrol.Recolor.X.RecolorXT
- Blucontrol.Recolor.X: instance Control.Monad.Trans.Control.MonadBaseControl GHC.Types.IO m => Blucontrol.Recolor.MonadRecolor (Blucontrol.Recolor.X.RecolorXT m)
- Blucontrol.Recolor.X: instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Blucontrol.Recolor.X.RecolorXT m)
- Blucontrol.Recolor.X: instance Control.Monad.Trans.Control.MonadTransControl Blucontrol.Recolor.X.RecolorXT
- Blucontrol.Recolor.X: instance Data.Default.Class.Default Blucontrol.Recolor.X.ConfigX
- Blucontrol.Recolor.X: instance GHC.Base.Functor m => GHC.Base.Functor (Blucontrol.Recolor.X.RecolorXT m)
- Blucontrol.Recolor.X: instance GHC.Base.Monad m => Control.Monad.Error.Class.MonadError Blucontrol.Recolor.X.XError (Blucontrol.Recolor.X.RecolorXT m)
- Blucontrol.Recolor.X: instance GHC.Base.Monad m => GHC.Base.Applicative (Blucontrol.Recolor.X.RecolorXT m)
- Blucontrol.Recolor.X: instance GHC.Base.Monad m => GHC.Base.Monad (Blucontrol.Recolor.X.RecolorXT m)
- Blucontrol.Recolor.X: instance GHC.Classes.Eq Blucontrol.Recolor.X.ConfigX
- Blucontrol.Recolor.X: instance GHC.Classes.Eq Blucontrol.Recolor.X.XError
- Blucontrol.Recolor.X: instance GHC.Classes.Ord Blucontrol.Recolor.X.ConfigX
- Blucontrol.Recolor.X: instance GHC.Classes.Ord Blucontrol.Recolor.X.XError
- Blucontrol.Recolor.X: instance GHC.Enum.Bounded Blucontrol.Recolor.X.XError
- Blucontrol.Recolor.X: instance GHC.Enum.Enum Blucontrol.Recolor.X.XError
- Blucontrol.Recolor.X: instance GHC.Generics.Generic Blucontrol.Recolor.X.ConfigX
- Blucontrol.Recolor.X: instance GHC.Generics.Generic Blucontrol.Recolor.X.XError
- Blucontrol.Recolor.X: instance GHC.Read.Read Blucontrol.Recolor.X.ConfigX
- Blucontrol.Recolor.X: instance GHC.Read.Read Blucontrol.Recolor.X.XError
- Blucontrol.Recolor.X: instance GHC.Show.Show Blucontrol.Recolor.X.ConfigX
- Blucontrol.Recolor.X: instance GHC.Show.Show Blucontrol.Recolor.X.XError
- Blucontrol.Recolor.X: runRecolorXTIO :: MonadBaseControl IO m => ConfigX -> RecolorXT m a -> m (Either XError a)
+ Blucontrol.Monad.Control: -- <a>StM</a> from running <a>MonadGamma</a> and <a>MonadRecolor</a>.
+ Blucontrol.Monad.Control: -- argument. This is usfeul to allow arguments wrapped in monadic state
+ Blucontrol.Monad.Control: -- | Give a constraint to allow <a>doInbetween</a> to handle a polymorphic
+ Blucontrol.Monad.Control: class MonadBaseControl IO m => MonadControl m where {
+ Blucontrol.Monad.Control: doInbetween :: (MonadControl m, ControlConstraint m a) => a -> m ()
+ Blucontrol.Monad.Control: instance Blucontrol.Monad.Control.MonadControl GHC.Types.IO
+ Blucontrol.Monad.Control: type family ControlConstraint m a :: Constraint;
+ Blucontrol.Monad.Control: }
+ Blucontrol.Monad.Control.Concat: (!>) :: (t1 m a -> m a) -> (t2 (t1 m) a -> t1 m a) -> ControlConcatT t1 t2 m a -> m a
+ Blucontrol.Monad.Control.Concat: data ControlConcatT (t1 :: (Type -> Type) -> Type -> Type) (t2 :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) a
+ Blucontrol.Monad.Control.Concat: infixr 5 !>
+ Blucontrol.Monad.Control.Concat: instance (Blucontrol.Monad.Control.MonadControl (t1 m), Blucontrol.Monad.Control.MonadControl (t2 (t1 m)), Control.Monad.Trans.Class.MonadTrans t2) => Blucontrol.Monad.Control.MonadControl (Blucontrol.Monad.Control.Concat.ControlConcatT t1 t2 m)
+ Blucontrol.Monad.Control.Concat: instance (forall (m :: * -> *). GHC.Base.Monad m => GHC.Base.Monad (t1 m), Control.Monad.Trans.Class.MonadTrans t1, Control.Monad.Trans.Class.MonadTrans t2) => Control.Monad.Trans.Class.MonadTrans (Blucontrol.Monad.Control.Concat.ControlConcatT t1 t2)
+ Blucontrol.Monad.Control.Concat: instance (forall (m :: * -> *). GHC.Base.Monad m => GHC.Base.Monad (t1 m), Control.Monad.Trans.Control.MonadTransControl t1, Control.Monad.Trans.Control.MonadTransControl t2) => Control.Monad.Trans.Control.MonadTransControl (Blucontrol.Monad.Control.Concat.ControlConcatT t1 t2)
+ Blucontrol.Monad.Control.Concat: instance Control.Monad.Base.MonadBase b (t2 (t1 m)) => Control.Monad.Base.MonadBase b (Blucontrol.Monad.Control.Concat.ControlConcatT t1 t2 m)
+ Blucontrol.Monad.Control.Concat: instance Control.Monad.Trans.Control.MonadBaseControl b (t2 (t1 m)) => Control.Monad.Trans.Control.MonadBaseControl b (Blucontrol.Monad.Control.Concat.ControlConcatT t1 t2 m)
+ Blucontrol.Monad.Control.Concat: instance GHC.Base.Applicative (t2 (t1 m)) => GHC.Base.Applicative (Blucontrol.Monad.Control.Concat.ControlConcatT t1 t2 m)
+ Blucontrol.Monad.Control.Concat: instance GHC.Base.Functor (t2 (t1 m)) => GHC.Base.Functor (Blucontrol.Monad.Control.Concat.ControlConcatT t1 t2 m)
+ Blucontrol.Monad.Control.Concat: instance GHC.Base.Monad (t2 (t1 m)) => GHC.Base.Monad (Blucontrol.Monad.Control.Concat.ControlConcatT t1 t2 m)
+ Blucontrol.Monad.Control.Concat: runControlConcatT :: (t1 m a -> m a) -> (t2 (t1 m) a -> t1 m a) -> ControlConcatT t1 t2 m a -> m a
+ Blucontrol.Monad.Control.Count: ConfigCount :: Natural -> ConfigCount
+ Blucontrol.Monad.Control.Count: [maxCount] :: ConfigCount -> Natural
+ Blucontrol.Monad.Control.Count: class CountableException a
+ Blucontrol.Monad.Control.Count: data ControlCountT m a
+ Blucontrol.Monad.Control.Count: instance Blucontrol.Monad.Control.Count.CountableException ()
+ Blucontrol.Monad.Control.Count: instance Blucontrol.Monad.Control.Count.CountableException a => Blucontrol.Monad.Control.Count.CountableException (Data.Either.Either b a)
+ Blucontrol.Monad.Control.Count: instance Blucontrol.Monad.Control.Count.CountableException a => Blucontrol.Monad.Control.Count.CountableException (GHC.Maybe.Maybe a)
+ Blucontrol.Monad.Control.Count: instance Control.DeepSeq.NFData Blucontrol.Monad.Control.Count.ConfigCount
+ Blucontrol.Monad.Control.Count: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Blucontrol.Monad.Control.Count.ControlCountT m)
+ Blucontrol.Monad.Control.Count: instance Control.Monad.Trans.Class.MonadTrans Blucontrol.Monad.Control.Count.ControlCountT
+ Blucontrol.Monad.Control.Count: instance Control.Monad.Trans.Control.MonadBaseControl GHC.Types.IO m => Blucontrol.Monad.Control.MonadControl (Blucontrol.Monad.Control.Count.ControlCountT m)
+ Blucontrol.Monad.Control.Count: instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Blucontrol.Monad.Control.Count.ControlCountT m)
+ Blucontrol.Monad.Control.Count: instance Control.Monad.Trans.Control.MonadTransControl Blucontrol.Monad.Control.Count.ControlCountT
+ Blucontrol.Monad.Control.Count: instance Data.Default.Class.Default Blucontrol.Monad.Control.Count.ConfigCount
+ Blucontrol.Monad.Control.Count: instance GHC.Base.Functor m => GHC.Base.Functor (Blucontrol.Monad.Control.Count.ControlCountT m)
+ Blucontrol.Monad.Control.Count: instance GHC.Base.Monad m => GHC.Base.Applicative (Blucontrol.Monad.Control.Count.ControlCountT m)
+ Blucontrol.Monad.Control.Count: instance GHC.Base.Monad m => GHC.Base.Monad (Blucontrol.Monad.Control.Count.ControlCountT m)
+ Blucontrol.Monad.Control.Count: instance GHC.Classes.Eq Blucontrol.Monad.Control.Count.ConfigCount
+ Blucontrol.Monad.Control.Count: instance GHC.Classes.Ord Blucontrol.Monad.Control.Count.ConfigCount
+ Blucontrol.Monad.Control.Count: instance GHC.Generics.Generic Blucontrol.Monad.Control.Count.ConfigCount
+ Blucontrol.Monad.Control.Count: instance GHC.Read.Read Blucontrol.Monad.Control.Count.ConfigCount
+ Blucontrol.Monad.Control.Count: instance GHC.Show.Show Blucontrol.Monad.Control.Count.ConfigCount
+ Blucontrol.Monad.Control.Count: isException :: CountableException a => a -> Bool
+ Blucontrol.Monad.Control.Count: newtype ConfigCount
+ Blucontrol.Monad.Control.Count: runControlCountT :: Monad m => ConfigCount -> ControlCountT m a -> m a
+ Blucontrol.Monad.Control.Print: data ControlPrintT m a
+ Blucontrol.Monad.Control.Print: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Blucontrol.Monad.Control.Print.ControlPrintT m)
+ Blucontrol.Monad.Control.Print: instance Control.Monad.Trans.Class.MonadTrans Blucontrol.Monad.Control.Print.ControlPrintT
+ Blucontrol.Monad.Control.Print: instance Control.Monad.Trans.Control.MonadBaseControl GHC.Types.IO m => Blucontrol.Monad.Control.MonadControl (Blucontrol.Monad.Control.Print.ControlPrintT m)
+ Blucontrol.Monad.Control.Print: instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Blucontrol.Monad.Control.Print.ControlPrintT m)
+ Blucontrol.Monad.Control.Print: instance Control.Monad.Trans.Control.MonadTransControl Blucontrol.Monad.Control.Print.ControlPrintT
+ Blucontrol.Monad.Control.Print: instance GHC.Base.Applicative m => GHC.Base.Applicative (Blucontrol.Monad.Control.Print.ControlPrintT m)
+ Blucontrol.Monad.Control.Print: instance GHC.Base.Functor m => GHC.Base.Functor (Blucontrol.Monad.Control.Print.ControlPrintT m)
+ Blucontrol.Monad.Control.Print: instance GHC.Base.Monad m => GHC.Base.Monad (Blucontrol.Monad.Control.Print.ControlPrintT m)
+ Blucontrol.Monad.Control.Print: runControlPrintT :: ControlPrintT m a -> m a
+ Blucontrol.Monad.Control.Wait: ConfigWait :: Microseconds -> ConfigWait
+ Blucontrol.Monad.Control.Wait: [interval] :: ConfigWait -> Microseconds
+ Blucontrol.Monad.Control.Wait: data ControlWaitT m a
+ Blucontrol.Monad.Control.Wait: instance Control.DeepSeq.NFData Blucontrol.Monad.Control.Wait.ConfigWait
+ Blucontrol.Monad.Control.Wait: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Blucontrol.Monad.Control.Wait.ControlWaitT m)
+ Blucontrol.Monad.Control.Wait: instance Control.Monad.Trans.Class.MonadTrans Blucontrol.Monad.Control.Wait.ControlWaitT
+ Blucontrol.Monad.Control.Wait: instance Control.Monad.Trans.Control.MonadBaseControl GHC.Types.IO m => Blucontrol.Monad.Control.MonadControl (Blucontrol.Monad.Control.Wait.ControlWaitT m)
+ Blucontrol.Monad.Control.Wait: instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Blucontrol.Monad.Control.Wait.ControlWaitT m)
+ Blucontrol.Monad.Control.Wait: instance Control.Monad.Trans.Control.MonadTransControl Blucontrol.Monad.Control.Wait.ControlWaitT
+ Blucontrol.Monad.Control.Wait: instance Data.Default.Class.Default Blucontrol.Monad.Control.Wait.ConfigWait
+ Blucontrol.Monad.Control.Wait: instance GHC.Base.Applicative m => GHC.Base.Applicative (Blucontrol.Monad.Control.Wait.ControlWaitT m)
+ Blucontrol.Monad.Control.Wait: instance GHC.Base.Functor m => GHC.Base.Functor (Blucontrol.Monad.Control.Wait.ControlWaitT m)
+ Blucontrol.Monad.Control.Wait: instance GHC.Base.Monad m => GHC.Base.Monad (Blucontrol.Monad.Control.Wait.ControlWaitT m)
+ Blucontrol.Monad.Control.Wait: instance GHC.Classes.Eq Blucontrol.Monad.Control.Wait.ConfigWait
+ Blucontrol.Monad.Control.Wait: instance GHC.Classes.Ord Blucontrol.Monad.Control.Wait.ConfigWait
+ Blucontrol.Monad.Control.Wait: instance GHC.Generics.Generic Blucontrol.Monad.Control.Wait.ConfigWait
+ Blucontrol.Monad.Control.Wait: instance GHC.Read.Read Blucontrol.Monad.Control.Wait.ConfigWait
+ Blucontrol.Monad.Control.Wait: instance GHC.Show.Show Blucontrol.Monad.Control.Wait.ConfigWait
+ Blucontrol.Monad.Control.Wait: newtype ConfigWait
+ Blucontrol.Monad.Control.Wait: runControlWaitT :: ConfigWait -> ControlWaitT m a -> m a
+ Blucontrol.Monad.Control.Wait: type Microseconds = Int
+ Blucontrol.Monad.Gamma: class Monad m => MonadGamma m where {
+ Blucontrol.Monad.Gamma: gamma :: MonadGamma m => m (GammaValue m)
+ Blucontrol.Monad.Gamma: type family GammaValue m;
+ Blucontrol.Monad.Gamma: }
+ Blucontrol.Monad.Gamma.Const: data GammaConstT c m a
+ Blucontrol.Monad.Gamma.Const: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Blucontrol.Monad.Gamma.Const.GammaConstT c m)
+ Blucontrol.Monad.Gamma.Const: instance Control.Monad.Reader.Class.MonadReader r m => Control.Monad.Reader.Class.MonadReader r (Blucontrol.Monad.Gamma.Const.GammaConstT c m)
+ Blucontrol.Monad.Gamma.Const: instance Control.Monad.Trans.Class.MonadTrans (Blucontrol.Monad.Gamma.Const.GammaConstT c)
+ Blucontrol.Monad.Gamma.Const: instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Blucontrol.Monad.Gamma.Const.GammaConstT c m)
+ Blucontrol.Monad.Gamma.Const: instance Control.Monad.Trans.Control.MonadTransControl (Blucontrol.Monad.Gamma.Const.GammaConstT c)
+ Blucontrol.Monad.Gamma.Const: instance GHC.Base.Applicative m => GHC.Base.Applicative (Blucontrol.Monad.Gamma.Const.GammaConstT c m)
+ Blucontrol.Monad.Gamma.Const: instance GHC.Base.Functor m => GHC.Base.Functor (Blucontrol.Monad.Gamma.Const.GammaConstT c m)
+ Blucontrol.Monad.Gamma.Const: instance GHC.Base.Monad m => Blucontrol.Monad.Gamma.MonadGamma (Blucontrol.Monad.Gamma.Const.GammaConstT c m)
+ Blucontrol.Monad.Gamma.Const: instance GHC.Base.Monad m => GHC.Base.Monad (Blucontrol.Monad.Gamma.Const.GammaConstT c m)
+ Blucontrol.Monad.Gamma.Const: runGammaConstT :: c -> GammaConstT c m a -> m a
+ Blucontrol.Monad.Gamma.Linear: (:.) :: Hour -> Minute -> Time
+ Blucontrol.Monad.Gamma.Linear: (:|) :: a -> [a] -> NonEmpty a
+ Blucontrol.Monad.Gamma.Linear: (==>) :: Time -> c -> (TimeOfDay, c)
+ Blucontrol.Monad.Gamma.Linear: calculateValue :: Monad m => (Rational -> c -> c -> c) -> LocalTime -> GammaLinearT c m c
+ Blucontrol.Monad.Gamma.Linear: data GammaLinearT c m a
+ Blucontrol.Monad.Gamma.Linear: data Hour
+ Blucontrol.Monad.Gamma.Linear: data Minute
+ Blucontrol.Monad.Gamma.Linear: data NonEmpty a
+ Blucontrol.Monad.Gamma.Linear: data Time
+ Blucontrol.Monad.Gamma.Linear: infix 6 ==>
+ Blucontrol.Monad.Gamma.Linear: infix 7 :.
+ Blucontrol.Monad.Gamma.Linear: infixr 5 :|
+ Blucontrol.Monad.Gamma.Linear: instance (Control.Monad.Base.MonadBase GHC.Types.IO m, Blucontrol.Monad.Gamma.MonadGamma (Blucontrol.Monad.Gamma.Linear.GammaLinearT c m)) => Blucontrol.Monad.Gamma.MonadGamma (Blucontrol.Monad.Gamma.Linear.GammaLinearT (Blucontrol.Value.Brightness.WithBrightness c) m)
+ Blucontrol.Monad.Gamma.Linear: instance Control.DeepSeq.NFData Blucontrol.Monad.Gamma.Linear.Hour
+ Blucontrol.Monad.Gamma.Linear: instance Control.DeepSeq.NFData Blucontrol.Monad.Gamma.Linear.Minute
+ Blucontrol.Monad.Gamma.Linear: instance Control.DeepSeq.NFData Blucontrol.Monad.Gamma.Linear.Time
+ Blucontrol.Monad.Gamma.Linear: instance Control.Monad.Base.MonadBase GHC.Types.IO m => Blucontrol.Monad.Gamma.MonadGamma (Blucontrol.Monad.Gamma.Linear.GammaLinearT (Blucontrol.Value.RGB.RGB GHC.Word.Word8) m)
+ Blucontrol.Monad.Gamma.Linear: instance Control.Monad.Base.MonadBase GHC.Types.IO m => Blucontrol.Monad.Gamma.MonadGamma (Blucontrol.Monad.Gamma.Linear.GammaLinearT Blucontrol.Value.RGB.Temperature.Temperature m)
+ Blucontrol.Monad.Gamma.Linear: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Blucontrol.Monad.Gamma.Linear.GammaLinearT c m)
+ Blucontrol.Monad.Gamma.Linear: instance Control.Monad.Reader.Class.MonadReader r m => Control.Monad.Reader.Class.MonadReader r (Blucontrol.Monad.Gamma.Linear.GammaLinearT c m)
+ Blucontrol.Monad.Gamma.Linear: instance Control.Monad.Trans.Class.MonadTrans (Blucontrol.Monad.Gamma.Linear.GammaLinearT c)
+ Blucontrol.Monad.Gamma.Linear: instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Blucontrol.Monad.Gamma.Linear.GammaLinearT c m)
+ Blucontrol.Monad.Gamma.Linear: instance Control.Monad.Trans.Control.MonadTransControl (Blucontrol.Monad.Gamma.Linear.GammaLinearT c)
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Base.Applicative m => GHC.Base.Applicative (Blucontrol.Monad.Gamma.Linear.GammaLinearT c m)
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Base.Functor m => GHC.Base.Functor (Blucontrol.Monad.Gamma.Linear.GammaLinearT c m)
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Base.Monad m => GHC.Base.Monad (Blucontrol.Monad.Gamma.Linear.GammaLinearT c m)
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Classes.Eq Blucontrol.Monad.Gamma.Linear.Hour
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Classes.Eq Blucontrol.Monad.Gamma.Linear.Minute
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Classes.Eq Blucontrol.Monad.Gamma.Linear.Time
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Classes.Ord Blucontrol.Monad.Gamma.Linear.Hour
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Classes.Ord Blucontrol.Monad.Gamma.Linear.Minute
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Classes.Ord Blucontrol.Monad.Gamma.Linear.Time
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Enum.Bounded Blucontrol.Monad.Gamma.Linear.Hour
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Enum.Bounded Blucontrol.Monad.Gamma.Linear.Minute
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Enum.Bounded Blucontrol.Monad.Gamma.Linear.Time
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Enum.Enum Blucontrol.Monad.Gamma.Linear.Hour
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Enum.Enum Blucontrol.Monad.Gamma.Linear.Minute
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Enum.Enum Blucontrol.Monad.Gamma.Linear.Time
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Generics.Generic Blucontrol.Monad.Gamma.Linear.Hour
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Generics.Generic Blucontrol.Monad.Gamma.Linear.Minute
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Generics.Generic Blucontrol.Monad.Gamma.Linear.Time
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Num.Num Blucontrol.Monad.Gamma.Linear.Hour
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Num.Num Blucontrol.Monad.Gamma.Linear.Minute
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Read.Read Blucontrol.Monad.Gamma.Linear.Hour
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Read.Read Blucontrol.Monad.Gamma.Linear.Minute
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Read.Read Blucontrol.Monad.Gamma.Linear.Time
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Real.Integral Blucontrol.Monad.Gamma.Linear.Hour
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Real.Integral Blucontrol.Monad.Gamma.Linear.Minute
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Real.Real Blucontrol.Monad.Gamma.Linear.Hour
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Real.Real Blucontrol.Monad.Gamma.Linear.Minute
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Show.Show Blucontrol.Monad.Gamma.Linear.Hour
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Show.Show Blucontrol.Monad.Gamma.Linear.Minute
+ Blucontrol.Monad.Gamma.Linear: instance GHC.Show.Show Blucontrol.Monad.Gamma.Linear.Time
+ Blucontrol.Monad.Gamma.Linear: runGammaLinearT :: NonEmpty (TimeOfDay, c) -> GammaLinearT c m a -> m a
+ Blucontrol.Monad.Gamma.Linear: weightedAverageRGB :: Rational -> RGB Word8 -> RGB Word8 -> RGB Word8
+ Blucontrol.Monad.Gamma.Modifier: data GammaModifierT m a
+ Blucontrol.Monad.Gamma.Modifier: instance (Control.Monad.Base.MonadBase GHC.Types.IO m, Blucontrol.Monad.Gamma.MonadGamma m) => Blucontrol.Monad.Gamma.MonadGamma (Blucontrol.Monad.Gamma.Modifier.GammaModifierT m)
+ Blucontrol.Monad.Gamma.Modifier: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Blucontrol.Monad.Gamma.Modifier.GammaModifierT m)
+ Blucontrol.Monad.Gamma.Modifier: instance Control.Monad.Trans.Class.MonadTrans Blucontrol.Monad.Gamma.Modifier.GammaModifierT
+ Blucontrol.Monad.Gamma.Modifier: instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Blucontrol.Monad.Gamma.Modifier.GammaModifierT m)
+ Blucontrol.Monad.Gamma.Modifier: instance GHC.Base.Applicative m => GHC.Base.Applicative (Blucontrol.Monad.Gamma.Modifier.GammaModifierT m)
+ Blucontrol.Monad.Gamma.Modifier: instance GHC.Base.Functor m => GHC.Base.Functor (Blucontrol.Monad.Gamma.Modifier.GammaModifierT m)
+ Blucontrol.Monad.Gamma.Modifier: instance GHC.Base.Monad m => GHC.Base.Monad (Blucontrol.Monad.Gamma.Modifier.GammaModifierT m)
+ Blucontrol.Monad.Gamma.Modifier: runGammaModifierT :: (GammaValue m -> IO (GammaValue m)) -> GammaModifierT m a -> m a
+ Blucontrol.Monad.Recolor: class Monad m => MonadRecolor m where {
+ Blucontrol.Monad.Recolor: recolor :: MonadRecolor m => RecolorValue m -> m ()
+ Blucontrol.Monad.Recolor: type family RecolorValue m;
+ Blucontrol.Monad.Recolor: }
+ Blucontrol.Monad.Recolor.Print: data RecolorPrintT c m a
+ Blucontrol.Monad.Recolor.Print: instance (Control.Monad.Trans.Control.MonadBaseControl GHC.Types.IO m, GHC.Show.Show c) => Blucontrol.Monad.Recolor.MonadRecolor (Blucontrol.Monad.Recolor.Print.RecolorPrintT c m)
+ Blucontrol.Monad.Recolor.Print: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Blucontrol.Monad.Recolor.Print.RecolorPrintT c m)
+ Blucontrol.Monad.Recolor.Print: instance Control.Monad.Trans.Class.MonadTrans (Blucontrol.Monad.Recolor.Print.RecolorPrintT c)
+ Blucontrol.Monad.Recolor.Print: instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Blucontrol.Monad.Recolor.Print.RecolorPrintT c m)
+ Blucontrol.Monad.Recolor.Print: instance Control.Monad.Trans.Control.MonadTransControl (Blucontrol.Monad.Recolor.Print.RecolorPrintT c)
+ Blucontrol.Monad.Recolor.Print: instance GHC.Base.Applicative m => GHC.Base.Applicative (Blucontrol.Monad.Recolor.Print.RecolorPrintT c m)
+ Blucontrol.Monad.Recolor.Print: instance GHC.Base.Functor m => GHC.Base.Functor (Blucontrol.Monad.Recolor.Print.RecolorPrintT c m)
+ Blucontrol.Monad.Recolor.Print: instance GHC.Base.Monad m => GHC.Base.Monad (Blucontrol.Monad.Recolor.Print.RecolorPrintT c m)
+ Blucontrol.Monad.Recolor.Print: runRecolorPrintT :: RecolorPrintT c m a -> m a
+ Blucontrol.Monad.Recolor.X: ConfigX :: Maybe Text -> Int -> Maybe Int -> ConfigX
+ Blucontrol.Monad.Recolor.X: XErrorCloseDisplay :: XError
+ Blucontrol.Monad.Recolor.X: XErrorOpenDisplay :: XError
+ Blucontrol.Monad.Recolor.X: XErrorRead :: XError
+ Blucontrol.Monad.Recolor.X: XErrorSetGamma :: XError
+ Blucontrol.Monad.Recolor.X: [displayServer] :: ConfigX -> Int
+ Blucontrol.Monad.Recolor.X: [hostName] :: ConfigX -> Maybe Text
+ Blucontrol.Monad.Recolor.X: [screen] :: ConfigX -> Maybe Int
+ Blucontrol.Monad.Recolor.X: data ConfigX
+ Blucontrol.Monad.Recolor.X: data RecolorXT m a
+ Blucontrol.Monad.Recolor.X: data XError
+ Blucontrol.Monad.Recolor.X: instance Control.DeepSeq.NFData Blucontrol.Monad.Recolor.X.ConfigX
+ Blucontrol.Monad.Recolor.X: instance Control.DeepSeq.NFData Blucontrol.Monad.Recolor.X.XError
+ Blucontrol.Monad.Recolor.X: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Blucontrol.Monad.Recolor.X.RecolorXT m)
+ Blucontrol.Monad.Recolor.X: instance Control.Monad.Trans.Class.MonadTrans Blucontrol.Monad.Recolor.X.RecolorXT
+ Blucontrol.Monad.Recolor.X: instance Control.Monad.Trans.Control.MonadBaseControl GHC.Types.IO m => Blucontrol.Monad.Recolor.MonadRecolor (Blucontrol.Monad.Recolor.X.RecolorXT m)
+ Blucontrol.Monad.Recolor.X: instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Blucontrol.Monad.Recolor.X.RecolorXT m)
+ Blucontrol.Monad.Recolor.X: instance Control.Monad.Trans.Control.MonadTransControl Blucontrol.Monad.Recolor.X.RecolorXT
+ Blucontrol.Monad.Recolor.X: instance Data.Default.Class.Default Blucontrol.Monad.Recolor.X.ConfigX
+ Blucontrol.Monad.Recolor.X: instance GHC.Base.Functor m => GHC.Base.Functor (Blucontrol.Monad.Recolor.X.RecolorXT m)
+ Blucontrol.Monad.Recolor.X: instance GHC.Base.Monad m => Control.Monad.Error.Class.MonadError Blucontrol.Monad.Recolor.X.XError (Blucontrol.Monad.Recolor.X.RecolorXT m)
+ Blucontrol.Monad.Recolor.X: instance GHC.Base.Monad m => GHC.Base.Applicative (Blucontrol.Monad.Recolor.X.RecolorXT m)
+ Blucontrol.Monad.Recolor.X: instance GHC.Base.Monad m => GHC.Base.Monad (Blucontrol.Monad.Recolor.X.RecolorXT m)
+ Blucontrol.Monad.Recolor.X: instance GHC.Classes.Eq Blucontrol.Monad.Recolor.X.ConfigX
+ Blucontrol.Monad.Recolor.X: instance GHC.Classes.Eq Blucontrol.Monad.Recolor.X.XError
+ Blucontrol.Monad.Recolor.X: instance GHC.Classes.Ord Blucontrol.Monad.Recolor.X.ConfigX
+ Blucontrol.Monad.Recolor.X: instance GHC.Classes.Ord Blucontrol.Monad.Recolor.X.XError
+ Blucontrol.Monad.Recolor.X: instance GHC.Enum.Bounded Blucontrol.Monad.Recolor.X.XError
+ Blucontrol.Monad.Recolor.X: instance GHC.Enum.Enum Blucontrol.Monad.Recolor.X.XError
+ Blucontrol.Monad.Recolor.X: instance GHC.Generics.Generic Blucontrol.Monad.Recolor.X.ConfigX
+ Blucontrol.Monad.Recolor.X: instance GHC.Generics.Generic Blucontrol.Monad.Recolor.X.XError
+ Blucontrol.Monad.Recolor.X: instance GHC.Read.Read Blucontrol.Monad.Recolor.X.ConfigX
+ Blucontrol.Monad.Recolor.X: instance GHC.Read.Read Blucontrol.Monad.Recolor.X.XError
+ Blucontrol.Monad.Recolor.X: instance GHC.Show.Show Blucontrol.Monad.Recolor.X.ConfigX
+ Blucontrol.Monad.Recolor.X: instance GHC.Show.Show Blucontrol.Monad.Recolor.X.XError
+ Blucontrol.Monad.Recolor.X: runRecolorXTIO :: MonadBaseControl IO m => ConfigX -> RecolorXT m a -> m (Either XError a)
+ Blucontrol.Value: class CompatibleValues a b
+ Blucontrol.Value: convertValue :: CompatibleValues a b => a -> b
+ Blucontrol.Value: instance Blucontrol.Value.CompatibleValues a a
+ Blucontrol.Value.Brightness: WithBrightness :: Brightness -> a -> WithBrightness a
+ Blucontrol.Value.Brightness: [brightness] :: WithBrightness a -> Brightness
+ Blucontrol.Value.Brightness: [color] :: WithBrightness a -> a
+ Blucontrol.Value.Brightness: data Brightness
+ Blucontrol.Value.Brightness: data WithBrightness a
+ Blucontrol.Value.Brightness: instance Control.DeepSeq.NFData Blucontrol.Value.Brightness.Brightness
+ Blucontrol.Value.Brightness: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Blucontrol.Value.Brightness.WithBrightness a)
+ Blucontrol.Value.Brightness: instance Data.Default.Class.Default Blucontrol.Value.Brightness.Brightness
+ Blucontrol.Value.Brightness: instance Data.Default.Class.Default a => Data.Default.Class.Default (Blucontrol.Value.Brightness.WithBrightness a)
+ Blucontrol.Value.Brightness: instance GHC.Classes.Eq Blucontrol.Value.Brightness.Brightness
+ Blucontrol.Value.Brightness: instance GHC.Classes.Eq a => GHC.Classes.Eq (Blucontrol.Value.Brightness.WithBrightness a)
+ Blucontrol.Value.Brightness: instance GHC.Classes.Ord Blucontrol.Value.Brightness.Brightness
+ Blucontrol.Value.Brightness: instance GHC.Classes.Ord a => GHC.Classes.Ord (Blucontrol.Value.Brightness.WithBrightness a)
+ Blucontrol.Value.Brightness: instance GHC.Enum.Bounded Blucontrol.Value.Brightness.Brightness
+ Blucontrol.Value.Brightness: instance GHC.Enum.Enum Blucontrol.Value.Brightness.Brightness
+ Blucontrol.Value.Brightness: instance GHC.Generics.Generic (Blucontrol.Value.Brightness.WithBrightness a)
+ Blucontrol.Value.Brightness: instance GHC.Generics.Generic Blucontrol.Value.Brightness.Brightness
+ Blucontrol.Value.Brightness: instance GHC.Num.Num Blucontrol.Value.Brightness.Brightness
+ Blucontrol.Value.Brightness: instance GHC.Read.Read Blucontrol.Value.Brightness.Brightness
+ Blucontrol.Value.Brightness: instance GHC.Read.Read a => GHC.Read.Read (Blucontrol.Value.Brightness.WithBrightness a)
+ Blucontrol.Value.Brightness: instance GHC.Real.Fractional Blucontrol.Value.Brightness.Brightness
+ Blucontrol.Value.Brightness: instance GHC.Real.Real Blucontrol.Value.Brightness.Brightness
+ Blucontrol.Value.Brightness: instance GHC.Real.RealFrac Blucontrol.Value.Brightness.Brightness
+ Blucontrol.Value.Brightness: instance GHC.Show.Show Blucontrol.Value.Brightness.Brightness
+ Blucontrol.Value.Brightness: instance GHC.Show.Show a => GHC.Show.Show (Blucontrol.Value.Brightness.WithBrightness a)
+ Blucontrol.Value.RGB: RGB :: a -> a -> a -> RGB a
+ Blucontrol.Value.RGB: [blue] :: RGB a -> a
+ Blucontrol.Value.RGB: [green] :: RGB a -> a
+ Blucontrol.Value.RGB: [red] :: RGB a -> a
+ Blucontrol.Value.RGB: data RGB a
+ Blucontrol.Value.RGB: instance (GHC.Enum.Bounded a, GHC.Enum.Enum a) => GHC.Enum.Enum (Blucontrol.Value.RGB.RGB a)
+ Blucontrol.Value.RGB: instance Blucontrol.Value.CompatibleValues (Blucontrol.Value.RGB.RGB GHC.Word.Word8) (Blucontrol.Value.RGB.RGB GHC.Types.Float)
+ Blucontrol.Value.RGB: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Blucontrol.Value.RGB.RGB a)
+ Blucontrol.Value.RGB: instance Data.Default.Class.Default (Blucontrol.Value.RGB.RGB GHC.Word.Word8)
+ Blucontrol.Value.RGB: instance GHC.Classes.Eq a => GHC.Classes.Eq (Blucontrol.Value.RGB.RGB a)
+ Blucontrol.Value.RGB: instance GHC.Classes.Ord a => GHC.Classes.Ord (Blucontrol.Value.RGB.RGB a)
+ Blucontrol.Value.RGB: instance GHC.Enum.Bounded a => GHC.Enum.Bounded (Blucontrol.Value.RGB.RGB a)
+ Blucontrol.Value.RGB: instance GHC.Generics.Generic (Blucontrol.Value.RGB.RGB a)
+ Blucontrol.Value.RGB: instance GHC.Read.Read a => GHC.Read.Read (Blucontrol.Value.RGB.RGB a)
+ Blucontrol.Value.RGB: instance GHC.Show.Show a => GHC.Show.Show (Blucontrol.Value.RGB.RGB a)
+ Blucontrol.Value.RGB.Temperature: data Temperature
+ Blucontrol.Value.RGB.Temperature: instance Blucontrol.Value.CompatibleValues (Blucontrol.Value.RGB.RGB GHC.Word.Word8) a => Blucontrol.Value.CompatibleValues Blucontrol.Value.RGB.Temperature.Temperature a
+ Blucontrol.Value.RGB.Temperature: instance Control.DeepSeq.NFData Blucontrol.Value.RGB.Temperature.Temperature
+ Blucontrol.Value.RGB.Temperature: instance Data.Default.Class.Default Blucontrol.Value.RGB.Temperature.Temperature
+ Blucontrol.Value.RGB.Temperature: instance GHC.Classes.Eq Blucontrol.Value.RGB.Temperature.Temperature
+ Blucontrol.Value.RGB.Temperature: instance GHC.Classes.Ord Blucontrol.Value.RGB.Temperature.Temperature
+ Blucontrol.Value.RGB.Temperature: instance GHC.Enum.Bounded Blucontrol.Value.RGB.Temperature.Temperature
+ Blucontrol.Value.RGB.Temperature: instance GHC.Enum.Enum Blucontrol.Value.RGB.Temperature.Temperature
+ Blucontrol.Value.RGB.Temperature: instance GHC.Generics.Generic Blucontrol.Value.RGB.Temperature.Temperature
+ Blucontrol.Value.RGB.Temperature: instance GHC.Num.Num Blucontrol.Value.RGB.Temperature.Temperature
+ Blucontrol.Value.RGB.Temperature: instance GHC.Read.Read Blucontrol.Value.RGB.Temperature.Temperature
+ Blucontrol.Value.RGB.Temperature: instance GHC.Real.Fractional Blucontrol.Value.RGB.Temperature.Temperature
+ Blucontrol.Value.RGB.Temperature: instance GHC.Real.Real Blucontrol.Value.RGB.Temperature.Temperature
+ Blucontrol.Value.RGB.Temperature: instance GHC.Real.RealFrac Blucontrol.Value.RGB.Temperature.Temperature
+ Blucontrol.Value.RGB.Temperature: instance GHC.Show.Show Blucontrol.Value.RGB.Temperature.Temperature

Files

CHANGELOG.md view
@@ -1,5 +1,11 @@ # Revision history for blucontrol +## 0.5.0.0 *09 Jun 2021*++* Change module structure, now using `Blucontrol.Monad` and `Blucontrol.Value`.+* Move module `Blucontrol.Value.RGB.Brightness` to `Blucontrol.Value.Brightness`.+* Rename module `Blucontrol.CompatibleValues` to `Blucontrol.Value`.+ ## 0.4.1.0 *08 Jun 2021*  * Remove field `coerceValue` from `ConfigControl`.
Main.hs view
@@ -3,12 +3,12 @@ module Main where  import Blucontrol-import Blucontrol.Control.Count-import Blucontrol.Control.Print-import Blucontrol.Control.Wait-import Blucontrol.Gamma.Linear-import Blucontrol.Recolor.X-import Blucontrol.RGB.Temperature+import Blucontrol.Monad.Control.Count+import Blucontrol.Monad.Control.Print+import Blucontrol.Monad.Control.Wait+import Blucontrol.Monad.Gamma.Linear+import Blucontrol.Monad.Recolor.X+import Blucontrol.Value.RGB.Temperature  main :: IO () main = blucontrol configControl
blucontrol.cabal view
@@ -1,5 +1,5 @@ name:                blucontrol-version:             0.4.1.0+version:             0.5.0.0 synopsis:            Configurable blue light filter description:         This application is a blue light filter, with the main focus on                      configurability.@@ -25,27 +25,27 @@  library   exposed-modules:     Blucontrol-                       Blucontrol.CompatibleValues-                       Blucontrol.Control-                       Blucontrol.Control.Concat-                       Blucontrol.Control.Count-                       Blucontrol.Control.Print-                       Blucontrol.Control.Wait-                       Blucontrol.Gamma-                       Blucontrol.Gamma.Const-                       Blucontrol.Gamma.Linear-                       Blucontrol.Gamma.Modifier                        Blucontrol.Main                        Blucontrol.Main.CLI                        Blucontrol.Main.Control-                       Blucontrol.Recolor-                       Blucontrol.Recolor.Print-                       Blucontrol.Recolor.X-                       Blucontrol.RGB-                       Blucontrol.RGB.Brightness-                       Blucontrol.RGB.Temperature+                       Blucontrol.Monad.Control+                       Blucontrol.Monad.Control.Concat+                       Blucontrol.Monad.Control.Count+                       Blucontrol.Monad.Control.Print+                       Blucontrol.Monad.Control.Wait+                       Blucontrol.Monad.Gamma+                       Blucontrol.Monad.Gamma.Const+                       Blucontrol.Monad.Gamma.Linear+                       Blucontrol.Monad.Gamma.Modifier+                       Blucontrol.Monad.Recolor+                       Blucontrol.Monad.Recolor.Print+                       Blucontrol.Monad.Recolor.X+                       Blucontrol.Value+                       Blucontrol.Value.Brightness+                       Blucontrol.Value.RGB+                       Blucontrol.Value.RGB.Temperature   other-modules:       Blucontrol.Main.GHC.Internal-                       Blucontrol.Recolor.X.Internal+                       Blucontrol.Monad.Recolor.X.Internal                        Paths_blucontrol   build-depends:       base              >= 4.11    && < 5                      , containers        >= 0.6.2.1 && < 0.7@@ -98,8 +98,8 @@   main-is:             Blucontrol.hs   type:                exitcode-stdio-1.0   hs-source-dirs:      test-  other-modules:       Blucontrol.Test.Gamma.Linear-                       Blucontrol.Test.RGB+  other-modules:       Blucontrol.Monad.Gamma.Linear.Test+                       Blucontrol.Value.RGB.Test   build-depends:       base                      , blucontrol                      , data-default
src/Blucontrol.hs view
@@ -35,8 +35,8 @@  import Data.Default -import Blucontrol.Control-import Blucontrol.Control.Concat-import Blucontrol.Gamma import Blucontrol.Main-import Blucontrol.Recolor+import Blucontrol.Monad.Control+import Blucontrol.Monad.Control.Concat+import Blucontrol.Monad.Gamma+import Blucontrol.Monad.Recolor
− src/Blucontrol/CompatibleValues.hs
@@ -1,9 +0,0 @@-module Blucontrol.CompatibleValues (-  CompatibleValues (..)-) where--class CompatibleValues a b where-    convertValue :: a -> b--instance CompatibleValues a a where-  convertValue = id
− src/Blucontrol/Control.hs
@@ -1,25 +0,0 @@-{-# LANGUAGE UndecidableInstances #-}--module Blucontrol.Control (-  MonadControl (..)-) where--import Control.Monad.Trans.Control-import Data.Kind--class MonadBaseControl IO m => MonadControl m where--  {- | Give a constraint to allow 'doInbetween' to handle a polymorphic argument.-    This is usfeul to allow arguments wrapped in monadic state 'StM' from running-    'Blucontrol.Gamma.MonadGamma' and 'Blucontrol.Recolor.MonadRecolor'.-  -}-  type ControlConstraint m a :: Constraint--  -- | This function will be called after recoloring the screen.-  doInbetween :: ControlConstraint m a-              => a -- ^ the returned value from the last call of 'Blucontrol.Recolor.recolor' including monadic state-              -> m () -- ^ the side effect to be run inbetween recoloring--instance MonadControl IO where-  type ControlConstraint IO _ = ()-  doInbetween _ = return ()
− src/Blucontrol/Control/Concat.hs
@@ -1,40 +0,0 @@-{-# LANGUAGE QuantifiedConstraints, UndecidableInstances #-}--module Blucontrol.Control.Concat (-  ControlConcatT-, runControlConcatT-, (!>)-) where--import Control.Monad.Base-import Control.Monad.Trans-import Control.Monad.Trans.Control-import Data.Kind--import Blucontrol.Control--newtype ControlConcatT (t1 :: (Type -> Type) -> Type -> Type) (t2 :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) a = ControlConcatT { unControlConcatT :: t2 (t1 m) a }-  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b)--instance (forall m. Monad m => Monad (t1 m), MonadTrans t1, MonadTrans t2) => MonadTrans (ControlConcatT t1 t2) where-  lift = ControlConcatT . lift . lift--instance (forall m. Monad m => Monad (t1 m), MonadTransControl t1, MonadTransControl t2) => MonadTransControl (ControlConcatT t1 t2) where-  type StT (ControlConcatT t1 t2) a = StT t1 (StT t2 a)-  liftWith inner = ControlConcatT $-    liftWith $ \ runT2 ->-      liftWith $ \ runT1 ->-        inner $ runT1 . runT2 . unControlConcatT-  restoreT = ControlConcatT . restoreT . restoreT--instance (MonadControl (t1 m), MonadControl (t2 (t1 m)), MonadTrans t2) => MonadControl (ControlConcatT t1 t2 m) where-  type ControlConstraint (ControlConcatT t1 t2 m) a = (ControlConstraint (t1 m) a, ControlConstraint (t2 (t1 m)) a)-  doInbetween a = do ControlConcatT . lift $ doInbetween a-                     ControlConcatT $ doInbetween a--runControlConcatT :: (t1 m a -> m a) -> (t2 (t1 m) a -> t1 m a) -> ControlConcatT t1 t2 m a -> m a-runControlConcatT runT1 runT2 = runT1 . runT2 . unControlConcatT--infixr 5 !>-(!>) :: (t1 m a -> m a) -> (t2 (t1 m) a -> t1 m a) -> (ControlConcatT t1 t2 m a -> m a)-(!>) = runControlConcatT
− src/Blucontrol/Control/Count.hs
@@ -1,70 +0,0 @@-{-# LANGUAGE UndecidableInstances #-}--module Blucontrol.Control.Count (-  ControlCountT-, runControlCountT-, ConfigCount (..)-, CountableException (..)-) where--import Control.DeepSeq-import Control.Monad.Base-import Control.Monad.Trans.Control-import Control.Monad.Reader-import Control.Monad.State.Strict-import Data.Default-import GHC.Generics-import Numeric.Natural--import Blucontrol.Control--newtype ControlCountT m a = ControlCountT { unControlCountT :: StateT Natural (ReaderT ConfigCount m) a }-  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b)--instance MonadTrans ControlCountT where-  lift = ControlCountT . lift . lift--instance MonadTransControl ControlCountT where-  type StT ControlCountT a = StT (ReaderT ConfigCount) (StT (StateT Natural) a)-  -- TODO: workaround for ghc-9.0.1-  --liftWith = defaultLiftWith2 ControlCountT unControlCountT-  liftWith f = ControlCountT $ liftWith $ \run -> liftWith $ \run' -> f $ run' . run . unControlCountT-  restoreT = defaultRestoreT2 ControlCountT--instance MonadBaseControl IO m => MonadControl (ControlCountT m) where-  type ControlConstraint (ControlCountT m) a = CountableException a-  doInbetween a = do if isException a-                        then ControlCountT $ modify succ-                        else ControlCountT $ put 0-                     current <- ControlCountT get-                     limit <- ControlCountT . lift $ reader maxCount-                     if current >= limit-                        then error $ "failed after " <> show limit <> " consecutive tries"-                        else return ()--runControlCountT :: Monad m => ConfigCount -> ControlCountT m a -> m a-runControlCountT !conf tma = runReaderT (evalStateT (unControlCountT tma) 0) conf--newtype ConfigCount = ConfigCount { maxCount :: Natural-                                  }-  deriving (Eq, Generic, Ord, Read, Show)--instance NFData ConfigCount--instance Default ConfigCount where-  def = ConfigCount { maxCount = 5-                    }--class CountableException a where-  isException :: a -> Bool--instance CountableException () where-  isException () = False--instance CountableException a => CountableException (Maybe a) where-  isException Nothing = True-  isException (Just a) = isException a--instance CountableException a => CountableException (Either b a) where-  isException (Left _) = True-  isException (Right a) = isException a
− src/Blucontrol/Control/Print.hs
@@ -1,30 +0,0 @@-{-# LANGUAGE UndecidableInstances #-}--module Blucontrol.Control.Print (-  ControlPrintT-, runControlPrintT-) where--import Control.Monad.Base-import Control.Monad.Trans-import Control.Monad.Trans.Control--import Blucontrol.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 MonadBaseControl IO m => MonadControl (ControlPrintT m) where-  type ControlConstraint (ControlPrintT m) a = Show a-  doInbetween a = liftBase $ print a--runControlPrintT :: ControlPrintT m a -> m a-runControlPrintT = unControlPrintT
− src/Blucontrol/Control/Wait.hs
@@ -1,40 +0,0 @@-{-# LANGUAGE UndecidableInstances #-}--module Blucontrol.Control.Wait (-  ControlWaitT-, runControlWaitT-, ConfigWait (..)-, Microseconds-) where--import Control.Concurrent (threadDelay)-import Control.DeepSeq-import Control.Monad.Base-import Control.Monad.Trans.Control-import Control.Monad.Reader-import Data.Default-import GHC.Generics--import Blucontrol.Control--newtype ControlWaitT m a = ControlWaitT { unControlWaitT :: ReaderT ConfigWait m a }-  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b, MonadTrans, MonadTransControl)--instance MonadBaseControl IO m => MonadControl (ControlWaitT m) where-  type ControlConstraint (ControlWaitT m) _ = ()-  doInbetween _ = liftBase . threadDelay . interval =<< ControlWaitT ask--runControlWaitT :: ConfigWait -> ControlWaitT m a -> m a-runControlWaitT !conf tma = runReaderT (unControlWaitT tma) conf--newtype ConfigWait = ConfigWait { interval :: Microseconds-                                }-  deriving (Eq, Generic, Ord, Read, Show)--instance NFData ConfigWait--instance Default ConfigWait where-  def = ConfigWait { interval = 1000000-                   }--type Microseconds = Int
− src/Blucontrol/Gamma.hs
@@ -1,13 +0,0 @@-module Blucontrol.Gamma (-  MonadGamma (..)-) where--class Monad m => MonadGamma m where--  type GammaValue m--  {- | Calculate a gamma value.-     This is a monadic function, to allow the value to be dependent on side effects like time and-     location.-  -}-  gamma :: m (GammaValue m)
− src/Blucontrol/Gamma/Const.hs
@@ -1,28 +0,0 @@-{-# 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--newtype GammaConstT c m a = GammaConstT { unGammaConstT :: ReaderT c m a }-  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b, MonadTrans, MonadTransControl)--instance MonadReader r m => MonadReader r (GammaConstT c m) where-  ask = lift ask-  local f tma = liftWith $ \ run ->-    local f $ run tma--instance Monad m => MonadGamma (GammaConstT c m) where-  type GammaValue (GammaConstT c m) = c-  gamma = GammaConstT ask--runGammaConstT :: c -> GammaConstT c m a -> m a-runGammaConstT !rgb tma = runReaderT (unGammaConstT tma) rgb
− src/Blucontrol/Gamma/Linear.hs
@@ -1,142 +0,0 @@-{-# LANGUAGE UndecidableInstances #-}--module Blucontrol.Gamma.Linear (-  GammaLinearT-, runGammaLinearT-, Time (..)-, Hour-, Minute-, (==>)-, N.NonEmpty (..) -- TODO: keep here?-, calculateValue -- TODO: export for testing-, weightedAverageRGB -- TODO: export for testing-) where--import Control.DeepSeq-import Control.Monad.Base-import Control.Monad.Except-import Control.Monad.Reader-import Control.Monad.Trans.Control-import qualified Data.Finite as F-import qualified Data.List.NonEmpty as N-import qualified Data.Map as M-import Data.Maybe (fromJust)-import Data.Time-import Data.Word-import GHC.Generics--import Blucontrol.Gamma-import Blucontrol.RGB-import Blucontrol.RGB.Brightness-import Blucontrol.RGB.Temperature--newtype GammaLinearT c m a = GammaLinearT { unGammaLinearT :: ReaderT (M.Map TimeOfDay c) m a }-  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b, MonadTrans, MonadTransControl)--instance MonadReader r m => MonadReader r (GammaLinearT c m) where-  ask = lift ask-  local f tma = liftWith $ \ run ->-    local f $ run tma--instance MonadBase IO m => MonadGamma (GammaLinearT (RGB Word8) m) where-  type GammaValue (GammaLinearT (RGB Word8) m) = RGB Word8-  gamma = calculateValue weightedAverageRGB . zonedTimeToLocalTime =<< liftBase getZonedTime--instance MonadBase IO m => MonadGamma (GammaLinearT Temperature m) where-  type GammaValue (GammaLinearT Temperature m) = Temperature-  gamma = calculateValue weightedAverageTemperature . zonedTimeToLocalTime =<< liftBase getZonedTime--instance (MonadBase IO m, MonadGamma (GammaLinearT c m)) => MonadGamma (GammaLinearT (WithBrightness c) m) where-  type GammaValue (GammaLinearT (WithBrightness c) m) = WithBrightness (GammaValue (GammaLinearT c m))-  -- TODO: It would be nice to use the same exact time for `color'` and `brightness'`.-  gamma = do-    color' <- withGammaLinearT color gamma-    brightness' <- withGammaLinearT brightness $ calculateValue weightedAverageBrightness . zonedTimeToLocalTime =<< liftBase getZonedTime-    return WithBrightness { brightness = brightness'-                          , color = color'-                          }--withGammaLinearT :: (c' -> c) -> GammaLinearT c m a -> GammaLinearT c' m a-withGammaLinearT f m = GammaLinearT $ withReaderT (fmap f) $ unGammaLinearT m--nextTimeValue :: M.Map TimeOfDay c -> LocalTime -> Maybe (LocalTime,c)-nextTimeValue m time = catchError (toLocalTimeToday <$> M.lookupGT (localTimeOfDay time) m) $-                     const (toLocalTimeTomorrow <$> M.lookupMin m)-  where toLocalTimeToday (tod,tc) = let t = LocalTime { localDay = localDay time-                                                      , localTimeOfDay = tod-                                                      }-                                     in (t,tc)-        toLocalTimeTomorrow x = let (t,tc) = toLocalTimeToday x-                                    t' = t { localDay = succ $ localDay t }-                                 in (t',tc)--prevTimeValue :: M.Map TimeOfDay c -> LocalTime -> Maybe (LocalTime,c)-prevTimeValue m time = catchError (toLocalTimeToday <$> M.lookupLE (localTimeOfDay time) m) $-                     const (toLocalTimeYesterday <$> M.lookupMax m)-  where toLocalTimeToday (tod,tc) = let t = LocalTime { localDay = localDay time-                                                      , localTimeOfDay = tod-                                                      }-                                     in (t,tc)-        toLocalTimeYesterday x = let (t,tc) = toLocalTimeToday x-                                     t' = t { localDay = pred $ localDay t }-                                  in (t',tc)--calculateValue :: Monad m-               => (Rational -> c -> c -> c)-               -> LocalTime -> GammaLinearT c m c-calculateValue weightedAverage time = do-  m <- GammaLinearT ask-  return . fromJust $ do-    (nextTime , nextValue) <- nextTimeValue m time-    (prevTime , prevValue) <- prevTimeValue m time-    let diffSeconds t1 t2 = nominalDiffTimeToSeconds $ t1 `diffLocalTime` t2-        timeFraction = toRational $ (time `diffSeconds` prevTime) / (nextTime `diffSeconds` prevTime)-    return $ weightedAverage timeFraction prevValue nextValue--weightedAverageRGB :: Rational -> RGB Word8 -> RGB Word8 -> RGB Word8-weightedAverageRGB w rgb1 rgb2 = RGB { red = f (red rgb1) (red rgb2)-                                     , green = f (green rgb1) (green rgb2)-                                     , blue = f (blue rgb1) (blue rgb2)-                                     }-  where f c1 c2 = round $ fromIntegral c1 + w * (fromIntegral c2 - fromIntegral c1)--weightedAverageTemperature :: Rational -> Temperature -> Temperature -> Temperature-weightedAverageTemperature w t1 t2 = fromRational $ toRational t1 + w * (toRational t2 - toRational t1)--weightedAverageBrightness :: Rational -> Brightness -> Brightness -> Brightness-weightedAverageBrightness w b1 b2 = fromRational $ toRational b1 + w * (toRational b2 - toRational b1)--runGammaLinearT' :: M.Map TimeOfDay c -> GammaLinearT c m a -> m a-runGammaLinearT' !rgbs tma = runReaderT (unGammaLinearT tma) rgbs--runGammaLinearT :: N.NonEmpty (TimeOfDay,c) -> GammaLinearT c m a -> m a-runGammaLinearT rgbs = runGammaLinearT' $ M.fromList . N.toList $ rgbs--newtype Hour = Hour { unHour :: F.Finite 24 }-  deriving (Bounded, Enum, Eq, Generic, Integral, Num, Ord, Read, Real, Show)--instance NFData Hour--newtype Minute = Minute { unMinute :: F.Finite 60 }-  deriving (Bounded, Enum, Eq, Generic, Integral, Num, Ord, Read, Real, Show)--instance NFData Minute--infix 7 :.-data Time = Hour :. Minute-  deriving (Bounded, Eq, Generic, Ord, Read, Show)--instance NFData Time--instance Enum Time where-  fromEnum (h :. m) = fromEnum h * succ (fromEnum $ maxBound @Minute) + fromEnum m-  toEnum i = let (h , m) = i `divMod` succ (fromEnum $ maxBound @Minute)-              in toEnum h :. toEnum m--infix 6 ==>-(==>) :: Time -> c -> (TimeOfDay,c)-(==>) (h :. m) c = (time,c)-  where time = TimeOfDay { todHour = fromIntegral h-                         , todMin = fromIntegral m-                         , todSec = 0-                         }
− src/Blucontrol/Gamma/Modifier.hs
@@ -1,29 +0,0 @@-{-# 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
src/Blucontrol/Main.hs view
@@ -6,12 +6,12 @@  import Control.Monad.Trans.Control -import Blucontrol.CompatibleValues import Blucontrol.Main.Control import Blucontrol.Main.CLI-import Blucontrol.Control-import Blucontrol.Gamma-import Blucontrol.Recolor+import Blucontrol.Monad.Control+import Blucontrol.Monad.Gamma+import Blucontrol.Monad.Recolor+import Blucontrol.Value  type BlucontrolConstraints m g r =   ( ControlConstraint m (StM g (StM r ()))
src/Blucontrol/Main/Control.hs view
@@ -7,9 +7,9 @@ import Control.Monad.Reader import Control.Monad.State.Strict -import Blucontrol.Control-import Blucontrol.Gamma-import Blucontrol.Recolor+import Blucontrol.Monad.Control+import Blucontrol.Monad.Gamma+import Blucontrol.Monad.Recolor  -- | Run the loop, using `gamma`, `recolor` and `doInbetween`. -- The arguments are the actual monad runners.
+ src/Blucontrol/Monad/Control.hs view
@@ -0,0 +1,25 @@+{-# LANGUAGE UndecidableInstances #-}++module Blucontrol.Monad.Control (+  MonadControl (..)+) where++import Control.Monad.Trans.Control+import Data.Kind++class MonadBaseControl IO m => MonadControl m where++  {- | Give a constraint to allow 'doInbetween' to handle a polymorphic argument.+    This is usfeul to allow arguments wrapped in monadic state 'StM' from running+    'Blucontrol.Gamma.MonadGamma' and 'Blucontrol.Recolor.MonadRecolor'.+  -}+  type ControlConstraint m a :: Constraint++  -- | This function will be called after recoloring the screen.+  doInbetween :: ControlConstraint m a+              => a -- ^ the returned value from the last call of 'Blucontrol.Recolor.recolor' including monadic state+              -> m () -- ^ the side effect to be run inbetween recoloring++instance MonadControl IO where+  type ControlConstraint IO _ = ()+  doInbetween _ = return ()
+ src/Blucontrol/Monad/Control/Concat.hs view
@@ -0,0 +1,40 @@+{-# LANGUAGE QuantifiedConstraints, UndecidableInstances #-}++module Blucontrol.Monad.Control.Concat (+  ControlConcatT+, runControlConcatT+, (!>)+) where++import Control.Monad.Base+import Control.Monad.Trans+import Control.Monad.Trans.Control+import Data.Kind++import Blucontrol.Monad.Control++newtype ControlConcatT (t1 :: (Type -> Type) -> Type -> Type) (t2 :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) a = ControlConcatT { unControlConcatT :: t2 (t1 m) a }+  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b)++instance (forall m. Monad m => Monad (t1 m), MonadTrans t1, MonadTrans t2) => MonadTrans (ControlConcatT t1 t2) where+  lift = ControlConcatT . lift . lift++instance (forall m. Monad m => Monad (t1 m), MonadTransControl t1, MonadTransControl t2) => MonadTransControl (ControlConcatT t1 t2) where+  type StT (ControlConcatT t1 t2) a = StT t1 (StT t2 a)+  liftWith inner = ControlConcatT $+    liftWith $ \ runT2 ->+      liftWith $ \ runT1 ->+        inner $ runT1 . runT2 . unControlConcatT+  restoreT = ControlConcatT . restoreT . restoreT++instance (MonadControl (t1 m), MonadControl (t2 (t1 m)), MonadTrans t2) => MonadControl (ControlConcatT t1 t2 m) where+  type ControlConstraint (ControlConcatT t1 t2 m) a = (ControlConstraint (t1 m) a, ControlConstraint (t2 (t1 m)) a)+  doInbetween a = do ControlConcatT . lift $ doInbetween a+                     ControlConcatT $ doInbetween a++runControlConcatT :: (t1 m a -> m a) -> (t2 (t1 m) a -> t1 m a) -> ControlConcatT t1 t2 m a -> m a+runControlConcatT runT1 runT2 = runT1 . runT2 . unControlConcatT++infixr 5 !>+(!>) :: (t1 m a -> m a) -> (t2 (t1 m) a -> t1 m a) -> (ControlConcatT t1 t2 m a -> m a)+(!>) = runControlConcatT
+ src/Blucontrol/Monad/Control/Count.hs view
@@ -0,0 +1,70 @@+{-# LANGUAGE UndecidableInstances #-}++module Blucontrol.Monad.Control.Count (+  ControlCountT+, runControlCountT+, ConfigCount (..)+, CountableException (..)+) where++import Control.DeepSeq+import Control.Monad.Base+import Control.Monad.Trans.Control+import Control.Monad.Reader+import Control.Monad.State.Strict+import Data.Default+import GHC.Generics+import Numeric.Natural++import Blucontrol.Monad.Control++newtype ControlCountT m a = ControlCountT { unControlCountT :: StateT Natural (ReaderT ConfigCount m) a }+  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b)++instance MonadTrans ControlCountT where+  lift = ControlCountT . lift . lift++instance MonadTransControl ControlCountT where+  type StT ControlCountT a = StT (ReaderT ConfigCount) (StT (StateT Natural) a)+  -- TODO: workaround for ghc-9.0.1+  --liftWith = defaultLiftWith2 ControlCountT unControlCountT+  liftWith f = ControlCountT $ liftWith $ \run -> liftWith $ \run' -> f $ run' . run . unControlCountT+  restoreT = defaultRestoreT2 ControlCountT++instance MonadBaseControl IO m => MonadControl (ControlCountT m) where+  type ControlConstraint (ControlCountT m) a = CountableException a+  doInbetween a = do if isException a+                        then ControlCountT $ modify succ+                        else ControlCountT $ put 0+                     current <- ControlCountT get+                     limit <- ControlCountT . lift $ reader maxCount+                     if current >= limit+                        then error $ "failed after " <> show limit <> " consecutive tries"+                        else return ()++runControlCountT :: Monad m => ConfigCount -> ControlCountT m a -> m a+runControlCountT !conf tma = runReaderT (evalStateT (unControlCountT tma) 0) conf++newtype ConfigCount = ConfigCount { maxCount :: Natural+                                  }+  deriving (Eq, Generic, Ord, Read, Show)++instance NFData ConfigCount++instance Default ConfigCount where+  def = ConfigCount { maxCount = 5+                    }++class CountableException a where+  isException :: a -> Bool++instance CountableException () where+  isException () = False++instance CountableException a => CountableException (Maybe a) where+  isException Nothing = True+  isException (Just a) = isException a++instance CountableException a => CountableException (Either b a) where+  isException (Left _) = True+  isException (Right a) = isException a
+ src/Blucontrol/Monad/Control/Print.hs view
@@ -0,0 +1,30 @@+{-# LANGUAGE UndecidableInstances #-}++module Blucontrol.Monad.Control.Print (+  ControlPrintT+, runControlPrintT+) where++import Control.Monad.Base+import Control.Monad.Trans+import Control.Monad.Trans.Control++import Blucontrol.Monad.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 MonadBaseControl IO m => MonadControl (ControlPrintT m) where+  type ControlConstraint (ControlPrintT m) a = Show a+  doInbetween a = liftBase $ print a++runControlPrintT :: ControlPrintT m a -> m a+runControlPrintT = unControlPrintT
+ src/Blucontrol/Monad/Control/Wait.hs view
@@ -0,0 +1,40 @@+{-# LANGUAGE UndecidableInstances #-}++module Blucontrol.Monad.Control.Wait (+  ControlWaitT+, runControlWaitT+, ConfigWait (..)+, Microseconds+) where++import Control.Concurrent (threadDelay)+import Control.DeepSeq+import Control.Monad.Base+import Control.Monad.Trans.Control+import Control.Monad.Reader+import Data.Default+import GHC.Generics++import Blucontrol.Monad.Control++newtype ControlWaitT m a = ControlWaitT { unControlWaitT :: ReaderT ConfigWait m a }+  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b, MonadTrans, MonadTransControl)++instance MonadBaseControl IO m => MonadControl (ControlWaitT m) where+  type ControlConstraint (ControlWaitT m) _ = ()+  doInbetween _ = liftBase . threadDelay . interval =<< ControlWaitT ask++runControlWaitT :: ConfigWait -> ControlWaitT m a -> m a+runControlWaitT !conf tma = runReaderT (unControlWaitT tma) conf++newtype ConfigWait = ConfigWait { interval :: Microseconds+                                }+  deriving (Eq, Generic, Ord, Read, Show)++instance NFData ConfigWait++instance Default ConfigWait where+  def = ConfigWait { interval = 1000000+                   }++type Microseconds = Int
+ src/Blucontrol/Monad/Gamma.hs view
@@ -0,0 +1,13 @@+module Blucontrol.Monad.Gamma (+  MonadGamma (..)+) where++class Monad m => MonadGamma m where++  type GammaValue m++  {- | Calculate a gamma value.+     This is a monadic function, to allow the value to be dependent on side effects like time and+     location.+  -}+  gamma :: m (GammaValue m)
+ src/Blucontrol/Monad/Gamma/Const.hs view
@@ -0,0 +1,28 @@+{-# LANGUAGE UndecidableInstances #-}++module Blucontrol.Monad.Gamma.Const (+  GammaConstT+, runGammaConstT+) where++import Control.Monad.Base+import Control.Monad.Trans+import Control.Monad.Trans.Control+import Control.Monad.Reader++import Blucontrol.Monad.Gamma++newtype GammaConstT c m a = GammaConstT { unGammaConstT :: ReaderT c m a }+  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b, MonadTrans, MonadTransControl)++instance MonadReader r m => MonadReader r (GammaConstT c m) where+  ask = lift ask+  local f tma = liftWith $ \ run ->+    local f $ run tma++instance Monad m => MonadGamma (GammaConstT c m) where+  type GammaValue (GammaConstT c m) = c+  gamma = GammaConstT ask++runGammaConstT :: c -> GammaConstT c m a -> m a+runGammaConstT !rgb tma = runReaderT (unGammaConstT tma) rgb
+ src/Blucontrol/Monad/Gamma/Linear.hs view
@@ -0,0 +1,142 @@+{-# LANGUAGE UndecidableInstances #-}++module Blucontrol.Monad.Gamma.Linear (+  GammaLinearT+, runGammaLinearT+, Time (..)+, Hour+, Minute+, (==>)+, N.NonEmpty (..) -- TODO: keep here?+, calculateValue -- TODO: export for testing+, weightedAverageRGB -- TODO: export for testing+) where++import Control.DeepSeq+import Control.Monad.Base+import Control.Monad.Except+import Control.Monad.Reader+import Control.Monad.Trans.Control+import qualified Data.Finite as F+import qualified Data.List.NonEmpty as N+import qualified Data.Map as M+import Data.Maybe (fromJust)+import Data.Time+import Data.Word+import GHC.Generics++import Blucontrol.Monad.Gamma+import Blucontrol.Value.Brightness+import Blucontrol.Value.RGB+import Blucontrol.Value.RGB.Temperature++newtype GammaLinearT c m a = GammaLinearT { unGammaLinearT :: ReaderT (M.Map TimeOfDay c) m a }+  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b, MonadTrans, MonadTransControl)++instance MonadReader r m => MonadReader r (GammaLinearT c m) where+  ask = lift ask+  local f tma = liftWith $ \ run ->+    local f $ run tma++instance MonadBase IO m => MonadGamma (GammaLinearT (RGB Word8) m) where+  type GammaValue (GammaLinearT (RGB Word8) m) = RGB Word8+  gamma = calculateValue weightedAverageRGB . zonedTimeToLocalTime =<< liftBase getZonedTime++instance MonadBase IO m => MonadGamma (GammaLinearT Temperature m) where+  type GammaValue (GammaLinearT Temperature m) = Temperature+  gamma = calculateValue weightedAverageTemperature . zonedTimeToLocalTime =<< liftBase getZonedTime++instance (MonadBase IO m, MonadGamma (GammaLinearT c m)) => MonadGamma (GammaLinearT (WithBrightness c) m) where+  type GammaValue (GammaLinearT (WithBrightness c) m) = WithBrightness (GammaValue (GammaLinearT c m))+  -- TODO: It would be nice to use the same exact time for `color'` and `brightness'`.+  gamma = do+    color' <- withGammaLinearT color gamma+    brightness' <- withGammaLinearT brightness $ calculateValue weightedAverageBrightness . zonedTimeToLocalTime =<< liftBase getZonedTime+    return WithBrightness { brightness = brightness'+                          , color = color'+                          }++withGammaLinearT :: (c' -> c) -> GammaLinearT c m a -> GammaLinearT c' m a+withGammaLinearT f m = GammaLinearT $ withReaderT (fmap f) $ unGammaLinearT m++nextTimeValue :: M.Map TimeOfDay c -> LocalTime -> Maybe (LocalTime,c)+nextTimeValue m time = catchError (toLocalTimeToday <$> M.lookupGT (localTimeOfDay time) m) $+                     const (toLocalTimeTomorrow <$> M.lookupMin m)+  where toLocalTimeToday (tod,tc) = let t = LocalTime { localDay = localDay time+                                                      , localTimeOfDay = tod+                                                      }+                                     in (t,tc)+        toLocalTimeTomorrow x = let (t,tc) = toLocalTimeToday x+                                    t' = t { localDay = succ $ localDay t }+                                 in (t',tc)++prevTimeValue :: M.Map TimeOfDay c -> LocalTime -> Maybe (LocalTime,c)+prevTimeValue m time = catchError (toLocalTimeToday <$> M.lookupLE (localTimeOfDay time) m) $+                     const (toLocalTimeYesterday <$> M.lookupMax m)+  where toLocalTimeToday (tod,tc) = let t = LocalTime { localDay = localDay time+                                                      , localTimeOfDay = tod+                                                      }+                                     in (t,tc)+        toLocalTimeYesterday x = let (t,tc) = toLocalTimeToday x+                                     t' = t { localDay = pred $ localDay t }+                                  in (t',tc)++calculateValue :: Monad m+               => (Rational -> c -> c -> c)+               -> LocalTime -> GammaLinearT c m c+calculateValue weightedAverage time = do+  m <- GammaLinearT ask+  return . fromJust $ do+    (nextTime , nextValue) <- nextTimeValue m time+    (prevTime , prevValue) <- prevTimeValue m time+    let diffSeconds t1 t2 = nominalDiffTimeToSeconds $ t1 `diffLocalTime` t2+        timeFraction = toRational $ (time `diffSeconds` prevTime) / (nextTime `diffSeconds` prevTime)+    return $ weightedAverage timeFraction prevValue nextValue++weightedAverageRGB :: Rational -> RGB Word8 -> RGB Word8 -> RGB Word8+weightedAverageRGB w rgb1 rgb2 = RGB { red = f (red rgb1) (red rgb2)+                                     , green = f (green rgb1) (green rgb2)+                                     , blue = f (blue rgb1) (blue rgb2)+                                     }+  where f c1 c2 = round $ fromIntegral c1 + w * (fromIntegral c2 - fromIntegral c1)++weightedAverageTemperature :: Rational -> Temperature -> Temperature -> Temperature+weightedAverageTemperature w t1 t2 = fromRational $ toRational t1 + w * (toRational t2 - toRational t1)++weightedAverageBrightness :: Rational -> Brightness -> Brightness -> Brightness+weightedAverageBrightness w b1 b2 = fromRational $ toRational b1 + w * (toRational b2 - toRational b1)++runGammaLinearT' :: M.Map TimeOfDay c -> GammaLinearT c m a -> m a+runGammaLinearT' !rgbs tma = runReaderT (unGammaLinearT tma) rgbs++runGammaLinearT :: N.NonEmpty (TimeOfDay,c) -> GammaLinearT c m a -> m a+runGammaLinearT rgbs = runGammaLinearT' $ M.fromList . N.toList $ rgbs++newtype Hour = Hour { unHour :: F.Finite 24 }+  deriving (Bounded, Enum, Eq, Generic, Integral, Num, Ord, Read, Real, Show)++instance NFData Hour++newtype Minute = Minute { unMinute :: F.Finite 60 }+  deriving (Bounded, Enum, Eq, Generic, Integral, Num, Ord, Read, Real, Show)++instance NFData Minute++infix 7 :.+data Time = Hour :. Minute+  deriving (Bounded, Eq, Generic, Ord, Read, Show)++instance NFData Time++instance Enum Time where+  fromEnum (h :. m) = fromEnum h * succ (fromEnum $ maxBound @Minute) + fromEnum m+  toEnum i = let (h , m) = i `divMod` succ (fromEnum $ maxBound @Minute)+              in toEnum h :. toEnum m++infix 6 ==>+(==>) :: Time -> c -> (TimeOfDay,c)+(==>) (h :. m) c = (time,c)+  where time = TimeOfDay { todHour = fromIntegral h+                         , todMin = fromIntegral m+                         , todSec = 0+                         }
+ src/Blucontrol/Monad/Gamma/Modifier.hs view
@@ -0,0 +1,29 @@+{-# LANGUAGE UndecidableInstances #-}++module Blucontrol.Monad.Gamma.Modifier (+  GammaModifierT+, runGammaModifierT+) where++import Control.Monad.Base+import Control.Monad.Except+import Control.Monad.Reader+import Control.Monad.Trans.Control++import Blucontrol.Monad.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
+ src/Blucontrol/Monad/Recolor.hs view
@@ -0,0 +1,13 @@+module Blucontrol.Monad.Recolor (+  MonadRecolor (..)+) where++class Monad m => MonadRecolor m where++  type RecolorValue m++  {- | Apply a gamma value.+     This is a monadic function, to allow application to external programs like an X display+     server.+  -}+  recolor :: RecolorValue m -> m ()
+ src/Blucontrol/Monad/Recolor/Print.hs view
@@ -0,0 +1,30 @@+{-# LANGUAGE UndecidableInstances #-}++module Blucontrol.Monad.Recolor.Print (+  RecolorPrintT+, runRecolorPrintT+) where++import Control.Monad.Base+import Control.Monad.Trans+import Control.Monad.Trans.Control++import Blucontrol.Monad.Recolor++newtype RecolorPrintT c m a = RecolorPrintT { unRecolorPrintT :: m a }+  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b)++instance MonadTrans (RecolorPrintT c) where+  lift = RecolorPrintT++instance MonadTransControl (RecolorPrintT c) where+  type StT (RecolorPrintT c) a = a+  liftWith inner = RecolorPrintT $ inner unRecolorPrintT+  restoreT = RecolorPrintT++instance (MonadBaseControl IO m, Show c) => MonadRecolor (RecolorPrintT c m) where+  type RecolorValue (RecolorPrintT c m) = c+  recolor = liftBase . print++runRecolorPrintT :: RecolorPrintT c m a -> m a+runRecolorPrintT = unRecolorPrintT
+ src/Blucontrol/Monad/Recolor/X.hs view
@@ -0,0 +1,96 @@+{-# LANGUAGE RecordWildCards, UndecidableInstances #-}++module Blucontrol.Monad.Recolor.X (+  RecolorXT+, runRecolorXTIO+, ConfigX (..)+, XError (..)+) where++import Control.DeepSeq+import Control.Exception.Lifted (SomeException (..), bracket, catch)+import Control.Monad.Base+import Control.Monad.Trans.Control+import Control.Monad.Reader+import Control.Monad.Except+import Data.Default+import Data.Maybe (fromMaybe)+import qualified Data.Text as T+import GHC.Generics++import Graphics.X11.Xlib.Display (closeDisplay, defaultScreen, openDisplay, rootWindow)+import Graphics.X11.Xlib.Types (Display)++import Blucontrol.Monad.Recolor+import Blucontrol.Monad.Recolor.X.Internal+import Blucontrol.Value.RGB++newtype RecolorXT m a = RecolorXT { unRecolorXT :: ExceptT XError (ReaderT Display m) a }+  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b, MonadError XError)++instance MonadTrans RecolorXT where+  lift = RecolorXT . lift . lift++instance MonadTransControl RecolorXT where+  type StT RecolorXT a = StT (ReaderT Display) (StT (ExceptT XError) a)+  -- TODO: broken by ghc-9.0.1+  -- liftWith = defaultLiftWith2 RecolorXT unRecolorXT+  liftWith f = RecolorXT $ liftWith $ \run -> liftWith $ \run' -> f $ run' . run . unRecolorXT+  restoreT = defaultRestoreT2 RecolorXT++instance MonadBaseControl IO m => MonadRecolor (RecolorXT m) where+  type RecolorValue (RecolorXT m) = RGB Float+  recolor rgb = do+    display <- RecolorXT ask+    root <- liftXIO XErrorRead $+      rootWindow display $ defaultScreen display++    liftXIO XErrorSetGamma $ xrrSetGamma (translateRGB rgb) display root++runRecolorXT :: Display -> RecolorXT m a -> m (Either XError a)+runRecolorXT display tma = runReaderT (runExceptT (unRecolorXT tma)) display++data ConfigX = ConfigX { hostName :: Maybe T.Text+                       , displayServer :: Int+                       , screen :: Maybe Int+                       }+  deriving (Eq, Generic, Ord, Read, Show)++instance NFData ConfigX++instance Default ConfigX where+  def = ConfigX { hostName = Nothing+                , displayServer = 0+                , screen = Nothing+                }++data XError = XErrorCloseDisplay+            | XErrorOpenDisplay+            | XErrorRead+            | XErrorSetGamma+  deriving (Bounded, Enum, Eq, Generic, Ord, Read, Show)++instance NFData XError++liftXIO :: (MonadBaseControl IO m, MonadError XError m) => XError -> IO a -> m a+liftXIO xError = flip catch throwXError . liftBase+  where throwXError (SomeException _) = throwError xError++runRecolorXTIO :: MonadBaseControl IO m => ConfigX -> RecolorXT m a -> m (Either XError a)+runRecolorXTIO !conf tma = runExceptT $ bracket open close run+  where open = liftXIO XErrorOpenDisplay $ openDisplay $ showDisplay conf+        close display = liftXIO XErrorCloseDisplay $ closeDisplay display+        run display = restoreT $ runRecolorXT display tma++showDisplay :: ConfigX -> String+showDisplay ConfigX {..} = T.unpack . T.concat $+  [ fromMaybe "" hostName+  , ":" <> T.pack (show displayServer)+  , maybe "" (("." <>) . T.pack . show) screen+  ]++translateRGB :: RGB Float -> XRRGamma+translateRGB RGB {..} = XRRGamma {..}+  where xrr_gamma_red = red+        xrr_gamma_green = green+        xrr_gamma_blue = blue
+ src/Blucontrol/Monad/Recolor/X/Internal.hs view
@@ -0,0 +1,29 @@+{-# LANGUAGE ForeignFunctionInterface, RecordWildCards #-}++module Blucontrol.Monad.Recolor.X.Internal (+  XRRGamma (..)+, xrrSetGamma+) where++import Control.DeepSeq+import Foreign.Ptr+import GHC.Generics++import Graphics.X11.Types+import Graphics.X11.Xlib.Types++data XRRGamma = XRRGamma { xrr_gamma_red :: Float+                         , xrr_gamma_green :: Float+                         , xrr_gamma_blue :: Float+                         }+  deriving (Eq, Generic, Ord, Read, Show)++instance NFData XRRGamma++xrrSetGamma :: XRRGamma -> Display -> Window -> IO ()+xrrSetGamma XRRGamma {..} (Display display) window = do+  res <- _XRRGetScreenResourcesCurrent display window+  _setGamma xrr_gamma_red xrr_gamma_green xrr_gamma_blue res display++foreign import ccall "XrandrGamma.h setGamma" _setGamma :: Float -> Float -> Float -> Ptr Int -> Ptr Display -> IO ()+foreign import ccall "<X11/extensions/Xrandr.h> XRRGetScreenResourcesCurrent" _XRRGetScreenResourcesCurrent :: Ptr Display -> Window -> IO (Ptr Int)
− src/Blucontrol/RGB.hs
@@ -1,52 +0,0 @@-{-# LANGUAGE ScopedTypeVariables #-}--module Blucontrol.RGB (-  RGB (..)-) where--import Control.DeepSeq-import Data.Default-import Data.Word-import GHC.Generics--import Blucontrol.CompatibleValues---- | Values for the colors 'red', 'green' and 'blue'-data RGB a = RGB { red :: a-                 , green :: a-                 , blue :: a-                 }-  deriving (Bounded, Eq, Generic, Ord, Read, Show)--instance NFData a => NFData (RGB a)---- TODO: Is this instance really necessary?-instance (Bounded a, Enum a) => Enum (RGB a) where-  fromEnum rgb = sum [ fromEnum (red rgb)-                     , fromEnum (green rgb) * range-                     , fromEnum (blue rgb) * range * range-                     ]-    where range = succ . fromEnum $ maxBound @a-  toEnum i = let (b , i') = i `divMod` (range * range)-                 (g , r) = i' `divMod` range-              in RGB { red = toEnum r-                     , green = toEnum g-                     , blue = toEnum b-                     }-    where range = succ . fromEnum $ maxBound @a--instance Default (RGB Word8) where-  def = RGB { red = maxBound-            , green = maxBound-            , blue = maxBound-            }--mapRGB :: (a -> b) -> RGB a -> RGB b-mapRGB f rgb = RGB { red = f $ red rgb-                   , green = f $ green rgb-                   , blue = f $ blue rgb-                   }--instance CompatibleValues (RGB Word8) (RGB Float) where-  convertValue = mapRGB word8ToFloat-    where word8ToFloat = (/ fromIntegral (maxBound @Word8)) . fromIntegral
− src/Blucontrol/RGB/Brightness.hs
@@ -1,38 +0,0 @@-module Blucontrol.RGB.Brightness (-  Brightness-, WithBrightness (..)-) where--import Control.DeepSeq-import Data.Default-import GHC.Generics---- | Arbitrary precision brightness between 0 and 1-newtype Brightness = Brightness Rational-  deriving (Enum, Eq, Fractional, Generic, Num, Ord, Read, Real, RealFrac, Show)--instance NFData Brightness--instance Bounded Brightness where-  minBound = 0-  maxBound = 1--instance Default Brightness where-  def = 1---- | Combination of a color value and a 'Brightness'-data WithBrightness a = WithBrightness { brightness :: Brightness-                                       , color :: a-                                       }-  deriving (Eq, Generic, Ord, Read, Show)--instance NFData a => NFData (WithBrightness a)--instance Default a => Default (WithBrightness a) where-  def = WithBrightness { brightness = def-                       , color = def-                       }---- TODO: Maybe allow applying to RGB?---toRGB WithBrightness {..} = mapRGB applyBrightness $ toRGB rgb---  where applyBrightness = truncate . (toRational brightness *) . toRational
− src/Blucontrol/RGB/Temperature.hs
@@ -1,51 +0,0 @@-{-# LANGUAGE RecordWildCards, UndecidableInstances #-}--module Blucontrol.RGB.Temperature (-  Temperature-) where--import Control.DeepSeq-import Data.Default-import Data.Word-import GHC.Generics--import Blucontrol.CompatibleValues-import Blucontrol.RGB---- | Arbitrary precision temperature in Kelvin-newtype Temperature = Temperature Rational-  deriving (Enum, Eq, Fractional, Generic, Num, Ord, Read, Real, RealFrac, Show)--instance NFData Temperature--instance Bounded Temperature where-  minBound = 0-  maxBound = 20000--instance Default Temperature where-  def = 6600--instance CompatibleValues (RGB Word8) a => CompatibleValues Temperature a where-  -- TODO: Test and implement more accurately. Currently based on blugon.-  convertValue = convertValue . toRGBWord8-    where toRGBWord8 :: Temperature -> RGB Word8-          toRGBWord8 (Temperature temp) = RGB {..}-            where red = round . inBounds $-                    if t <= 66-                       then 255-                       else 329.698727446 * ((t - 60) ** (-0.1332047592))-                  green = round . inBounds $-                    if t <= 66-                       then 99.4708025861 * log t - 161.1195681661-                       else 288.1221695283 * ((t - 60) ** (-0.0755148492))-                  blue = round . inBounds $-                    if t <= 0-                       then 0-                       else if t >= 66-                               then 255-                               else 138.5177312231 * log (t - 10) - 305.0447927307-                  t = fromRational $ temp / 100 :: Double-                  inBounds x-                    | x < 0 = 0-                    | x > 255 = 255-                    | otherwise = x
− src/Blucontrol/Recolor.hs
@@ -1,13 +0,0 @@-module Blucontrol.Recolor (-  MonadRecolor (..)-) where--class Monad m => MonadRecolor m where--  type RecolorValue m--  {- | Apply a gamma value.-     This is a monadic function, to allow application to external programs like an X display-     server.-  -}-  recolor :: RecolorValue m -> m ()
− src/Blucontrol/Recolor/Print.hs
@@ -1,30 +0,0 @@-{-# LANGUAGE UndecidableInstances #-}--module Blucontrol.Recolor.Print (-  RecolorPrintT-, runRecolorPrintT-) where--import Control.Monad.Base-import Control.Monad.Trans-import Control.Monad.Trans.Control--import Blucontrol.Recolor--newtype RecolorPrintT c m a = RecolorPrintT { unRecolorPrintT :: m a }-  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b)--instance MonadTrans (RecolorPrintT c) where-  lift = RecolorPrintT--instance MonadTransControl (RecolorPrintT c) where-  type StT (RecolorPrintT c) a = a-  liftWith inner = RecolorPrintT $ inner unRecolorPrintT-  restoreT = RecolorPrintT--instance (MonadBaseControl IO m, Show c) => MonadRecolor (RecolorPrintT c m) where-  type RecolorValue (RecolorPrintT c m) = c-  recolor = liftBase . print--runRecolorPrintT :: RecolorPrintT c m a -> m a-runRecolorPrintT = unRecolorPrintT
− src/Blucontrol/Recolor/X.hs
@@ -1,96 +0,0 @@-{-# LANGUAGE RecordWildCards, UndecidableInstances #-}--module Blucontrol.Recolor.X (-  RecolorXT-, runRecolorXTIO-, ConfigX (..)-, XError (..)-) where--import Control.DeepSeq-import Control.Exception.Lifted (SomeException (..), bracket, catch)-import Control.Monad.Base-import Control.Monad.Trans.Control-import Control.Monad.Reader-import Control.Monad.Except-import Data.Default-import Data.Maybe (fromMaybe)-import qualified Data.Text as T-import GHC.Generics--import Graphics.X11.Xlib.Display (closeDisplay, defaultScreen, openDisplay, rootWindow)-import Graphics.X11.Xlib.Types (Display)--import Blucontrol.RGB-import Blucontrol.Recolor-import Blucontrol.Recolor.X.Internal--newtype RecolorXT m a = RecolorXT { unRecolorXT :: ExceptT XError (ReaderT Display m) a }-  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b, MonadError XError)--instance MonadTrans RecolorXT where-  lift = RecolorXT . lift . lift--instance MonadTransControl RecolorXT where-  type StT RecolorXT a = StT (ReaderT Display) (StT (ExceptT XError) a)-  -- TODO: broken by ghc-9.0.1-  -- liftWith = defaultLiftWith2 RecolorXT unRecolorXT-  liftWith f = RecolorXT $ liftWith $ \run -> liftWith $ \run' -> f $ run' . run . unRecolorXT-  restoreT = defaultRestoreT2 RecolorXT--instance MonadBaseControl IO m => MonadRecolor (RecolorXT m) where-  type RecolorValue (RecolorXT m) = RGB Float-  recolor rgb = do-    display <- RecolorXT ask-    root <- liftXIO XErrorRead $-      rootWindow display $ defaultScreen display--    liftXIO XErrorSetGamma $ xrrSetGamma (translateRGB rgb) display root--runRecolorXT :: Display -> RecolorXT m a -> m (Either XError a)-runRecolorXT display tma = runReaderT (runExceptT (unRecolorXT tma)) display--data ConfigX = ConfigX { hostName :: Maybe T.Text-                       , displayServer :: Int-                       , screen :: Maybe Int-                       }-  deriving (Eq, Generic, Ord, Read, Show)--instance NFData ConfigX--instance Default ConfigX where-  def = ConfigX { hostName = Nothing-                , displayServer = 0-                , screen = Nothing-                }--data XError = XErrorCloseDisplay-            | XErrorOpenDisplay-            | XErrorRead-            | XErrorSetGamma-  deriving (Bounded, Enum, Eq, Generic, Ord, Read, Show)--instance NFData XError--liftXIO :: (MonadBaseControl IO m, MonadError XError m) => XError -> IO a -> m a-liftXIO xError = flip catch throwXError . liftBase-  where throwXError (SomeException _) = throwError xError--runRecolorXTIO :: MonadBaseControl IO m => ConfigX -> RecolorXT m a -> m (Either XError a)-runRecolorXTIO !conf tma = runExceptT $ bracket open close run-  where open = liftXIO XErrorOpenDisplay $ openDisplay $ showDisplay conf-        close display = liftXIO XErrorCloseDisplay $ closeDisplay display-        run display = restoreT $ runRecolorXT display tma--showDisplay :: ConfigX -> String-showDisplay ConfigX {..} = T.unpack . T.concat $-  [ fromMaybe "" hostName-  , ":" <> T.pack (show displayServer)-  , maybe "" (("." <>) . T.pack . show) screen-  ]--translateRGB :: RGB Float -> XRRGamma-translateRGB RGB {..} = XRRGamma {..}-  where xrr_gamma_red = red-        xrr_gamma_green = green-        xrr_gamma_blue = blue
− src/Blucontrol/Recolor/X/Internal.hs
@@ -1,29 +0,0 @@-{-# LANGUAGE ForeignFunctionInterface, RecordWildCards #-}--module Blucontrol.Recolor.X.Internal (-  XRRGamma (..)-, xrrSetGamma-) where--import Control.DeepSeq-import Foreign.Ptr-import GHC.Generics--import Graphics.X11.Types-import Graphics.X11.Xlib.Types--data XRRGamma = XRRGamma { xrr_gamma_red :: Float-                         , xrr_gamma_green :: Float-                         , xrr_gamma_blue :: Float-                         }-  deriving (Eq, Generic, Ord, Read, Show)--instance NFData XRRGamma--xrrSetGamma :: XRRGamma -> Display -> Window -> IO ()-xrrSetGamma XRRGamma {..} (Display display) window = do-  res <- _XRRGetScreenResourcesCurrent display window-  _setGamma xrr_gamma_red xrr_gamma_green xrr_gamma_blue res display--foreign import ccall "XrandrGamma.h setGamma" _setGamma :: Float -> Float -> Float -> Ptr Int -> Ptr Display -> IO ()-foreign import ccall "<X11/extensions/Xrandr.h> XRRGetScreenResourcesCurrent" _XRRGetScreenResourcesCurrent :: Ptr Display -> Window -> IO (Ptr Int)
+ src/Blucontrol/Value.hs view
@@ -0,0 +1,9 @@+module Blucontrol.Value (+  CompatibleValues (..)+) where++class CompatibleValues a b where+    convertValue :: a -> b++instance CompatibleValues a a where+  convertValue = id
+ src/Blucontrol/Value/Brightness.hs view
@@ -0,0 +1,38 @@+module Blucontrol.Value.Brightness (+  Brightness+, WithBrightness (..)+) where++import Control.DeepSeq+import Data.Default+import GHC.Generics++-- | Arbitrary precision brightness between 0 and 1+newtype Brightness = Brightness Rational+  deriving (Enum, Eq, Fractional, Generic, Num, Ord, Read, Real, RealFrac, Show)++instance NFData Brightness++instance Bounded Brightness where+  minBound = 0+  maxBound = 1++instance Default Brightness where+  def = 1++-- | Combination of a color value and a 'Brightness'+data WithBrightness a = WithBrightness { brightness :: Brightness+                                       , color :: a+                                       }+  deriving (Eq, Generic, Ord, Read, Show)++instance NFData a => NFData (WithBrightness a)++instance Default a => Default (WithBrightness a) where+  def = WithBrightness { brightness = def+                       , color = def+                       }++-- TODO: Maybe allow applying to RGB?+--toRGB WithBrightness {..} = mapRGB applyBrightness $ toRGB rgb+--  where applyBrightness = truncate . (toRational brightness *) . toRational
+ src/Blucontrol/Value/RGB.hs view
@@ -0,0 +1,52 @@+{-# LANGUAGE ScopedTypeVariables #-}++module Blucontrol.Value.RGB (+  RGB (..)+) where++import Control.DeepSeq+import Data.Default+import Data.Word+import GHC.Generics++import Blucontrol.Value++-- | Values for the colors 'red', 'green' and 'blue'+data RGB a = RGB { red :: a+                 , green :: a+                 , blue :: a+                 }+  deriving (Bounded, Eq, Generic, Ord, Read, Show)++instance NFData a => NFData (RGB a)++-- TODO: Is this instance really necessary?+instance (Bounded a, Enum a) => Enum (RGB a) where+  fromEnum rgb = sum [ fromEnum (red rgb)+                     , fromEnum (green rgb) * range+                     , fromEnum (blue rgb) * range * range+                     ]+    where range = succ . fromEnum $ maxBound @a+  toEnum i = let (b , i') = i `divMod` (range * range)+                 (g , r) = i' `divMod` range+              in RGB { red = toEnum r+                     , green = toEnum g+                     , blue = toEnum b+                     }+    where range = succ . fromEnum $ maxBound @a++instance Default (RGB Word8) where+  def = RGB { red = maxBound+            , green = maxBound+            , blue = maxBound+            }++mapRGB :: (a -> b) -> RGB a -> RGB b+mapRGB f rgb = RGB { red = f $ red rgb+                   , green = f $ green rgb+                   , blue = f $ blue rgb+                   }++instance CompatibleValues (RGB Word8) (RGB Float) where+  convertValue = mapRGB word8ToFloat+    where word8ToFloat = (/ fromIntegral (maxBound @Word8)) . fromIntegral
+ src/Blucontrol/Value/RGB/Temperature.hs view
@@ -0,0 +1,51 @@+{-# LANGUAGE RecordWildCards, UndecidableInstances #-}++module Blucontrol.Value.RGB.Temperature (+  Temperature+) where++import Control.DeepSeq+import Data.Default+import Data.Word+import GHC.Generics++import Blucontrol.Value+import Blucontrol.Value.RGB++-- | Arbitrary precision temperature in Kelvin+newtype Temperature = Temperature Rational+  deriving (Enum, Eq, Fractional, Generic, Num, Ord, Read, Real, RealFrac, Show)++instance NFData Temperature++instance Bounded Temperature where+  minBound = 0+  maxBound = 20000++instance Default Temperature where+  def = 6600++instance CompatibleValues (RGB Word8) a => CompatibleValues Temperature a where+  -- TODO: Test and implement more accurately. Currently based on blugon.+  convertValue = convertValue . toRGBWord8+    where toRGBWord8 :: Temperature -> RGB Word8+          toRGBWord8 (Temperature temp) = RGB {..}+            where red = round . inBounds $+                    if t <= 66+                       then 255+                       else 329.698727446 * ((t - 60) ** (-0.1332047592))+                  green = round . inBounds $+                    if t <= 66+                       then 99.4708025861 * log t - 161.1195681661+                       else 288.1221695283 * ((t - 60) ** (-0.0755148492))+                  blue = round . inBounds $+                    if t <= 0+                       then 0+                       else if t >= 66+                               then 255+                               else 138.5177312231 * log (t - 10) - 305.0447927307+                  t = fromRational $ temp / 100 :: Double+                  inBounds x+                    | x < 0 = 0+                    | x > 255 = 255+                    | otherwise = x
test/Blucontrol.hs view
@@ -2,10 +2,10 @@  import Test.Hspec -import qualified Blucontrol.Test.Gamma.Linear-import qualified Blucontrol.Test.RGB+import qualified Blucontrol.Monad.Gamma.Linear.Test+import qualified Blucontrol.Value.RGB.Test  main :: IO () main = hspec $ do-  Blucontrol.Test.RGB.test-  Blucontrol.Test.Gamma.Linear.test+  Blucontrol.Value.RGB.Test.test+  Blucontrol.Monad.Gamma.Linear.Test.test
+ test/Blucontrol/Monad/Gamma/Linear/Test.hs view
@@ -0,0 +1,67 @@+{-# LANGUAGE RecordWildCards #-}++module Blucontrol.Monad.Gamma.Linear.Test (+  test+) where++import Test.Hspec+import Test.QuickCheck++import Control.DeepSeq+import Control.Monad.Identity+import Data.Time+import Data.Word+import GHC.Generics++import Blucontrol.Monad.Gamma.Linear+import Blucontrol.Value.RGB+import Blucontrol.Value.RGB.Test (Arbitrary_RGBWord8 (..))++test :: Spec+test = describe "Blucontrol.Gamma.Linear" $ do++  it "convert Time to TimeOfDay" $+    property prop_timeToTimeOfDay++  -- TODO: this tests `calculateValue weightedAverageRGB`+  it "calculateRGB between surrounding values" $+    property prop_calculateRGB++newtype Arbitrary_Time = Arbitrary_Time Time+  deriving (Bounded, Enum, Eq, Generic, Ord, Read, Show)++instance NFData Arbitrary_Time++instance Arbitrary Arbitrary_Time where+  arbitrary = elements [minBound .. maxBound]++prop_timeToTimeOfDay :: Arbitrary_Time -> Bool+prop_timeToTimeOfDay (Arbitrary_Time time) = and+  [ fromIntegral h == todHour+  , fromIntegral m == todMin+  , 0 == todSec+  ]+  where h :. m = time+        TimeOfDay {..} = fst $ time Blucontrol.Monad.Gamma.Linear.==> (undefined :: RGB Word8)++prop_calculateRGB :: Arbitrary_Time+                  -> (Arbitrary_Time,Arbitrary_RGBWord8)+                  -> (Arbitrary_Time,Arbitrary_RGBWord8)+                  -> Bool+prop_calculateRGB (Arbitrary_Time time) (Arbitrary_Time xt , Arbitrary_RGBWord8 xtc) (Arbitrary_Time yt , Arbitrary_RGBWord8 ytc) =+  rgb `prop_RGBBetween` (xtc , ytc)+  where rgb = runIdentity . runGammaLinearT rgbMap $ calculateValue weightedAverageRGB tod+        rgbMap = xt Blucontrol.Monad.Gamma.Linear.==> xtc+            :| [ yt Blucontrol.Monad.Gamma.Linear.==> ytc+               ]+        tod = LocalTime (ModifiedJulianDay 0) . fst $ time Blucontrol.Monad.Gamma.Linear.==> (undefined :: RGB Word8)++prop_RGBBetween :: RGB Word8 -> (RGB Word8,RGB Word8) -> Bool+prop_RGBBetween x (a,b) = and+  [ red x `prop_between` (red a , red b)+  , green x `prop_between` (green a , green b)+  , blue x `prop_between` (blue a , blue b)+  ]++prop_between :: Ord a => a -> (a,a) -> Bool+prop_between x (a,b) = x <= max a b && x >= min a b
− test/Blucontrol/Test/Gamma/Linear.hs
@@ -1,67 +0,0 @@-{-# LANGUAGE RecordWildCards #-}--module Blucontrol.Test.Gamma.Linear (-  test-) where--import Test.Hspec-import Test.QuickCheck--import Control.DeepSeq-import Control.Monad.Identity-import Data.Time-import Data.Word-import GHC.Generics--import Blucontrol.Gamma.Linear-import Blucontrol.RGB-import Blucontrol.Test.RGB (Arbitrary_RGBWord8 (..))--test :: Spec-test = describe "Blucontrol.Gamma.Linear" $ do--  it "convert Time to TimeOfDay" $-    property prop_timeToTimeOfDay--  -- TODO: this tests `calculateValue weightedAverageRGB`-  it "calculateRGB between surrounding values" $-    property prop_calculateRGB--newtype Arbitrary_Time = Arbitrary_Time Time-  deriving (Bounded, Enum, Eq, Generic, Ord, Read, Show)--instance NFData Arbitrary_Time--instance Arbitrary Arbitrary_Time where-  arbitrary = elements [minBound .. maxBound]--prop_timeToTimeOfDay :: Arbitrary_Time -> Bool-prop_timeToTimeOfDay (Arbitrary_Time time) = and-  [ fromIntegral h == todHour-  , fromIntegral m == todMin-  , 0 == todSec-  ]-  where h :. m = time-        TimeOfDay {..} = fst $ time Blucontrol.Gamma.Linear.==> (undefined :: RGB Word8)--prop_calculateRGB :: Arbitrary_Time-                  -> (Arbitrary_Time,Arbitrary_RGBWord8)-                  -> (Arbitrary_Time,Arbitrary_RGBWord8)-                  -> Bool-prop_calculateRGB (Arbitrary_Time time) (Arbitrary_Time xt , Arbitrary_RGBWord8 xtc) (Arbitrary_Time yt , Arbitrary_RGBWord8 ytc) =-  rgb `prop_RGBBetween` (xtc , ytc)-  where rgb = runIdentity . runGammaLinearT rgbMap $ calculateValue weightedAverageRGB tod-        rgbMap = xt Blucontrol.Gamma.Linear.==> xtc-            :| [ yt Blucontrol.Gamma.Linear.==> ytc-               ]-        tod = LocalTime (ModifiedJulianDay 0) . fst $ time Blucontrol.Gamma.Linear.==> (undefined :: RGB Word8)--prop_RGBBetween :: RGB Word8 -> (RGB Word8,RGB Word8) -> Bool-prop_RGBBetween x (a,b) = and-  [ red x `prop_between` (red a , red b)-  , green x `prop_between` (green a , green b)-  , blue x `prop_between` (blue a , blue b)-  ]--prop_between :: Ord a => a -> (a,a) -> Bool-prop_between x (a,b) = x <= max a b && x >= min a b
− test/Blucontrol/Test/RGB.hs
@@ -1,29 +0,0 @@-{-# LANGUAGE RecordWildCards #-}--module Blucontrol.Test.RGB (-  test-, Arbitrary_RGBWord8 (..)-) where--import Test.Hspec-import Test.QuickCheck--import Control.DeepSeq-import Data.Word-import GHC.Generics--import Blucontrol.RGB--test :: Spec-test = describe "Blucontrol.RGB" $ do--  it "(RGB Word8) in bounds." $-    property $ total @Arbitrary_RGBWord8--newtype Arbitrary_RGBWord8 = Arbitrary_RGBWord8 (RGB Word8)-  deriving (Bounded, Enum, Eq, Generic, Ord, Read, Show)--instance NFData Arbitrary_RGBWord8--instance Arbitrary Arbitrary_RGBWord8 where-  arbitrary = elements [minBound .. maxBound]
+ test/Blucontrol/Value/RGB/Test.hs view
@@ -0,0 +1,29 @@+{-# LANGUAGE RecordWildCards #-}++module Blucontrol.Value.RGB.Test (+  test+, Arbitrary_RGBWord8 (..)+) where++import Test.Hspec+import Test.QuickCheck++import Control.DeepSeq+import Data.Word+import GHC.Generics++import Blucontrol.Value.RGB++test :: Spec+test = describe "Blucontrol.RGB" $ do++  it "(RGB Word8) in bounds." $+    property $ total @Arbitrary_RGBWord8++newtype Arbitrary_RGBWord8 = Arbitrary_RGBWord8 (RGB Word8)+  deriving (Bounded, Enum, Eq, Generic, Ord, Read, Show)++instance NFData Arbitrary_RGBWord8++instance Arbitrary Arbitrary_RGBWord8 where+  arbitrary = elements [minBound .. maxBound]