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
|
|
|
|
|
2000-04-02 18:57:52 -07:00
|
|
|
let rec assq key = function
|
1999-12-10 01:40:51 -08:00
|
|
|
Nil -> raise Not_found
|
|
|
|
| Cons (a, b, l) ->
|
2000-04-02 18:57:52 -07:00
|
|
|
if key == a then b else assq key l
|
1999-12-10 01:40:51 -08:00
|
|
|
|
2000-04-11 20:43:25 -07:00
|
|
|
let fast ~f =
|
1999-12-10 01:40:51 -08:00
|
|
|
let memo = ref Nil in
|
|
|
|
fun key ->
|
2000-04-02 18:57:52 -07:00
|
|
|
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
|
|
|
|
|
|
|
|