src/Pure/General/susp.ML
changeset 23922 707639e9497d
parent 20594 b80c4a5cd018
child 24058 81aafd465662
equal deleted inserted replaced
23921:947152add153 23922:707639e9497d
    26 
    26 
    27 fun value v = ref (Value v);
    27 fun value v = ref (Value v);
    28 
    28 
    29 fun delay f = ref (Delay f);
    29 fun delay f = ref (Delay f);
    30 
    30 
    31 fun force (ref (Value v)) = v
    31 fun force susp = CRITICAL (fn () =>
    32   | force (r as ref (Delay f)) =
    32   (case ! susp of
       
    33     Value v => v
       
    34   | Delay f =>
    33       let
    35       let
    34         val v = f ()
    36         val v = f ();
    35       in
    37         val _ = susp := Value v;
    36         r := Value v;
    38       in v end));
    37         v
       
    38       end;
       
    39 
    39 
    40 fun peek (ref (Value v)) = SOME v
    40 fun peek susp =
    41   | peek (ref (Delay _)) = NONE;
    41   (case ! susp of
       
    42     Value v => SOME v
       
    43   | Delay _ => NONE);
    42 
    44 
    43 fun same (r1 : 'a T, r2) = (r1 = r2); (*equality on references*)
    45 fun same (r1 : 'a T, r2) = (r1 = r2); (*equality on references*)
    44 
    46 
    45 end
    47 end