1999-12-16 04:25:11 -08:00
|
|
|
(*************************************************************************)
|
|
|
|
(* *)
|
|
|
|
(* Objective Caml LablTk library *)
|
|
|
|
(* *)
|
|
|
|
(* Jacques Garrigue, Kyoto University RIMS *)
|
|
|
|
(* *)
|
|
|
|
(* Copyright 1999 Institut National de Recherche en Informatique et *)
|
|
|
|
(* en Automatique and Kyoto University. All rights reserved. *)
|
|
|
|
(* This file is distributed under the terms of the GNU Library *)
|
|
|
|
(* General Public License. *)
|
|
|
|
(* *)
|
|
|
|
(*************************************************************************)
|
|
|
|
|
1999-11-30 06:59:39 -08:00
|
|
|
(* $Id$ *)
|
|
|
|
|
1999-12-10 01:40:51 -08:00
|
|
|
type ('a, 'b) assoc_list =
|
|
|
|
Nil
|
|
|
|
| Cons of 'a * 'b * ('a, 'b) assoc_list
|
|
|
|
|
|
|
|
let rec assq :key = function
|
|
|
|
Nil -> raise Not_found
|
|
|
|
| Cons (a, b, l) ->
|
|
|
|
if key == a then b else assq :key l
|
|
|
|
|
|
|
|
let fast fun:f =
|
|
|
|
let memo = ref Nil in
|
|
|
|
fun key ->
|
|
|
|
try assq :key !memo
|
1999-11-30 06:59:39 -08:00
|
|
|
with Not_found ->
|
|
|
|
let data = f key in
|
1999-12-10 01:40:51 -08:00
|
|
|
memo := Cons(key, data, !memo);
|
1999-11-30 06:59:39 -08:00
|
|
|
data
|
1999-12-10 01:40:51 -08:00
|
|
|
|
|
|
|
|