Skip to content
Snippets Groups Projects
Commit 0d0fc21e authored by Jens Nolte's avatar Jens Nolte
Browse files

Fix (+rewrite) FnDisposable.dispose

parent c260449f
No related branches found
No related tags found
No related merge requests found
Pipeline #2401 passed
......@@ -80,13 +80,16 @@ instance IsAwaitable () Disposable where
newtype FnDisposable = FnDisposable (TMVar (Either (IO (Awaitable ())) (Awaitable ())))
instance IsDisposable FnDisposable where
dispose (FnDisposable var) =
bracketOnError
do atomically $ takeTMVar var
do atomically . putTMVar var
\case
Left action -> do
awaitable <- action
dispose (FnDisposable var) = do
mask \restore -> do
eitherVal <- atomically do
takeTMVar var >>= \case
l@(Left _action) -> pure l
-- If the var contains an awaitable its put back immediately to save a second transaction
r@(Right _awaitable) -> r <$ putTMVar var r
case eitherVal of
l@(Left action) -> do
awaitable <- restore action `onException` atomically (putTMVar var l)
atomically $ putTMVar var $ Right awaitable
pure awaitable
Right awaitable -> pure awaitable
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment