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 :: forall (mc :: * -> *) (mp :: * -> *) (ma :: * -> *). BlucontrolConstraints mc mp ma => ConfigControl mc mp ma -> IO (StM mc (StM mp (StM ma ()))) blucontrol ConfigControl { forall a. mc a -> IO (StM mc a) runControl :: forall a. mc a -> IO (StM mc a) runControl :: forall (mc :: * -> *) (mp :: * -> *) (ma :: * -> *). ConfigControl mc mp ma -> forall a. mc a -> IO (StM mc a) runControl, forall a. mp a -> IO (StM mp a) runPrepareValue :: forall a. mp a -> IO (StM mp a) runPrepareValue :: forall (mc :: * -> *) (mp :: * -> *) (ma :: * -> *). ConfigControl mc mp ma -> forall a. mp a -> IO (StM mp a) runPrepareValue, forall a. ma a -> IO (StM ma a) runApplyValue :: forall a. ma a -> IO (StM ma a) runApplyValue :: forall (mc :: * -> *) (mp :: * -> *) (ma :: * -> *). ConfigControl mc mp ma -> forall a. ma a -> IO (StM ma a) runApplyValue } = do IO () launch mc (StM mp (StM ma ())) -> IO (StM mc (StM mp (StM ma ()))) forall a. mc a -> IO (StM mc a) runControl (mc (StM mp (StM ma ())) -> IO (StM mc (StM mp (StM ma ())))) -> mc (StM mp (StM ma ())) -> IO (StM mc (StM mp (StM ma ()))) forall a b. (a -> b) -> a -> b $ ((forall a. mc a -> IO (StM mc a)) -> IO (StM mp (StM ma ()))) -> mc (StM mp (StM ma ())) forall a. ((forall a. mc a -> IO (StM mc a)) -> IO a) -> mc a forall (b :: * -> *) (m :: * -> *) a. MonadBaseControl b m => (RunInBase m b -> b a) -> m a liftBaseWith (((forall a. mc a -> IO (StM mc a)) -> IO (StM mp (StM ma ()))) -> mc (StM mp (StM ma ()))) -> ((forall a. mc a -> IO (StM mc a)) -> IO (StM mp (StM ma ()))) -> mc (StM mp (StM ma ())) forall a b. (a -> b) -> a -> b $ \ forall a. mc a -> IO (StM mc a) runC -> mp (StM ma ()) -> IO (StM mp (StM ma ())) forall a. mp a -> IO (StM mp a) runPrepareValue (mp (StM ma ()) -> IO (StM mp (StM ma ()))) -> mp (StM ma ()) -> IO (StM mp (StM ma ())) forall a b. (a -> b) -> a -> b $ ((forall a. mp a -> IO (StM mp a)) -> IO (StM ma ())) -> mp (StM ma ()) forall a. ((forall a. mp a -> IO (StM mp a)) -> IO a) -> mp a forall (b :: * -> *) (m :: * -> *) a. MonadBaseControl b m => (RunInBase m b -> b a) -> m a liftBaseWith (((forall a. mp a -> IO (StM mp a)) -> IO (StM ma ())) -> mp (StM ma ())) -> ((forall a. mp a -> IO (StM mp a)) -> IO (StM ma ())) -> mp (StM ma ()) forall a b. (a -> b) -> a -> b $ \ forall a. mp a -> IO (StM mp a) runP -> ma () -> IO (StM ma ()) forall a. ma a -> IO (StM ma a) runApplyValue (ma () -> IO (StM ma ())) -> ma () -> IO (StM ma ()) forall a b. (a -> b) -> a -> b $ ((forall a. ma a -> IO (StM ma a)) -> IO ()) -> ma () forall a. ((forall a. ma a -> IO (StM ma a)) -> IO a) -> ma a forall (b :: * -> *) (m :: * -> *) a. MonadBaseControl b m => (RunInBase m b -> b a) -> m a liftBaseWith (((forall a. ma a -> IO (StM ma a)) -> IO ()) -> ma ()) -> ((forall a. ma a -> IO (StM ma a)) -> IO ()) -> ma () forall a b. (a -> b) -> a -> b $ \ forall a. ma a -> IO (StM ma a) runA -> (forall a. mc a -> IO (StM mc a)) -> (forall a. mp a -> IO (StM mp a)) -> (forall a. ma a -> IO (StM ma a)) -> (PreparedValue mp -> ApplicableValue ma) -> IO () forall (mc :: * -> *) (mp :: * -> *) (ma :: * -> *). (ControlConstraint mc (StM mp (StM ma ())), MonadBaseControl IO mc, MonadBaseControl IO mp, MonadBaseControl IO ma, MonadApplyValue ma, MonadControl mc, MonadPrepareValue mp) => RunInBase mc IO -> RunInBase mp IO -> RunInBase ma IO -> (PreparedValue mp -> ApplicableValue ma) -> IO () loopRecolor mc a -> IO (StM mc a) forall a. mc a -> IO (StM mc a) runC mp a -> IO (StM mp a) forall a. mp a -> IO (StM mp a) runP ma a -> IO (StM ma a) forall a. ma a -> IO (StM ma a) runA PreparedValue mp -> ApplicableValue ma forall a b. CompatibleValues a b => a -> b convertValue data ConfigControl mc mp ma = ConfigControl { forall (mc :: * -> *) (mp :: * -> *) (ma :: * -> *). ConfigControl mc mp ma -> forall a. mc a -> IO (StM mc a) runControl :: forall a. mc a -> IO (StM mc a) , forall (mc :: * -> *) (mp :: * -> *) (ma :: * -> *). ConfigControl mc mp ma -> forall a. mp a -> IO (StM mp a) runPrepareValue :: forall a. mp a -> IO (StM mp a) , forall (mc :: * -> *) (mp :: * -> *) (ma :: * -> *). ConfigControl mc mp ma -> forall a. ma a -> IO (StM ma a) runApplyValue :: forall a. ma a -> IO (StM ma a) }