module CCCache:sig
..end
Particularly useful for memoization. See CCCache.with_cache
and CCCache.with_cache_rec
for more details.
Since 0.6
type'a
equal ='a -> 'a -> bool
type'a
hash ='a -> int
Typical use case: one wants to memoize a function f : 'a -> 'b
. Code sample:
let f x =
print_endline "call f";
x + 1;;
let f' = with_cache (lru 256) f;;
f' 0;; (* prints *)
f' 1;; (* prints *)
f' 0;; (* doesn't print, returns cached value *)
type ('a, 'b)
t
val clear : ('a, 'b) t -> unit
val with_cache : ('a, 'b) t -> ('a -> 'b) -> 'a -> 'b
with_cache c f
behaves like f
, but caches calls to f
in the
cache c
. It always returns the same value as
f x
, if f x
returns, or raise the same exception.
However, f
may not be called if x
is in the cache.val with_cache_rec : ('a, 'b) t -> (('a -> 'b) -> 'a -> 'b) -> 'a -> 'b
with_cache_rec c f
is a function that first, applies f
to
some f' = fix f
, such that recursive calls to f'
are cached in c
.
It is similar to CCCache.with_cache
but with a function that takes as
first argument its own recursive version.
Example (memoized Fibonacci function):
let fib = with_cache_rec (lru 256)
(fun fib' n -> match n with
| 1 | 2 -> 1
| _ -> fib' (n-1) + fib' (n-2)
);;
fib 70;;
val size : ('a, 'b) t -> int
val iter : ('a, 'b) t -> ('a -> 'b -> unit) -> unit
size cache
pairs.val dummy : ('a, 'b) t
val linear : ?eq:'a equal -> int -> ('a, 'b) t
eq
: optional equality predicate for keysval replacing : ?eq:'a equal -> ?hash:'a hash -> int -> ('a, 'b) t
val lru : ?eq:'a equal -> ?hash:'a hash -> int -> ('a, 'b) t
val unbounded : ?eq:'a equal -> ?hash:'a hash -> int -> ('a, 'b) t
CCCache.clear
is called manually.