Source file Printer_kit.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
module type S0 =
sig
type out
val text : string -> out -> unit
end
module type S =
sig
include S0
type t = out -> unit
val nil : t
val iter : ?sep:t -> ('a -> t) -> 'a list -> t
val option : ('a -> t) -> 'a option -> t
val seq : ?sep:t -> t list -> t
val trimmedText : string -> t
val space : t
end
module Kit (P : S0) : S with type out = P.out =
struct
include P
type t = out -> unit
let nil : t = fun _ -> ()
let iter ?(sep = nil) printer xs : t =
fun fmt ->
let n = List.length xs in
xs |> List.iteri @@ fun i x ->
if not (i = 0 || i = n) then
sep fmt;
printer x fmt
let option printer =
function
| None -> nil
| Some x -> printer x
let seq ?(sep = nil) ps : t =
iter ~sep Fun.id ps
let trimmedText (txt : string) : t =
let txt = String.trim txt in
if String.length txt > 0 then
text @@ txt
else
nil
let space = text " "
end