struct

  include SmartPrint

  let (%) = (^-^)
  let s str = 
    let has_leading_space = String.get str ~index:0 = Some ' ' in
    let has_ending_space = String.(get str ~index:(length str - 1)) = Some ' ' in
    (if has_leading_space then space else empty) 
    % words str 
    % (if has_ending_space then space  else empty)

  let sp = space
  let sf fmt = ksprintf s fmt
  let i i = OCaml.int i
  let f f = OCaml.float f
  let n = newline
  let verbatim s = string s
  let exn e = s (Printexc.to_string e)
  let option ~f = function
  | Some o -> f o
  | None -> empty

  let escape c = ksprintf string "\027[%sm" c 
  let color c t = escape c % t % escape "0"
  let bold_red t =  color "1;31" t
  let bold_yellow t =  color "1;33" t
  let bold_green t =  color "1;32" t
  let greyish t = color "37" t

  let to_string ~line_width ~indent t =
    SmartPrint.to_string line_width indent t

  let to_list ~line_width ~indent t =
    let res = ref [] in
    let add c = res := c :: !res in
    SmartPrint.to_something line_width indent
      (fun c -> `Char c |> add)
      (fun s -> `String s |> add)
      (fun s ofs len -> `Sub_string (s, ofs, len) |> add)
      t;
    List.rev !res

end