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
None, None -> None
| Some f, None
| None, Some 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
None, None -> None
| Some f, None
| None, Some 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)