let rec insert_group ?(path=[]) g1 g2 =
  match path with
    [] ->
      begin
        try
          let g = List.find (fun g -> g.group_title = g2.group_title) g1.group_groups in
          let items = merge_items g.group_items g2.group_items in
          g.group_items <- items;
          List.iter (insert_group g) g2.group_groups
        with
          Not_found -> g1.group_groups <- g1.group_groups @ [g2]
      end
  | title :: q ->
      begin
        try
          let g = List.find (fun g -> g.group_title = title) g1.group_groups in
          insert_group ~path: q g g2
        with
          Not_found ->
            let empty = group ~title () in
            g1.group_groups <- g1.group_groups @ [empty];
            insert_group ~path: q empty g2
      end