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)