module Unfork.Sync (unforkSyncIO, unforkSyncIO_) where
import Prelude (IO, pure)
import Control.Exception.Safe (bracket)
import qualified Control.Concurrent.MVar as MVar
unforkSyncIO ::
(task -> IO result)
-> IO (task -> IO result)
unforkSyncIO :: (task -> IO result) -> IO (task -> IO result)
unforkSyncIO task -> IO result
action = do
MVar ()
lock <- () -> IO (MVar ())
forall a. a -> IO (MVar a)
MVar.newMVar ()
(task -> IO result) -> IO (task -> IO result)
forall (f :: * -> *) a. Applicative f => a -> f a
pure \task
x ->
IO () -> (() -> IO ()) -> (() -> IO result) -> IO result
forall (m :: * -> *) a b c.
MonadMask m =>
m a -> (a -> m b) -> (a -> m c) -> m c
bracket (MVar () -> IO ()
forall a. MVar a -> IO a
MVar.takeMVar MVar ()
lock) (MVar () -> () -> IO ()
forall a. MVar a -> a -> IO ()
MVar.putMVar MVar ()
lock) \() ->
task -> IO result
action task
x
unforkSyncIO_ ::
(task -> IO result)
-> IO (task -> IO ())
unforkSyncIO_ :: (task -> IO result) -> IO (task -> IO ())
unforkSyncIO_ task -> IO result
action =
(task -> IO ()) -> IO (task -> IO ())
forall task result. (task -> IO result) -> IO (task -> IO result)
unforkSyncIO \task
x -> do
result
_ <- task -> IO result
action task
x
() -> IO ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()