packages feed

yaftee-basic-monads-0.1.0.0: src/Control/Monad/Yaftee/ST.hs

{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Control.Monad.Yaftee.ST (

	-- * TYPE

	S,

	-- * REF

	newRef, readRef, writeRef, modifyRef, modifyRef',

	) where

import Prelude hiding (read)
import Control.Monad.ST qualified as ST
import Control.Monad.Yaftee.Eff qualified as Eff
import Control.HigherOpenUnion qualified as Union
import Data.STRef qualified as ST

type (S s) = Union.FromFirst (ST.ST s)

newRef :: forall s effs i o a .
	Union.Base (S s) effs => a -> Eff.E effs i o (ST.STRef s a)
newRef = Eff.effBase . ST.newSTRef

readRef :: forall s effs i o a .
	Union.Base (S s) effs => ST.STRef s a -> Eff.E effs i o a
readRef = Eff.effBase . ST.readSTRef

writeRef :: forall s effs i o a .
	Union.Base (S s) effs => ST.STRef s a -> a -> Eff.E effs i o ()
writeRef = (Eff.effBase .) . ST.writeSTRef

modifyRef, modifyRef' :: forall s effs i o a .
	Union.Base (S s) effs => ST.STRef s a -> (a -> a) -> Eff.E effs i o ()
modifyRef = (Eff.effBase .) . ST.modifySTRef
modifyRef' = (Eff.effBase .) . ST.modifySTRef'