notify-effectful
Safe HaskellNone
LanguageGHC2021

Effectful.Notify.Static

Description

Provides an effect for desktop notifications.

Since: 0.1

Synopsis

Description

notify-effectful is a library for implementing cross-platform desktop notifications. Currently supports:

  • Linux: Supports dbus and notify-send. That is, if there is a running dbus notification server, it can be used directly. notify-send (libnotify) can also be used, though it also requires a running dbus server.
  • Osx: Supports built-in apple-script i.e. osascript.
  • Windows: Unsupported. Functions are mere stubs that will compile (with a warning) and do nothing at runtime.

Usage

General usage involves choosing the notification system and using that to initialize the environment:

-- choose system
let systemOs :: NotifySystemOs
    systemOs = ...

-- prepare environment
notifyEnv <- initNotifyEnv systemOs

-- send notification
let note =
      mkNote "A summary"
        & setBody "Some notification"
        & setTitle "My Application"

notify notifyEnv note

Choosing the system is more interesting. If we do not care about being cross-platform, we can simply choose a NotifySystemOs directly and pass it to init:

-- The NotifySystemOsDBus constructor is only available on linux.
let systemOs :: NotifySystemOs
    systemOs = NotifySystemOsDBus

notifyEnv <- initNotifyEnv systemOs
...

If we need to work on several platforms, we can instead use NotifySystem, which includes every possible notification system and is available on all platforms. We then pass it to notifySystemToOs, which -- if successful -- will return the NotifySystemOs and we can continue as normal.

-- All NotifySystem constructors are available on all platforms.
let system :: NotifySystem
    system = ...

systemOs <- notifySystemToOs system >>= \case
  Left ex -> throwM ex
  Right s -> pure s
notifyEnv <- initNotifyEnv systemOs
...

If a system is chosen that is unavailable on the current platform, a NotifyParseException will be returned.

Effect

data Notify (a :: Type -> Type) b Source #

Static notify effect.

Since: 0.1

Instances

Instances details
type DispatchOf Notify Source # 
Instance details

Defined in Effectful.Notify.Static

data StaticRep Notify Source # 
Instance details

Defined in Effectful.Notify.Static

initNotifyEnv Source #

Arguments

:: forall (es :: [Effect]). (HasCallStack, Notify :> es) 
=> NotifySystemOs

System.

-> Eff es NotifyEnv 

Initialize the notification environment.

Since: 0.1

notify Source #

Arguments

:: forall (es :: [Effect]). (HasCallStack, Notify :> es) 
=> NotifyEnv

Env.

-> Note

Note.

-> Eff es () 

Send a notification.

Since: 0.1

Handlers

runNotify :: forall (es :: [Effect]) a. (HasCallStack, IOE :> es) => Eff (Notify ': es) a -> Eff es a Source #

Runs a Notify effect in IO.

Since: 0.1

Errors

data NotifyException Source #

Exceptions thrown when sending notifications. The list of non-fatal exceptions includes:

  • DBus: Non-fatal client errors.

All others are considered fatal.

Since: 0.1

Constructors

MkNotifyException 

Fields

Instances

Instances details
Exception NotifyException Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.NotifyException

Show NotifyException Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.NotifyException

(k ~ A_Lens, a ~ SomeException, b ~ SomeException) => LabelOptic "exception" k NotifyException NotifyException a b Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.NotifyException

(k ~ A_Lens, a ~ Bool, b ~ Bool) => LabelOptic "fatal" k NotifyException NotifyException a b Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.NotifyException

(k ~ A_Lens, a ~ Note, b ~ Note) => LabelOptic "note" k NotifyException NotifyException a b Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.NotifyException

(k ~ A_Lens, a ~ NotifySystem, b ~ NotifySystem) => LabelOptic "notifySystem" k NotifyException NotifyException a b Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.NotifyException

catchNonFatalNotify Source #

Arguments

:: forall (es :: [Effect]). (HasCallStack, Notify :> es) 
=> NotifyEnv

Env.

-> Note

Note.

-> (NotifyException -> Eff es ())

Handler.

-> Eff es () 

Runs notify and runs the handler on any non-fatal NotifyExceptions. Any other exceptions are rethrown.

Since: 0.1

tryNonFatalNotify Source #

Arguments

:: forall (es :: [Effect]). (HasCallStack, Notify :> es) 
=> NotifyEnv

Env.

-> Note

Note.

-> Eff es (Maybe NotifyException) 

Like notify, but catches non-fatal NotifyException.

Since: 0.1

tryNonFatalNotify_ Source #

Arguments

:: forall (es :: [Effect]). (HasCallStack, Notify :> es) 
=> NotifyEnv

Env.

-> Note

Note.

-> Eff es () 

Like tryNonFatalNotify, but catches and discards the exception.

Since: 0.1

Types

System

Platform-specific

data NotifySystemOs Source #

Notification system. Options are platform specific.

Since: 0.1

Instances

Instances details
NFData NotifySystemOs Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

Methods

rnf :: NotifySystemOs -> () #

Bounded NotifySystemOs Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

Enum NotifySystemOs Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

Generic NotifySystemOs Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

Associated Types

type Rep NotifySystemOs 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

type Rep NotifySystemOs = D1 ('MetaData "NotifySystemOs" "Effectful.Notify.Internal.Data.NotifySystem" "notify-effectful-0.1-inplace" 'False) (C1 ('MetaCons "NotifySystemOsDBus" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "NotifySystemOsNotifySend" 'PrefixI 'False) (U1 :: Type -> Type))
Show NotifySystemOs Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

Eq NotifySystemOs Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

Ord NotifySystemOs Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

Display NotifySystemOs Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

type Rep NotifySystemOs Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

type Rep NotifySystemOs = D1 ('MetaData "NotifySystemOs" "Effectful.Notify.Internal.Data.NotifySystem" "notify-effectful-0.1-inplace" 'False) (C1 ('MetaCons "NotifySystemOsDBus" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "NotifySystemOsNotifySend" 'PrefixI 'False) (U1 :: Type -> Type))

All platforms

data NotifySystem Source #

Represents all possible notification systems. This is useful for when we want to choose the system in some way that works across multiple platforms without requiring cpp.

Since: 0.1

Instances

Instances details
NFData NotifySystem Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

Methods

rnf :: NotifySystem -> () #

Bounded NotifySystem Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

Enum NotifySystem Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

Generic NotifySystem Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

Associated Types

type Rep NotifySystem 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

type Rep NotifySystem = D1 ('MetaData "NotifySystem" "Effectful.Notify.Internal.Data.NotifySystem" "notify-effectful-0.1-inplace" 'False) ((C1 ('MetaCons "NotifySystemAppleScript" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "NotifySystemDBus" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "NotifySystemNotifySend" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "NotifySystemWindows" 'PrefixI 'False) (U1 :: Type -> Type)))
Show NotifySystem Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

Eq NotifySystem Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

Ord NotifySystem Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

Display NotifySystem Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

type Rep NotifySystem Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifySystem

type Rep NotifySystem = D1 ('MetaData "NotifySystem" "Effectful.Notify.Internal.Data.NotifySystem" "notify-effectful-0.1-inplace" 'False) ((C1 ('MetaCons "NotifySystemAppleScript" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "NotifySystemDBus" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "NotifySystemNotifySend" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "NotifySystemWindows" 'PrefixI 'False) (U1 :: Type -> Type)))

notifySystemToOs :: NotifySystem -> Either NotifyParseException NotifySystemOs Source #

Converts platform-agnostic NotifySystem to platform-specific NotifySystemOs. Useful for obtaining a valid system for the current platform without cpp.

Since: 0.1

data Os Source #

Os types.

Since: 0.1

Constructors

Linux

Since: 0.1

Osx

Since: 0.1

Windows

Since: 0.1

Instances

Instances details
Bounded Os Source # 
Instance details

Defined in Effectful.Notify.Internal.Os

Methods

minBound :: Os #

maxBound :: Os #

Show Os Source # 
Instance details

Defined in Effectful.Notify.Internal.Os

Methods

showsPrec :: Int -> Os -> ShowS #

show :: Os -> String #

showList :: [Os] -> ShowS #

Eq Os Source # 
Instance details

Defined in Effectful.Notify.Internal.Os

Methods

(==) :: Os -> Os -> Bool #

(/=) :: Os -> Os -> Bool #

Display Os Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Os

Env

data NotifyEnv Source #

Notification environment.

Since: 0.1

notifyEnvToSystemOs :: NotifyEnv -> NotifySystemOs Source #

Gives the system for the given environment.

Since: 0.1

Notes

data Note Source #

Notification type.

Since: 0.1

Instances

Instances details
NFData Note Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.Note

Methods

rnf :: Note -> () #

Generic Note Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.Note

Methods

from :: Note -> Rep Note x #

to :: Rep Note x -> Note #

Show Note Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.Note

Methods

showsPrec :: Int -> Note -> ShowS #

show :: Note -> String #

showList :: [Note] -> ShowS #

Eq Note Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.Note

Methods

(==) :: Note -> Note -> Bool #

(/=) :: Note -> Note -> Bool #

Ord Note Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.Note

Methods

compare :: Note -> Note -> Ordering #

(<) :: Note -> Note -> Bool #

(<=) :: Note -> Note -> Bool #

(>) :: Note -> Note -> Bool #

(>=) :: Note -> Note -> Bool #

max :: Note -> Note -> Note #

min :: Note -> Note -> Note #

HasField "summary" Note Text Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.Note

Methods

getField :: Note -> Text #

(k ~ A_Lens, a ~ Maybe Text, b ~ Maybe Text) => LabelOptic "body" k Note Note a b Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.Note

(k ~ A_Lens, a ~ Text, b ~ Text) => LabelOptic "summary" k Note Note a b Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.Note

(k ~ A_Lens, a ~ Maybe NotifyTimeout, b ~ Maybe NotifyTimeout) => LabelOptic "timeout" k Note Note a b Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.Note

(k ~ A_Lens, a ~ Maybe Text, b ~ Maybe Text) => LabelOptic "title" k Note Note a b Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.Note

(k ~ A_Lens, a ~ Maybe NotifyUrgency, b ~ Maybe NotifyUrgency) => LabelOptic "urgency" k Note Note a b Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.Note

HasField "body" Note (Maybe Text) Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.Note

Methods

getField :: Note -> Maybe Text #

HasField "timeout" Note (Maybe NotifyTimeout) Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.Note

HasField "title" Note (Maybe Text) Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.Note

Methods

getField :: Note -> Maybe Text #

HasField "urgency" Note (Maybe NotifyUrgency) Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.Note

type Rep Note Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.Note

mkNote :: Text -> Note Source #

Makes a note from a text summary.

setBody :: Maybe Text -> Note -> Note Source #

Since: 0.1

getBody :: Note -> Maybe Text Source #

Since: 0.1

setSummary :: Text -> Note -> Note Source #

Since: 0.1

getSummary :: Note -> Text Source #

Since: 0.1

setTitle :: Maybe Text -> Note -> Note Source #

Since: 0.1

getTitle :: Note -> Maybe Text Source #

Since: 0.1

Timeout

data NotifyTimeout Source #

Notification timeout, in milliseconds.

Since: 0.1

Instances

Instances details
NFData NotifyTimeout Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifyTimeout

Methods

rnf :: NotifyTimeout -> () #

Generic NotifyTimeout Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifyTimeout

Associated Types

type Rep NotifyTimeout 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifyTimeout

type Rep NotifyTimeout = D1 ('MetaData "NotifyTimeout" "Effectful.Notify.Internal.Data.NotifyTimeout" "notify-effectful-0.1-inplace" 'False) (C1 ('MetaCons "NotifyTimeoutNever" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "NotifyTimeoutMillis" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 Int)))
Show NotifyTimeout Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifyTimeout

Eq NotifyTimeout Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifyTimeout

Ord NotifyTimeout Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifyTimeout

Display NotifyTimeout Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.NotifyTimeout

HasField "timeout" Note (Maybe NotifyTimeout) Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.Note

type Rep NotifyTimeout Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifyTimeout

type Rep NotifyTimeout = D1 ('MetaData "NotifyTimeout" "Effectful.Notify.Internal.Data.NotifyTimeout" "notify-effectful-0.1-inplace" 'False) (C1 ('MetaCons "NotifyTimeoutNever" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "NotifyTimeoutMillis" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 Int)))

NotifyUrgency

data NotifyUrgency Source #

Notification urgency. Not supported by all notification systems.

Instances

Instances details
NFData NotifyUrgency Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifyUrgency

Methods

rnf :: NotifyUrgency -> () #

Bounded NotifyUrgency Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifyUrgency

Enum NotifyUrgency Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifyUrgency

Generic NotifyUrgency Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifyUrgency

Associated Types

type Rep NotifyUrgency 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifyUrgency

type Rep NotifyUrgency = D1 ('MetaData "NotifyUrgency" "Effectful.Notify.Internal.Data.NotifyUrgency" "notify-effectful-0.1-inplace" 'False) (C1 ('MetaCons "NotifyUrgencyLow" 'PrefixI 'False) (U1 :: Type -> Type) :+: (C1 ('MetaCons "NotifyUrgencyNormal" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "NotifyUrgencyCritical" 'PrefixI 'False) (U1 :: Type -> Type)))
Show NotifyUrgency Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifyUrgency

Eq NotifyUrgency Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifyUrgency

Ord NotifyUrgency Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifyUrgency

Display NotifyUrgency Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.NotifyUrgency

HasField "urgency" Note (Maybe NotifyUrgency) Source #

Since: 0.1

Instance details

Defined in Effectful.Notify.Internal.Data.Note

type Rep NotifyUrgency Source # 
Instance details

Defined in Effectful.Notify.Internal.Data.NotifyUrgency

type Rep NotifyUrgency = D1 ('MetaData "NotifyUrgency" "Effectful.Notify.Internal.Data.NotifyUrgency" "notify-effectful-0.1-inplace" 'False) (C1 ('MetaCons "NotifyUrgencyLow" 'PrefixI 'False) (U1 :: Type -> Type) :+: (C1 ('MetaCons "NotifyUrgencyNormal" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "NotifyUrgencyCritical" 'PrefixI 'False) (U1 :: Type -> Type)))