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