14 for operators that have side-effects or raise exceptions! |
14 for operators that have side-effects or raise exceptions! |
15 *) |
15 *) |
16 |
16 |
17 signature PAR_LIST = |
17 signature PAR_LIST = |
18 sig |
18 sig |
19 val map_name: string -> ('a -> 'b) -> 'a list -> 'b list |
19 val map': {name: string, sequential: bool} -> ('a -> 'b) -> 'a list -> 'b list |
20 val map_independent: ('a -> 'b) -> 'a list -> 'b list |
20 val map_independent: ('a -> 'b) -> 'a list -> 'b list |
21 val map: ('a -> 'b) -> 'a list -> 'b list |
21 val map: ('a -> 'b) -> 'a list -> 'b list |
22 val get_some: ('a -> 'b option) -> 'a list -> 'b option |
22 val get_some: ('a -> 'b option) -> 'a list -> 'b option |
23 val find_some: ('a -> bool) -> 'a list -> 'a option |
23 val find_some: ('a -> bool) -> 'a list -> 'a option |
24 val exists: ('a -> bool) -> 'a list -> bool |
24 val exists: ('a -> bool) -> 'a list -> bool |
26 end; |
26 end; |
27 |
27 |
28 structure Par_List: PAR_LIST = |
28 structure Par_List: PAR_LIST = |
29 struct |
29 struct |
30 |
30 |
31 fun forked_results name f xs = |
31 fun managed_results {name, sequential} f xs = |
32 if Future.relevant xs |
32 if sequential orelse not (Future.relevant xs) then map (Exn.capture f) xs |
33 then Future.forked_results {name = name, deps = []} (map (fn x => fn () => f x) xs) |
33 else |
34 else map (Exn.capture f) xs; |
34 Future.forked_results |
|
35 {name = if name = "" then "Par_List.map" else name, deps = []} |
|
36 (map (fn x => fn () => f x) xs); |
35 |
37 |
36 fun map_name name f xs = Par_Exn.release_first (forked_results name f xs); |
38 fun map' params f xs = Par_Exn.release_first (managed_results params f xs); |
37 fun map f = map_name "Par_List.map" f; |
39 fun map f = map' {name = "", sequential = false} f; |
38 fun map_independent f = map (Exn.interruptible_capture f) #> Par_Exn.release_all; |
40 fun map_independent f = map (Exn.interruptible_capture f) #> Par_Exn.release_all; |
39 |
41 |
40 fun get_some f xs = |
42 fun get_some f xs = |
41 let |
43 let |
42 exception FOUND of 'b; |
44 exception FOUND of 'b; |
43 val results = |
45 val results = |
44 forked_results "Par_List.get_some" |
46 managed_results {name = "Par_List.get_some", sequential = false} |
45 (fn x => (case f x of NONE => () | SOME y => raise FOUND y)) xs; |
47 (fn x => (case f x of NONE => () | SOME y => raise FOUND y)) xs; |
46 in |
48 in |
47 (case get_first (fn Exn.Exn (FOUND res) => SOME res | _ => NONE) results of |
49 (case get_first (fn Exn.Exn (FOUND res) => SOME res | _ => NONE) results of |
48 NONE => (Par_Exn.release_first results; NONE) |
50 NONE => (Par_Exn.release_first results; NONE) |
49 | some => some) |
51 | some => some) |