packages feed

liblawless-0.26.0: Source/STM/Hub.hs

{-|
Module:             STM.Hub
Description:        Hub's are bounded single-reader-multiple-writer queues.
Copyright:          © 2017 All rights reserved.
License:            GPL-3
Maintainer:         Evan Cofsky <evan@theunixman.com>
Stability:          experimental
Portability:        POSIX
-}

module STM.Hub (
    HubLength,
    Hub,
    hub,

    hubMsg,
    hubEmpty,

    Source,
    source,
    sourceMsg
    )where

import Lawless
import STM.Base

-- * The 'Hub'

-- | The length of a 'Hub', guaranteed to be positive.
newtype HubLength = HubLength Word64
    deriving (Eq, Ord, Show, Bounded, Enum, Num, Integral, Real)

-- | The 'Hub' receives the messages from various 'Source's.
newtype Hub a = Hub {unHub ∷ TBChan a}

hub ∷ MonadBase IO m ⇒ HubLength → m (Hub a)
hub l = liftBase $ Hub <$> (newTBChanIO $ fromIntegral l)

hubMsg ∷ MonadBase IO m ⇒ (Hub a) → (m a)
hubMsg = atomically ∘ readTBChan ∘ unHub

hubEmpty ∷ MonadBase IO m ⇒ (Hub a) → (m Bool)
hubEmpty = atomically ∘  isEmptyTBChan ∘ unHub

-- * The 'Source'

-- | A 'Source' attached to a 'Hub' that can send messages to it.
newtype Source a = Source {unSource ∷ TBChan a}

-- | Create a 'Source' attached to a 'Hub'.
source ∷ Getter (Hub a) (Source a)
source = to $ Source ∘ unHub

-- | Send a message to a 'Hub' through a 'Source'.
sourceMsg ∷ MonadBase IO m ⇒ Source a → a → m ()
sourceMsg s = atomically ∘ writeTBChan (unSource s)