Safe Haskell | None |
---|---|
Language | GHC2021 |
Navi.Event
Description
This module provides functionality for handling events.
Synopsis
- data Event result trigger = MkEvent {
- errorNote :: ErrorNote
- name :: Text
- pollInterval :: PollInterval
- raiseAlert :: result -> Maybe (trigger, NaviNote)
- repeatEvent :: RepeatEvent trigger
- serviceType :: ServiceType result
- data AnyEvent where
- runEvent :: (HasCallStack, MonadLoggerNS m env k, MonadSystemInfo m, Show result) => Event result trigger -> m (EventSuccess result trigger)
- data EventSuccess result trigger = MkEventSuccess {
- pollInterval :: Maybe PollInterval
- result :: result
- repeatEvent :: RepeatEvent trigger
- raiseAlert :: result -> Maybe (trigger, NaviNote)
- data EventError = MkEventError {}
- data RepeatEvent a
- = NoRepeats (IORef (Maybe a))
- | SomeRepeats (Set a) (IORef (Maybe a))
- | AllowRepeats
- data ErrorNote
- = NoErrNote
- | AllowErrNote (RepeatEvent ())
- blockRepeat :: (Ord a, MonadLoggerNS m env k, MonadIORef m, Show a) => RepeatEvent a -> a -> m Bool
- blockErr :: (MonadLoggerNS m env k, MonadIORef m) => ErrorNote -> m Bool
- updatePrevTrigger :: (Eq a, MonadIORef m) => RepeatEvent a -> Maybe a -> m ()
Event type
data Event result trigger Source #
Event
represents sending notifications. An event will:
- Query for information (i.e. run a shell command).
- Parse the result.
- Map the result to a trigger.
- Raise an alert if the trigger matches some condition.
For most services, the (result -> trigger) map will be trivial i.e. result and trigger will be identical.
For example, custom servicess is Text
, and NetInterfaces is
NetInterface. In these cases, there is an exact
correspondonce between the service query result and the trigger.
But for e.g. battery percentage, the result is Battery (percentage and status) whereas trigger is PercentageData.
See NOTE: [Battery Percentage Result/Trigger] for an explanation on why this might be desirable.
Constructors
MkEvent | |
Fields
|
Instances
(k ~ A_Lens, a ~ ErrorNote, b ~ ErrorNote) => LabelOptic "errorNote" k (Event result trigger) (Event result trigger) a b Source # | |
Defined in Navi.Event.Types | |
(k ~ A_Lens, a ~ Text, b ~ Text) => LabelOptic "name" k (Event result trigger) (Event result trigger) a b Source # | |
Defined in Navi.Event.Types | |
(k ~ A_Lens, a ~ PollInterval, b ~ PollInterval) => LabelOptic "pollInterval" k (Event result trigger) (Event result trigger) a b Source # | |
Defined in Navi.Event.Types | |
(k ~ A_Lens, a ~ (result -> Maybe (trigger, NaviNote)), b ~ (result -> Maybe (trigger, NaviNote))) => LabelOptic "raiseAlert" k (Event result trigger) (Event result trigger) a b Source # | |
Defined in Navi.Event.Types | |
(k ~ A_Lens, a ~ RepeatEvent trigger, b ~ RepeatEvent trigger) => LabelOptic "repeatEvent" k (Event result trigger) (Event result trigger) a b Source # | |
Defined in Navi.Event.Types | |
(k ~ A_Lens, a ~ ServiceType result, b ~ ServiceType result) => LabelOptic "serviceType" k (Event result trigger) (Event result trigger) a b Source # | |
Defined in Navi.Event.Types | |
Show trigger => Show (Event result trigger) Source # | |
Existentially quantifies result type on an Event
. Used so that we can
store different events in the same list.
runEvent :: (HasCallStack, MonadLoggerNS m env k, MonadSystemInfo m, Show result) => Event result trigger -> m (EventSuccess result trigger) Source #
Runs an event, i.e.,
- Queries the system via
MonadSystemInfo
. - Returns the parsed result.
Results
data EventSuccess result trigger Source #
Holds the Event
data used after an event is successfully run.
Since: 0.1
Constructors
MkEventSuccess | |
Fields
|
Instances
(k ~ A_Lens, a ~ Maybe PollInterval, b ~ Maybe PollInterval) => LabelOptic "pollInterval" k (EventSuccess result trigger) (EventSuccess result trigger) a b Source # | |
Defined in Navi.Event.Types Methods labelOptic :: Optic k NoIx (EventSuccess result trigger) (EventSuccess result trigger) a b Source # | |
(k ~ A_Lens, a ~ (result -> Maybe (trigger, NaviNote)), b ~ (result -> Maybe (trigger, NaviNote))) => LabelOptic "raiseAlert" k (EventSuccess result trigger) (EventSuccess result trigger) a b Source # | |
Defined in Navi.Event.Types Methods labelOptic :: Optic k NoIx (EventSuccess result trigger) (EventSuccess result trigger) a b Source # | |
(k ~ A_Lens, a ~ RepeatEvent trigger, b ~ RepeatEvent trigger) => LabelOptic "repeatEvent" k (EventSuccess result trigger) (EventSuccess result trigger) a b Source # | |
Defined in Navi.Event.Types Methods labelOptic :: Optic k NoIx (EventSuccess result trigger) (EventSuccess result trigger) a b Source # | |
(k ~ A_Lens, a ~ result, b ~ result) => LabelOptic "result" k (EventSuccess result trigger) (EventSuccess result trigger) a b Source # | |
Defined in Navi.Event.Types Methods labelOptic :: Optic k NoIx (EventSuccess result trigger) (EventSuccess result trigger) a b Source # |
data EventError Source #
Represents an error when querying an Event
.
Constructors
MkEventError | |
Instances
Caching previous events/errors
data RepeatEvent a Source #
Determines if we are allowed to send off duplicate notifications
simultaneously. If we are not, then NoRepeats
holds the last trigger
so that we can detect duplicates.
Constructors
NoRepeats (IORef (Maybe a)) | |
SomeRepeats (Set a) (IORef (Maybe a)) | |
AllowRepeats |
Instances
Show a => Show (RepeatEvent a) Source # | |
Defined in Navi.Event.Types Methods showsPrec :: Int -> RepeatEvent a -> ShowS # show :: RepeatEvent a -> String # showList :: [RepeatEvent a] -> ShowS # |
Determines if we should send notifications for errors and, if so, if we allow repeats.
Constructors
NoErrNote | |
AllowErrNote (RepeatEvent ()) |
blockRepeat :: (Ord a, MonadLoggerNS m env k, MonadIORef m, Show a) => RepeatEvent a -> a -> m Bool Source #
Determines if we should block the event. The semantics are:
AllowRepeats
: never block (returnsFalse
).NoRepeats
: block only if the parametera
equals the previousa
stored in ourref
.
blockErr :: (MonadLoggerNS m env k, MonadIORef m) => ErrorNote -> m Bool Source #
Determines if we should block the error event. The semantics are:
NoErrNote
: always block (returnsTrue
).AllowErrNote
AllowRepeats
: never block (returnsFalse
).AllowErrNote
NoRepeats
: block only if we have sent a notifcation for this error before.
updatePrevTrigger :: (Eq a, MonadIORef m) => RepeatEvent a -> Maybe a -> m () Source #
If the reference is NoRepeats
or SomeRepeats
then we overwrite the
previous reference with the new parameter. Otherwise we do nothing.