navi
Safe HaskellNone
LanguageGHC2021

Navi.Event

Description

This module provides functionality for handling events.

Synopsis

Event type

data Event result trigger Source #

Event represents sending notifications. An event will:

  1. Query for information (i.e. run a shell command).
  2. Parse the result.
  3. Map the result to a trigger.
  4. 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

Instances details
(k ~ A_Lens, a ~ ErrorNote, b ~ ErrorNote) => LabelOptic "errorNote" k (Event result trigger) (Event result trigger) a b Source # 
Instance details

Defined in Navi.Event.Types

Methods

labelOptic :: Optic k NoIx (Event result trigger) (Event result trigger) a b Source #

(k ~ A_Lens, a ~ Text, b ~ Text) => LabelOptic "name" k (Event result trigger) (Event result trigger) a b Source # 
Instance details

Defined in Navi.Event.Types

Methods

labelOptic :: Optic k NoIx (Event result trigger) (Event result trigger) a b Source #

(k ~ A_Lens, a ~ PollInterval, b ~ PollInterval) => LabelOptic "pollInterval" k (Event result trigger) (Event result trigger) a b Source # 
Instance details

Defined in Navi.Event.Types

Methods

labelOptic :: Optic k NoIx (Event result trigger) (Event result trigger) a b Source #

(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 # 
Instance details

Defined in Navi.Event.Types

Methods

labelOptic :: Optic k NoIx (Event result trigger) (Event result trigger) a b Source #

(k ~ A_Lens, a ~ RepeatEvent trigger, b ~ RepeatEvent trigger) => LabelOptic "repeatEvent" k (Event result trigger) (Event result trigger) a b Source # 
Instance details

Defined in Navi.Event.Types

Methods

labelOptic :: Optic k NoIx (Event result trigger) (Event result trigger) a b Source #

(k ~ A_Lens, a ~ ServiceType result, b ~ ServiceType result) => LabelOptic "serviceType" k (Event result trigger) (Event result trigger) a b Source # 
Instance details

Defined in Navi.Event.Types

Methods

labelOptic :: Optic k NoIx (Event result trigger) (Event result trigger) a b Source #

Show trigger => Show (Event result trigger) Source # 
Instance details

Defined in Navi.Event.Types

Methods

showsPrec :: Int -> Event result trigger -> ShowS #

show :: Event result trigger -> String #

showList :: [Event result trigger] -> ShowS #

data AnyEvent where Source #

Existentially quantifies result type on an Event. Used so that we can store different events in the same list.

Constructors

MkAnyEvent :: forall trigger result. (Ord trigger, Show result, Show trigger) => Event result trigger -> AnyEvent 

Instances

Instances details
Show AnyEvent Source # 
Instance details

Defined in Navi.Event.Types

runEvent :: (HasCallStack, MonadLoggerNS m env k, MonadSystemInfo m, Show result) => Event result trigger -> m (EventSuccess result trigger) Source #

Runs an event, i.e.,

  1. Queries the system via MonadSystemInfo.
  2. 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

Instances details
(k ~ A_Lens, a ~ Maybe PollInterval, b ~ Maybe PollInterval) => LabelOptic "pollInterval" k (EventSuccess result trigger) (EventSuccess result trigger) a b Source # 
Instance details

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 # 
Instance details

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 # 
Instance details

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 # 
Instance details

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 

Fields

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

Instances details
Show a => Show (RepeatEvent a) Source # 
Instance details

Defined in Navi.Event.Types

data ErrorNote Source #

Determines if we should send notifications for errors and, if so, if we allow repeats.

Constructors

NoErrNote 
AllowErrNote (RepeatEvent ()) 

Instances

Instances details
Show ErrorNote Source # 
Instance details

Defined in Navi.Event.Types

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:

  1. AllowRepeats: never block (returns False).
  2. NoRepeats: block only if the parameter a equals the previous a stored in our ref.

blockErr :: (MonadLoggerNS m env k, MonadIORef m) => ErrorNote -> m Bool Source #

Determines if we should block the error event. The semantics are:

  1. NoErrNote: always block (returns True).
  2. AllowErrNote AllowRepeats: never block (returns False).
  3. 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.