6464 BatIO. close_out f
6565end
6666
67+ (* TODO: generalize N argument to just to_string *)
6768module ArgNodeGraphMlWriter (N : MyARG.Node ) (M : StringGraphMlWriter ):
6869 GraphMlWriter with type node = N. t =
6970struct
@@ -81,6 +82,39 @@ struct
8182 let stop = M. stop
8283end
8384
85+ module EnumerateNodeGraphMlWriter (N : Hashtbl.HashedType ) (M : StringGraphMlWriter ):
86+ GraphMlWriter with type node = N. t =
87+ struct
88+ module H = Hashtbl. Make (N )
89+
90+ type t =
91+ {
92+ delegate : M .t ;
93+ node_numbers : int H .t ;
94+ mutable next_number : int
95+ }
96+ type node = N .t
97+
98+ let string_of_node ({node_numbers; next_number; _} as g ) node =
99+ let number = match H. find_opt node_numbers node with
100+ | Some number -> number
101+ | None ->
102+ let number = next_number in
103+ H. replace node_numbers node number;
104+ g.next_number < - number + 1 ;
105+ number
106+ in
107+ " N" ^ string_of_int number
108+
109+ let start out = { delegate = M. start out; node_numbers = H. create 100 ; next_number = 0 }
110+ let write_key {delegate; _} = M. write_key delegate
111+ let start_graph {delegate; _} = M. start_graph delegate
112+ let write_metadata {delegate; _} = M. write_metadata delegate
113+ let write_node ({delegate; _} as g ) node datas = M. write_node delegate (string_of_node g node) datas
114+ let write_edge ({delegate; _} as g ) source target datas = M. write_edge delegate (string_of_node g source) (string_of_node g target) datas
115+ let stop {delegate; _} = M. stop delegate
116+ end
117+
84118module DeDupGraphMlWriter (Node : Hashtbl.HashedType ) (M : GraphMlWriter with type node = Node.t ):
85119 GraphMlWriter with type node = Node. t =
86120struct
0 commit comments