(* Memoized promises *) module PromiseMemoized = struct type 'a promise = unit -> 'a let force promise = promise () let makePromise thunk = let memo = ref None in fun () -> match ! memo with Some v -> v | None -> let result = thunk () in let _ = memo := Some result in result end