{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Control.Concurrent.STM.ToolsYj (newDefaultTVar, readModifyTVar, checkFlag) where

import Control.Concurrent.STM
import Data.Default
import Data.Bool

newDefaultTVar :: Default a => STM (TVar a)
newDefaultTVar :: forall a. Default a => STM (TVar a)
newDefaultTVar = a -> STM (TVar a)
forall a. a -> STM (TVar a)
newTVar a
forall a. Default a => a
def

readModifyTVar :: TVar a -> (a -> a) -> STM a
readModifyTVar :: forall a. TVar a -> (a -> a) -> STM a
readModifyTVar TVar a
v a -> a
f = TVar a -> STM a
forall a. TVar a -> STM a
readTVar TVar a
v STM a -> STM () -> STM a
forall a b. STM a -> STM b -> STM a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* TVar a -> (a -> a) -> STM ()
forall a. TVar a -> (a -> a) -> STM ()
modifyTVar TVar a
v a -> a
f

checkFlag :: TVar Bool -> STM Bool
checkFlag :: TVar Bool -> STM Bool
checkFlag TVar Bool
flg = TVar Bool -> STM Bool
forall a. TVar a -> STM a
readTVar TVar Bool
flg STM Bool -> (Bool -> STM Bool) -> STM Bool
forall a b. STM a -> (a -> STM b) -> STM b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= STM Bool -> STM Bool -> Bool -> STM Bool
forall a. a -> a -> Bool -> a
bool (Bool -> STM Bool
forall a. a -> STM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False) (Bool
True Bool -> STM () -> STM Bool
forall a b. a -> STM b -> STM a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ TVar Bool -> Bool -> STM ()
forall a. TVar a -> a -> STM ()
writeTVar TVar Bool
flg Bool
False)