@@ -28,7 +28,16 @@ import Control.Monad.Trans.Class (lift)
28
28
-- | Laws:
29
29
-- |
30
30
-- | ```purescript
31
+ -- | -- Unjoined suspension is a no-op
32
+ -- | suspend a1 *> suspend a2 = suspend a2
33
+ -- |
34
+ -- | -- Suspend/join is identity
31
35
-- | suspend >=> join = id
36
+ -- |
37
+ -- | -- Fork/join is identity
38
+ -- | fork >=> join = id
39
+ -- |
40
+ -- | -- Join is idempotent
32
41
-- | join t *> join t = join t
33
42
-- | ```
34
43
class (Monad m , Functor f ) ⇐ MonadFork f m | m → f where
@@ -51,15 +60,11 @@ instance monadForkReaderT ∷ MonadFork f m ⇒ MonadFork f (ReaderT r m) where
51
60
-- | Laws:
52
61
-- |
53
62
-- | ```purescript
54
- -- | (do t <- suspend (throwError e1)
55
- -- | kill e2 t
56
- -- | join t)
57
- -- | = throwError e2
63
+ -- | -- Killed suspension is an exception
64
+ -- | suspend a >>= \f -> kill e f *> join f = throwError e
58
65
-- |
59
- -- | (do t <- fork (pure a)
60
- -- | kill e2 t
61
- -- | join t)
62
- -- | = pure a
66
+ -- | -- Suspend/kill is unit
67
+ -- | suspend a >>= kill e = pure unit
63
68
-- | ```
64
69
class (MonadFork f m , MonadThrow e m ) ⇐ MonadKill e f m | m → e f where
65
70
kill ∷ ∀ a . e → f a → m Unit
@@ -77,8 +82,23 @@ data BracketCondition e a
77
82
78
83
-- | Represents Monads which support cleanup in the presence of async
79
84
-- | exceptions.
85
+ -- |
86
+ -- | Laws:
87
+ -- | ```purescript
88
+ -- | bracket a k \_ -> pure r
89
+ -- | = uninterruptible (a >>= k (Completed r))
90
+ -- |
91
+ -- | -- Release failed
92
+ -- | bracket a k \_ -> throwError e
93
+ -- | = uninterruptible (a >>= k (Failed e) *> throwError e)
94
+ -- |
95
+ -- | -- Release killed
96
+ -- | fork (bracket a k \_ -> never) >>= \f -> kill e f *> void (try (join f))
97
+ -- | = uninterruptible (a >>= k (Killed e))
98
+ -- | ```
80
99
class (MonadKill e f m , MonadError e m ) ⇐ MonadBracket e f m | m → e f where
81
100
bracket ∷ ∀ r a . m r → (BracketCondition e a → r → m Unit ) → (r → m a ) → m a
101
+ uninterruptible ∷ ∀ a . m a → m a
82
102
never ∷ ∀ a . m a
83
103
84
104
instance monadBracketAff ∷ MonadBracket Aff.Error (Aff.Fiber eff ) (Aff.Aff eff ) where
@@ -89,11 +109,14 @@ instance monadBracketAff ∷ MonadBracket Aff.Error (Aff.Fiber eff) (Aff.Aff eff
89
109
, killed: release <<< Killed
90
110
}
91
111
run
112
+ uninterruptible = Aff .invincible
92
113
never = Aff .never
93
114
94
115
instance monadBracketReaderT ∷ MonadBracket e f m ⇒ MonadBracket e f (ReaderT r m ) where
95
116
bracket (ReaderT acquire) release run = ReaderT \r →
96
117
bracket (acquire r)
97
118
(\c a → runReaderT (release c a) r)
98
119
(\a → runReaderT (run a) r)
120
+ uninterruptible k = ReaderT \r ->
121
+ uninterruptible (runReaderT k r)
99
122
never = lift never
0 commit comments