git.iko.soy/distributed-process
on master help sign in
MonadControl instance for Process.

A `MonadControl` instance makes it possible to lift many actions with an occurrence of `IO` in negative position to the `Process` monad. See e.g. the async library, which contains many such actions. This patch makes it possible to use `async` with `distributed-process`, via `lifted-async`. Signed-off-by: Mathieu Boespflug <m@tweag.io> Conflicts: distributed-process.cabal src/Control/Distributed/Process/Internal/Types.hs

commit53c7fe6a82c54a3caf0e168ebe3dfcd1d02dd0ca authorAlexander Vershilov <alexander.vershilov@gmail.com> dateThu 19 Jun 2014, 11:31 (12 years ago) parentc18f525
2 files changed+25−5
distributed-process.cabal+3−1 src/Control/Distributed/Process/Internal/Types.hs+22−4
distributed-process.cabal+3−1
@@ -54,7 +54,9 @@ Library
5454 ghc-prim >= 0.2 && < 0.5,
5555 distributed-static >= 0.2 && < 0.4,
5656 rank1dynamic >= 0.1 && < 0.4,
57− syb >= 0.3 && < 0.7
57+ syb >= 0.3 && < 0.7,
58+ transformers-base >= 0.3 && < 0.5,
59+ monad-control >= 0.3 && < 0.4
5860 Exposed-modules: Control.Distributed.Process,
5961 Control.Distributed.Process.Closure,
6062 Control.Distributed.Process.Debug,
src/Control/Distributed/Process/Internal/Types.hs+22−4
@@ -1,9 +1,11 @@
1+{-# LANGUAGE CPP #-}
12{-# LANGUAGE DeriveDataTypeable #-}
3+{-# LANGUAGE DeriveGeneric #-}
24{-# LANGUAGE ExistentialQuantification #-}
35{-# LANGUAGE GeneralizedNewtypeDeriving #-}
46{-# LANGUAGE GADTs #-}
5−{-# LANGUAGE DeriveGeneric #-}
6−{-# LANGUAGE CPP #-}
7+{-# LANGUAGE MultiParamTypeClasses #-}
8+{-# LANGUAGE TypeFamilies #-}
79
810-- | Types used throughout the Cloud Haskell framework
911--
@@ -116,7 +118,9 @@ import qualified Network.Transport as NT (EndPoint, EndPointAddress, Connection)
116118import Control.Applicative (Applicative, Alternative, (<$>), (<*>))
117119import Control.Monad.Fix (MonadFix)
118120import Control.Monad.Reader (MonadReader(..), ReaderT, runReaderT)
119−import Control.Monad.IO.Class (MonadIO)
121+import Control.Monad.IO.Class (MonadIO(..))
122+import Control.Monad.Base (MonadBase(..))
123+import Control.Monad.Trans.Control (MonadBaseControl(..))
120124import Control.Distributed.Process.Serializable
121125 ( Fingerprint
122126 , Serializable
@@ -345,7 +349,21 @@ data LocalProcessState = LocalProcessState
345349newtype Process a = Process {
346350 unProcess :: ReaderT LocalProcess IO a
347351 }
348− deriving (Functor, Monad, MonadIO, MonadReader LocalProcess, Typeable, Applicative, MonadFix)
352+ deriving ( Applicative, Functor, Monad, MonadFix, MonadIO
353+ , MonadReader LocalProcess, Typeable
354+ )
355+
356+instance MonadBase IO Process where
357+ liftBase = liftIO
358+
359+instance MonadBaseControl IO Process where
360+ newtype StM Process a =
361+ StMProcess { unStMProcess :: StM (ReaderT LocalProcess IO) a }
362+
363+ liftBaseWith f = Process $ liftBaseWith $ \run ->
364+ f $ fmap StMProcess . run . unProcess
365+
366+ restoreM = Process . restoreM . unStMProcess
349367
350368--------------------------------------------------------------------------------
351369-- Typed channels --