blob: 61bb539a6b0ef49a74fb42a6ab212c702b1cfc49 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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
|