9 datatype 'a result = Result of 'a | Exn of exn |
9 datatype 'a result = Result of 'a | Exn of exn |
10 val get_result: 'a result -> 'a option |
10 val get_result: 'a result -> 'a option |
11 val get_exn: 'a result -> exn option |
11 val get_exn: 'a result -> exn option |
12 val capture: ('a -> 'b) -> 'a -> 'b result |
12 val capture: ('a -> 'b) -> 'a -> 'b result |
13 val release: 'a result -> 'a |
13 val release: 'a result -> 'a |
14 val map_result: ('a -> 'a) -> 'a result -> 'a result |
14 val map_result: ('a -> 'b) -> 'a result -> 'b result |
15 exception Interrupt |
15 exception Interrupt |
16 val interrupt: unit -> 'a |
16 val interrupt: unit -> 'a |
17 val is_interrupt: exn -> bool |
17 val is_interrupt: exn -> bool |
18 val interrupt_exn: 'a result |
18 val interrupt_exn: 'a result |
19 val is_interrupt_exn: 'a result -> bool |
19 val is_interrupt_exn: 'a result -> bool |
|
20 val interruptible_capture: ('a -> 'b) -> 'a -> 'b result |
20 exception EXCEPTIONS of exn list |
21 exception EXCEPTIONS of exn list |
21 val flatten: exn -> exn list |
22 val flatten: exn -> exn list |
22 val flatten_list: exn list -> exn list |
23 val flatten_list: exn list -> exn list |
23 val release_all: 'a result list -> 'a list |
24 val release_all: 'a result list -> 'a list |
24 val release_first: 'a result list -> 'a list |
25 val release_first: 'a result list -> 'a list |
43 |
44 |
44 fun release (Result y) = y |
45 fun release (Result y) = y |
45 | release (Exn e) = reraise e; |
46 | release (Exn e) = reraise e; |
46 |
47 |
47 fun map_result f (Result x) = Result (f x) |
48 fun map_result f (Result x) = Result (f x) |
48 | map_result f e = e; |
49 | map_result f (Exn e) = (Exn e); |
49 |
50 |
50 |
51 |
51 (* interrupts *) |
52 (* interrupts *) |
52 |
53 |
53 exception Interrupt = Interrupt; |
54 exception Interrupt = Interrupt; |
54 |
55 |
55 fun interrupt () = raise Interrupt; |
56 fun interrupt () = raise Interrupt; |
56 |
57 |
57 fun is_interrupt Interrupt = true |
58 fun is_interrupt Interrupt = true |
58 | is_interrupt (IO.Io {cause = Interrupt, ...}) = true |
59 | is_interrupt (IO.Io {cause, ...}) = is_interrupt cause |
59 | is_interrupt _ = false; |
60 | is_interrupt _ = false; |
60 |
61 |
61 val interrupt_exn = Exn Interrupt; |
62 val interrupt_exn = Exn Interrupt; |
62 |
63 |
63 fun is_interrupt_exn (Exn exn) = is_interrupt exn |
64 fun is_interrupt_exn (Exn exn) = is_interrupt exn |
64 | is_interrupt_exn _ = false; |
65 | is_interrupt_exn _ = false; |
|
66 |
|
67 fun interruptible_capture f x = |
|
68 Result (f x) handle e => if is_interrupt e then reraise e else Exn e; |
65 |
69 |
66 |
70 |
67 (* nested exceptions *) |
71 (* nested exceptions *) |
68 |
72 |
69 exception EXCEPTIONS of exn list; |
73 exception EXCEPTIONS of exn list; |