let rec filter_filter kind = function
  Group s when kind = `Group -> Some (Group s)
| Group _ -> None
| Item s when kind = `Item -> Some (Item s)
| Item _ -> None
| Empty when kind = `Group -> Some Empty
| Empty -> None
| State s when kind = `Item -> Some (State s)
| State _ -> None
| Desc s when kind = `Item -> Some (Desc s)
| Desc _ -> None
| Before d when kind = `Item -> Some (Before d)
| Before _ -> None
| And (f1, f2) ->
    begin
      match filter_filter kind f1, filter_filter kind f2 with
        NoneNone -> None
      | Some f, None
      | NoneSome f -> Some f
      | Some f1, Some f2 -> Some (And (f1, f2))
    end
| Or (f1, f2) ->
    begin
      match filter_filter kind f1, filter_filter kind f2 with
        NoneNone -> None
      | Some f, None
      | NoneSome f -> Some f
      | Some f1, Some f2 -> Some (Or (f1, f2))
    end
| Not f ->
    match filter_filter kind f with
      None -> None
    | Some f -> Some (Not f)