equal
deleted
inserted
replaced
5 evaluations. Interrupt counts as neutral element. |
5 evaluations. Interrupt counts as neutral element. |
6 *) |
6 *) |
7 |
7 |
8 signature PAR_EXN = |
8 signature PAR_EXN = |
9 sig |
9 sig |
10 val serial: exn -> serial * exn |
10 val identify: Properties.entry list -> exn -> exn |
11 val set_serial: exn -> exn |
11 val the_serial: exn -> int |
12 val make: exn list -> exn |
12 val make: exn list -> exn |
13 val dest: exn -> exn list option |
13 val dest: exn -> exn list option |
14 val is_interrupted: 'a Exn.result list -> bool |
14 val is_interrupted: 'a Exn.result list -> bool |
15 val release_all: 'a Exn.result list -> 'a list |
15 val release_all: 'a Exn.result list -> 'a list |
16 val release_first: 'a Exn.result list -> 'a list |
16 val release_first: 'a Exn.result list -> 'a list |
19 structure Par_Exn: PAR_EXN = |
19 structure Par_Exn: PAR_EXN = |
20 struct |
20 struct |
21 |
21 |
22 (* identification via serial numbers *) |
22 (* identification via serial numbers *) |
23 |
23 |
24 fun serial exn = |
24 fun identify default_props exn = |
25 (case get_exn_serial exn of |
25 let |
26 SOME i => (i, exn) |
26 val props = Exn_Properties.get exn; |
27 | NONE => |
27 val update_serial = |
28 let |
28 if Properties.defined props Markup.serialN then [] |
29 val i = Library.serial (); |
29 else [(Markup.serialN, serial_string ())]; |
30 val exn' = uninterruptible (fn _ => set_exn_serial i) exn; |
30 val update_props = filter_out (Properties.defined props o #1) default_props; |
31 in (i, exn') end); |
31 in Exn_Properties.update (update_serial @ update_props) exn end; |
32 |
32 |
33 fun set_serial exn = #2 (serial exn); |
33 fun the_serial exn = |
34 |
34 Markup.parse_int (the (Properties.get (Exn_Properties.get exn) Markup.serialN)); |
35 val the_serial = the o get_exn_serial; |
|
36 |
35 |
37 val exn_ord = rev_order o int_ord o pairself the_serial; |
36 val exn_ord = rev_order o int_ord o pairself the_serial; |
38 |
37 |
39 |
38 |
40 (* parallel exceptions *) |
39 (* parallel exceptions *) |
42 exception Par_Exn of exn list; |
41 exception Par_Exn of exn list; |
43 (*non-empty list with unique identified elements sorted by exn_ord; |
42 (*non-empty list with unique identified elements sorted by exn_ord; |
44 no occurrences of Par_Exn or Exn.Interrupt*) |
43 no occurrences of Par_Exn or Exn.Interrupt*) |
45 |
44 |
46 fun par_exns (Par_Exn exns) = exns |
45 fun par_exns (Par_Exn exns) = exns |
47 | par_exns exn = if Exn.is_interrupt exn then [] else [set_serial exn]; |
46 | par_exns exn = if Exn.is_interrupt exn then [] else [identify [] exn]; |
48 |
47 |
49 fun make exns = |
48 fun make exns = |
50 (case Ord_List.unions exn_ord (map par_exns exns) of |
49 (case Ord_List.unions exn_ord (map par_exns exns) of |
51 [] => Exn.Interrupt |
50 [] => Exn.Interrupt |
52 | es => Par_Exn es); |
51 | es => Par_Exn es); |