forked from camlspotter/ocamloscope
-
Notifications
You must be signed in to change notification settings - Fork 0
/
packageq.ml
34 lines (28 loc) · 1.08 KB
/
packageq.ml
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
open Spotlib.Spot
open Ppx_orakuda.Regexp.Infix
open List
type t =
| Exclude of string (** -spotlib *)
| Only of string (** +spotlib *)
let to_string = function
| Exclude s -> "-" ^ s
| Only s -> "+" ^ s
let parse s =
match s with
| "" -> None
| _ -> Option.do_;
res <-- (s =~ {m|(-|\+)([A-Za-z.0-9_-]+)|m});
return & (if res#_1 = "-" then Exclude res#_2 else Only res#_2)
let parse_query s =
let tokens = String.split (function ' ' | '\t' -> true | _ -> false) s in
let ts = map (fun s -> s, parse s) tokens in
let ts1, rest = span (function (_,Some _) -> true | _ -> false) ts in
let rev_ts2, rev_rest = span (function (_,Some _) -> true | _ -> false) & rev rest in
(map (from_Some *< snd) (ts1 @ rev rev_ts2),
String.concat " " & rev_map fst rev_rest)
let compile q =
let match_ = OCamlFind.Packages.cached_match in
let exclude s = let m = match_ s in fun t -> not (m t) in
let only s = let m = match_ s in fun t -> m t in
let ands ms = fun t -> for_all (fun m -> m t) ms in
ands & map (function | Exclude s -> exclude s | Only s -> only s) q