let right_arrow = "→"
let left_arrow = "←"
let epsilon = "ϵ"
+let bullet = "•"
let big_sigma = "∑"
let cap = "∩"
let cup = "∪"
let top = "⊤"
let bottom = "⊥"
let dummy = "☠"
+let inverse = "⁻¹"
let double_right_arrow = "⇒"
let combining_overbar = "\204\133"
let combining_underbar = "\204\178"
let underline s = combine_all combining_underbar s
let strike s = combine_all combining_stroke s
-let mk_repeater c =
- let mk_str i = String.make i c in
- let _table = Array.init 16 mk_str in
- fun i -> try
- if i < 16 then _table.(i) else mk_str i
- with e -> print_int i; print_newline(); raise e
-let padding = mk_repeater ' '
-let line = mk_repeater '_'
+let padding i = String.make i ' '
+let line i = String.make i '_'
let pp_strike = ppf strike
let pp_subscript = ppf subscript
let pp_superscript = ppf superscript
-let dummy_printer fmt () = ()
+let dummy_printer _ () = ()
let pp_print_list ?(sep=dummy_printer) printer fmt l =
match l with
[] -> ()
| [ e ] -> printer fmt e
- | e :: es -> printer fmt e; List.iter
+ | e :: es -> printer fmt e;
+ List.iter
(fun x ->
sep fmt ();
fprintf fmt "%a" printer x) es
+
+let pp_print_range ?(sep=dummy_printer) printer fmt (first, last) =
+ for i = first to last - 1 do
+ printer fmt i;
+ sep fmt ();
+ done;
+ if first <= last then printer fmt last
+
let pp_print_array ?(sep=dummy_printer) printer fmt a =
- pp_print_list ~sep:sep printer fmt (Array.to_list a)
+ pp_print_range ~sep:sep (fun fmt i -> printer fmt a.(i)) fmt
+ (0, (Array.length a - 1))
-let print_list ?(sep=" ") printer fmt l =
+let with_printer (f : ?sep:('a) -> 'b) strsep pr fmt =
let sep_printer fmt () =
- pp_print_string fmt sep
+ pp_print_string fmt strsep
in
- pp_print_list ~sep:sep_printer printer fmt l
+ fun x -> f ~sep:sep_printer pr fmt x
-let print_array ?(sep=" ") printer fmt a =
- print_list ~sep:sep printer fmt (Array.to_list a)
+let print_list ?(sep=" ") printer fmt l =
+ with_printer pp_print_list sep printer fmt l
+
+let print_array ?(sep=" ") printer fmt a =
+ with_printer pp_print_array sep printer fmt a
+let print_range ?(sep=" ") printer fmt r =
+ with_printer pp_print_range sep printer fmt r