From 4b1e31f1abb896dca8d981565ba76378d2488bb1 Mon Sep 17 00:00:00 2001 From: Jens Nolte <git@queezle.net> Date: Sun, 2 Jan 2022 01:47:30 +0100 Subject: [PATCH] Add helper functions for ResourceManagerSTM --- src/Quasar/ResourceManager.hs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Quasar/ResourceManager.hs b/src/Quasar/ResourceManager.hs index 07e8057..63c643d 100644 --- a/src/Quasar/ResourceManager.hs +++ b/src/Quasar/ResourceManager.hs @@ -12,12 +12,14 @@ module Quasar.ResourceManager ( registerAsyncDisposeAction, withScopedResourceManager, onResourceManager, + onResourceManagerSTM, captureDisposable, captureDisposable_, disposeOnError, liftResourceManagerIO, runInResourceManagerSTM, enterResourceManager, + enterResourceManagerSTM, lockResourceManager, -- ** Top level initialization @@ -219,6 +221,9 @@ instance {-# OVERLAPS #-} MonadResourceManager (ResourceManagerT STM) where onResourceManager :: (IsResourceManager a, MonadIO m) => a -> ResourceManagerIO r -> m r onResourceManager target action = liftIO $ runReaderT action (toResourceManager target) +onResourceManagerSTM :: (IsResourceManager a) => a -> ResourceManagerSTM r -> STM r +onResourceManagerSTM target action = runReaderT action (toResourceManager target) + liftResourceManagerIO :: (MonadResourceManager m, MonadIO m) => ResourceManagerIO r -> m r liftResourceManagerIO action = do resourceManager <- askResourceManager @@ -254,6 +259,14 @@ enterResourceManager resourceManager action = liftIO do onResourceManager resourceManager $ lockResourceManager do action `catchAll` \ex -> liftIO $ throwToResourceManager resourceManager ex +-- | Run a computation on a resource manager and throw any exception that occurs to the resource manager. +-- +-- This can be used to run e.g. callbacks that belong to a different resource context. +enterResourceManagerSTM :: ResourceManager -> ResourceManagerSTM () -> STM () +enterResourceManagerSTM resourceManager action = do + onResourceManagerSTM resourceManager do + action `catchAll` \ex -> throwToResourceManager ex + -- * Resource manager implementations -- GitLab