-let merge canonicals elements n m =
- let cn,canonicals = rm_assoc n canonicals in
- let cm,canonicals = rm_assoc m canonicals in
- let ln,elements = rm_assoc cn elements in
- let lm,elements = rm_assoc cm elements in
- let canonicals =
- (n,cm)::(m,cm)::List.map
- (fun ((x,xc) as p) ->
- if xc = cn then (x,cm) else p) canonicals
- in
- let elements = (cm,ln@lm)::elements
- in
- canonicals,elements
+let merge canonicals elements extern n m =
+ let cn,canonicals = rm_assoc_option n canonicals in
+ let cm,canonicals = rm_assoc_option m canonicals in
+ match cn,cm with
+ | None, None -> canonicals, elements, extern
+ | None, Some c
+ | Some c, None ->
+ let l,elements = rm_assoc_assert c elements in
+ let canonicals =
+ List.filter (fun (_,xc) -> not (xc = c)) canonicals
+ in
+ canonicals,elements,l@extern
+ | Some cn, Some cm when cn=cm ->
+ (n,cm)::(m,cm)::canonicals, elements, extern
+ | Some cn, Some cm ->
+ let ln,elements = rm_assoc_assert cn elements in
+ let lm,elements = rm_assoc_assert cm elements in
+ let canonicals =
+ (n,cm)::(m,cm)::List.map
+ (fun ((x,xc) as p) ->
+ if xc = cn then (x,cm) else p) canonicals
+ in
+ let elements = (cm,ln@lm)::elements
+ in
+ canonicals,elements,extern