module HaskellWorks.Polysemy.Control.Concurrent.STM
  ( TVar,
    atomically,
    STM.orElse,
    STM.retry,
    STM.check,
    STM.throwSTM,
    STM.catchSTM,
  ) where

import           Control.Concurrent.STM        (STM, TVar)
import qualified Control.Concurrent.STM        as STM
import           HaskellWorks.Polysemy.Prelude
import           Polysemy

atomically :: ()
  => Member (Embed IO) r
  => STM a
  -> Sem r a
atomically :: forall (r :: EffectRow) a. Member (Embed IO) r => STM a -> Sem r a
atomically STM a
m =
  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
$ STM a -> IO a
forall a. STM a -> IO a
STM.atomically STM a
m