Skip to content

Instantly share code, notes, and snippets.

@dminuoso

dminuoso/f.hs Secret

Last active October 28, 2022 23:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dminuoso/f42f92a27457088ce0d927175d7a21fc to your computer and use it in GitHub Desktop.
Save dminuoso/f42f92a27457088ce0d927175d7a21fc to your computer and use it in GitHub Desktop.
data Event = Event { eventTag :: Int
, eventPayload :: Pay }
data BackendWithChan = BackendWithChan
{ bwcBackend :: Backend
, bwcBroadcast :: TChan Event
}
data Backend = Backend { backendTag :: Int }
makeBackends :: [Backend] -> STM [BackendWithChan]
makeBackends bs = do
writer <- newBroadcastTChan
traverse (BackendWithChan b <$> dupChan writer) bs
awaitEvent :: BackendWithChan -> STM Event
awaitEvent b = do e <- readTVar (bwcBroadcast b)
if eventTag e == backendTag (bwcBackend b)
then awaitEvent b
else pure e
tryAwaitEvent :: BackendWithChan -> STM (Maybe Event)
tryAwaitEvent b = do e <- readTVar (bwcBroadcast b)
case e of
Nothing -> pure Nothing
Just e | eventTag e == backendTag (bwcBackend b)
-> tryAwaitEvent b
| otherwise
-> pure (Just e)
tryAwaitEventIO :: BackendWithChan -> IO (Maybe Event)
tryAwaitEventIO = atomically . tryAwaitEvent
runBackend :: BackendWithChan -> IO ()
runBackend b = do whatever...
run :: [Backend] -> IO ()
run bs = do bsc <- atomically (makeBackends bs)
mapConcurrently runBackend bsc
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment