1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
module Deep = struct
open Effect.Deep
type ('a, 'b) resumption = ('a, 'b) continuation
external clone_continuation : ('a, 'b) continuation -> ('a, 'b) continuation
= "multicont_clone_continuation"
external drop_continuation : ('a, 'b) continuation -> unit
= "multicont_drop_continuation"
external promote : ('a, 'b) continuation -> ('a, 'b) resumption
= "multicont_promote"
let promote : ('a, 'b) continuation -> ('a, 'b) resumption
= fun k ->
let r = promote k in
Gc.finalise drop_continuation r; r
let resume : ('a, 'b) resumption -> 'a -> 'b
= fun r v -> continue (clone_continuation r) v
let abort : ('a, 'b) resumption -> exn -> 'b
= fun r exn -> discontinue (clone_continuation r) exn
let abort_with_backtrace : ('a, 'b) resumption -> exn ->
Printexc.raw_backtrace -> 'b
= fun r exn bt ->
discontinue_with_backtrace (clone_continuation r) exn bt
end
module Shallow = struct open Effect.Shallow
type ('a, 'b) resumption = ('a, 'b) continuation
external clone_continuation : ('a, 'b) continuation -> ('a, 'b) continuation
= "multicont_clone_continuation"
external drop_continuation : ('a, 'b) continuation -> unit
= "multicont_drop_continuation"
external promote : ('a, 'b) continuation -> ('a, 'b) resumption
= "multicont_promote"
let promote : ('a, 'b) continuation -> ('a, 'b) resumption
= fun k ->
let r = promote k in
Gc.finalise drop_continuation r; r
let resume_with : ('c, 'a) resumption -> 'c -> ('a, 'b) handler -> 'b
= fun r v h -> continue_with (clone_continuation r) v h
let abort_with : ('c, 'a) resumption -> exn -> ('a, 'b) handler -> 'b
= fun r exn h -> discontinue_with (clone_continuation r) exn h
let abort_with_backtrace : ('c, 'a) resumption -> exn ->
Printexc.raw_backtrace -> ('a, 'b) handler -> 'b
= fun r exn bt h ->
discontinue_with_backtrace (clone_continuation r) exn bt h
end