module Blucontrol.Main (
  blucontrol
, BlucontrolConstraints
, ConfigControl (..)
) where

import Control.Monad.Trans.Control

import Blucontrol.Main.Control
import Blucontrol.Main.CLI
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 ()))
  , MonadControl m
  , MonadBaseControl IO g
  , MonadBaseControl IO r
  , MonadGamma g
  , MonadRecolor r
  , CompatibleValues (GammaValue g) (RecolorValue r)
  )

blucontrol :: BlucontrolConstraints m g r
           => ConfigControl m g r
           -> IO ()
blucontrol :: ConfigControl m g r -> IO ()
blucontrol ConfigControl m g r
c = do IO ()
launch
                  ConfigControl m g r -> forall a. m a -> IO a
forall (m :: * -> *) (g :: * -> *) (r :: * -> *).
ConfigControl m g r -> forall a. m a -> IO a
runControl ConfigControl m g r
c (m () -> IO ()) -> m () -> IO ()
forall a b. (a -> b) -> a -> b
$ (forall a. g a -> IO (StM g a))
-> (forall a. r a -> IO (StM r a))
-> (GammaValue g -> RecolorValue r)
-> m ()
forall (m :: * -> *) (g :: * -> *) (r :: * -> *).
(ControlConstraint m (StM g (StM r ())), MonadBaseControl IO g,
 MonadBaseControl IO r, MonadControl m, MonadGamma g,
 MonadRecolor r) =>
(forall a. g a -> IO (StM g a))
-> (forall a. r a -> IO (StM r a))
-> (GammaValue g -> RecolorValue r)
-> m ()
loopRecolor (ConfigControl m g r -> forall a. g a -> IO (StM g a)
forall (m :: * -> *) (g :: * -> *) (r :: * -> *).
ConfigControl m g r -> forall a. g a -> IO (StM g a)
runGamma ConfigControl m g r
c) (ConfigControl m g r -> forall a. r a -> IO (StM r a)
forall (m :: * -> *) (g :: * -> *) (r :: * -> *).
ConfigControl m g r -> forall a. r a -> IO (StM r a)
runRecolor ConfigControl m g r
c) GammaValue g -> RecolorValue r
forall a b. CompatibleValues a b => a -> b
convertValue

data ConfigControl m g r = ConfigControl { ConfigControl m g r -> forall a. m a -> IO a
runControl :: forall a. m a -> IO a
                                         , ConfigControl m g r -> forall a. g a -> IO (StM g a)
runGamma   :: forall a. g a -> IO (StM g a)
                                         , ConfigControl m g r -> forall a. r a -> IO (StM r a)
runRecolor :: forall a. r a -> IO (StM r a)
                                         }