let rec item_verifies_filter f path i =
  match f with
    Item s -> title_verifies_path s path i.item_title
  | State s -> i.item_state = s
  | Desc s ->
      Str.string_match
        (Str.regexp s)
        (match i.item_desc with None -> "" | Some s -> s)
        0
  | Before d ->
      let d2 =
        match i.item_enddate with
          None -> i.item_date
        | Some d -> d
      in
      compare_dates d d2 >= 0
  | And (f1, f2) ->
      item_verifies_filter f1 path i && item_verifies_filter f2 path i
  | Or (f1, f2) ->
      item_verifies_filter f1 path i || item_verifies_filter f2 path i
  | Not f ->
      not (item_verifies_filter f path i)
  | _ -> assert false