From 32aef8d3fa0e430a9b543837837acdbca36a7394 Mon Sep 17 00:00:00 2001
From: Jens Nolte <git@queezle.net>
Date: Thu, 10 Feb 2022 22:15:22 +0100
Subject: [PATCH] Add draft for MonadQuasar types

---
 quasar.cabal        |  1 +
 src/Quasar/Monad.hs | 51 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+)
 create mode 100644 src/Quasar/Monad.hs

diff --git a/quasar.cabal b/quasar.cabal
index afea5a0..6e2b05d 100644
--- a/quasar.cabal
+++ b/quasar.cabal
@@ -91,6 +91,7 @@ library
     Quasar.Awaitable
     Quasar.Disposable
     Quasar.Exceptions
+    Quasar.Monad
     Quasar.Observable
     Quasar.Observable.Delta
     Quasar.Observable.ObservableHashMap
diff --git a/src/Quasar/Monad.hs b/src/Quasar/Monad.hs
new file mode 100644
index 0000000..833f7b6
--- /dev/null
+++ b/src/Quasar/Monad.hs
@@ -0,0 +1,51 @@
+module Quasar.Monad (
+  Quasar,
+  newQuasar,
+
+  MonadQuasar(..),
+
+  QuasarT,
+  QuasarIO,
+  QuasarSTM,
+
+) where
+
+import Control.Concurrent.STM
+import Quasar.Async.STMHelper
+import Quasar.Exceptions
+import Quasar.Prelude
+import Quasar.Resources
+import Control.Monad.Reader
+
+
+data Quasar = Quasar TIOWorker ExceptionChannel ResourceManager
+
+newQuasar :: TIOWorker -> ExceptionChannel -> ResourceManager -> STM Quasar
+newQuasar = undefined
+
+
+class Monad m => MonadQuasar m where
+  askQuasar :: m Quasar
+  runSTM :: STM a -> m a
+
+type QuasarT = ReaderT Quasar
+type QuasarIO = QuasarT IO
+type QuasarSTM = QuasarT STM
+
+
+instance MonadIO m => MonadQuasar (QuasarT m) where
+  askQuasar = ask
+  runSTM t = liftIO (atomically t)
+
+-- Overlaps the QuasartT/MonadIO-instance, because `MonadIO` _could_ be specified for `STM` (but that would be _very_ incorrect, so this is safe).
+instance {-# OVERLAPS #-} MonadQuasar (QuasarT STM) where
+  askQuasar = ask
+  runSTM = lift
+
+
+-- Overlappable so a QuasarT has priority over the base monad.
+instance {-# OVERLAPPABLE #-} MonadQuasar m => MonadQuasar (ReaderT r m) where
+  askQuasar = lift askQuasar
+  runSTM t = lift (runSTM t)
+
+-- TODO MonadQuasar instances for StateT, WriterT, RWST, MaybeT, ...
-- 
GitLab