I have a module which looks like this:
module Control.Monad.Aff.AVar.RW
( module Control.Monad.Eff.AVar
, AVar
, Cap
, AVarR
, AVarR'
, AVarW
, AVarW'
, AVarRW
, split
, makeVar
, makeEmptyVar
, status
, isEmptyVar
, isFilledVar
, isKilledVar
, takeVar
, tryTakeVar
, putVar
, tryPutVar
, readVar
, tryReadVar
, killVar
) where
import Prelude
import Control.Monad.Aff.AVar (takeVar, putVar, readVar) as AffAvar
import Control.Monad.Aff.Class (class MonadAff, liftAff)
import Control.Monad.Eff.AVar (AVAR, AVarStatus(..), isEmpty, isFilled, isKilled)
import Control.Monad.Eff.AVar as AVar
import Control.Monad.Eff.Class (class MonadEff, liftEff)
import Control.Monad.Eff.Exception (Error)
import Data.Maybe (Maybe)
import Data.Tuple (Tuple(..))
data Cap
data AVar (r ∷ # Type) a = AVar (AVar.AVar a)
type AVarR = AVarR' ()
type AVarR' r = AVar (read ∷ Cap | r)
type AVarW = AVarW' ()
type AVarW' r = AVar (write ∷ Cap | r)
type AVarRW = AVar (read ∷ Cap, write ∷ Cap)
split ∷ forall a. AVarRW a -> Tuple (AVarR a) (AVarW a)
makeVar ∷ forall m eff a. MonadEff (avar ∷ AVAR | eff) m => a -> m (AVarRW a)
makeEmptyVar ∷ forall m eff a. MonadEff (avar ∷ AVAR | eff) m => m (AVarRW a)
status ∷ forall m eff a r. MonadEff (avar ∷ AVAR | eff) m => AVarR' r a -> m (AVar.AVarStatus a)
isEmptyVar ∷ forall m eff a r. MonadEff (avar ∷ AVAR | eff) m => AVarR' r a -> m Boolean
isFilledVar ∷ forall m eff a r. MonadEff (avar ∷ AVAR | eff) m => AVarR' r a -> m Boolean
isKilledVar ∷ forall m eff a r. MonadEff (avar ∷ AVAR | eff) m => AVarR' r a -> m Boolean
takeVar ∷ forall m eff a. MonadAff (avar ∷ AVAR | eff) m => AVarRW a -> m a
tryTakeVar ∷ forall m eff a. MonadEff (avar ∷ AVAR | eff) m => AVarRW a -> m (Maybe a)
putVar ∷ forall m eff a r. MonadAff (avar ∷ AVAR | eff) m => a -> AVarW' r a -> m Unit
tryPutVar ∷ forall m eff a r. MonadEff (avar ∷ AVAR | eff) m => a -> AVarW' r a -> m Boolean
readVar ∷ forall m eff a r. MonadAff (avar ∷ AVAR | eff) m => AVarR' r a -> m a
tryReadVar ∷ forall m eff a r. MonadEff (avar ∷ AVAR | eff) m => AVarR' r a -> m (Maybe a)
killVar ∷ forall m eff a r. MonadEff (avar ∷ AVAR | eff) m => Error -> AVarW' r a -> m Unit
The Cap is exact same thing as in Bus and i find it very useful. for example if are passing AVar to someone they can do many staff with it but if you instead pass AVarW you know they can only write to it and not read.
if you like I can make similar changes (except Monad{Aff,Eff} i guess) and then in ps-bus we can reuse this Cap.
I have a module which looks like this:
The
Capis exact same thing as inBusand i find it very useful. for example if are passing AVar to someone they can do many staff with it but if you instead passAVarWyou know they can only write to it and not read.if you like I can make similar changes (except Monad{Aff,Eff} i guess) and then in ps-bus we can reuse this
Cap.