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

Move Disposable to Quasar.Disposable

parent db1acd0b
No related branches found
No related tags found
No related merge requests found
......@@ -78,6 +78,7 @@ library
exposed-modules:
Quasar.Awaitable
Quasar.Core
Quasar.Disposable
Quasar.Observable
Quasar.Observable.Delta
Quasar.Observable.ObservableHashMap
......
......@@ -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
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
......@@ -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
......
......@@ -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
......
......@@ -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)
......
......@@ -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
......
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
......
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
......
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