packages feed

blucontrol-0.7.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.ApplyValue
import Blucontrol.Monad.Control
import Blucontrol.Monad.PrepareValue
import Blucontrol.Value

type BlucontrolConstraints mc mp ma =
  ( CompatibleValues (PreparedValue mp) (ApplicableValue ma)
  , ControlConstraint mc (StM mp (StM ma ()))
  , MonadBaseControl IO mp
  , MonadBaseControl IO ma
  , MonadApplyValue ma
  , MonadControl mc
  , MonadPrepareValue mp
  )

blucontrol :: BlucontrolConstraints mc mp ma
           => ConfigControl mc mp ma
           -> IO (StM mc (StM mp (StM ma ())))
blucontrol ConfigControl { runControl, runPrepareValue, runApplyValue } = do
  launch
  runControl $ liftBaseWith $ \ runC ->
    runPrepareValue $ liftBaseWith $ \ runP ->
      runApplyValue $ liftBaseWith $ \ runA ->
        loopRecolor runC runP runA convertValue

data ConfigControl mc mp ma = ConfigControl { runControl :: forall a. mc a -> IO (StM mc a)
                                            , runPrepareValue :: forall a. mp a -> IO (StM mp a)
                                            , runApplyValue :: forall a. ma a -> IO (StM ma a)
                                            }