(** A bounded key-value cache with first-in-first-out eviction. Keys are strings; values are whatever the instance stores. Callers build keys from content identifiers (a repository head hash, for example), so a key's value never changes — adding a key that is already present is therefore a no-op. *) type 'a t val create : capacity:int -> 'a t (** An empty cache holding at most [capacity] entries. *) val find : 'a t -> string -> 'a option val add : 'a t -> string -> 'a -> unit (** Insert a value, evicting the oldest entry when the cache is full. A no-op when the key is already present. *)