-- | Semisynchronous interprocess communication. module System.Miniplex ( module System.Miniplex.Sink, module System.Miniplex.Source -- * Overview -- -- $over -- * Implementation -- -- $impl ) where import System.Miniplex.Sink import System.Miniplex.Source -- $over -- This module provides interprocess communication channels. This is meant -- to be used by logger-like programs that want to send status reports to -- N listeners (where N >= 0). -- -- Such a logger would 'create' a 'Sink' with a certain tag and just start -- writing messages to it. Then, at any point a client knowing the tag can -- 'attach' a 'Source' and receive those messages -- until it disconnects. -- This is all completely transparent to the logger. -- -- Because each message is intended to be a complete status update, 'write' -- does not buffer unsent messages: A client that is not ready to read when -- a new message arrives will simply skip it (and hopefully continue -- processing with the next message). However, there is one exception to -- this rule: A 'Sink' remembers the last message sent and repeats it -- to newly connected clients. Therefore a client will always receive a -- message immediately after connecting unless the logger hasn't sent -- anything so far. -- $impl -- The implementation is based on named sockets. Specifically, @'create' -- \"tag\"@ creates the socket @~\/.miniplex\/tag@. It also spawns a thread -- to watch it, which in turn spawns one thread per connected client. -- 'attach' simply connects to this socket; no threads are spawned by -- "System.Miniplex.Source".