From fb5636483871fbafe9b286b377c339c8ddf8b4f8 Mon Sep 17 00:00:00 2001 From: tv Date: Thu, 7 Feb 2019 18:42:36 +0100 Subject: initial commit --- src/Control/Concurrent/Extended.hs | 24 ++++++++++++++++++++++++ src/Control/Monad/Extended.hs | 14 ++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 src/Control/Concurrent/Extended.hs create mode 100644 src/Control/Monad/Extended.hs (limited to 'src/Control') diff --git a/src/Control/Concurrent/Extended.hs b/src/Control/Concurrent/Extended.hs new file mode 100644 index 0000000..933e3a6 --- /dev/null +++ b/src/Control/Concurrent/Extended.hs @@ -0,0 +1,24 @@ +module Control.Concurrent.Extended + ( module Exports + , newChan + , newRef + , newRelay + , newSemaphore + ) where + +import Control.Arrow +import Control.Concurrent as Exports hiding (newChan,readChan,writeChan) +import qualified Control.Concurrent.Chan.Unagi as U +import Data.IORef + +newChan :: IO (a -> IO (), IO a) +newChan = (U.writeChan *** U.readChan) <$> U.newChan + +newRef :: a -> IO (a -> IO (), IO a) +newRef v0 = (atomicWriteIORef &&& readIORef) <$> newIORef v0 + +newRelay :: IO (a -> IO (), IO a) +newRelay = (putMVar &&& takeMVar) <$> newEmptyMVar + +newSemaphore :: IO (IO (), IO ()) +newSemaphore = first ($()) <$> newRelay diff --git a/src/Control/Monad/Extended.hs b/src/Control/Monad/Extended.hs new file mode 100644 index 0000000..d91b12c --- /dev/null +++ b/src/Control/Monad/Extended.hs @@ -0,0 +1,14 @@ +module Control.Monad.Extended + ( module Control.Monad + , unlessM_ + , untilM_ + ) where + +import Control.Monad + + +unlessM_ :: Monad m => m Bool -> m () -> m () +unlessM_ p f = p >>= flip unless f + +untilM_ :: Monad m => m Bool -> m a -> m () +untilM_ p f = unlessM_ p (f >> untilM_ p f) -- cgit v1.2.3