src/Tools/Metis/src/Lazy.sml
author wenzelm
Sat, 07 Apr 2012 16:41:59 +0200
changeset 47389 e8552cba702d
parent 39502 cffceed8e7fa
child 72004 913162a47d9f
permissions -rw-r--r--
explicit checks stable_finished_theory/stable_command allow parallel asynchronous command transactions; tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     1
(* ========================================================================= *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     2
(* SUPPORT FOR LAZY EVALUATION                                               *)
39502
cffceed8e7fa fix license
blanchet
parents: 39501
diff changeset
     3
(* Copyright (c) 2007 Joe Hurd, distributed under the BSD License            *)
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     4
(* ========================================================================= *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     6
structure Lazy :> Lazy =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     7
struct
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     8
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     9
datatype 'a thunk =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    10
    Value of 'a
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    11
  | Thunk of unit -> 'a;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    12
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    13
datatype 'a lazy = Lazy of 'a thunk ref;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    14
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    15
fun quickly v = Lazy (ref (Value v));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    16
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    17
fun delay f = Lazy (ref (Thunk f));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    18
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    19
fun force (Lazy s) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    20
    case !s of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    21
      Value v => v
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    22
    | Thunk f =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    23
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    24
        val v = f ()
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    25
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    26
        val () = s := Value v
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    27
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    28
        v
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    29
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    30
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    31
fun memoize f =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    32
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    33
      val t = delay f
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    34
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    35
      fn () => force t
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    36
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    37
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    38
end