Open
Description
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
.
Metadata
Metadata
Assignees
Labels
No labels