Module nimobserver

A message event queue implementation

To start listening, init a Subject object to return a pointer to a Subject on the shared heap so that all published messages are handled on other threads

Must be compiled with --threads:on for channels and threads

Example

import nimobserver

proc onNotify(observer: myObserverClass, message: MyMessageClass) =
  echo "Notified of message " & $message

let globalTestSub: SubjectPtr[MessagePtr] = initSubject[MessagePtr]()
globalTestSub.add(MyObserverClass)
globalTestSub.publish(MyMessageClass)

Types

BaseObserver = ref object {.
inheritable
.}
Base Observer Class
BaseMessage = ref object {.
inheritable
.}
Subject[T] = object {.
inheritable
.} observers: seq[BaseObserver] channel: Channel[T]
The Subject keeps track of observers and maintains an open channel to handle message type T. T must be a pointer in order to be accessible by the shared Subject
SubjectPtr[T] = ptr Subject[T]

Procs

proc newSubject[T](): SubjectPtr[T]
Create a new SubjectPtr on the shared heap
proc initSubject[T](): SubjectPtr[T]
Initialise a SubjectPtr and wait for messages on another thread
proc destroySubject[T](subject: SubjectPtr[T])
Deallocate shared memory
proc `$`(x: BaseObserver): string {.
raises: [], tags: []
.}
Prints the Observer type
proc `$`[T](x: SubjectPtr[T]): string

Methods

method onNotify(observer: BaseObserver; message: ptr BaseMessage) {.
base, gcsafe, raises: [], tags: []
.}
Base method for observers to implement. Observers are notified when a message is received
method publish[T](subject: SubjectPtr[T]; message: T) {.
base
.}
Send our message through our channel, which will notify any observers
method addObserver[T](subject: SubjectPtr[T]; observer: BaseObserver) {.
base
.}
Add an Observer to be notified on a message being received
method removeObserver[T](subject: SubjectPtr[T]; observer: BaseObserver) {.
base
.}
Remove an Observer, causing it to no longer be notified when a message is published