src/Pure/Concurrent/par_list.ML
changeset 73686 b9aae426e51d
parent 68130 6fb85346cb79
child 78705 fde0b195cb7d
equal deleted inserted replaced
73685:c17253cad5c6 73686:b9aae426e51d
    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)