diff options
Diffstat (limited to 'motus/lib/criteria.ml')
| -rw-r--r-- | motus/lib/criteria.ml | 42 | 
1 files changed, 42 insertions, 0 deletions
diff --git a/motus/lib/criteria.ml b/motus/lib/criteria.ml new file mode 100644 index 0000000..61bb539 --- /dev/null +++ b/motus/lib/criteria.ml @@ -0,0 +1,42 @@ +open StdLabels + +type t = +  | Lenght of int +  | Contain of char * int option +  | NotContain of char * int option + +(** Return true if the word match the given filter *) +let check_filter : string -> t -> bool = + fun word f -> +  match f with +  | Lenght l -> l = String.length word +  | Contain (c, pos) -> +    ( match pos with +    | None -> String.contains word c +    | Some i -> Char.equal c (String.get word i) ) +  | NotContain (c, pos) -> +    ( match pos with +    | None -> not (String.contains word c) +    | Some i -> not (Char.equal c (String.get word i)) ) + + +let is_valid : t -> t -> bool = + fun t1 t2 -> +  match (t1, t2) with +  | Lenght _, Lenght _ -> false +  | Contain (c1, _), NotContain (c2, None) -> not (Char.equal c1 c2) +  | NotContain (c1, None), Contain (c2, _) -> not (Char.equal c1 c2) +  | Contain (c1, Some i1), Contain (c2, Some i2) -> Char.equal c1 c2 || i1 <> i2 +  | _ -> true + + +(** Add a new filter in the list if it is compatible with the existing ones *) +let add : t -> t list -> t list = + fun t filters -> +  match List.for_all ~f:(is_valid t) filters with +  | true -> t :: filters +  | false -> filters + + +let merge_lists : init:t list -> t list -> t list = + fun ~init news -> List.fold_left ~f:(fun acc t -> add t acc) ~init news  | 
