Skip to content

Commit f7e37de

Browse files
committed
Bracket laws
1 parent 09d6d6b commit f7e37de

File tree

1 file changed

+31
-8
lines changed

1 file changed

+31
-8
lines changed

src/Control/Monad/Fork/Class.purs

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,16 @@ import Control.Monad.Trans.Class (lift)
2828
-- | Laws:
2929
-- |
3030
-- | ```purescript
31+
-- | -- Unjoined suspension is a no-op
32+
-- | suspend a1 *> suspend a2 = suspend a2
33+
-- |
34+
-- | -- Suspend/join is identity
3135
-- | suspend >=> join = id
36+
-- |
37+
-- | -- Fork/join is identity
38+
-- | fork >=> join = id
39+
-- |
40+
-- | -- Join is idempotent
3241
-- | join t *> join t = join t
3342
-- | ```
3443
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
5160
-- | Laws:
5261
-- |
5362
-- | ```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
5865
-- |
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
6368
-- | ```
6469
class (MonadFork f m, MonadThrow e m) MonadKill e f m | m e f where
6570
kill a. e f a m Unit
@@ -77,8 +82,23 @@ data BracketCondition e a
7782

7883
-- | Represents Monads which support cleanup in the presence of async
7984
-- | 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+
-- | ```
8099
class (MonadKill e f m, MonadError e m) MonadBracket e f m | m e f where
81100
bracket r a. m r (BracketCondition e a r m Unit) (r m a) m a
101+
uninterruptible a. m a m a
82102
never a. m a
83103

84104
instance monadBracketAffMonadBracket Aff.Error (Aff.Fiber eff) (Aff.Aff eff) where
@@ -89,11 +109,14 @@ instance monadBracketAff ∷ MonadBracket Aff.Error (Aff.Fiber eff) (Aff.Aff eff
89109
, killed: release <<< Killed
90110
}
91111
run
112+
uninterruptible = Aff.invincible
92113
never = Aff.never
93114

94115
instance monadBracketReaderTMonadBracket e f m MonadBracket e f (ReaderT r m) where
95116
bracket (ReaderT acquire) release run = ReaderT \r →
96117
bracket (acquire r)
97118
(\c a → runReaderT (release c a) r)
98119
(\a → runReaderT (run a) r)
120+
uninterruptible k = ReaderT \r ->
121+
uninterruptible (runReaderT k r)
99122
never = lift never

0 commit comments

Comments
 (0)