summaryrefslogtreecommitdiffhomepage
path: root/src/Xmobar
diff options
context:
space:
mode:
Diffstat (limited to 'src/Xmobar')
-rw-r--r--src/Xmobar/Plugins/PacmanUpdates.hs74
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