1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
(*
* This is a simple cache datatype.
*
* -- Allen
*)
signature CACHE_REF =
sig
type 'a cache
val cache : ('a -> 'b) -> 'a -> 'b cache
val flush : 'a cache -> unit
val ! : 'a cache -> 'a
val := : 'a cache * 'a -> unit
end
structure CacheRef :> CACHE_REF =
struct
type 'a cache = 'a option ref * (unit -> 'a)
fun cache f x = (ref NONE, fn _ => f x)
fun flush (x,_) = x := NONE
fun ! (r as ref NONE,f) = let val x = f() in r := SOME x; x end
| ! (r as ref(SOME x),f) = x
val op := = fn((r, _),x) => r := SOME x
end
|