blob: 0d930899429545eb5e5973bd20fd7956b9bdabf1 [file] [log] [blame] [edit]
type void = |
module Fun =
struct
let id x = x
let flip f x y = f y x
let curry f x y = f (x, y)
let uncurry f (x, y) = f x y
let rec repeat n f x =
if n = 0 then x else repeat (n - 1) f (f x)
end
module Char =
struct
let is_digit_ascii c = '0' <= c && c <= '9'
let is_uppercase_ascii c = 'A' <= c && c <= 'Z'
let is_lowercase_ascii c = 'a' <= c && c <= 'z'
let is_letter_ascii c = is_uppercase_ascii c || is_lowercase_ascii c
let is_alphanum_ascii c = is_digit_ascii c || is_letter_ascii c
end
module String =
struct
let implode cs =
let buf = Buffer.create 80 in
List.iter (Buffer.add_char buf) cs;
Buffer.contents buf
let explode s =
let cs = ref [] in
for i = String.length s - 1 downto 0 do cs := s.[i] :: !cs done;
!cs
let split s c =
let len = String.length s in
let rec loop i =
if i > len then [] else
let j = try String.index_from s i c with Not_found -> len in
String.sub s i (j - i) :: loop (j + 1)
in loop 0
let breakup s n =
let rec loop i =
let len = min n (String.length s - i) in
if len = 0 then [] else String.sub s i len :: loop (i + len)
in loop 0
let rec find_from_opt f s i =
if i = String.length s then
None
else if f s.[i] then
Some i
else
find_from_opt f s (i + 1)
end
module List =
struct
let rec make n x = make' n x []
and make' n x xs =
if n = 0 then xs else make' (n - 1) x (x::xs)
let rec take n xs =
match n, xs with
| 0, _ -> []
| n, x::xs' when n > 0 -> x :: take (n - 1) xs'
| _ -> failwith "take"
let rec drop n xs =
match n, xs with
| 0, _ -> xs
| n, _::xs' when n > 0 -> drop (n - 1) xs'
| _ -> failwith "drop"
let rec split n xs = split' n [] xs
and split' n xs ys =
match n, ys with
| 0, _ -> List.rev xs, ys
| n, y::ys' when n > 0 -> split' (n - 1) (y::xs) ys'
| _ -> failwith "split"
let rec lead = function
| x::[] -> []
| x::xs -> x :: lead xs
| [] -> failwith "last"
let rec last = function
| x::[] -> x
| _::xs -> last xs
| [] -> failwith "last"
let rec split_last = function
| x::[] -> [], x
| x::xs -> let ys, y = split_last xs in x::ys, y
| [] -> failwith "split_last"
let rec index_where p xs = index_where' p xs 0
and index_where' p xs i =
match xs with
| [] -> None
| x::xs' when p x -> Some i
| x::xs' -> index_where' p xs' (i+1)
let index_of x = index_where ((=) x)
let rec map3 f xs ys zs =
match xs, ys, zs with
| [], [], [] -> []
| x::xs', y::ys', z::zs' -> f x y z :: map3 f xs' ys' zs'
| _ -> raise (Invalid_argument "Lib.List.map3")
let rec map_pairwise f = function
| [] -> []
| x1::x2::xs -> f x1 x2 :: map_pairwise f xs
| _ -> failwith "pairwise"
end
module List32 =
struct
let rec init n f = init' n f []
and init' n f xs =
if n = 0l then xs else init' (Int32.sub n 1l) f (f (Int32.sub n 1l) :: xs)
let rec make n x = make' n x []
and make' n x xs =
if n = 0l then xs else make' (Int32.sub n 1l) x (x::xs)
let rec length xs = length' xs 0l
and length' xs n =
match xs with
| [] -> n
| _::xs' when n < Int32.max_int -> length' xs' (Int32.add n 1l)
| _ -> failwith "length"
let rec nth xs n =
match n, xs with
| 0l, x::_ -> x
| n, _::xs' when n > 0l -> nth xs' (Int32.sub n 1l)
| _ -> failwith "nth"
let rec replace xs n y =
match n, xs with
| 0l, _::xs' -> y::xs'
| n, x::xs' when n > 0l -> x :: replace xs' (Int32.sub n 1l) y
| _ -> failwith "replace"
let rec take n xs =
match n, xs with
| 0l, _ -> []
| n, x::xs' when n > 0l -> x :: take (Int32.sub n 1l) xs'
| _ -> failwith "take"
let rec drop n xs =
match n, xs with
| 0l, _ -> xs
| n, _::xs' when n > 0l -> drop (Int32.sub n 1l) xs'
| _ -> failwith "drop"
let rec iteri f xs = iteri' f 0l xs
and iteri' f i = function
| [] -> ()
| x::xs -> f i x; iteri' f (Int32.add i 1l) xs
let rec mapi f xs = mapi' f 0l xs
and mapi' f i = function
| [] -> []
| x::xs -> f i x :: mapi' f (Int32.add i 1l) xs
let rec index_where p xs = index_where' p xs 0l
and index_where' p xs i =
match xs with
| [] -> None
| x::xs' when p x -> Some i
| x::xs' -> index_where' p xs' (Int32.add i 1l)
let index_of x = index_where ((=) x)
end
module List64 =
struct
let rec init n f = init' n f []
and init' n f xs =
if n = 0L then xs else init' (Int64.sub n 1L) f (f (Int64.sub n 1L) :: xs)
let rec make n x = make' n x []
and make' n x xs =
if n = 0L then xs else make' (Int64.sub n 1L) x (x::xs)
let rec length xs = length' xs 0L
and length' xs n =
match xs with
| [] -> n
| _::xs' when n < Int64.max_int -> length' xs' (Int64.add n 1L)
| _ -> failwith "length"
let rec nth xs n =
match n, xs with
| 0L, x::_ -> x
| n, _::xs' when n > 0L -> nth xs' (Int64.sub n 1L)
| _ -> failwith "nth"
let rec take n xs =
match n, xs with
| 0L, _ -> []
| n, x::xs' when n > 0L -> x :: take (Int64.sub n 1L) xs'
| _ -> failwith "take"
let rec drop n xs =
match n, xs with
| 0L, _ -> xs
| n, _::xs' when n > 0L -> drop (Int64.sub n 1L) xs'
| _ -> failwith "drop"
let rec mapi f xs = mapi' f 0L xs
and mapi' f i = function
| [] -> []
| x::xs -> f i x :: mapi' f (Int64.add i 1L) xs
end
module Array64 =
struct
let make n x =
if n < 0L || n > Int64.of_int max_int then
invalid_arg "Array64.make";
Array.make (Int64.to_int n) x
let length a = Int64.of_int (Array.length a)
let index_of_int64 i =
if i < 0L || i > Int64.of_int max_int then -1 else
Int64.to_int i
let get a i = Array.get a (index_of_int64 i)
let set a i x = Array.set a (index_of_int64 i) x
let blit a1 i1 a2 i2 n =
Array.blit a1 (index_of_int64 i1) a2 (index_of_int64 i2) (index_of_int64 n)
end
module Bigarray =
struct
open Bigarray
module Array1_64 =
struct
let create kind layout n =
if n < 0L || n > Int64.of_int max_int then
invalid_arg "Bigarray.Array1_64.create";
Array1.create kind layout (Int64.to_int n)
let dim a = Int64.of_int (Array1.dim a)
let index_of_int64 i =
if i < 0L || i > Int64.of_int max_int then -1 else
Int64.to_int i
let get a i = Array1.get a (index_of_int64 i)
let set a i x = Array1.set a (index_of_int64 i) x
let sub a i n = Array1.sub a (index_of_int64 i) (index_of_int64 n)
end
end
module Option =
struct
let get o x =
match o with
| Some y -> y
| None -> x
let force o =
match o with
| Some y -> y
| None -> invalid_arg "Option.force"
let map f = function
| Some x -> Some (f x)
| None -> None
let app f = function
| Some x -> f x
| None -> ()
end
module Promise =
struct
type 'a t = 'a option ref
exception Promise
let make () = ref None
let fulfill p x = if !p = None then p := Some x else raise Promise
let value_opt p = !p
let value p = match !p with Some x -> x | None -> raise Promise
end
module Int =
struct
let log2 n =
if n <= 0 then failwith "log2";
let rec loop acc n = if n = 1 then acc else loop (acc + 1) (n lsr 1) in
loop 0 n
let is_power_of_two n =
if n < 0 then failwith "is_power_of_two";
n <> 0 && n land (n - 1) = 0
end
module Int32 =
struct
let log2 n =
if n <= 0l then failwith "log2";
let rec loop acc n =
if n = 1l then acc else loop (Int32.add acc 1l) (Int32.shift_right_logical n 1) in
loop 0l n
let is_power_of_two n =
if n < 0l then failwith "is_power_of_two";
n <> 0l && Int32.(logand n (sub n 1l)) = 0l
end
module Int64 =
struct
let log2_unsigned n =
let rec loop acc n =
if n = 1L then acc else loop (Int64.add acc 1L) (Int64.shift_right_logical n 1) in
loop 0L n
let log2 n =
if n <= 0L then failwith "log2" else log2_unsigned n
let is_power_of_two_unsigned n =
n <> 0L && Int64.(logand n (sub n 1L)) = 0L
let is_power_of_two n =
if n < 0L then failwith "is_power_of_two" else is_power_of_two_unsigned n
end