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 (StM m (StM g (StM r ())))
blucontrol :: ConfigControl m g r -> IO (StM m (StM g (StM r ())))
blucontrol ConfigControl { forall a. m a -> IO (StM m a)
runControl :: forall (m :: * -> *) (g :: * -> *) (r :: * -> *).
ConfigControl m g r -> forall a. m a -> IO (StM m a)
runControl :: forall a. m a -> IO (StM m a)
runControl, forall a. g a -> IO (StM g a)
runGamma :: forall (m :: * -> *) (g :: * -> *) (r :: * -> *).
ConfigControl m g r -> forall a. g a -> IO (StM g a)
runGamma :: forall a. g a -> IO (StM g a)
runGamma, forall a. r a -> IO (StM r a)
runRecolor :: forall (m :: * -> *) (g :: * -> *) (r :: * -> *).
ConfigControl m g r -> forall a. r a -> IO (StM r a)
runRecolor :: forall a. r a -> IO (StM r a)
runRecolor } = do
  IO ()
launch
  m (StM g (StM r ())) -> IO (StM m (StM g (StM r ())))
forall a. m a -> IO (StM m a)
runControl (m (StM g (StM r ())) -> IO (StM m (StM g (StM r ()))))
-> m (StM g (StM r ())) -> IO (StM m (StM g (StM r ())))
forall a b. (a -> b) -> a -> b
$ ((forall a. m a -> IO (StM m a)) -> IO (StM g (StM r ())))
-> m (StM g (StM r ()))
forall (b :: * -> *) (m :: * -> *) a.
MonadBaseControl b m =>
(RunInBase m b -> b a) -> m a
liftBaseWith (((forall a. m a -> IO (StM m a)) -> IO (StM g (StM r ())))
 -> m (StM g (StM r ())))
-> ((forall a. m a -> IO (StM m a)) -> IO (StM g (StM r ())))
-> m (StM g (StM r ()))
forall a b. (a -> b) -> a -> b
$ \ forall a. m a -> IO (StM m a)
runC ->
    g (StM r ()) -> IO (StM g (StM r ()))
forall a. g a -> IO (StM g a)
runGamma (g (StM r ()) -> IO (StM g (StM r ())))
-> g (StM r ()) -> IO (StM g (StM r ()))
forall a b. (a -> b) -> a -> b
$ ((forall a. g a -> IO (StM g a)) -> IO (StM r ())) -> g (StM r ())
forall (b :: * -> *) (m :: * -> *) a.
MonadBaseControl b m =>
(RunInBase m b -> b a) -> m a
liftBaseWith (((forall a. g a -> IO (StM g a)) -> IO (StM r ()))
 -> g (StM r ()))
-> ((forall a. g a -> IO (StM g a)) -> IO (StM r ()))
-> g (StM r ())
forall a b. (a -> b) -> a -> b
$ \ forall a. g a -> IO (StM g a)
runG ->
      r () -> IO (StM r ())
forall a. r a -> IO (StM r a)
runRecolor (r () -> IO (StM r ())) -> r () -> IO (StM r ())
forall a b. (a -> b) -> a -> b
$ ((forall a. r a -> IO (StM r a)) -> IO ()) -> r ()
forall (b :: * -> *) (m :: * -> *) a.
MonadBaseControl b m =>
(RunInBase m b -> b a) -> m a
liftBaseWith (((forall a. r a -> IO (StM r a)) -> IO ()) -> r ())
-> ((forall a. r a -> IO (StM r a)) -> IO ()) -> r ()
forall a b. (a -> b) -> a -> b
$ \ forall a. r a -> IO (StM r a)
runR ->
        (forall a. m a -> IO (StM m a))
-> (forall a. g a -> IO (StM g a))
-> (forall a. r a -> IO (StM r a))
-> (GammaValue g -> RecolorValue r)
-> IO ()
forall (m :: * -> *) (g :: * -> *) (r :: * -> *).
(MonadBaseControl IO m, MonadBaseControl IO g,
 MonadBaseControl IO r, MonadControl m, MonadGamma g,
 MonadRecolor r, ControlConstraint m (StM g (StM r ()))) =>
RunInBase m IO
-> RunInBase g IO
-> RunInBase r IO
-> (GammaValue g -> RecolorValue r)
-> IO ()
loopRecolor forall a. m a -> IO (StM m a)
runC forall a. g a -> IO (StM g a)
runG forall a. r a -> IO (StM r a)
runR 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 (StM m a)
runControl :: forall a. m a -> IO (StM m 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)
                                         }