let rec trees_of_list l =
match l with
[] -> []
| ([],_) :: q ->
trees_of_list q
| ([(mods,key)],f) :: q ->
(handler_tree
~mods key (Handler (handler f))) ::
(trees_of_list q)
| (((mods,key)::b),_) :: q ->
let mods = List.sort Pervasives.compare mods in
let pred = function
([],_) -> false
| (((mods2,key2)::_),_) ->
key2 = key &&
List.sort Pervasives.compare mods2 = mods
in
let (same,diff) = List.partition pred l in
let subs = List.map
(function
((_::q),f) -> (q,f)
| _ -> assert false
)
same
in
(handler_tree ~mods key (Node (trees_of_list subs))) ::
(trees_of_list q)