(* Title: Pure/Concurrent/par_list.ML
Author: Makarius
Parallel list combinators.
Notes:
* These combinators only make sense if the operator (function or
predicate) applied to the list of operands takes considerable
time. The overhead of scheduling is significantly higher than
just traversing the list of operands sequentially.
* The order of operator application is non-deterministic. Watch out
for operators that have side-effects or raise exceptions!
*)
signature PAR_LIST =
sig
val map_name: string -> ('a -> 'b) -> 'a list -> 'b list
val map_independent: ('a -> 'b) -> 'a list -> 'b list
val map: ('a -> 'b) -> 'a list -> 'b list
val get_some: ('a -> 'b option) -> 'a list -> 'b option
val find_some: ('a -> bool) -> 'a list -> 'a option
val exists: ('a -> bool) -> 'a list -> bool
val forall: ('a -> bool) -> 'a list -> bool
end;
structure Par_List: PAR_LIST =
struct
fun forked_results name f xs =
if Future.relevant xs
then Future.forked_results {name = name, deps = []} (map (fn x => fn () => f x) xs)
else map (Exn.capture f) xs;
fun map_name name f xs = Par_Exn.release_first (forked_results name f xs);
fun map f = map_name "Par_List.map" f;
fun map_independent f = map (Exn.interruptible_capture f) #> Par_Exn.release_all;
fun get_some f xs =
let
exception FOUND of 'b;
val results =
forked_results "Par_List.get_some"
(fn x => (case f x of NONE => () | SOME y => raise FOUND y)) xs;
in
(case get_first (fn Exn.Exn (FOUND res) => SOME res | _ => NONE) results of
NONE => (Par_Exn.release_first results; NONE)
| some => some)
end;
fun find_some P = get_some (fn x => if P x then SOME x else NONE);
fun exists P = is_some o find_some P;
fun forall P = not o exists (not o P);
end;
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet)
¤
|
Haftungshinweis
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.
|