Skip to content

Commit

Permalink
quasar: Add futureDisposer function
Browse files Browse the repository at this point in the history
Co-authored-by: Jan Beinke <[email protected]>
  • Loading branch information
queezle42 and thelegy committed Apr 4, 2024
1 parent 07d399a commit d513deb
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 4 deletions.
1 change: 1 addition & 0 deletions quasar/quasar.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ library
Quasar.PreludeExtras
Quasar.Resources
Quasar.Resources.DisposableVar
Quasar.Resources.FutureDisposer
Quasar.Resources.RcVar
Quasar.Utils.CallbackRegistry
Quasar.Utils.Exceptions
Expand Down
9 changes: 5 additions & 4 deletions quasar/src/Quasar/Resources/DisposableVar.hs
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,16 @@ data DisposableVar a = DisposableVar Unique (DisposableVarState a)

instance ToFuture () (DisposableVar a) where
toFuture (DisposableVar _ state) = do
mdeps <- join (toFuture state)
mapM_ flattenDisposeDependencies mdeps
deps <- join (toFuture state)
mapM_ flattenDisposeDependencies deps

instance IsDisposerElement (DisposableVar a) where
disposerElementKey (DisposableVar key _) = key

beginDispose# (DisposableVar key disposeState) = do
deps <- mapFinalizeTOnce disposeState \(fn, value) ->
fdeps <- mapFinalizeTOnce disposeState \(fn, value) ->
beginDisposeDisposer =<< fn value
pure (DisposeResultDependencies (DisposeDependencies key deps))
pure (DisposeResultDependencies (DisposeDependencies key fdeps))

disposeEventually# self = do
beginDispose# self <&> \case
Expand Down
44 changes: 44 additions & 0 deletions quasar/src/Quasar/Resources/FutureDisposer.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
module Quasar.Resources.FutureDisposer (
futureDisposer,
) where

import Quasar.Prelude
import Quasar.Future
import Quasar.Resources.Disposer
import Quasar.Utils.TOnce

data FutureDisposer = FutureDisposer Unique (TOnce (Future Disposer) (Future [DisposeDependencies]))

instance IsDisposerElement FutureDisposer where
disposerElementKey (FutureDisposer key _) = key

disposeEventually# self = do
beginDispose# self <&> \case
DisposeResultAwait future -> future
DisposeResultDependencies deps -> flattenDisposeDependencies deps

beginDispose# (FutureDisposer key var) = do
fdeps <- mapFinalizeTOnce var \future -> do

promise <- newPromise
callOnceCompleted_ future \disposer -> do
fdeps <- beginDisposeDisposer disposer
tryFulfillPromise_ promise fdeps

pure (join (toFuture promise))

pure (DisposeResultDependencies (DisposeDependencies key fdeps))

instance ToFuture () FutureDisposer where
toFuture (FutureDisposer _ var) = do
deps <- join (toFuture var)
mapM_ flattenDisposeDependencies deps

instance Disposable FutureDisposer where
getDisposer x = mkDisposer [x]

futureDisposer :: Future Disposer -> STMc NoRetry '[] Disposer
futureDisposer future = do
key <- newUniqueSTM
var <- newTOnce future
pure (getDisposer (FutureDisposer key var))

0 comments on commit d513deb

Please sign in to comment.