packages feed

tricorder-0.1.0.0: src/Tricorder/Effects/BrickChan.hs

module Tricorder.Effects.BrickChan
    ( BrickChan
    , BChan
    , newBChan
    , writeBChan
    , writeBChanNonBlocking
    , readBChan
    , readBChan2
    , 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.writeBChanNonBlocking`
    WriteBChanNonBlocking :: BChan a -> a -> BrickChan m Bool
    -- | Lifted `Brick.BChan.readBChan`
    ReadBChan :: BChan a -> BrickChan m a
    -- | Lifted `Brick.BChan.readBChan2`
    ReadBChan2 :: BChan a -> BChan b -> BrickChan m (Either a b)


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
    WriteBChanNonBlocking c x -> liftIO $ BChan.writeBChanNonBlocking c x
    ReadBChan c -> liftIO $ BChan.readBChan c
    ReadBChan2 c1 c2 -> liftIO $ BChan.readBChan2 c1 c2