let ( |> ) x f = f x
module String = struct
let split_on_char sep s =
let r = ref [] in
let j = ref (String.length s) in
for i = String.length s - 1 downto 0 do
if String.unsafe_get s i = sep then begin
r := String.sub s (i + 1) (!j - i - 1) :: !r;
j := i
end
done;
String.sub s 0 !j :: !r
let starts_with ~prefix s =
let len_s = String.length s
and len_pre = String.length prefix in
let rec aux i =
if i = len_pre then true
else if String.unsafe_get s i <> String.unsafe_get prefix i then false
else aux (i + 1)
in len_s >= len_pre && aux 0
include String
end
module List = struct
let rec find_map f = function
| [] -> None
| x :: l ->
begin match f x with
| Some _ as result -> result
| None -> find_map f l
end
let rec filter_map f = function
| [] -> []
| x :: l -> (
match f x with
| None -> filter_map f l
| Some v -> v :: filter_map f l)
include List
end
module Option = struct
let value o ~default = match o with Some v -> v | None -> default
(* can't include Option because it was only introduced in 4.08 *)
(* include Option *)
end
module Sys = struct
let getenv_opt s =
try Some (Sys.getenv s)
with Not_found -> None
include Sys
end