let filter_group f =
(*  prerr_endline (string_of_filter f);*)
  let (group_filter, item_filter) = split_filter f in
  (*
  prerr_endline
    (Printf.sprintf "group_filter: %s\nitem_filter: %s"
     (match group_filter with None -> "NONE" | Some f -> string_of_filter f)
       (match item_filter with None -> "NONE" | Some f -> string_of_filter f)
    );
    *)

  let rec iter path g =
    let new_path = concat_paths path g.group_title in
    let groups = List.map (iter new_path) g.group_groups in
    let groups = match group_filter with
        None -> groups
      | Some f -> filter_groups f new_path groups
    in
    let items = match item_filter with
        None -> g.group_items
      | Some f -> List.filter (item_verifies_filter f new_path) g.group_items
    in
    { g with group_groups = groups ; group_items = items ; }
  in
  iter ""