Refactor the tracing code, store the whole tree structure in a javascript array and...
[tatoo.git] / src / pretty.ml
index 02c413f..b39375a 100644 (file)
@@ -86,6 +86,8 @@ let up_arrow = "↑"
 let right_arrow = "→"
 let left_arrow =  "←"
 let epsilon = "ϵ"
+let bullet = "•"
+let big_sigma = "∑"
 let cap = "∩"
 let cup = "∪"
 let lnot = "¬"
@@ -94,6 +96,7 @@ let vee = "∨"
 let top = "⊤"
 let bottom = "⊥"
 let dummy = "☠"
+let inverse = "⁻¹"
 let double_right_arrow = "⇒"
 let combining_overbar = "\204\133"
 let combining_underbar = "\204\178"
@@ -105,14 +108,8 @@ let overline s = combine_all combining_overbar s
 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 '_'
 
 
 
@@ -125,27 +122,42 @@ let pp_underline = ppf underline
 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