From 50f7fb9905c30f3f7c1a6bbadf6823c5a046536e Mon Sep 17 00:00:00 2001 From: Jens Nolte <git@queezle.net> Date: Sun, 25 Jul 2021 19:10:29 +0200 Subject: [PATCH] Move Disposable to Quasar.Disposable --- quasar.cabal | 1 + src/Quasar/Core.hs | 51 ------------------ src/Quasar/Disposable.hs | 53 +++++++++++++++++++ src/Quasar/Observable.hs | 1 + src/Quasar/Observable/Delta.hs | 2 +- src/Quasar/Observable/ObservableHashMap.hs | 1 + src/Quasar/Observable/ObservablePriority.hs | 2 +- .../Observable/ObservableHashMapSpec.hs | 1 + .../Observable/ObservablePrioritySpec.hs | 1 + 9 files changed, 60 insertions(+), 53 deletions(-) create mode 100644 src/Quasar/Disposable.hs diff --git a/quasar.cabal b/quasar.cabal index a151df5..bbcd9f4 100644 --- a/quasar.cabal +++ b/quasar.cabal @@ -78,6 +78,7 @@ library exposed-modules: Quasar.Awaitable Quasar.Core + Quasar.Disposable Quasar.Observable Quasar.Observable.Delta Quasar.Observable.ObservableHashMap diff --git a/src/Quasar/Core.hs b/src/Quasar/Core.hs index 15ffc90..863b7e8 100644 --- a/src/Quasar/Core.hs +++ b/src/Quasar/Core.hs @@ -11,13 +11,6 @@ module Quasar.Core ( newAsyncVar, putAsyncVar, - -- * Disposable - IsDisposable(..), - Disposable, - mkDisposable, - synchronousDisposable, - noDisposable, - -- * Cancellation withCancellationToken, ) where @@ -250,47 +243,3 @@ withCancellationToken action = do -- TODO test if it is better to run readMVar recursively or to keep it uninterruptible either throwIO pure =<< (unmask (readMVar resultMVar) `catchAll` (\ex -> cancel cancellationToken ex >> readMVar resultMVar)) - - --- * Disposable - -class IsDisposable a where - -- TODO document laws: must not throw exceptions, is idempotent - - -- | Dispose a resource. - dispose :: a -> AsyncIO () - - -- | Dispose a resource in the IO monad. - disposeIO :: a -> IO () - - toDisposable :: a -> Disposable - toDisposable = mkDisposable . dispose - -instance IsDisposable a => IsDisposable (Maybe a) where - dispose = mapM_ dispose - disposeIO = mapM_ disposeIO - - -newtype Disposable = Disposable (AsyncIO ()) - -instance IsDisposable Disposable where - dispose (Disposable fn) = fn - disposeIO = runAsyncIO . dispose - toDisposable = id - -instance Semigroup Disposable where - x <> y = mkDisposable $ liftA2 (<>) (dispose x) (dispose y) - -instance Monoid Disposable where - mempty = mkDisposable $ pure () - mconcat disposables = mkDisposable $ traverse_ dispose disposables - - -mkDisposable :: AsyncIO () -> Disposable -mkDisposable = Disposable - -synchronousDisposable :: IO () -> Disposable -synchronousDisposable = mkDisposable . liftIO - -noDisposable :: Disposable -noDisposable = mempty diff --git a/src/Quasar/Disposable.hs b/src/Quasar/Disposable.hs new file mode 100644 index 0000000..33eaaff --- /dev/null +++ b/src/Quasar/Disposable.hs @@ -0,0 +1,53 @@ +module Quasar.Disposable ( + IsDisposable(..), + Disposable, + mkDisposable, + synchronousDisposable, + noDisposable, +) where + +import Quasar.Core +import Quasar.Prelude + +-- * Disposable + +class IsDisposable a where + -- TODO document laws: must not throw exceptions, is idempotent + + -- | Dispose a resource. + dispose :: a -> AsyncIO () + + -- | Dispose a resource in the IO monad. + disposeIO :: a -> IO () + disposeIO = runAsyncIO . dispose + + toDisposable :: a -> Disposable + toDisposable = mkDisposable . dispose + +instance IsDisposable a => IsDisposable (Maybe a) where + dispose = mapM_ dispose + disposeIO = mapM_ disposeIO + + +newtype Disposable = Disposable (AsyncIO ()) + +instance IsDisposable Disposable where + dispose (Disposable fn) = fn + toDisposable = id + +instance Semigroup Disposable where + x <> y = mkDisposable $ liftA2 (<>) (dispose x) (dispose y) + +instance Monoid Disposable where + mempty = mkDisposable $ pure () + mconcat disposables = mkDisposable $ traverse_ dispose disposables + + +mkDisposable :: AsyncIO () -> Disposable +mkDisposable = Disposable + +synchronousDisposable :: IO () -> Disposable +synchronousDisposable = mkDisposable . liftIO + +noDisposable :: Disposable +noDisposable = mempty diff --git a/src/Quasar/Observable.hs b/src/Quasar/Observable.hs index e77f8cf..4a4f812 100644 --- a/src/Quasar/Observable.hs +++ b/src/Quasar/Observable.hs @@ -36,6 +36,7 @@ import Data.HashMap.Strict qualified as HM import Data.IORef import Data.Unique import Quasar.Core +import Quasar.Disposable import Quasar.Prelude diff --git a/src/Quasar/Observable/Delta.hs b/src/Quasar/Observable/Delta.hs index c2862b2..3adb77d 100644 --- a/src/Quasar/Observable/Delta.hs +++ b/src/Quasar/Observable/Delta.hs @@ -7,7 +7,7 @@ module Quasar.Observable.Delta ( import Data.Binary (Binary) import Data.Binary qualified as B import Data.HashMap.Strict qualified as HM -import Quasar.Core +import Quasar.Disposable import Quasar.Observable import Quasar.Prelude diff --git a/src/Quasar/Observable/ObservableHashMap.hs b/src/Quasar/Observable/ObservableHashMap.hs index b013f03..a157128 100644 --- a/src/Quasar/Observable/ObservableHashMap.hs +++ b/src/Quasar/Observable/ObservableHashMap.hs @@ -15,6 +15,7 @@ import Data.Maybe (isJust) import Language.Haskell.TH.Syntax (mkName, nameBase) import Lens.Micro.Platform import Quasar.Core +import Quasar.Disposable import Quasar.Observable import Quasar.Observable.Delta import Quasar.Prelude hiding (lookup, lookupDelete) diff --git a/src/Quasar/Observable/ObservablePriority.hs b/src/Quasar/Observable/ObservablePriority.hs index 7c926e3..9184e2e 100644 --- a/src/Quasar/Observable/ObservablePriority.hs +++ b/src/Quasar/Observable/ObservablePriority.hs @@ -9,7 +9,7 @@ import Data.List (maximumBy) import Data.List.NonEmpty (NonEmpty(..), nonEmpty) import Data.List.NonEmpty qualified as NonEmpty import Data.Ord (comparing) -import Quasar.Core +import Quasar.Disposable import Quasar.Observable import Quasar.Prelude diff --git a/test/Quasar/Observable/ObservableHashMapSpec.hs b/test/Quasar/Observable/ObservableHashMapSpec.hs index 9884802..f3cc07e 100644 --- a/test/Quasar/Observable/ObservableHashMapSpec.hs +++ b/test/Quasar/Observable/ObservableHashMapSpec.hs @@ -1,6 +1,7 @@ module Quasar.Observable.ObservableHashMapSpec (spec) where import Quasar.Core +import Quasar.Disposable import Quasar.Observable import Quasar.Observable.Delta import Quasar.Observable.ObservableHashMap qualified as OM diff --git a/test/Quasar/Observable/ObservablePrioritySpec.hs b/test/Quasar/Observable/ObservablePrioritySpec.hs index 4278a3b..a09b9e3 100644 --- a/test/Quasar/Observable/ObservablePrioritySpec.hs +++ b/test/Quasar/Observable/ObservablePrioritySpec.hs @@ -1,6 +1,7 @@ module Quasar.Observable.ObservablePrioritySpec (spec) where import Quasar.Core +import Quasar.Disposable import Quasar.Observable import Quasar.Observable.ObservablePriority (ObservablePriority) import Quasar.Observable.ObservablePriority qualified as OP -- GitLab