+
+ let rec fold t ~f ~init:acc =
+ match t with
+ | Leaf -> acc
+ | Node (k, v, l, r) -> fold r ~f ~init:(f (fold l ~f ~init:acc) (k, v))
+
+ let print t ~k_to_string ~indent_level =
+ let (_, nodes) =
+ fold t
+ ~f:(fun (indentation, nodes) (k, _) ->
+ let indentation = indent_level ^ indentation in
+ let node = indentation ^ (k_to_string k) in
+ (indentation, node :: nodes)
+ )
+ ~init:(indent_level, [])
+ in
+ List.iter (List.rev nodes) ~f:print_endline