From 2ec879d5aad07c24adb376ec81c8301cff143734 Mon Sep 17 00:00:00 2001
From: Jens Nolte <git@queezle.net>
Date: Wed, 3 Nov 2021 00:27:12 +0100
Subject: [PATCH] Rename and move unmanaged async helpers

Co-authored-by: Jan Beinke <git@janbeinke.com>
---
 quasar.cabal                                  |  2 +-
 src/Quasar/Async.hs                           | 10 ++++--
 .../Concurrent.hs => Async/Unmanaged.hs}      | 33 +++++++++----------
 src/Quasar/ResourceManager.hs                 |  4 +--
 src/Quasar/Timer.hs                           |  6 ++--
 5 files changed, 28 insertions(+), 27 deletions(-)
 rename src/Quasar/{Utils/Concurrent.hs => Async/Unmanaged.hs} (81%)

diff --git a/quasar.cabal b/quasar.cabal
index 83d1287..145bdbf 100644
--- a/quasar.cabal
+++ b/quasar.cabal
@@ -85,6 +85,7 @@ library
   exposed-modules:
     Quasar
     Quasar.Async
+    Quasar.Async.Unmanaged
     Quasar.Awaitable
     Quasar.Disposable
     Quasar.Observable
@@ -96,7 +97,6 @@ library
     Quasar.ResourceManager
     Quasar.Subscribable
     Quasar.Timer
-    Quasar.Utils.Concurrent
     Quasar.Utils.Exceptions
     Quasar.Utils.ExtraT
   hs-source-dirs:
diff --git a/src/Quasar/Async.hs b/src/Quasar/Async.hs
index 98f09c6..5c2cb0c 100644
--- a/src/Quasar/Async.hs
+++ b/src/Quasar/Async.hs
@@ -1,16 +1,20 @@
 module Quasar.Async (
-  -- * Async/await
+  -- * Async
   async,
   async_,
   asyncWithUnmask,
   asyncWithUnmask_,
+
+  -- ** Task exceptions
+  CancelTask(..),
+  TaskDisposed(..),
 ) where
 
 import Control.Monad.Reader
+import Quasar.Async.Unmanaged
 import Quasar.Awaitable
 import Quasar.Prelude
 import Quasar.ResourceManager
-import Quasar.Utils.Concurrent
 
 
 -- | TODO: Documentation
@@ -26,7 +30,7 @@ asyncWithUnmask :: MonadResourceManager m => ((ResourceManagerIO a -> ResourceMa
 asyncWithUnmask action = do
   resourceManager <- askResourceManager
   toAwaitable <$> registerNewResource do
-    unmanagedForkWithUnmask (\unmask -> runReaderT (action (liftUnmask unmask)) resourceManager)
+    unmanagedAsyncWithUnmask (\unmask -> runReaderT (action (liftUnmask unmask)) resourceManager)
   where
     liftUnmask :: (forall b. IO b -> IO b) -> ResourceManagerIO a -> ResourceManagerIO a
     liftUnmask unmask innerAction = do
diff --git a/src/Quasar/Utils/Concurrent.hs b/src/Quasar/Async/Unmanaged.hs
similarity index 81%
rename from src/Quasar/Utils/Concurrent.hs
rename to src/Quasar/Async/Unmanaged.hs
index e5f0420..0ecde0f 100644
--- a/src/Quasar/Utils/Concurrent.hs
+++ b/src/Quasar/Async/Unmanaged.hs
@@ -1,9 +1,10 @@
-module Quasar.Utils.Concurrent (
+module Quasar.Async.Unmanaged (
+  -- ** Unmanaged variant
   Task,
-  unmanagedFork,
-  unmanagedFork_,
-  unmanagedForkWithUnmask,
-  unmanagedForkWithUnmask_,
+  unmanagedAsync,
+  unmanagedAsync_,
+  unmanagedAsyncWithUnmask,
+  unmanagedAsyncWithUnmask_,
 
   -- ** Task exceptions
   CancelTask(..),
@@ -19,8 +20,6 @@ import Quasar.Disposable
 import Quasar.Prelude
 
 
-
-
 -- | A task is an operation (e.g. a thread or a network request) that is running asynchronously and can be cancelled.
 -- It has a result and can fail.
 --
@@ -68,16 +67,14 @@ instance Exception TaskDisposed where
 
 
 
+unmanagedAsync :: MonadIO m => IO a -> m (Task a)
+unmanagedAsync action = unmanagedAsyncWithUnmask \unmask -> unmask action
 
+unmanagedAsync_ :: MonadIO m => IO () -> m Disposable
+unmanagedAsync_ action = toDisposable <$> unmanagedAsync action
 
-unmanagedFork :: MonadIO m => IO a -> m (Task a)
-unmanagedFork action = unmanagedForkWithUnmask \unmask -> unmask action
-
-unmanagedFork_ :: MonadIO m => IO () -> m Disposable
-unmanagedFork_ action = toDisposable <$> unmanagedFork action
-
-unmanagedForkWithUnmask :: MonadIO m => ((forall b. IO b -> IO b) -> IO a) -> m (Task a)
-unmanagedForkWithUnmask action = do
+unmanagedAsyncWithUnmask :: MonadIO m => ((forall b. IO b -> IO b) -> IO a) -> m (Task a)
+unmanagedAsyncWithUnmask action = do
   liftIO $ mask_ do
     key <- newUnique
     resultVar <- newAsyncVar
@@ -86,7 +83,7 @@ unmanagedForkWithUnmask action = do
 
     threadId <- forkIOWithUnmask \unmask ->
       handleAll
-        do \ex -> fail $ "unmanagedForkWithUnmask thread failed: " <> displayException ex
+        do \ex -> fail $ "unmanagedAsyncWithUnmask thread failed: " <> displayException ex
         do
           result <- try $ handleIf
             do \(CancelTask exKey) -> key == exKey
@@ -115,5 +112,5 @@ unmanagedForkWithUnmask action = do
 
     pure $ Task key stateVar finalizers (toAwaitable resultVar)
 
-unmanagedForkWithUnmask_ :: MonadIO m => ((forall b. IO b -> IO b) -> IO ()) -> m Disposable
-unmanagedForkWithUnmask_ action = toDisposable <$> unmanagedForkWithUnmask action
+unmanagedAsyncWithUnmask_ :: MonadIO m => ((forall b. IO b -> IO b) -> IO ()) -> m Disposable
+unmanagedAsyncWithUnmask_ action = toDisposable <$> unmanagedAsyncWithUnmask action
diff --git a/src/Quasar/ResourceManager.hs b/src/Quasar/ResourceManager.hs
index 940cd52..2a101f2 100644
--- a/src/Quasar/ResourceManager.hs
+++ b/src/Quasar/ResourceManager.hs
@@ -48,10 +48,10 @@ import Data.HashMap.Strict qualified as HM
 import Data.List.NonEmpty (NonEmpty(..), (<|), nonEmpty)
 import Data.Sequence (Seq(..), (|>))
 import Data.Sequence qualified as Seq
+import Quasar.Async.Unmanaged
 import Quasar.Awaitable
 import Quasar.Disposable
 import Quasar.Prelude
-import Quasar.Utils.Concurrent
 import Quasar.Utils.Exceptions
 
 
@@ -249,7 +249,7 @@ newUnmanagedRootResourceManagerInternal = liftIO do
   exceptionsVar <- newTMVarIO Empty
   finalExceptionsVar <- newAsyncVar
   mfix \root -> do
-    unmanagedFork_ (disposeThread root)
+    unmanagedAsync_ (disposeThread root)
     internal <- newUnmanagedDefaultResourceManagerInternal (toResourceManager root)
     pure $ RootResourceManager internal disposingVar exceptionsVar finalExceptionsVar
 
diff --git a/src/Quasar/Timer.hs b/src/Quasar/Timer.hs
index 99571bd..cc3f341 100644
--- a/src/Quasar/Timer.hs
+++ b/src/Quasar/Timer.hs
@@ -24,11 +24,11 @@ import Data.Heap
 import Data.Time.Clock (UTCTime, diffUTCTime, getCurrentTime)
 import Data.Foldable (toList)
 import Quasar.Async
+import Quasar.Async.Unmanaged
 import Quasar.Awaitable
 import Quasar.Disposable
 import Quasar.Prelude
 import Quasar.ResourceManager
-import Quasar.Utils.Concurrent
 
 
 data TimerCancelled = TimerCancelled
@@ -92,7 +92,7 @@ newUnmanagedTimerScheduler = do
       }
 
 startSchedulerThread :: TimerScheduler -> IO Disposable
-startSchedulerThread scheduler = unmanagedFork_ (schedulerThread `finally` cancelAll)
+startSchedulerThread scheduler = unmanagedAsync_ (schedulerThread `finally` cancelAll)
   where
     heap' :: TMVar (Heap Timer)
     heap' = heap scheduler
@@ -210,7 +210,7 @@ newDelay :: MonadResourceManager m => Int -> m Delay
 newDelay microseconds = registerNewResource $ newUnmanagedDelay microseconds
 
 newUnmanagedDelay :: MonadIO m => Int -> m Delay
-newUnmanagedDelay microseconds = Delay <$> unmanagedFork (liftIO (threadDelay microseconds))
+newUnmanagedDelay microseconds = Delay <$> unmanagedAsync (liftIO (threadDelay microseconds))
 
 
 
-- 
GitLab