packages feed

blucontrol-0.6.0.0: src/Blucontrol/Main.hs

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 { runControl, runGamma, runRecolor } = do
  launch
  runControl $ liftBaseWith $ \ runC ->
    runGamma $ liftBaseWith $ \ runG ->
      runRecolor $ liftBaseWith $ \ runR ->
        loopRecolor runC runG runR convertValue

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