sig
  type a
  type +'a t
  val empty : 'Knn.S.t
  val create_balanced : (Knn.S.a * 'a) list -> 'Knn.S.t
  val add : Knn.S.a -> '-> 'Knn.S.t -> 'Knn.S.t
  val find_k_nearest :
    'Knn.S.t -> int -> float -> Knn.S.a -> (float * Knn.S.a * 'a) list
  val contents : 'Knn.S.t -> (Knn.S.a * 'a) list
  val rebalance : 'Knn.S.t -> 'Knn.S.t
end