unison-cli-0.0.0
Safe HaskellSafe-Inferred
LanguageHaskell2010

Unison.LSP.Util.Signal

Description

A transactional signal type. Similar to a broadcast channel, but with better memory characteristics when you only care about the latest value.

Allows multiple consumers to detect the latest value of a signal, and to be notified when the signal changes.

Synopsis

Documentation

newSignalIO :: MonadIO m => Maybe a -> m (Signal a) Source #

Create a new signal with an optional initial value.

writeSignal :: Signal a -> a -> STM () Source #

Update the value of a signal, notifying all subscribers (even if the value didn't change)

writeSignalIO :: MonadIO m => Signal a -> a -> m () Source #

Update the value of a signal, notifying all subscribers (even if the value didn't change)

subscribe :: MonadIO m => Signal a -> m (STM a) Source #

Subscribe to a signal, returning an STM action which will read the latest NEW value, after successfully reading a new value, subsequent reads will retry until there's a new value written to the signal.

Each independent reader should have its own subscription.

>>> signal <- newSignalIO (Just "initial")
>>> subscriber1 <- subscribe signal
>>> subscriber2 <- subscribe signal
>>> -- Should return the initial value
>>> atomically (optional subscriber1)
>>> -- Should retry, since the signal hasn't changed.
>>> atomically (optional subscriber1)
>>> writeSignalIO signal "new value"
>>> -- Each subscriber should return the newest value
>>> ("sub1",) <$> atomically (optional subscriber1)
>>> ("sub2",) <$> atomically (optional subscriber2)
>>> -- Both should now retry
>>> ("sub1",) <$> atomically (optional subscriber1)
>>> ("sub2",) <$> atomically (optional subscriber2)
Just "initial"
Nothing
("sub1",Just "new value")
("sub2",Just "new value")
("sub1",Nothing)
("sub2",Nothing)

data Signal a Source #