chan-0.0.3: README.md
# chan
This is just some extra `Chan` and `TChan` kit that might help the average user. It relies on
spawning threads with `async` and either canceling (debouncing) or waiting (throttling) messages.
Unfortunately, the current design is untyped in the sense that the channel which you supply is the
_output_ channel, and the returned channel is the one you would write to. I'm not sure how this should
be fixed.
An example might be the following:
```haskell
import Control.Concurrent.Chan (readChan)
import Control.Concurrent.Chan.Extra (throttleStatic, intersperseStatic)
-- For example, some websockets:
data SomeMessage
= Ping
-- | ...
throttleLayer :: Chan SomeMessage -> IO (Chan SomeMessage)
throttleLayer output = do
(x,_) <- throttleStatic output 1000000 -- nanoseconds, = 1 second
pure x
pingLayer :: Chan SomeMessage -> IO (Chan SomeMessage)
pingLayer output = do
(x,_,_) <- intersperseStatic output (pure Ping) 1000000
pure x
performWebsocket :: Chan SomeMessage -> IO ()
performWebsocket output = do
output' <- pingLayer =<< throttleLayer output
_ <- async $ forever $ do
msg <- readChan output'
send msg -- something like that - it'll include Ping messages for us,
-- and throttle the outgoing messages at the same time.
```