packages feed

bludigon 0.1.0.1 → 0.1.1.0

raw patch · 9 files changed

+130/−14 lines, 9 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Bludigon.Control.Print: instance Bludigon.Control.MonadControl m => Bludigon.Control.MonadControl (Bludigon.Control.Print.ControlPrintT m)
- Bludigon.Control.Wait: instance Bludigon.Control.MonadControl m => Bludigon.Control.MonadControl (Bludigon.Control.Wait.ControlWaitT m)
+ Bludigon: (!>) :: (t1 m a -> m a) -> (t2 (t1 m) a -> t1 m a) -> ControlConcatT t1 t2 m a -> m a
+ Bludigon: infixr 5 !>
+ Bludigon.Control.Concat: (!>) :: (t1 m a -> m a) -> (t2 (t1 m) a -> t1 m a) -> ControlConcatT t1 t2 m a -> m a
+ Bludigon.Control.Concat: data ControlConcatT (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *) (m :: * -> *) a
+ Bludigon.Control.Concat: infixr 5 !>
+ Bludigon.Control.Concat: instance (Bludigon.Control.MonadControl (t1 m), Bludigon.Control.MonadControl (t2 (t1 m)), Control.Monad.Trans.Class.MonadTrans t2) => Bludigon.Control.MonadControl (Bludigon.Control.Concat.ControlConcatT t1 t2 m)
+ Bludigon.Control.Concat: instance (forall (m :: * -> *). GHC.Base.Monad m => GHC.Base.Monad (t1 m), Control.Monad.Trans.Class.MonadTrans t1, Control.Monad.Trans.Class.MonadTrans t2) => Control.Monad.Trans.Class.MonadTrans (Bludigon.Control.Concat.ControlConcatT t1 t2)
+ Bludigon.Control.Concat: instance (forall (m :: * -> *). GHC.Base.Monad m => GHC.Base.Monad (t1 m), Control.Monad.Trans.Control.MonadTransControl t1, Control.Monad.Trans.Control.MonadTransControl t2) => Control.Monad.Trans.Control.MonadTransControl (Bludigon.Control.Concat.ControlConcatT t1 t2)
+ Bludigon.Control.Concat: instance Control.Monad.Base.MonadBase b (t2 (t1 m)) => Control.Monad.Base.MonadBase b (Bludigon.Control.Concat.ControlConcatT t1 t2 m)
+ Bludigon.Control.Concat: instance Control.Monad.Trans.Control.MonadBaseControl b (t2 (t1 m)) => Control.Monad.Trans.Control.MonadBaseControl b (Bludigon.Control.Concat.ControlConcatT t1 t2 m)
+ Bludigon.Control.Concat: instance GHC.Base.Applicative (t2 (t1 m)) => GHC.Base.Applicative (Bludigon.Control.Concat.ControlConcatT t1 t2 m)
+ Bludigon.Control.Concat: instance GHC.Base.Functor (t2 (t1 m)) => GHC.Base.Functor (Bludigon.Control.Concat.ControlConcatT t1 t2 m)
+ Bludigon.Control.Concat: instance GHC.Base.Monad (t2 (t1 m)) => GHC.Base.Monad (Bludigon.Control.Concat.ControlConcatT t1 t2 m)
+ Bludigon.Control.Concat: runControlConcatT :: (t1 m a -> m a) -> (t2 (t1 m) a -> t1 m a) -> ControlConcatT t1 t2 m a -> m a
+ Bludigon.Control.Count: ConfigCount :: Natural -> ConfigCount
+ Bludigon.Control.Count: [maxCount] :: ConfigCount -> Natural
+ Bludigon.Control.Count: class CountableException a
+ Bludigon.Control.Count: data ControlCountT m a
+ Bludigon.Control.Count: instance Bludigon.Control.Count.CountableException ()
+ Bludigon.Control.Count: instance Bludigon.Control.Count.CountableException a => Bludigon.Control.Count.CountableException (Data.Either.Either b a)
+ Bludigon.Control.Count: instance Bludigon.Control.Count.CountableException a => Bludigon.Control.Count.CountableException (GHC.Maybe.Maybe a)
+ Bludigon.Control.Count: instance Control.DeepSeq.NFData Bludigon.Control.Count.ConfigCount
+ Bludigon.Control.Count: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Bludigon.Control.Count.ControlCountT m)
+ Bludigon.Control.Count: instance Control.Monad.Trans.Class.MonadTrans Bludigon.Control.Count.ControlCountT
+ Bludigon.Control.Count: instance Control.Monad.Trans.Control.MonadBaseControl GHC.Types.IO m => Bludigon.Control.MonadControl (Bludigon.Control.Count.ControlCountT m)
+ Bludigon.Control.Count: instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Bludigon.Control.Count.ControlCountT m)
+ Bludigon.Control.Count: instance Data.Default.Class.Default Bludigon.Control.Count.ConfigCount
+ Bludigon.Control.Count: instance GHC.Base.Functor m => GHC.Base.Functor (Bludigon.Control.Count.ControlCountT m)
+ Bludigon.Control.Count: instance GHC.Base.Monad m => GHC.Base.Applicative (Bludigon.Control.Count.ControlCountT m)
+ Bludigon.Control.Count: instance GHC.Base.Monad m => GHC.Base.Monad (Bludigon.Control.Count.ControlCountT m)
+ Bludigon.Control.Count: instance GHC.Classes.Eq Bludigon.Control.Count.ConfigCount
+ Bludigon.Control.Count: instance GHC.Classes.Ord Bludigon.Control.Count.ConfigCount
+ Bludigon.Control.Count: instance GHC.Generics.Generic Bludigon.Control.Count.ConfigCount
+ Bludigon.Control.Count: instance GHC.Read.Read Bludigon.Control.Count.ConfigCount
+ Bludigon.Control.Count: instance GHC.Show.Show Bludigon.Control.Count.ConfigCount
+ Bludigon.Control.Count: isException :: CountableException a => a -> Bool
+ Bludigon.Control.Count: newtype ConfigCount
+ Bludigon.Control.Count: runControlCountT :: Monad m => ConfigCount -> ControlCountT m a -> m a
+ Bludigon.Control.Print: instance Control.Monad.Trans.Control.MonadBaseControl GHC.Types.IO m => Bludigon.Control.MonadControl (Bludigon.Control.Print.ControlPrintT m)
+ Bludigon.Control.Wait: instance Control.Monad.Trans.Control.MonadBaseControl GHC.Types.IO m => Bludigon.Control.MonadControl (Bludigon.Control.Wait.ControlWaitT m)
- Bludigon: ConfigControl :: (forall a. m a -> IO a) -> (forall a. g a -> m (StM g a)) -> (forall a. r a -> g (StM r a)) -> ConfigControl m g r
+ Bludigon: ConfigControl :: (forall a. m a -> IO a) -> (forall a. g a -> IO (StM g a)) -> (forall a. r a -> g (StM r a)) -> ConfigControl m g r
- Bludigon: [runGamma] :: ConfigControl m g r -> forall a. g a -> m (StM g a)
+ Bludigon: [runGamma] :: ConfigControl m g r -> forall a. g a -> IO (StM g a)
- Bludigon.Main: ConfigControl :: (forall a. m a -> IO a) -> (forall a. g a -> m (StM g a)) -> (forall a. r a -> g (StM r a)) -> ConfigControl m g r
+ Bludigon.Main: ConfigControl :: (forall a. m a -> IO a) -> (forall a. g a -> IO (StM g a)) -> (forall a. r a -> g (StM r a)) -> ConfigControl m g r
- Bludigon.Main: [runGamma] :: ConfigControl m g r -> forall a. g a -> m (StM g a)
+ Bludigon.Main: [runGamma] :: ConfigControl m g r -> forall a. g a -> IO (StM g a)
- Bludigon.Main.Control: ConfigControl :: (forall a. m a -> IO a) -> (forall a. g a -> m (StM g a)) -> (forall a. r a -> g (StM r a)) -> ConfigControl m g r
+ Bludigon.Main.Control: ConfigControl :: (forall a. m a -> IO a) -> (forall a. g a -> IO (StM g a)) -> (forall a. r a -> g (StM r a)) -> ConfigControl m g r
- Bludigon.Main.Control: [runGamma] :: ConfigControl m g r -> forall a. g a -> m (StM g a)
+ Bludigon.Main.Control: [runGamma] :: ConfigControl m g r -> forall a. g a -> IO (StM g a)
- Bludigon.Main.Control: loopRecolor :: (ControlConstraint m (StM g (StM r ())), MonadBaseControl IO g, MonadBaseControl IO r, MonadControl m, MonadGamma g, MonadRecolor r) => (forall a. g a -> m (StM g a)) -> (forall a. r a -> g (StM r a)) -> ControlT m ()
+ Bludigon.Main.Control: loopRecolor :: (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 -> g (StM r a)) -> ControlT m ()

Files

CHANGELOG.md view
@@ -1,5 +1,11 @@ # Revision history for bludigon +## 0.1.1.0 -- 2020-08-10++* `runGamma` runs directly in `IO` now+* New module `Bludigon.Control.Concat`+* New module `Bludigon.Control.Count`+ ## 0.1.0.1 -- 2020-08-02  * Add header file to c-sources.
Main.hs view
@@ -1,6 +1,7 @@ module Main where  import Bludigon+import Bludigon.Control.Count import Bludigon.Control.Print import Bludigon.Control.Wait import Bludigon.Gamma.Linear@@ -8,7 +9,7 @@  main :: IO () main = bludigon configControl-  where configControl = ConfigControl { runControl = runControlWaitT def . runControlPrintT+  where configControl = ConfigControl { runControl = runControlPrintT !> runControlCountT def !> runControlWaitT def                                       , runGamma = runGammaLinearT rgbMap                                       , runRecolor = runRecolorXTIO def                                       }
bludigon.cabal view
@@ -1,5 +1,5 @@ name:                bludigon-version:             0.1.0.1+version:             0.1.1.0 synopsis:            Configurable blue light filter description:         This application is a blue light filter, with the main focus on                      configurability.@@ -26,6 +26,8 @@ library   exposed-modules:     Bludigon                        Bludigon.Control+                       Bludigon.Control.Concat+                       Bludigon.Control.Count                        Bludigon.Control.Print                        Bludigon.Control.Wait                        Bludigon.Gamma
src/Bludigon.hs view
@@ -24,6 +24,12 @@ -- | Modules with instances of 'MonadControl' can be found under @Bludigon.Control.*@. , MonadControl (..) +{- | To compose instances of 'MonadControl' avoid function composition, as it won't compose+   'doInbetween'.+   Use '!>' instead.+-}+, (!>)+ -- * Gamma -- | Modules with instances of 'MonadGamma' can be found under @Bludigon.Gamma.*@. , MonadGamma (..)@@ -39,6 +45,7 @@ import Data.Default  import Bludigon.Control+import Bludigon.Control.Concat import Bludigon.Gamma import Bludigon.Main import Bludigon.Recolor
+ src/Bludigon/Control/Concat.hs view
@@ -0,0 +1,39 @@+{-# LANGUAGE QuantifiedConstraints, UndecidableInstances #-}++module Bludigon.Control.Concat (+  ControlConcatT+, runControlConcatT+, (!>)+) where++import Control.Monad.Base+import Control.Monad.Trans+import Control.Monad.Trans.Control++import Bludigon.Control++newtype ControlConcatT (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *) (m :: * -> *) a = ControlConcatT { unControlConcatT :: t2 (t1 m) a }+  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b)++instance (forall m. Monad m => Monad (t1 m), MonadTrans t1, MonadTrans t2) => MonadTrans (ControlConcatT t1 t2) where+  lift = ControlConcatT . lift . lift++instance (forall m. Monad m => Monad (t1 m), MonadTransControl t1, MonadTransControl t2) => MonadTransControl (ControlConcatT t1 t2) where+  type StT (ControlConcatT t1 t2) a = StT t1 (StT t2 a)+  liftWith inner = ControlConcatT $+    liftWith $ \ runT2 ->+      liftWith $ \ runT1 ->+        inner $ runT1 . runT2 . unControlConcatT+  restoreT = ControlConcatT . restoreT . restoreT++instance (MonadControl (t1 m), MonadControl (t2 (t1 m)), MonadTrans t2) => MonadControl (ControlConcatT t1 t2 m) where+  type ControlConstraint (ControlConcatT t1 t2 m) a = (ControlConstraint (t1 m) a, ControlConstraint (t2 (t1 m)) a)+  doInbetween a = do ControlConcatT . lift $ doInbetween a+                     ControlConcatT $ doInbetween a++runControlConcatT :: (t1 m a -> m a) -> (t2 (t1 m) a -> t1 m a) -> ControlConcatT t1 t2 m a -> m a+runControlConcatT runT1 runT2 = runT1 . runT2 . unControlConcatT++infixr 5 !>+(!>) :: (t1 m a -> m a) -> (t2 (t1 m) a -> t1 m a) -> (ControlConcatT t1 t2 m a -> m a)+(!>) = runControlConcatT
+ src/Bludigon/Control/Count.hs view
@@ -0,0 +1,63 @@+{-# LANGUAGE UndecidableInstances #-}++module Bludigon.Control.Count (+  ControlCountT+, runControlCountT+, ConfigCount (..)+, CountableException (..)+) where++import Control.DeepSeq+import Control.Monad.Base+import Control.Monad.Trans.Control+import Control.Monad.Reader+import Control.Monad.State.Strict+import Data.Default+import GHC.Generics+import Numeric.Natural++import Bludigon.Control++newtype ControlCountT m a = ControlCountT { unControlCountT :: StateT Natural (ReaderT ConfigCount m) a }+  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b)++instance MonadTrans ControlCountT where+  lift = ControlCountT . lift . lift++instance MonadBaseControl IO m => MonadControl (ControlCountT m) where+  type ControlConstraint (ControlCountT m) a = CountableException a+  doInbetween a = do if isException a+                        then ControlCountT $ modify succ+                        else ControlCountT $ put 0+                     current <- ControlCountT get+                     limit <- ControlCountT . lift $ reader maxCount+                     if current >= limit+                        then error $ "failed after " <> show limit <> " consecutive tries"+                        else return ()++runControlCountT :: Monad m => ConfigCount -> ControlCountT m a -> m a+runControlCountT conf tma = runReaderT (evalStateT (unControlCountT tma) 0) conf++newtype ConfigCount = ConfigCount { maxCount :: Natural+                                  }+  deriving (Eq, Generic, Ord, Read, Show)++instance NFData ConfigCount++instance Default ConfigCount where+  def = ConfigCount { maxCount = 5+                    }++class CountableException a where+  isException :: a -> Bool++instance CountableException () where+  isException () = False++instance CountableException a => CountableException (Maybe a) where+  isException Nothing = True+  isException (Just a) = isException a++instance CountableException a => CountableException (Either b a) where+  isException (Left _) = True+  isException (Right a) = isException a
src/Bludigon/Control/Print.hs view
@@ -22,10 +22,9 @@   liftWith inner = ControlPrintT $ inner unControlPrintT   restoreT = ControlPrintT -instance MonadControl m => MonadControl (ControlPrintT m) where-  type ControlConstraint (ControlPrintT m) a = (ControlConstraint m a, Show a)-  doInbetween a = do liftBase $ print a-                     lift $ doInbetween a+instance MonadBaseControl IO m => MonadControl (ControlPrintT m) where+  type ControlConstraint (ControlPrintT m) a = Show a+  doInbetween a = liftBase $ print a  runControlPrintT :: ControlPrintT m a -> m a runControlPrintT = unControlPrintT
src/Bludigon/Control/Wait.hs view
@@ -20,10 +20,9 @@ newtype ControlWaitT m a = ControlWaitT { unControlWaitT :: ReaderT ConfigWait m a }   deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b, MonadTrans, MonadTransControl) -instance MonadControl m => MonadControl (ControlWaitT m) where-  type ControlConstraint (ControlWaitT m) a = ControlConstraint m a-  doInbetween a = do liftBase . threadDelay . interval =<< ControlWaitT ask-                     lift $ doInbetween a+instance MonadBaseControl IO m => MonadControl (ControlWaitT m) where+  type ControlConstraint (ControlWaitT m) a = ()+  doInbetween _ = liftBase . threadDelay . interval =<< ControlWaitT ask  runControlWaitT :: ConfigWait -> ControlWaitT m a -> m a runControlWaitT conf tma = runReaderT (unControlWaitT tma) conf
src/Bludigon/Main/Control.hs view
@@ -33,11 +33,11 @@ runControlT = unControlT  loopRecolor :: (ControlConstraint m (StM g (StM r ())), MonadBaseControl IO g, MonadBaseControl IO r, MonadControl m, MonadGamma g, MonadRecolor r)-            => (forall a. g a -> m (StM g a))+            => (forall a. g a -> IO (StM g a))             -> (forall a. r a -> g (StM r a))             -> ControlT m () loopRecolor runG runR = do-  a <- lift doRecolorGamma+  a <- liftBase doRecolorGamma   ControlT $ evalStateT doLoopRecolor a   where doRecolorGamma = runG $ do           rgb <- gamma@@ -45,11 +45,11 @@         doLoopRecolor = do           a' <- get           lift $ doInbetween a'-          a'' <- lift doRecolorGamma+          a'' <- liftBase doRecolorGamma           put a''           doLoopRecolor  data ConfigControl m g r = ConfigControl { runControl :: forall a. m a -> IO a-                                         , runGamma   :: forall a. g a -> m (StM g a)+                                         , runGamma   :: forall a. g a -> IO (StM g a)                                          , runRecolor :: forall a. r a -> g (StM r a)                                          }