| 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 parameteraequals the previousastored 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).AllowErrNoteAllowRepeats: never block (returnsFalse).AllowErrNoteNoRepeats: 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.