| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Control.Eff.Concurrent.Protocol.Observer
Description
Observer Effects
This module supports the implementation of observerRegistry and observables. Expected use case is event propagation.
The observable event sources and the observers are usually server processes for a
protocol that embeds the ObserverRegistry and Observer Pdus respectively.
A generic FIFO queue based observer can be found in Control.Eff.Concurrent.Protocol.Observer.Queue.
Since: 0.16.0
Synopsis
- newtype Observer event = MkObserver (Arg ProcessId (ObservationSink event))
- data ObservationSink event
- type IsObservable eventSource event = (Tangible event, Embeds eventSource (ObserverRegistry event), HasPdu eventSource)
- type CanObserve eventSink event = (Tangible event, Embeds eventSink (Observer event), HasPdu eventSink)
- data family Pdu protocol (reply :: Synchronicity)
- registerObserver :: forall event eventSink eventSource r q. (HasCallStack, HasProcesses r q, IsObservable eventSource event, Tangible (Pdu eventSource Asynchronous), Tangible (Pdu eventSink Asynchronous), CanObserve eventSink event) => Endpoint eventSource -> Endpoint eventSink -> Eff r ()
- forgetObserver :: forall event eventSink eventSource r q. (HasProcesses r q, HasCallStack, Tangible (Pdu eventSource Asynchronous), Tangible (Pdu eventSink Asynchronous), IsObservable eventSource event, CanObserve eventSink event) => Endpoint eventSource -> Endpoint eventSink -> Eff r ()
- forgetObserverUnsafe :: forall event eventSource r q. (HasProcesses r q, HasCallStack, Tangible (Pdu eventSource Asynchronous), IsObservable eventSource event) => Endpoint eventSource -> ProcessId -> Eff r ()
- data ObserverRegistry (event :: Type) = MkObserverRegistry {
- _observerRegistry :: Map ProcessId (ObservationSink event)
- type ObserverRegistryState event = State (ObserverRegistry event)
- observerRegistryNotify :: forall event r q. (HasProcesses r q, Member (ObserverRegistryState event) r, Tangible event, HasCallStack) => event -> Eff r ()
- evalObserverRegistryState :: HasCallStack => Eff (ObserverRegistryState event ': r) a -> Eff r a
- emptyObserverRegistry :: ObserverRegistry event
- observerRegistryHandlePdu :: forall event q r. (HasCallStack, Typeable event, HasProcesses r q, Member (ObserverRegistryState event) r, Member Logs r) => Pdu (ObserverRegistry event) Asynchronous -> Eff r ()
- observerRegistryRemoveProcess :: forall event q r. (HasCallStack, Typeable event, HasProcesses r q, Member (ObserverRegistryState event) r, Member Logs r) => ProcessId -> Eff r Bool
Documentation
newtype Observer event Source #
A protocol to communicate Observed events from a sources to many sinks.
A sink is any process that serves a protocol with a Pdu instance that embeds
the Observer Pdu via an HasPduPrism instance.
This type has dual use, for one it serves as type-index for Pdu, i.e.
HasPdu respectively, and secondly it contains an ObservationSink and
a MonitorReference.
The ObservationSink is used to serialize and send the Observed events,
while the ProcessId serves as key for internal maps.
Since: 0.28.0
Constructors
| MkObserver (Arg ProcessId (ObservationSink event)) |
Instances
data ObservationSink event Source #
The Information necessary to wrap an Observed event to a process specific
message, e.g. the embedded Observer Pdu instance, and the MonitorReference of
the destination process.
Since: 0.28.0
Instances
type IsObservable eventSource event = (Tangible event, Embeds eventSource (ObserverRegistry event), HasPdu eventSource) Source #
Convenience type alias.
Since: 0.28.0
type CanObserve eventSink event = (Tangible event, Embeds eventSink (Observer event), HasPdu eventSink) Source #
Convenience type alias.
Since: 0.28.0
data family Pdu protocol (reply :: Synchronicity) Source #
The protocol data unit type for the given protocol.
Instances
registerObserver :: forall event eventSink eventSource r q. (HasCallStack, HasProcesses r q, IsObservable eventSource event, Tangible (Pdu eventSource Asynchronous), Tangible (Pdu eventSink Asynchronous), CanObserve eventSink event) => Endpoint eventSource -> Endpoint eventSink -> Eff r () Source #
And an Observer to the set of recipients for all observations reported by observerRegistryNotify.
Note that the observerRegistry are keyed by the observing process, i.e. a previous entry for the process
contained in the Observer is overwritten. If you want multiple entries for a single process, just
combine several filter functions.
Since: 0.16.0
forgetObserver :: forall event eventSink eventSource r q. (HasProcesses r q, HasCallStack, Tangible (Pdu eventSource Asynchronous), Tangible (Pdu eventSink Asynchronous), IsObservable eventSource event, CanObserve eventSink event) => Endpoint eventSource -> Endpoint eventSink -> Eff r () Source #
Send the ForgetObserver message
Since: 0.16.0
forgetObserverUnsafe :: forall event eventSource r q. (HasProcesses r q, HasCallStack, Tangible (Pdu eventSource Asynchronous), IsObservable eventSource event) => Endpoint eventSource -> ProcessId -> Eff r () Source #
Send the ForgetObserver message, use a raw ProcessId as parameter.
Since: 0.28.0
data ObserverRegistry (event :: Type) Source #
A protocol for managing Observers, encompassing registration and de-registration of
Observers.
Since: 0.28.0
Constructors
| MkObserverRegistry | |
Fields
| |
Instances
type ObserverRegistryState event = State (ObserverRegistry event) Source #
Alias for the effect that contains the observers managed by evalObserverRegistryState
observerRegistryNotify :: forall event r q. (HasProcesses r q, Member (ObserverRegistryState event) r, Tangible event, HasCallStack) => event -> Eff r () Source #
Report an observation to all observers.
The process needs to evalObserverRegistryState and to observerRegistryHandlePdu.
Since: 0.28.0
evalObserverRegistryState :: HasCallStack => Eff (ObserverRegistryState event ': r) a -> Eff r a Source #
Keep track of registered Observers.
Handle the ObserverRegistryState effect, i.e. run evalState on an emptyObserverRegistry.
Since: 0.28.0
emptyObserverRegistry :: ObserverRegistry event Source #
The empty ObserverRegistryState
Since: 0.28.0
observerRegistryHandlePdu :: forall event q r. (HasCallStack, Typeable event, HasProcesses r q, Member (ObserverRegistryState event) r, Member Logs r) => Pdu (ObserverRegistry event) Asynchronous -> Eff r () Source #
Provide the implementation for the ObserverRegistry Protocol, this handled RegisterObserver and ForgetObserver
messages. It also adds the ObserverRegistryState constraint to the effect list.
Since: 0.28.0
observerRegistryRemoveProcess :: forall event q r. (HasCallStack, Typeable event, HasProcesses r q, Member (ObserverRegistryState event) r, Member Logs r) => ProcessId -> Eff r Bool Source #
Remove the entry in the ObserverRegistry for the ProcessId
and return True if there was an entry, False otherwise.
Since: 0.28.0