let pp_print_list ppf ~elem_pp ~sep_pp = 
  let rec loop ppf = 
    function
        [] -> ()
      | [e] -> elem_pp ppf e;
      | h::tl ->
          fprintf ppf "%a%t%a"
            elem_pp h
            sep_pp
            loop tl
  in
  loop ppf