packages feed

tricorder-0.2.0.0: src/Tricorder/CLI/UI/BrickChan.hs

module Tricorder.CLI.UI.BrickChan
    ( BrickChan
    , BChan
    , newBChan
    , writeBChan
    , readBChan
    , runBrickChan
    ) where

import Brick.BChan (BChan)
import Effectful (Effect, IOE)
import Effectful.Dispatch.Dynamic (interpret_)
import Effectful.TH (makeEffect)

import Brick.BChan qualified as BChan


data BrickChan :: Effect where
    -- | Lifted `Brick.BChan.newBChan`
    NewBChan :: Int -> BrickChan m (BChan a)
    -- | Lifted `Brick.BChan.writeBChan`
    WriteBChan :: BChan a -> a -> BrickChan m ()
    -- | Lifted `Brick.BChan.readBChan`
    ReadBChan :: BChan a -> BrickChan m a


makeEffect ''BrickChan


runBrickChan :: (IOE :> es) => Eff (BrickChan : es) a -> Eff es a
runBrickChan = interpret_ \case
    NewBChan n -> liftIO $ BChan.newBChan n
    WriteBChan c x -> liftIO $ BChan.writeBChan c x
    ReadBChan c -> liftIO $ BChan.readBChan c