src/Pure/Concurrent/lazy_sequential.ML
changeset 62360 3fd79fcdb491
parent 62358 0b7337826593
parent 62359 6709e51d5c11
child 62361 746d1698f31c
equal deleted inserted replaced
62358:0b7337826593 62360:3fd79fcdb491
     1 (*  Title:      Pure/Concurrent/lazy_sequential.ML
       
     2     Author:     Florian Haftmann and Makarius, TU Muenchen
       
     3 
       
     4 Lazy evaluation with memoing of results and regular exceptions
       
     5 (sequential version).
       
     6 *)
       
     7 
       
     8 structure Lazy: LAZY =
       
     9 struct
       
    10 
       
    11 (* datatype *)
       
    12 
       
    13 datatype 'a expr =
       
    14   Expr of unit -> 'a |
       
    15   Result of 'a Exn.result;
       
    16 
       
    17 abstype 'a lazy = Lazy of 'a expr Unsynchronized.ref
       
    18 with
       
    19 
       
    20 fun lazy e = Lazy (Unsynchronized.ref (Expr e));
       
    21 fun value a = Lazy (Unsynchronized.ref (Result (Exn.Res a)));
       
    22 
       
    23 fun peek (Lazy r) =
       
    24   (case ! r of
       
    25     Expr _ => NONE
       
    26   | Result res => SOME res);
       
    27 
       
    28 fun is_running _ = false;
       
    29 fun is_finished x = is_some (peek x);
       
    30 val finished_result = peek;
       
    31 
       
    32 
       
    33 (* force result *)
       
    34 
       
    35 fun force_result (Lazy r) =
       
    36   let
       
    37     val result =
       
    38       (case ! r of
       
    39         Expr e => Exn.capture e ()
       
    40       | Result res => res);
       
    41     val _ = if Exn.is_interrupt_exn result then () else r := Result result;
       
    42   in result end;
       
    43 
       
    44 fun force r = Exn.release (force_result r);
       
    45 fun map f x = lazy (fn () => f (force x));
       
    46 
       
    47 
       
    48 (* future evaluation *)
       
    49 
       
    50 fun future params x =
       
    51   if is_finished x then Future.value_result (force_result x)
       
    52   else (singleton o Future.forks) params (fn () => force x);
       
    53 
       
    54 end;
       
    55 end;
       
    56 
       
    57 type 'a lazy = 'a Lazy.lazy;
       
    58