diff options
Diffstat (limited to 'src/Xmobar/Plugins/PacmanUpdates.hs')
| -rw-r--r-- | src/Xmobar/Plugins/PacmanUpdates.hs | 74 |
1 files changed, 44 insertions, 30 deletions
diff --git a/src/Xmobar/Plugins/PacmanUpdates.hs b/src/Xmobar/Plugins/PacmanUpdates.hs index 03b556f..527580b 100644 --- a/src/Xmobar/Plugins/PacmanUpdates.hs +++ b/src/Xmobar/Plugins/PacmanUpdates.hs @@ -25,10 +25,12 @@ available (provided the name of the kernel package), and whether the running ker than the installed one. -} module Xmobar.Plugins.PacmanUpdates ( - {-# DEPRECATED "This ctor is DEPRECATED; please use `PacmanUpdates` type and `PacmanUpdatesK` and `PacmanUpdatesNoK` constructors instead." #-} + {-# DEPRECATED "This ctor is DEPRECATED; please use `PacmanUpdates` type and `PacmanUpdatesK`, `PacmanUpdatesPredicateK` and `PacmanUpdatesNoK` constructors instead." #-} pattern PacmanUpdates , PacmanUpdates () + , PacmanUpdatesKernelCheck (..) , pattern PacmanUpdatesK + , pattern PacmanUpdatesPredicateK , pattern PacmanUpdatesNoK) where import System.Exit (ExitCode (..)) @@ -43,13 +45,13 @@ import Control.Arrow ((&&&)) import qualified Data.Vector as V -- | Deprecated plugin ctor (will be deleted in 2027). --- Use `PacmanUpdatesK` or `PacmanUpdatesNoK` instead. +-- Use `PacmanUpdatesK`, `PacmanUpdatesPredicateK`, or `PacmanUpdatesNoK` instead. pattern PacmanUpdates :: (String, String, String, String) -- ^ `String`s to be shown for 0, 1, ≥ 2 updates, -- and for error respectively (in the 3rd string, for -- ≥ 2 updates, any occurrence of the '?' character -- is a placeholder for the number of available updates). -> Rate -- ^ `Rate` of update (see [Xmobar doc](https://codeberg.org/xmobar/xmobar/src/commit/39fd70308c3aef5402abe7152ade76ff7bb331bb/src/Xmobar/Plugins/Command.hs#L34)). - -> PacmanUpdates False + -> PacmanUpdates NoKernelCheck pattern PacmanUpdates irrelevant <- (error "PacmanUpdates: PacmanUpdates is a build-only pattern synonym (a ctor synonym)." -> irrelevant) where PacmanUpdates zome r = let (z, o, m, e) = zome @@ -65,10 +67,12 @@ pattern PacmanUpdates irrelevant <- (error "PacmanUpdates: PacmanUpdates is a bu ++ "deprecated plugin, click here</action>)</fc>" in PacmanUpdatesNoK r printer --- | PacmanUpdates plugin parametrized over `Bool` kind: if `True` the plugin --- will detect if there's pending update(s) for the kernel package; if `False` --- it wont. -data PacmanUpdates (b :: Bool) + +-- | Different types of kernel checks. +data PacmanUpdatesKernelCheck = NoKernelCheck | PredicateKernelCheck + +-- | PacmanUpdates plugin parametrized over the `PacmanUpdatesKernelCheck` kind. +data PacmanUpdates (b :: PacmanUpdatesKernelCheck) = Make -- ^ Constructor. Rate -- ^ `Rate` of update (see [Xmobar doc](https://codeberg.org/xmobar/xmobar/src/commit/39fd70308c3aef5402abe7152ade76ff7bb331bb/src/Xmobar/Plugins/Command.hs#L34)). (Arg b) -- ^ Optional further argument. See instances of `Updates`. @@ -80,12 +84,12 @@ instance Show (PacmanUpdates b) where instance Read (PacmanUpdates b) where readsPrec = error "PacmanUpdates: Read instance is stub" -instance Updates b => Exec (PacmanUpdates (b :: Bool)) where +instance Updates b => Exec (PacmanUpdates (b :: PacmanUpdatesKernelCheck)) where alias = const "pacman" rate (Make r _ _) = r run = Xmobar.Plugins.PacmanUpdates.run' -class Updates (b :: Bool) where +class Updates (b :: PacmanUpdatesKernelCheck) where -- | See `Updates`'s instances. type Arg b = (a :: Type) | a -> b -- | See `Updates`'s instances. @@ -98,34 +102,44 @@ class Updates (b :: Bool) where -- the system is running an outdated kernel, and an `Int` telling -- the number of available updates (or `Left` if an error occurred -- when calling `checkupdates`). -instance Updates False where - type Arg False = Void - type Printer False = Bool -> Either String Int -> String +instance Updates NoKernelCheck where + type Arg NoKernelCheck = Void + type Printer NoKernelCheck = Bool -> Either String Int -> String run' (Make _ _ printer) = printer <$> kernIsOld <*> (fmap V.length <$> checkUpdates) --- | Constructing the plugin requires an additional `String` telling the name --- name of the kernel package; the user-provided printer is fed with a `Bool` --- telling whether the system is running an outdated kernel, and an `(Int, --- Bool)` pair telling the number of available updates and whether one of these --- is a kernel update (or `Left` if an error occurred when calling --- `checkupdates`). -instance Updates True where - type Arg True = String - type Printer True = Bool -> Either String (Int, Bool) -> String - run' (Make _ kernName printer) +-- | Constructing the plugin requires an additional `String -> Bool` predicate +-- that receives each available package name and returns `True` for kernel +-- packages; the user-provided printer is fed with a `Bool` telling whether the +-- system is running an outdated kernel, and an `(Int, Bool)` pair telling the +-- number of available updates and whether one of these is a kernel update (or +-- `Left` if an error occurred when calling `checkupdates`). +instance Updates PredicateKernelCheck where + type Arg PredicateKernelCheck = String -> Bool + type Printer PredicateKernelCheck = Bool -> Either String (Int, Bool) -> String + run' (Make _ checkKern printer) = printer <$> kernIsOld - <*> (fmap (V.length &&& elem kernName) <$> checkUpdates) - --- | Pattern synonym used to construct a `PacmanUpdates True`. -pattern PacmanUpdatesK :: Rate -> Arg True -> Printer True -> PacmanUpdates True -pattern PacmanUpdatesK r a p = Make r a p - --- | Pattern synonym used to construct a `PacmanUpdates False`. -pattern PacmanUpdatesNoK :: Rate -> Printer False -> PacmanUpdates False + <*> (fmap (V.length &&& V.any checkKern) <$> checkUpdates) + +-- | Pattern synonym to construct a `PacmanUpdates PredicateKernelCheck` that +-- detects updates for packages matched by the given @(String -> Bool)@ +-- predicate. This can be used to detect kernel updates for distributions +-- with versioned kernel package names (e.g. Manjaro's @linux618@) +pattern PacmanUpdatesPredicateK :: Rate -> Arg PredicateKernelCheck -> Printer PredicateKernelCheck -> PacmanUpdates PredicateKernelCheck +pattern PacmanUpdatesPredicateK r a p = Make r a p + +-- | A convenience wrapper around PacmanUpdatesPredicateK with the predicate @(== kernName)@ +-- Construction only: the kernel name cannot be recovered when matching. +pattern PacmanUpdatesK :: Rate -> String -> Printer PredicateKernelCheck -> PacmanUpdates PredicateKernelCheck +pattern PacmanUpdatesK r kernName p <- + (error "PacmanUpdatesK: build-only pattern synonym (a ctor synonym)." -> (r, kernName, p)) + where PacmanUpdatesK r kernName p = PacmanUpdatesPredicateK r (== kernName) p + +-- | Pattern synonym used to construct a `PacmanUpdates NoKernelCheck`. +pattern PacmanUpdatesNoK :: Rate -> Printer NoKernelCheck -> PacmanUpdates NoKernelCheck pattern PacmanUpdatesNoK r p <- Make r _ p where PacmanUpdatesNoK r p = Make r undefined p |
