-let rec get_tops v = function
- | [] -> [], []
- | (_,r)::tl ->
- let ds, ts = get_tops v tl in
- if compare_versions v r.ET.v = 0 then begin
- if r.ET.n = [] then objs_union r.ET.o ds, ts else
- let tops = rev_objs_of_names v [] r.ET.n in
- ds, objs_union (List.rev tops) ts
- end else
- ds, ts
-
-let rec match_names oi ni os ns =
- match os, ns with
- | _ , [] -> None
- | [] , _ -> None
- | (_,o)::otl,(_,n)::ntl ->
- let b = compare_names (snd o) n in
- if b > 0 then match_names oi (succ ni) os ntl else
- if b < 0 then match_names (succ oi) ni otl ns else
- Some (oi, ni)
+let roles_split s rs =
+ let rec aux rs os ns = function
+ | [] -> List.rev rs, os, ns
+ | (b, r) :: tl ->
+ if compare_versions s r.ET.v <> 0 then aux ((b, r)::rs) os ns tl else
+ if b then aux rs (objs_union os r.ET.o) (names_union ns r.ET.n) tl else
+ let ro, so = list_split r.ET.o in
+ let rn, sn = list_split r.ET.n in
+ if ro = [] && rn = [] then aux rs (objs_union os so) (names_union ns sn) tl else begin
+ r.ET.o <- ro; r.ET.o <- ro;
+ aux ((b, r)::rs) (objs_union os so) (names_union ns sn) tl
+ end
+ in
+ aux [] [] [] rs