From 7f26db8d8513429511e2db3349850c23c41392d4 Mon Sep 17 00:00:00 2001 From: Jens Nolte <git@queezle.net> Date: Sun, 22 Aug 2021 19:20:00 +0200 Subject: [PATCH] Fix warnings --- quasar.cabal | 2 -- src/Quasar/Awaitable.hs | 8 +++--- src/Quasar/Core.hs | 9 +++---- src/Quasar/Observable.hs | 27 ++++++++----------- src/Quasar/Observable/ObservableHashMap.hs | 1 - test/Quasar/AsyncSpec.hs | 4 --- .../Observable/ObservableHashMapSpec.hs | 3 +-- 7 files changed, 19 insertions(+), 35 deletions(-) diff --git a/quasar.cabal b/quasar.cabal index 6592098..50fd701 100644 --- a/quasar.cabal +++ b/quasar.cabal @@ -67,7 +67,6 @@ library build-depends: base >=4.7 && <5, binary, - containers, exceptions, ghc-prim, hashable, @@ -99,7 +98,6 @@ test-suite quasar-test base >=4.7 && <5, hspec, quasar, - stm, unordered-containers, main-is: Spec.hs other-modules: diff --git a/src/Quasar/Awaitable.hs b/src/Quasar/Awaitable.hs index afabb41..c182c80 100644 --- a/src/Quasar/Awaitable.hs +++ b/src/Quasar/Awaitable.hs @@ -8,6 +8,7 @@ module Quasar.Awaitable ( successfulAwaitable, failedAwaitable, completedAwaitable, + simpleAwaitable, -- * Awaiting multiple awaitables cacheAwaitable, @@ -29,11 +30,8 @@ module Quasar.Awaitable ( import Control.Concurrent.STM import Control.Monad.Catch -import Control.Monad.Fix (mfix) import Control.Monad.Reader -import Control.Monad.Trans.Class import Control.Monad.Trans.Maybe -import Data.Bifunctor (bimap) import Quasar.Prelude @@ -102,9 +100,9 @@ instance Monad m => MonadQuerySTM (ReaderT (QueryFn m) m) where QueryFn querySTMFn <- ask lift $ querySTMFn query -data QueryFn m = QueryFn (forall a. STM (Maybe a) -> m a) +newtype QueryFn m = QueryFn (forall a. STM (Maybe a) -> m a) -runQueryT :: forall m a. Monad m => (forall b. STM (Maybe b) -> m b) -> ReaderT (QueryFn m) m a -> m a +runQueryT :: forall m a. (forall b. STM (Maybe b) -> m b) -> ReaderT (QueryFn m) m a -> m a runQueryT queryFn action = runReaderT action (QueryFn queryFn) diff --git a/src/Quasar/Core.hs b/src/Quasar/Core.hs index 6ef0bd4..08646c8 100644 --- a/src/Quasar/Core.hs +++ b/src/Quasar/Core.hs @@ -43,7 +43,6 @@ import Control.Concurrent.STM import Control.Monad.Catch import Control.Monad.Reader import Data.HashSet -import Data.Sequence import Quasar.Awaitable import Quasar.Prelude @@ -99,7 +98,7 @@ data ResourceManager = ResourceManager { } instance IsDisposable ResourceManager where - toDisposable x = undefined + toDisposable = undefined -- | A task that is running asynchronously. It has a result and can fail. @@ -268,7 +267,7 @@ instance IsDisposable CombinedDisposable where dispose (CombinedDisposable x y) = liftA2 (<>) (dispose x) (dispose y) isDisposed (CombinedDisposable x y) = liftA2 (<>) (isDisposed x) (isDisposed y) -data ListDisposable = ListDisposable [Disposable] +newtype ListDisposable = ListDisposable [Disposable] instance IsDisposable ListDisposable where dispose (ListDisposable disposables) = mconcat <$> traverse dispose disposables @@ -297,7 +296,7 @@ noDisposable = mempty -- -- The synchronous part of the `dispose`-Function will be run immediately but the resulting `Awaitable` will be passed to the resource manager. disposeEventually :: (IsDisposable a, MonadIO m) => ResourceManager -> a -> m () -disposeEventually resourceManager disposable = liftIO $ do +disposeEventually _resourceManager disposable = liftIO $ do disposeCompleted <- dispose disposable peekAwaitable disposeCompleted >>= \case Just (Left ex) -> throwIO ex @@ -312,7 +311,7 @@ boundDisposable action = do -- | Creates an `Disposable` that is bound to a ResourceManager. It will automatically be disposed when the resource manager is disposed. attachDisposeAction :: MonadIO m => ResourceManager -> IO (Awaitable ()) -> m Disposable -attachDisposeAction = undefined +attachDisposeAction _resourceManager _action = liftIO undefined -- | Attaches a dispose action to a ResourceManager. It will automatically be run when the resource manager is disposed. attachDisposeAction_ :: MonadIO m => ResourceManager -> IO (Awaitable ()) -> m () diff --git a/src/Quasar/Observable.hs b/src/Quasar/Observable.hs index 19f05a8..bd2eb26 100644 --- a/src/Quasar/Observable.hs +++ b/src/Quasar/Observable.hs @@ -35,16 +35,12 @@ import Control.Concurrent.MVar import Control.Concurrent.STM import Control.Monad.Catch import Control.Monad.Except -import Control.Monad.Reader import Control.Monad.Trans.Maybe import Data.HashMap.Strict qualified as HM -import Data.IORef import Data.Unique import Quasar.Awaitable import Quasar.Core -import Quasar.Disposable import Quasar.Prelude -import System.IO (fixIO) data ObservableMessage a @@ -85,11 +81,10 @@ class IsRetrievable v o => IsObservable v o | o -> v where -- | Observe until the callback returns `False`. The callback will also be unsubscribed when the `ResourceManager` is disposed. observeWhile :: (IsObservable v o, HasResourceManager m) => o -> (ObservableMessage v -> IO Bool) -> m Disposable observeWhile observable callback = do - resourceManager <- askResourceManager disposeVar <- liftIO $ newTVarIO False innerDisposable <- liftIO $ observe observable \msg -> do - disposeRequested <- atomically $ readTVar disposeVar + disposeRequested <- readTVarIO disposeVar unless disposeRequested do continue <- callback msg unless continue $ atomically $ writeTVar disposeVar True @@ -170,7 +165,7 @@ instance IsRetrievable r (BindObservable r) where awaitResult $ retrieve $ fn x instance IsObservable r (BindObservable r) where - observe :: forall r. (BindObservable r) -> (ObservableMessage r -> IO ()) -> IO Disposable + observe :: BindObservable r -> (ObservableMessage r -> IO ()) -> IO Disposable observe (BindObservable fx fn) callback = do -- Create a resource manager to ensure all subscriptions are cleaned up when disposing. resourceManager <- newResourceManager unlimitedResourceManagerConfiguration @@ -205,20 +200,20 @@ instance IsObservable r (BindObservable r) where pure $ do disposeEventually resourceManager oldDisposable - newDisposable <- + disposable <- unmask (outerMessageHandler key observableMessage) `onException` atomically (putTMVar disposableVar noDisposable) - atomically $ putTMVar disposableVar newDisposable + atomically $ putTMVar disposableVar disposable -- When already disposing no new handlers should be registered True -> pure $ pure () where outerMessageHandler key (ObservableUpdate x) = observe (fn x) (innerCallback key) - outerMessageHandler key (ObservableLoading) = noDisposable <$ callback ObservableLoading - outerMessageHandler key (ObservableNotAvailable ex) = noDisposable <$ callback (ObservableNotAvailable ex) + outerMessageHandler _ ObservableLoading = noDisposable <$ callback ObservableLoading + outerMessageHandler _ (ObservableNotAvailable ex) = noDisposable <$ callback (ObservableNotAvailable ex) innerCallback :: Unique -> ObservableMessage r -> IO () innerCallback key x = do @@ -238,7 +233,7 @@ instance IsRetrievable r (CatchObservable e r) where awaitResult (retrieve fx) `catch` \ex -> awaitResult (retrieve (fn ex)) instance IsObservable r (CatchObservable e r) where - observe :: forall e r. (CatchObservable e r) -> (ObservableMessage r -> IO ()) -> IO Disposable + observe :: CatchObservable e r -> (ObservableMessage r -> IO ()) -> IO Disposable observe (CatchObservable fx fn) callback = do -- Create a resource manager to ensure all subscriptions are cleaned up when disposing. resourceManager <- newResourceManager unlimitedResourceManagerConfiguration @@ -273,19 +268,19 @@ instance IsObservable r (CatchObservable e r) where pure $ do disposeEventually resourceManager oldDisposable - newDisposable <- + disposable <- unmask (outerMessageHandler key observableMessage) `onException` atomically (putTMVar disposableVar noDisposable) - atomically $ putTMVar disposableVar newDisposable + atomically $ putTMVar disposableVar disposable -- When already disposing no new handlers should be registered True -> pure $ pure () where - outerMessageHandler key msg@(ObservableNotAvailable (fromException -> Just ex)) = observe (fn ex) (innerCallback key) - outerMessageHandler key msg = noDisposable <$ callback msg + outerMessageHandler key (ObservableNotAvailable (fromException -> Just ex)) = observe (fn ex) (innerCallback key) + outerMessageHandler _ msg = noDisposable <$ callback msg innerCallback :: Unique -> ObservableMessage r -> IO () innerCallback key x = do diff --git a/src/Quasar/Observable/ObservableHashMap.hs b/src/Quasar/Observable/ObservableHashMap.hs index 085d288..eeb9db7 100644 --- a/src/Quasar/Observable/ObservableHashMap.hs +++ b/src/Quasar/Observable/ObservableHashMap.hs @@ -14,7 +14,6 @@ import Data.HashMap.Strict qualified as HM import Data.Maybe (isJust) import Language.Haskell.TH.Syntax (mkName, nameBase) import Lens.Micro.Platform -import Quasar.Awaitable import Quasar.Disposable import Quasar.Observable import Quasar.Observable.Delta diff --git a/test/Quasar/AsyncSpec.hs b/test/Quasar/AsyncSpec.hs index 9c78132..098af3f 100644 --- a/test/Quasar/AsyncSpec.hs +++ b/test/Quasar/AsyncSpec.hs @@ -1,7 +1,6 @@ module Quasar.AsyncSpec (spec) where import Control.Concurrent -import Control.Concurrent.STM import Control.Monad (void) import Control.Monad.IO.Class import Prelude @@ -10,9 +9,6 @@ import Quasar.Awaitable import Quasar.Core import System.Timeout -shouldSatisfyM :: (HasCallStack, Show a) => IO a -> (a -> Bool) -> Expectation -shouldSatisfyM action expected = action >>= (`shouldSatisfy` expected) - spec :: Spec spec = parallel $ do describe "AsyncVar" $ do diff --git a/test/Quasar/Observable/ObservableHashMapSpec.hs b/test/Quasar/Observable/ObservableHashMapSpec.hs index 7f808db..147fb61 100644 --- a/test/Quasar/Observable/ObservableHashMapSpec.hs +++ b/test/Quasar/Observable/ObservableHashMapSpec.hs @@ -1,12 +1,11 @@ module Quasar.Observable.ObservableHashMapSpec (spec) where -import Quasar.Awaitable import Quasar.Disposable import Quasar.Observable import Quasar.Observable.Delta import Quasar.Observable.ObservableHashMap qualified as OM -import Control.Monad ((<=<), void) +import Control.Monad (void) import Data.HashMap.Strict qualified as HM import Data.IORef import Prelude -- GitLab