src/Pure/General/susp.ML
changeset 23922 707639e9497d
parent 20594 b80c4a5cd018
child 24058 81aafd465662
--- a/src/Pure/General/susp.ML	Mon Jul 23 14:06:11 2007 +0200
+++ b/src/Pure/General/susp.ML	Mon Jul 23 14:06:12 2007 +0200
@@ -28,17 +28,19 @@
 
 fun delay f = ref (Delay f);
 
-fun force (ref (Value v)) = v
-  | force (r as ref (Delay f)) =
+fun force susp = CRITICAL (fn () =>
+  (case ! susp of
+    Value v => v
+  | Delay f =>
       let
-        val v = f ()
-      in
-        r := Value v;
-        v
-      end;
+        val v = f ();
+        val _ = susp := Value v;
+      in v end));
 
-fun peek (ref (Value v)) = SOME v
-  | peek (ref (Delay _)) = NONE;
+fun peek susp =
+  (case ! susp of
+    Value v => SOME v
+  | Delay _ => NONE);
 
 fun same (r1 : 'a T, r2) = (r1 = r2); (*equality on references*)