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 exception Interrupt |
14 exception Interrupt |
|
15 val interrupt: unit -> 'a |
|
16 val is_interrupt: exn -> bool |
|
17 val interrupt_exn: 'a result |
|
18 val is_interrupt_exn: 'a result -> bool |
15 exception EXCEPTIONS of exn list |
19 exception EXCEPTIONS of exn list |
16 val flatten: exn -> exn list |
20 val flatten: exn -> exn list |
17 val flatten_list: exn list -> exn list |
21 val flatten_list: exn list -> exn list |
18 val release_all: 'a result list -> 'a list |
22 val release_all: 'a result list -> 'a list |
19 val release_first: 'a result list -> 'a list |
23 val release_first: 'a result list -> 'a list |
38 |
42 |
39 fun release (Result y) = y |
43 fun release (Result y) = y |
40 | release (Exn e) = reraise e; |
44 | release (Exn e) = reraise e; |
41 |
45 |
42 |
46 |
43 (* interrupt and nested exceptions *) |
47 (* interrupts *) |
44 |
48 |
45 exception Interrupt = Interrupt; |
49 exception Interrupt = Interrupt; |
|
50 |
|
51 fun interrupt () = raise Interrupt; |
|
52 |
|
53 fun is_interrupt Interrupt = true |
|
54 | is_interrupt _ = false; |
|
55 |
|
56 val interrupt_exn = Exn Interrupt; |
|
57 |
|
58 fun is_interrupt_exn (Exn exn) = is_interrupt exn |
|
59 | is_interrupt_exn _ = false; |
|
60 |
|
61 |
|
62 (* nested exceptions *) |
|
63 |
46 exception EXCEPTIONS of exn list; |
64 exception EXCEPTIONS of exn list; |
47 |
65 |
48 fun flatten Interrupt = [] |
66 fun flatten (EXCEPTIONS exns) = flatten_list exns |
49 | flatten (EXCEPTIONS exns) = flatten_list exns |
67 | flatten exn = if is_interrupt exn then [] else [exn] |
50 | flatten exn = [exn] |
|
51 and flatten_list exns = List.concat (map flatten exns); |
68 and flatten_list exns = List.concat (map flatten exns); |
52 |
69 |
53 fun release_all results = |
70 fun release_all results = |
54 if List.all (fn Result _ => true | _ => false) results |
71 if List.all (fn Result _ => true | _ => false) results |
55 then map (fn Result x => x) results |
72 then map (fn Result x => x) results |