+type 'a disambiguator_input = string * int * 'a
+
+type domain = domain_tree list
+and domain_tree = Node of Token.flocation list * domain_item * domain
+
+let rec string_of_domain =
+ function
+ [] -> ""
+ | Node (_,domain_item,l)::tl ->
+ DisambiguateTypes.string_of_domain_item domain_item ^
+ " [ " ^ string_of_domain l ^ " ] " ^ string_of_domain tl
+
+let rec filter_map_domain f =
+ function
+ [] -> []
+ | Node (locs,domain_item,l)::tl ->
+ match f locs domain_item with
+ None -> filter_map_domain f l @ filter_map_domain f tl
+ | Some res -> res :: filter_map_domain f l @ filter_map_domain f tl
+
+let rec map_domain f =
+ function
+ [] -> []
+ | Node (locs,domain_item,l)::tl ->
+ f locs domain_item :: map_domain f l @ map_domain f tl
+
+let uniq_domain dom =
+ let rec aux seen =
+ function
+ [] -> seen,[]
+ | Node (locs,domain_item,l)::tl ->
+ if List.mem domain_item seen then
+ let seen,l = aux seen l in
+ let seen,tl = aux seen tl in
+ seen, l @ tl
+ else
+ let seen,l = aux (domain_item::seen) l in
+ let seen,tl = aux seen tl in
+ seen, Node (locs,domain_item,l)::tl
+ in
+ snd (aux [] dom)