src/Pure/General/susp.ML
changeset 28349 46a0dc9b51bb
parent 28159 80823c582b9d
child 28671 ed6681dd35d8
equal deleted inserted replaced
28348:4f2406ddd9ea 28349:46a0dc9b51bb
     9 sig
     9 sig
    10   type 'a T
    10   type 'a T
    11   val value: 'a -> 'a T
    11   val value: 'a -> 'a T
    12   val delay: (unit -> 'a) -> 'a T
    12   val delay: (unit -> 'a) -> 'a T
    13   val force: 'a T -> 'a
    13   val force: 'a T -> 'a
       
    14   val map_force: ('a -> 'a) -> 'a T -> 'a T
    14   val peek: 'a T -> 'a option
    15   val peek: 'a T -> 'a option
    15   val same: 'a T * 'a T -> bool
    16   val same: 'a T * 'a T -> bool
    16 end
    17 end
    17 
    18 
    18 structure Susp :> SUSP =
    19 structure Susp :> SUSP =
    36           let
    37           let
    37             val v = f ();
    38             val v = f ();
    38             val _ = susp := Value v;
    39             val _ = susp := Value v;
    39           in v end));
    40           in v end));
    40 
    41 
    41 fun peek susp =
    42 fun map_force f = value o f o force;
    42   (case ! susp of
    43 
    43     Value v => SOME v
    44 fun peek (ref (Value v)) = SOME v
    44   | Delay _ => NONE);
    45   | peek (ref (Delay _)) = NONE;
    45 
    46 
    46 fun same (r1 : 'a T, r2) = (r1 = r2); (*equality on references*)
    47 fun same (r1 : 'a T, r2) = (r1 = r2); (*equality on references*)
    47 
    48 
    48 end;
    49 end;