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