{-# LANGUAGE NumericUnderscores #-} module Main (main) where import Control.Concurrent (threadDelay) import Control.Concurrent.Async (wait) import Data.IORef import qualified Data.Poolboy as PB import Data.Poolboy.Effectful import Effectful import Test.Hspec -------------------------------------------------------------------------------- -- Main -------------------------------------------------------------------------------- main :: IO () main = hspec spec spec :: Spec spec = do describe "Effectful Poolboy Wrapper" $ do it "enqueueEff runs an Eff action" $ do res <- runEff $ withPoolboy PB.defaultPoolboySettings PB.waitingStopFinishWorkers ( \wq -> do r <- newIORefEff (0 :: Int) enqueue wq (writeIORefEff r 42) liftIO $ threadDelay 100_000 readIORefEff r ) res `shouldBe` 42 it "enqueueTrackingEff returns Async with correct result" $ do res <- runEff $ withPoolboy PB.defaultPoolboySettings PB.waitingStopFinishWorkers ( \wq -> do a <- enqueueTracking wq (pure @(Eff _) (99 :: Int)) liftIO (wait a) ) res `shouldBe` 99 -------------------------------------------------------------------------------- -- Helpers -------------------------------------------------------------------------------- newIORefEff :: (IOE :> es) => a -> Eff es (IORef a) newIORefEff = liftIO . newIORef writeIORefEff :: (IOE :> es) => IORef a -> a -> Eff es () writeIORefEff r x = liftIO $ writeIORef r x readIORefEff :: (IOE :> es) => IORef a -> Eff es a readIORefEff r = liftIO $ readIORef r