packages feed

regions 0.10 → 0.11

raw patch · 4 files changed

+42/−22 lines, 4 files

Files

Control/Monad/Trans/Region.hs view
@@ -19,6 +19,8 @@       -- * Running regions     , runRegionT +    , RegionControlIO+       -- * Duplication     , Dup(dup) 
Control/Monad/Trans/Region/Internal.hs view
@@ -55,8 +55,8 @@     , LocalRegion, Local, unsafeStripLocal        -- * MonadTransControl & MonadControlIO+    , RegionControlIO, unsafeLiftControlIO     , unsafeLiftControl-    , unsafeLiftControlIO     , unsafeControlIO     , unsafeLiftIOOp     , unsafeLiftIOOp_@@ -92,7 +92,7 @@  -- from monad-control: import Control.Monad.Trans.Control ( Run, RunInBase, liftControl )-import Control.Monad.IO.Control    ( MonadControlIO, liftControlIO, liftIOOp )+import Control.Monad.IO.Control    ( MonadControlIO, liftControlIO )  -- from transformers: import Control.Monad.Trans.Class ( MonadTrans, lift )@@ -208,8 +208,8 @@  Note that it is possible to run a region inside another region. -}-runRegionT ∷ MonadControlIO pr ⇒ (∀ s. RegionT s pr α) → pr α-runRegionT r = liftIOOp (bracket before after) thing+runRegionT ∷ RegionControlIO pr ⇒ (∀ s. RegionT s pr α) → pr α+runRegionT r = unsafeLiftIOOp (bracket before after) thing     where       before = newIORef []       thing hsIORef = runReaderT (unRegionT r) hsIORef@@ -408,30 +408,48 @@ -- * MonadTransControl & MonadControlIO -------------------------------------------------------------------------------- +{-|+Regions do not have an instance for 'MonadControlIO' since that would break the+safety guarantees. (Think about lifting 'forkIO' into a region!)++However 'runRegionT' and other operations on regions do need the ability to lift+control operations. This is where the 'RegionControlIO' class comes in. This+class is identical to `MonadControlIO` but its 'unsafeLiftControlIO' method is+not exported by this module. So user can't accidentally break the safety.++Note that a 'RegionT' is an instance of this class. For the rest there is a+catch-all @instance 'MonadControlIO' m => 'RegionControlIO' m@.+-}+class MonadIO m ⇒ RegionControlIO m where+    unsafeLiftControlIO ∷ (RunInBase m IO → IO α) → m α++instance RegionControlIO pr ⇒ RegionControlIO (RegionT s pr) where+    unsafeLiftControlIO f =+        unsafeLiftControl $ \runInPr →+          unsafeLiftControlIO $ \runInBase →+            let run = liftM (join ∘ lift) ∘ runInBase ∘ runInPr+            in f run++instance MonadControlIO m ⇒ RegionControlIO m where+    unsafeLiftControlIO = liftControlIO++--------------------------------------------------------------------------------+ unsafeLiftControl ∷ Monad pr ⇒ (Run (RegionT s) → pr α) → RegionT s pr α unsafeLiftControl f = RegionT $ liftControl $ \runReader →                         f $ liftM RegionT ∘ runReader ∘ unRegionT -unsafeLiftControlIO ∷ MonadControlIO pr-                    ⇒ (RunInBase (RegionT s pr) IO → IO α) → RegionT s pr α-unsafeLiftControlIO f = unsafeLiftControl $ \runInPr →-                          liftControlIO $ \runInBase →-                            let run = liftM (join ∘ lift) ∘ runInBase ∘ runInPr-                            in f run--unsafeControlIO ∷ MonadControlIO pr-                ⇒ (RunInBase (RegionT s pr) IO → IO (RegionT s pr α))-                 → RegionT s pr α+unsafeControlIO ∷ RegionControlIO m ⇒ (RunInBase m IO → IO (m α)) → m α unsafeControlIO = join ∘ unsafeLiftControlIO -unsafeLiftIOOp ∷ MonadControlIO pr-               ⇒ ((α → IO (RegionT s pr β)) → IO (RegionT s pr γ))-               → ((α →     RegionT s pr β)  →     RegionT s pr γ)+unsafeLiftIOOp ∷ RegionControlIO m+               ⇒ ((α → IO (m β)) → IO (m γ))+               → ((α →     m β)  →     m γ) unsafeLiftIOOp f = \g → unsafeControlIO $ \runInIO → f $ runInIO ∘ g -unsafeLiftIOOp_ ∷ MonadControlIO pr-                ⇒ (IO (RegionT s pr α) → IO (RegionT s pr β))-                → (    RegionT s pr α →      RegionT s pr β)+unsafeLiftIOOp_ ∷ RegionControlIO m+                ⇒ (IO (m α) → IO (m β))+                → (    m α →      m β) unsafeLiftIOOp_ f = \m → unsafeControlIO $ \runInIO → f $ runInIO m  --------------------------------------------------------------------------------
Control/Monad/Trans/Region/Unsafe.hs view
@@ -13,8 +13,8 @@       unsafeStripLocal        -- * MonadTransControl & MonadControlIO-    , unsafeLiftControl     , unsafeLiftControlIO+    , unsafeLiftControl     , unsafeControlIO     , unsafeLiftIOOp     , unsafeLiftIOOp_
regions.cabal view
@@ -1,5 +1,5 @@ name:          regions-version:       0.10+version:       0.11 cabal-version: >=1.6 build-type:    Simple license:       BSD3