module HaskellWorks.Polysemy.Control.Concurrent.STM.TVar ( TVar, STM.newTVar, newTVarIO, STM.readTVar, readTVarIO, STM.writeTVar, STM.modifyTVar, STM.modifyTVar', STM.stateTVar, STM.swapTVar, registerDelay, ) where import Control.Concurrent.STM (TVar) import qualified Control.Concurrent.STM as STM import HaskellWorks.Polysemy.Prelude import Polysemy newTVarIO :: () => Member (Embed IO) r => a -> Sem r (TVar a) newTVarIO :: forall (r :: EffectRow) a. Member (Embed IO) r => a -> Sem r (TVar a) newTVarIO a a = do IO (TVar a) -> Sem r (TVar a) forall (m :: * -> *) (r :: EffectRow) a. Member (Embed m) r => m a -> Sem r a embed (IO (TVar a) -> Sem r (TVar a)) -> IO (TVar a) -> Sem r (TVar a) forall a b. (a -> b) -> a -> b $ a -> IO (TVar a) forall a. a -> IO (TVar a) STM.newTVarIO a a readTVarIO :: () => Member (Embed IO) r => TVar a -> Sem r a readTVarIO :: forall (r :: EffectRow) a. Member (Embed IO) r => TVar a -> Sem r a readTVarIO TVar a tvar = do IO a -> Sem r a forall (m :: * -> *) (r :: EffectRow) a. Member (Embed m) r => m a -> Sem r a embed (IO a -> Sem r a) -> IO a -> Sem r a forall a b. (a -> b) -> a -> b $ TVar a -> IO a forall a. TVar a -> IO a STM.readTVarIO TVar a tvar registerDelay :: () => Member (Embed IO) r => Int -> Sem r (TVar Bool) registerDelay :: forall (r :: EffectRow). Member (Embed IO) r => Int -> Sem r (TVar Bool) registerDelay Int n = do IO (TVar Bool) -> Sem r (TVar Bool) forall (m :: * -> *) (r :: EffectRow) a. Member (Embed m) r => m a -> Sem r a embed (IO (TVar Bool) -> Sem r (TVar Bool)) -> IO (TVar Bool) -> Sem r (TVar Bool) forall a b. (a -> b) -> a -> b $ Int -> IO (TVar Bool) STM.registerDelay Int n