src/Pure/Concurrent/lazy.ML
changeset 68867 a8728e3f9822
parent 68698 6ee53660a911
child 68868 5f44ad150ed8
equal deleted inserted replaced
68866:d4681a748873 68867:a8728e3f9822
    13   val lazy_name: string -> (unit -> 'a) -> 'a lazy
    13   val lazy_name: string -> (unit -> 'a) -> 'a lazy
    14   val lazy: (unit -> 'a) -> 'a lazy
    14   val lazy: (unit -> 'a) -> 'a lazy
    15   val peek: 'a lazy -> 'a Exn.result option
    15   val peek: 'a lazy -> 'a Exn.result option
    16   val is_running: 'a lazy -> bool
    16   val is_running: 'a lazy -> bool
    17   val is_finished: 'a lazy -> bool
    17   val is_finished: 'a lazy -> bool
       
    18   val finished_result: 'a lazy -> 'a Exn.result
    18   val force_result: 'a lazy -> 'a Exn.result
    19   val force_result: 'a lazy -> 'a Exn.result
    19   val force: 'a lazy -> 'a
    20   val force: 'a lazy -> 'a
    20   val force_value: 'a lazy -> 'a lazy
    21   val force_value: 'a lazy -> 'a lazy
    21   val map: ('a -> 'b) -> 'a lazy -> 'b lazy
    22   val map: ('a -> 'b) -> 'a lazy -> 'b lazy
    22   val map_finished: ('a -> 'b) -> 'a lazy -> 'b lazy
    23   val map_finished: ('a -> 'b) -> 'a lazy -> 'b lazy
    57   | is_running (Lazy var) =
    58   | is_running (Lazy var) =
    58       (case Synchronized.value var of
    59       (case Synchronized.value var of
    59         Expr _ => false
    60         Expr _ => false
    60       | Result res => not (Future.is_finished res));
    61       | Result res => not (Future.is_finished res));
    61 
    62 
       
    63 fun is_finished_future res =
       
    64   Future.is_finished res andalso not (Exn.is_interrupt_exn (Future.join_result res));
       
    65 
    62 fun is_finished (Value _) = true
    66 fun is_finished (Value _) = true
    63   | is_finished (Lazy var) =
    67   | is_finished (Lazy var) =
    64       (case Synchronized.value var of
    68       (case Synchronized.value var of
    65         Expr _ => false
    69         Expr _ => false
    66       | Result res =>
    70       | Result res => is_finished_future res);
    67           Future.is_finished res andalso not (Exn.is_interrupt_exn (Future.join_result res)));
    71 
       
    72 fun finished_result (Value a) = Exn.Res a
       
    73   | finished_result (Lazy var) =
       
    74       let fun fail () = Exn.Exn (Fail "Unfinished lazy") in
       
    75         (case Synchronized.value var of
       
    76           Expr _ => fail ()
       
    77         | Result res => if is_finished_future res then Future.join_result res else fail ())
       
    78       end;
    68 
    79 
    69 
    80 
    70 (* force result *)
    81 (* force result *)
    71 
    82 
    72 fun force_result (Value a) = Exn.Res a
    83 fun force_result (Value a) = Exn.Res a