{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
module Hedgehog.Extras.Test.Concurrent
( threadDelay
, asyncRegister_
, module Control.Concurrent.Async.Lifted
, module Control.Concurrent.MVar.Lifted
, module System.Timeout.Lifted
) where
import Control.Concurrent.Async.Lifted
import qualified Control.Concurrent.Lifted as IO
import Control.Concurrent.MVar.Lifted
import Control.Monad.IO.Class
import Control.Monad.Trans.Resource
import Data.Function
import Data.Int
import qualified GHC.Stack as GHC
import System.IO (IO)
import System.Timeout.Lifted
import Hedgehog.Extras.Internal.Orphans ()
import Control.Monad
import Control.Monad.Catch (MonadCatch)
import GHC.Stack
import Hedgehog
import qualified Hedgehog as H
threadDelay :: (HasCallStack, MonadTest m, MonadIO m) => Int -> m ()
threadDelay :: forall (m :: * -> *).
(HasCallStack, MonadTest m, MonadIO m) =>
Int -> m ()
threadDelay Int
n = m () -> m ()
(HasCallStack => m ()) -> m ()
forall a. HasCallStack => (HasCallStack => a) -> a
GHC.withFrozenCallStack (m () -> m ()) -> (IO () -> m ()) -> IO () -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO () -> m ()
forall (m :: * -> *) a.
(MonadTest m, MonadIO m, HasCallStack) =>
IO a -> m a
H.evalIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ Int -> IO ()
forall (m :: * -> *). MonadBase IO m => Int -> m ()
IO.threadDelay Int
n
asyncRegister_ :: HasCallStack
=> MonadTest m
=> MonadResource m
=> MonadCatch m
=> IO a
-> m ()
asyncRegister_ :: forall (m :: * -> *) a.
(HasCallStack, MonadTest m, MonadResource m, MonadCatch m) =>
IO a -> m ()
asyncRegister_ IO a
act = (HasCallStack => m ()) -> m ()
forall a. HasCallStack => (HasCallStack => a) -> a
GHC.withFrozenCallStack ((HasCallStack => m ()) -> m ()) -> (HasCallStack => m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ m (ReleaseKey, Async a) -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m (ReleaseKey, Async a) -> m ())
-> (m (ReleaseKey, Async a) -> m (ReleaseKey, Async a))
-> m (ReleaseKey, Async a)
-> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m (ReleaseKey, Async a) -> m (ReleaseKey, Async a)
forall (m :: * -> *) a.
(MonadTest m, MonadCatch m, HasCallStack) =>
m a -> m a
H.evalM (m (ReleaseKey, Async a) -> m ())
-> m (ReleaseKey, Async a) -> m ()
forall a b. (a -> b) -> a -> b
$ IO (Async a) -> (Async a -> IO ()) -> m (ReleaseKey, Async a)
forall (m :: * -> *) a.
MonadResource m =>
IO a -> (a -> IO ()) -> m (ReleaseKey, a)
allocate (IO a -> IO (Async (StM IO a))
forall (m :: * -> *) a.
MonadBaseControl IO m =>
m a -> m (Async (StM m a))
async IO a
act) Async a -> IO ()
forall a. Async a -> IO ()
cleanUp
where
cleanUp :: Async a -> IO ()
cleanUp :: forall a. Async a -> IO ()
cleanUp Async a
a = Async a -> IO ()
forall (m :: * -> *) a. MonadBase IO m => Async a -> m ()
cancel Async a
a IO () -> IO () -> IO ()
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> IO () -> IO ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Async a -> IO ()
forall (m :: * -> *) a. MonadBase IO m => Async a -> m ()
link Async a
a)