|
@@ -2,20 +2,59 @@
|
|
|
-- documentation, see http://haskell.org/cabal/users-guide/
|
|
|
|
|
|
name: interruptible
|
|
|
-version: 0.1.1.0
|
|
|
+version: 0.1.1.1
|
|
|
synopsis: Monad transformers that can be run and resumed later, conserving their context.
|
|
|
description:
|
|
|
- Given an inner monad and a transformer:
|
|
|
- > (Monad m, MonadTrans t)
|
|
|
- If t is an interruptible transformer, it becomes possible to intercalate executions
|
|
|
- on the t context with executions over the inner monad m by breaking the execution
|
|
|
- on t and resuming it later.
|
|
|
+ Given an inner monad @M@ and a transformer @T@, if T is an interruptible transformer,
|
|
|
+ it becomes possible to intercalate functions over its context with functions over the
|
|
|
+ inner monad. That is, code like this:
|
|
|
.
|
|
|
- Interruptible monads implement the @runI@ function so that, given 'f :: a -> t m b' and
|
|
|
- 'g :: b -> t m c', 'resume (f >>= g)' is equivalent to '\x -> resume f x >>= resume g'.
|
|
|
+ @
|
|
|
+ runT (f 1 >>= g)
|
|
|
+ where
|
|
|
+ f :: Int -> T M a
|
|
|
+ g :: a -> T M b
|
|
|
+ @
|
|
|
.
|
|
|
- That makes it possible to intercalate the execution of different monads, and even to
|
|
|
- return a monadic context for another function to resume it.
|
|
|
+ Can be broken up like this:
|
|
|
+ .
|
|
|
+ @
|
|
|
+ do
|
|
|
+ let c0 = inTCtx 1
|
|
|
+ c1 <- resume f ct1
|
|
|
+ _ <- resume g ct2
|
|
|
+ @
|
|
|
+ .
|
|
|
+ That makes it possible to intercalate the execution of different contexts, and
|
|
|
+ treat contexts like data, for iterating or returning them.
|
|
|
+ .
|
|
|
+ As shown on the example, interruptible transformers are resumed with the @resume@ function.
|
|
|
+ State may be managed by specialized functions usually named as @inTransfomerCtx@ and
|
|
|
+ @peelTransformerCtx@ that enclose a value in an initial context and retrieve the
|
|
|
+ value from a context.
|
|
|
+ .
|
|
|
+ Interruptible transformers can be stacked. On this case, they must be resumed with a
|
|
|
+ composition of @resume@ calls, and their contexts must be created and peeled on the inverse
|
|
|
+ order that they appear on the stack. Like:
|
|
|
+ .
|
|
|
+ @
|
|
|
+ do
|
|
|
+ let c0 = inT2Ctx . inT1Ctx $ 1
|
|
|
+ c1 <- (resume . resume) f ct1
|
|
|
+ _ <- (resume . resume) g ct2
|
|
|
+ where
|
|
|
+ f :: Monad m => Int -> T1 T2 M a
|
|
|
+ g :: Monad m => a -> T1 T2 M b
|
|
|
+ @
|
|
|
+ .
|
|
|
+ For convenience, the @Interruptible@ module exports the @resume2@ to @resume5@
|
|
|
+ functions as composotions of resume. They can be composed further as in
|
|
|
+ @resume7 = resume3 . resume4@ if necessary.
|
|
|
+ .
|
|
|
+ This package also contains the appliable instantiations of Interruptible for the mtl transformers,
|
|
|
+ the @intercalateWith@ function, that intercalates calls of a function through a list
|
|
|
+ of contexts and parameters, and the @SafeIO@ module that lifts IOException treatment from the
|
|
|
+ base monad into the current resumed context.
|
|
|
homepage: https://sealgram.com/git/haskell/interruptible/
|
|
|
license: BSD3
|
|
|
license-file: LICENSE
|
|
@@ -35,7 +74,7 @@ source-repository head
|
|
|
source-repository this
|
|
|
type: git
|
|
|
location: https://sealgram.com/git/haskell/interruptible/
|
|
|
- tag: 0.1.1.0
|
|
|
+ tag: 0.1.1.1
|
|
|
|
|
|
|
|
|
library
|
|
@@ -45,7 +84,7 @@ library
|
|
|
other-modules: Control.Monad.Trans.Interruptible.Class
|
|
|
other-extensions: TypeFamilies
|
|
|
build-depends:
|
|
|
- base >=4.7 && <4.9,
|
|
|
+ base >=4.7 && <5,
|
|
|
transformers,
|
|
|
monad-control,
|
|
|
lifted-base,
|