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

Change QuasarIO to newtype; add more instances to QuasarIO and QuasarSTM

parent a91a3960
No related branches found
No related tags found
No related merge requests found
...@@ -52,12 +52,12 @@ async_ fn = void $ asyncWithUnmask (\unmask -> unmask fn) ...@@ -52,12 +52,12 @@ async_ fn = void $ asyncWithUnmask (\unmask -> unmask fn)
asyncWithUnmask :: (MonadQuasar m, MonadIO m) => ((forall b. QuasarIO b -> QuasarIO b) -> QuasarIO a) -> m (Async a) asyncWithUnmask :: (MonadQuasar m, MonadIO m) => ((forall b. QuasarIO b -> QuasarIO b) -> QuasarIO a) -> m (Async a)
asyncWithUnmask fn = do asyncWithUnmask fn = do
quasar <- askQuasar quasar <- askQuasar
asyncWithUnmask' (\unmask -> runReaderT (fn (liftUnmask unmask)) quasar) asyncWithUnmask' (\unmask -> runQuasarIO quasar (fn (liftUnmask unmask)))
where where
liftUnmask :: (forall b. IO b -> IO b) -> QuasarIO a -> QuasarIO a liftUnmask :: (forall b. IO b -> IO b) -> QuasarIO a -> QuasarIO a
liftUnmask unmask innerAction = do liftUnmask unmask innerAction = do
quasar <- askQuasar quasar <- askQuasar
liftIO $ unmask $ runReaderT innerAction quasar liftIO $ unmask $ runQuasarIO quasar innerAction
asyncWithUnmask_ :: (MonadQuasar m, MonadIO m) => ((forall b. QuasarIO b -> QuasarIO b) -> QuasarIO ()) -> m () asyncWithUnmask_ :: (MonadQuasar m, MonadIO m) => ((forall b. QuasarIO b -> QuasarIO b) -> QuasarIO ()) -> m ()
asyncWithUnmask_ fn = void $ asyncWithUnmask fn asyncWithUnmask_ fn = void $ asyncWithUnmask fn
......
...@@ -41,9 +41,11 @@ import Control.Monad.Reader ...@@ -41,9 +41,11 @@ import Control.Monad.Reader
import GHC.Records (HasField(..)) import GHC.Records (HasField(..))
import Quasar.Async.STMHelper import Quasar.Async.STMHelper
import Quasar.Exceptions import Quasar.Exceptions
import Quasar.Future
import Quasar.Logger import Quasar.Logger
import Quasar.Prelude import Quasar.Prelude
import Quasar.Resources.Disposer import Quasar.Resources.Disposer
import Control.Monad.Base (MonadBase)
-- Invariant: the resource manager is disposed as soon as an exception is thrown to the channel -- Invariant: the resource manager is disposed as soon as an exception is thrown to the channel
...@@ -115,22 +117,47 @@ class (MonadCatch m, MonadFix m) => MonadQuasar m where ...@@ -115,22 +117,47 @@ class (MonadCatch m, MonadFix m) => MonadQuasar m where
localQuasar :: Quasar -> m a -> m a localQuasar :: Quasar -> m a -> m a
type QuasarT = ReaderT Quasar type QuasarT = ReaderT Quasar
type QuasarIO = QuasarT IO
newtype QuasarIO a = QuasarIO (QuasarT IO a)
deriving newtype (Functor, Applicative, Monad, MonadThrow, MonadCatch, MonadMask, MonadFail, MonadFix, Alternative, MonadPlus, MonadBase IO, MonadIO)
instance Semigroup a => Semigroup (QuasarIO a) where
fx <> fy = liftA2 (<>) fx fy
instance Monoid a => Monoid (QuasarIO a) where
mempty = pure mempty
instance MonadAwait QuasarIO where
await awaitable = liftIO (await awaitable)
newtype QuasarSTM a = QuasarSTM (QuasarT STM a) newtype QuasarSTM a = QuasarSTM (QuasarT STM a)
deriving newtype (Functor, Applicative, Monad, MonadThrow, MonadCatch, MonadFix, Alternative, MonadSTM) deriving newtype (Functor, Applicative, Monad, MonadThrow, MonadCatch, MonadFix, Alternative, MonadPlus, MonadSTM)
instance Semigroup a => Semigroup (QuasarSTM a) where
fx <> fy = liftA2 (<>) fx fy
instance Monoid a => Monoid (QuasarSTM a) where
mempty = pure mempty
instance MonadFail QuasarSTM where
fail msg = throwM (userError msg)
instance MonadQuasar QuasarIO where
askQuasar = QuasarIO ask
localQuasar quasar (QuasarIO fn) = QuasarIO (local (const quasar) fn)
instance (MonadIO m, MonadMask m, MonadFix m) => MonadQuasar (QuasarT m) where instance (MonadIO m, MonadMask m, MonadFix m) => MonadQuasar (QuasarT m) where
askQuasar = ask askQuasar = ask
localQuasar quasar = local (const quasar) localQuasar quasar = local (const quasar)
{-# SPECIALIZE instance MonadQuasar QuasarIO #-} {-# SPECIALIZE instance MonadQuasar (QuasarT IO) #-}
instance (MonadIO m, MonadMask m, MonadFix m) => MonadLog (QuasarT m) where instance (MonadIO m, MonadMask m, MonadFix m) => MonadLog (QuasarT m) where
logMessage msg = do logMessage msg = do
logger <- askLogger logger <- askLogger
liftIO $ logger msg liftIO $ logger msg
{-# SPECIALIZE instance MonadLog QuasarIO #-} {-# SPECIALIZE instance MonadLog (QuasarT IO) #-}
instance MonadQuasar QuasarSTM where instance MonadQuasar QuasarSTM where
...@@ -176,7 +203,7 @@ liftQuasarSTM fn = do ...@@ -176,7 +203,7 @@ liftQuasarSTM fn = do
{-# INLINABLE [1] liftQuasarSTM #-} {-# INLINABLE [1] liftQuasarSTM #-}
runQuasarIO :: MonadIO m => Quasar -> QuasarIO a -> m a runQuasarIO :: MonadIO m => Quasar -> QuasarIO a -> m a
runQuasarIO quasar fn = liftIO $ runReaderT fn quasar runQuasarIO quasar (QuasarIO fn) = liftIO $ runReaderT fn quasar
{-# SPECIALIZE runQuasarIO :: Quasar -> QuasarIO a -> IO a #-} {-# SPECIALIZE runQuasarIO :: Quasar -> QuasarIO a -> IO a #-}
{-# INLINABLE runQuasarIO #-} {-# INLINABLE runQuasarIO #-}
......
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