mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2026-03-13 08:46:17 -04:00
Compare commits
28 commits
5461dcc07a
...
bcfa092a73
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bcfa092a73 | ||
|
|
35803e586c | ||
|
|
8f30ce25b6 | ||
|
|
b8f1048ce4 | ||
|
|
9eb002304f | ||
|
|
d80d36106b | ||
|
|
405dfa4891 | ||
|
|
30f7ac7551 | ||
|
|
3af76f266c | ||
|
|
bb31265e52 | ||
|
|
5e60c0d237 | ||
|
|
571f9f3793 | ||
|
|
0cd4bbf240 | ||
|
|
52fc619335 | ||
|
|
b8684b77df | ||
|
|
bf7f4897c6 | ||
|
|
8268e29c48 | ||
|
|
3516c5dc0e | ||
|
|
b649ac9dc5 | ||
|
|
74b787f7e6 | ||
|
|
f05c07d20d | ||
|
|
50cb263a6e | ||
|
|
6a6ccbbc5c | ||
|
|
9e3baf8ff1 | ||
|
|
88f093b64d | ||
|
|
0522770173 | ||
|
|
5576ad71cc | ||
|
|
fcbde4b187 |
42 changed files with 487 additions and 1130 deletions
|
|
@ -1,4 +1,10 @@
|
||||||
|
|
||||||
|
## main
|
||||||
|
- breaking: CCListLabel.compare and CCListLabel.equal takes the function on the elements as named arguments
|
||||||
|
- breaking: CCListLabel.init now takes the length as a named arguments to follow the Stdlib
|
||||||
|
- breaking: change the semantic of CCFloat.{min,max} with respect to NaN to follow the Stdlib
|
||||||
|
- breaking: change the semantic of CCInt.rem with respect to negative number to follow the Stdlib
|
||||||
|
- breaking: change the order of argument of CCMap.add_seq to align with the stdlib.
|
||||||
|
|
||||||
## 3.17
|
## 3.17
|
||||||
|
|
||||||
|
|
@ -60,6 +66,7 @@
|
||||||
|
|
||||||
## 3.13
|
## 3.13
|
||||||
|
|
||||||
|
- breaking: bump minimum version of OCaml to 4.08
|
||||||
- breaking: delete containers-thread (which was deprecated)
|
- breaking: delete containers-thread (which was deprecated)
|
||||||
- breaking: pp: modify `Ext.t` so it takes surrounding value
|
- breaking: pp: modify `Ext.t` so it takes surrounding value
|
||||||
- breaking: remove CCShims
|
- breaking: remove CCShims
|
||||||
|
|
|
||||||
|
|
@ -455,15 +455,6 @@ let pp_i ?(pp_start = fun _ () -> ()) ?(pp_stop = fun _ () -> ())
|
||||||
let to_string ?(sep = ", ") item_to_string a =
|
let to_string ?(sep = ", ") item_to_string a =
|
||||||
Array.to_list a |> List.map item_to_string |> String.concat sep
|
Array.to_list a |> List.map item_to_string |> String.concat sep
|
||||||
|
|
||||||
let to_seq a =
|
|
||||||
let rec aux i () =
|
|
||||||
if i >= length a then
|
|
||||||
Seq.Nil
|
|
||||||
else
|
|
||||||
Seq.Cons (a.(i), aux (i + 1))
|
|
||||||
in
|
|
||||||
aux 0
|
|
||||||
|
|
||||||
let to_iter a k = iter k a
|
let to_iter a k = iter k a
|
||||||
|
|
||||||
let to_gen a =
|
let to_gen a =
|
||||||
|
|
|
||||||
|
|
@ -240,14 +240,6 @@ val to_iter : 'a t -> 'a iter
|
||||||
in modification of the iterator.
|
in modification of the iterator.
|
||||||
@since 2.8 *)
|
@since 2.8 *)
|
||||||
|
|
||||||
val to_seq : 'a t -> 'a Seq.t
|
|
||||||
(** [to_seq a] returns a [Seq.t] of the elements of an array [a].
|
|
||||||
The input array [a] is shared with the sequence and modification of it will result
|
|
||||||
in modification of the sequence.
|
|
||||||
Renamed from [to_std_seq] since 3.0.
|
|
||||||
@since 3.0
|
|
||||||
*)
|
|
||||||
|
|
||||||
val to_gen : 'a t -> 'a gen
|
val to_gen : 'a t -> 'a gen
|
||||||
(** [to_gen a] returns a [gen] of the elements of an array [a]. *)
|
(** [to_gen a] returns a [gen] of the elements of an array [a]. *)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -219,13 +219,6 @@ val fold2 : f:('acc -> 'a -> 'b -> 'acc) -> init:'acc -> 'a t -> 'b t -> 'acc
|
||||||
@raise Invalid_argument if [a] and [b] have distinct lengths.
|
@raise Invalid_argument if [a] and [b] have distinct lengths.
|
||||||
@since 0.20 *)
|
@since 0.20 *)
|
||||||
|
|
||||||
val iter2 : f:('a -> 'b -> unit) -> 'a t -> 'b t -> unit
|
|
||||||
(** [iter2 ~f a b] iterates on the two arrays [a] and [b] stepwise.
|
|
||||||
It is equivalent to [f a0 b0; …; f a.(length a - 1) b.(length b - 1); ()].
|
|
||||||
|
|
||||||
@raise Invalid_argument if [a] and [b] have distinct lengths.
|
|
||||||
@since 0.20 *)
|
|
||||||
|
|
||||||
val shuffle : 'a t -> unit
|
val shuffle : 'a t -> unit
|
||||||
(** [shuffle a] randomly shuffles the array [a], in place. *)
|
(** [shuffle a] randomly shuffles the array [a], in place. *)
|
||||||
|
|
||||||
|
|
@ -248,14 +241,6 @@ val to_iter : 'a t -> 'a iter
|
||||||
in modification of the iterator.
|
in modification of the iterator.
|
||||||
@since 2.8 *)
|
@since 2.8 *)
|
||||||
|
|
||||||
val to_seq : 'a t -> 'a Seq.t
|
|
||||||
(** [to_seq a] returns a [Seq.t] of the elements of an array [a].
|
|
||||||
The input array [a] is shared with the sequence and modification of it will result
|
|
||||||
in modification of the sequence.
|
|
||||||
Renamed from [to_std_seq] since 3.0.
|
|
||||||
@since 3.0
|
|
||||||
*)
|
|
||||||
|
|
||||||
val to_gen : 'a t -> 'a gen
|
val to_gen : 'a t -> 'a gen
|
||||||
(** [to_gen a] returns a [gen] of the elements of an array [a]. *)
|
(** [to_gen a] returns a [gen] of the elements of an array [a]. *)
|
||||||
|
|
||||||
|
|
@ -286,14 +271,6 @@ val pp_i :
|
||||||
By defaults [pp_start] and [pp_stop] does nothing and [pp_sep] defaults to
|
By defaults [pp_start] and [pp_stop] does nothing and [pp_sep] defaults to
|
||||||
(fun out -> Format.fprintf out ",@ "). *)
|
(fun out -> Format.fprintf out ",@ "). *)
|
||||||
|
|
||||||
val map2 : f:('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
|
|
||||||
(** [map2 ~f a b] applies function [f] to all elements of [a] and [b],
|
|
||||||
and builds an array with the results returned by [f]:
|
|
||||||
[[| f a.(0) b.(0); …; f a.(length a - 1) b.(length b - 1)|]].
|
|
||||||
|
|
||||||
@raise Invalid_argument if [a] and [b] have distinct lengths.
|
|
||||||
@since 0.20 *)
|
|
||||||
|
|
||||||
val rev : 'a t -> 'a t
|
val rev : 'a t -> 'a t
|
||||||
(** [rev a] copies the array [a] and reverses it in place.
|
(** [rev a] copies the array [a] and reverses it in place.
|
||||||
@since 0.20 *)
|
@since 0.20 *)
|
||||||
|
|
@ -308,7 +285,7 @@ val filter_map : f:('a -> 'b option) -> 'a t -> 'b t
|
||||||
element of [a] is discarded. *)
|
element of [a] is discarded. *)
|
||||||
|
|
||||||
val monoid_product : f:('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
|
val monoid_product : f:('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
|
||||||
(** [monoid_product ~f a b] passes all combinaisons of tuples from the two arrays [a] and [b]
|
(** [monoid_product ~f a b] passes all combinaisons of tuples from the two arrays [a] and [b]
|
||||||
to the function [f].
|
to the function [f].
|
||||||
@since 2.8 *)
|
@since 2.8 *)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,6 @@
|
||||||
(* This file is free software, part of containers. See file "license" for more details. *)
|
(* This file is free software, part of containers. See file "license" for more details. *)
|
||||||
|
|
||||||
type t = bool
|
include Bool
|
||||||
|
|
||||||
let equal (a : bool) b = Stdlib.( = ) a b
|
|
||||||
let compare (a : bool) b = Stdlib.compare a b
|
|
||||||
|
|
||||||
let if_then f x =
|
let if_then f x =
|
||||||
if x then
|
if x then
|
||||||
|
|
@ -17,12 +14,6 @@ let if_then_else f g x =
|
||||||
else
|
else
|
||||||
g ()
|
g ()
|
||||||
|
|
||||||
let to_int (x : bool) : int =
|
|
||||||
if x then
|
|
||||||
1
|
|
||||||
else
|
|
||||||
0
|
|
||||||
|
|
||||||
let of_int x : t = x <> 0
|
let of_int x : t = x <> 0
|
||||||
|
|
||||||
type 'a printer = Format.formatter -> 'a -> unit
|
type 'a printer = Format.formatter -> 'a -> unit
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,8 @@
|
||||||
|
|
||||||
(** Basic Bool functions *)
|
(** Basic Bool functions *)
|
||||||
|
|
||||||
type t = bool
|
include module type of Bool
|
||||||
|
(** @inline *)
|
||||||
val compare : t -> t -> int
|
|
||||||
(** [compare b1 b2] is the total ordering on booleans [b1] and [b2], similar to {!Stdlib.compare}. *)
|
|
||||||
|
|
||||||
val equal : t -> t -> bool
|
|
||||||
(** [equal b1 b2] is [true] if [b1] and [b2] are the same. *)
|
|
||||||
|
|
||||||
val if_then : (unit -> 'a) -> t -> 'a option
|
val if_then : (unit -> 'a) -> t -> 'a option
|
||||||
(** [if_then f x] is [Some (f ())] if [x] is true and None otherwise.
|
(** [if_then f x] is [Some (f ())] if [x] is true and None otherwise.
|
||||||
|
|
@ -18,10 +13,6 @@ val if_then_else : (unit -> 'a) -> (unit -> 'a) -> t -> 'a
|
||||||
(** [if_then_else f g x] is [f ()] if [x] is true and [g ()] otherwise.
|
(** [if_then_else f g x] is [f ()] if [x] is true and [g ()] otherwise.
|
||||||
@since 3.13 *)
|
@since 3.13 *)
|
||||||
|
|
||||||
val to_int : t -> int
|
|
||||||
(** [to_int true = 1], [to_int false = 0].
|
|
||||||
@since 2.7 *)
|
|
||||||
|
|
||||||
val of_int : int -> t
|
val of_int : int -> t
|
||||||
(** [of_int i] is the same as [i <> 0]
|
(** [of_int i] is the same as [i <> 0]
|
||||||
@since 2.7 *)
|
@since 2.7 *)
|
||||||
|
|
|
||||||
|
|
@ -9,12 +9,6 @@ include module type of struct
|
||||||
include Char
|
include Char
|
||||||
end
|
end
|
||||||
|
|
||||||
val compare : t -> t -> int
|
|
||||||
(** The comparison function for characters, with the same specification as
|
|
||||||
{!Stdlib.compare}. Along with the type [t], this function [compare]
|
|
||||||
allows the module [Char] to be passed as argument to the functors
|
|
||||||
{!Set.Make} and {!Map.Make}. *)
|
|
||||||
|
|
||||||
val of_int_exn : int -> t
|
val of_int_exn : int -> t
|
||||||
(** Alias to {!Char.chr}.
|
(** Alias to {!Char.chr}.
|
||||||
Return the character with the given ASCII code.
|
Return the character with the given ASCII code.
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,12 @@ type 'a equal = 'a -> 'a -> bool
|
||||||
type 'a ord = 'a -> 'a -> int
|
type 'a ord = 'a -> 'a -> int
|
||||||
type 'a printer = Format.formatter -> 'a -> unit
|
type 'a printer = Format.formatter -> 'a -> unit
|
||||||
|
|
||||||
|
[@@@ifge 4.12]
|
||||||
|
|
||||||
|
include Either
|
||||||
|
|
||||||
|
[@@@else_]
|
||||||
|
|
||||||
(** {2 Basics} *)
|
(** {2 Basics} *)
|
||||||
|
|
||||||
type ('a, 'b) t = ('a, 'b) Either.t =
|
type ('a, 'b) t = ('a, 'b) Either.t =
|
||||||
|
|
@ -62,6 +68,8 @@ let compare ~left ~right e1 e2 =
|
||||||
| Left l1, Left l2 -> left l1 l2
|
| Left l1, Left l2 -> left l1 l2
|
||||||
| Right r1, Right r2 -> right r1 r2
|
| Right r1, Right r2 -> right r1 r2
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
(** {2 IO} *)
|
(** {2 IO} *)
|
||||||
|
|
||||||
let pp ~left ~right fmt = function
|
let pp ~left ~right fmt = function
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,13 @@ type 'a equal = 'a -> 'a -> bool
|
||||||
type 'a ord = 'a -> 'a -> int
|
type 'a ord = 'a -> 'a -> int
|
||||||
type 'a printer = Format.formatter -> 'a -> unit
|
type 'a printer = Format.formatter -> 'a -> unit
|
||||||
|
|
||||||
|
[@@@ifge 4.12]
|
||||||
|
|
||||||
|
include module type of Either
|
||||||
|
(** @inline *)
|
||||||
|
|
||||||
|
[@@@else_]
|
||||||
|
|
||||||
(** {2 Basics} *)
|
(** {2 Basics} *)
|
||||||
|
|
||||||
type ('a, 'b) t = ('a, 'b) Either.t =
|
type ('a, 'b) t = ('a, 'b) Either.t =
|
||||||
|
|
@ -70,6 +77,8 @@ val compare :
|
||||||
('a, 'b) t ->
|
('a, 'b) t ->
|
||||||
int
|
int
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
(** {2 IO} *)
|
(** {2 IO} *)
|
||||||
|
|
||||||
val pp : left:'a printer -> right:'b printer -> ('a, 'b) t printer
|
val pp : left:'a printer -> right:'b printer -> ('a, 'b) t printer
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,6 @@
|
||||||
(* This file is free software, part of containers. See file "license" for more details. *)
|
(* This file is free software, part of containers. See file "license" for more details. *)
|
||||||
|
|
||||||
type t = float
|
include Float
|
||||||
|
|
||||||
type fpclass = Stdlib.fpclass =
|
|
||||||
| FP_normal
|
|
||||||
| FP_subnormal
|
|
||||||
| FP_zero
|
|
||||||
| FP_infinite
|
|
||||||
| FP_nan
|
|
||||||
|
|
||||||
module Infix = struct
|
module Infix = struct
|
||||||
let ( = ) : t -> t -> bool = Stdlib.( = )
|
let ( = ) : t -> t -> bool = Stdlib.( = )
|
||||||
|
|
@ -27,47 +20,11 @@ include Infix
|
||||||
|
|
||||||
[@@@ocaml.warning "-32"]
|
[@@@ocaml.warning "-32"]
|
||||||
|
|
||||||
let nan = Stdlib.nan
|
|
||||||
let infinity = Stdlib.infinity
|
|
||||||
let neg_infinity = Stdlib.neg_infinity
|
|
||||||
let max_value = infinity
|
let max_value = infinity
|
||||||
let min_value = neg_infinity
|
let min_value = neg_infinity
|
||||||
let max_finite_value = Stdlib.max_float
|
let max_finite_value = Stdlib.max_float
|
||||||
let epsilon = Stdlib.epsilon_float
|
|
||||||
let pi = 0x1.921fb54442d18p+1
|
|
||||||
let is_nan x = Stdlib.(classify_float x = Stdlib.FP_nan)
|
|
||||||
let add = ( +. )
|
|
||||||
let sub = ( -. )
|
|
||||||
let mul = ( *. )
|
|
||||||
let div = ( /. )
|
|
||||||
let neg = ( ~-. )
|
|
||||||
let abs = Stdlib.abs_float
|
|
||||||
let scale = ( *. )
|
let scale = ( *. )
|
||||||
|
|
||||||
let min (x : t) y =
|
|
||||||
match Stdlib.classify_float x, Stdlib.classify_float y with
|
|
||||||
| FP_nan, _ -> y
|
|
||||||
| _, FP_nan -> x
|
|
||||||
| _ ->
|
|
||||||
if x < y then
|
|
||||||
x
|
|
||||||
else
|
|
||||||
y
|
|
||||||
|
|
||||||
let max (x : t) y =
|
|
||||||
match Stdlib.classify_float x, Stdlib.classify_float y with
|
|
||||||
| FP_nan, _ -> y
|
|
||||||
| _, FP_nan -> x
|
|
||||||
| _ ->
|
|
||||||
if x > y then
|
|
||||||
x
|
|
||||||
else
|
|
||||||
y
|
|
||||||
|
|
||||||
let equal (a : float) b = a = b
|
|
||||||
let hash : t -> int = Hashtbl.hash
|
|
||||||
let compare (a : float) b = Stdlib.compare a b
|
|
||||||
|
|
||||||
[@@@ocaml.warning "+32"]
|
[@@@ocaml.warning "+32"]
|
||||||
|
|
||||||
type 'a printer = Format.formatter -> 'a -> unit
|
type 'a printer = Format.formatter -> 'a -> unit
|
||||||
|
|
@ -91,22 +48,7 @@ let sign_exn (a : float) =
|
||||||
else
|
else
|
||||||
compare a 0.
|
compare a 0.
|
||||||
|
|
||||||
let round x =
|
|
||||||
let low = floor x in
|
|
||||||
let high = ceil x in
|
|
||||||
if x -. low > high -. x then
|
|
||||||
high
|
|
||||||
else
|
|
||||||
low
|
|
||||||
|
|
||||||
let to_int (a : float) = Stdlib.int_of_float a
|
|
||||||
let of_int (a : int) = Stdlib.float_of_int a
|
|
||||||
let to_string (a : float) = Stdlib.string_of_float a
|
|
||||||
let of_string_exn (a : string) = Stdlib.float_of_string a
|
let of_string_exn (a : string) = Stdlib.float_of_string a
|
||||||
|
|
||||||
let of_string_opt (a : string) =
|
|
||||||
try Some (Stdlib.float_of_string a) with Failure _ -> None
|
|
||||||
|
|
||||||
let random n st = Random.State.float st n
|
let random n st = Random.State.float st n
|
||||||
let random_small = random 100.0
|
let random_small = random 100.0
|
||||||
let random_range i j st = i +. random (j -. i) st
|
let random_range i j st = i +. random (j -. i) st
|
||||||
|
|
|
||||||
|
|
@ -3,17 +3,8 @@
|
||||||
(** Basic operations on floating-point numbers
|
(** Basic operations on floating-point numbers
|
||||||
@since 0.6.1 *)
|
@since 0.6.1 *)
|
||||||
|
|
||||||
type t = float
|
include module type of Float
|
||||||
|
(** @inline *)
|
||||||
type fpclass = Stdlib.fpclass =
|
|
||||||
| FP_normal
|
|
||||||
| FP_subnormal
|
|
||||||
| FP_zero
|
|
||||||
| FP_infinite
|
|
||||||
| FP_nan
|
|
||||||
|
|
||||||
val nan : t
|
|
||||||
(** [nan] is Not a Number (NaN). Equal to {!Stdlib.nan}. *)
|
|
||||||
|
|
||||||
val max_value : t
|
val max_value : t
|
||||||
(** [max_value] is Positive infinity. Equal to {!Stdlib.infinity}. *)
|
(** [max_value] is Positive infinity. Equal to {!Stdlib.infinity}. *)
|
||||||
|
|
@ -24,50 +15,13 @@ val min_value : t
|
||||||
val max_finite_value : t
|
val max_finite_value : t
|
||||||
(** [max_finite_value] is the largest finite float value. Equal to {!Stdlib.max_float}. *)
|
(** [max_finite_value] is the largest finite float value. Equal to {!Stdlib.max_float}. *)
|
||||||
|
|
||||||
val epsilon : t
|
|
||||||
(** [epsilon] is the smallest positive float x such that [1.0 +. x <> 1.0].
|
|
||||||
Equal to {!Stdlib.epsilon_float}. *)
|
|
||||||
|
|
||||||
val pi : t
|
|
||||||
(** [pi] is the constant pi. The ratio of a circumference to its diameter.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val is_nan : t -> bool
|
|
||||||
(** [is_nan f] returns [true] if f is NaN, [false] otherwise. *)
|
|
||||||
|
|
||||||
val add : t -> t -> t
|
|
||||||
(** [add x y] is equal to [x +. y]. *)
|
|
||||||
|
|
||||||
val sub : t -> t -> t
|
|
||||||
(** [sub x y] is equal to [x -. y]. *)
|
|
||||||
|
|
||||||
val neg : t -> t
|
|
||||||
(** [neg x] is equal to [~-. x]. *)
|
|
||||||
|
|
||||||
val abs : t -> t
|
|
||||||
(** [abs x] is the absolute value of the floating-point number [x].
|
|
||||||
Equal to {!Stdlib.abs_float}. *)
|
|
||||||
|
|
||||||
val scale : t -> t -> t
|
val scale : t -> t -> t
|
||||||
(** [scale x y] is equal to [x *. y]. *)
|
(** [scale x y] is equal to [x *. y]. *)
|
||||||
|
|
||||||
val min : t -> t -> t
|
|
||||||
(** [min x y] returns the min of the two given values [x] and [y]. *)
|
|
||||||
|
|
||||||
val max : t -> t -> t
|
|
||||||
(** [max x y] returns the max of the two given values [x] and [y]. *)
|
|
||||||
|
|
||||||
val equal : t -> t -> bool
|
|
||||||
(** [equal x y] is [true] if [x] and [y] are the same. *)
|
|
||||||
|
|
||||||
val compare : t -> t -> int
|
|
||||||
(** [compare x y] is {!Stdlib.compare x y}. *)
|
|
||||||
|
|
||||||
type 'a printer = Format.formatter -> 'a -> unit
|
type 'a printer = Format.formatter -> 'a -> unit
|
||||||
type 'a random_gen = Random.State.t -> 'a
|
type 'a random_gen = Random.State.t -> 'a
|
||||||
|
|
||||||
val pp : t printer
|
val pp : t printer
|
||||||
val hash : t -> int
|
|
||||||
val random : t -> t random_gen
|
val random : t -> t random_gen
|
||||||
val random_small : t random_gen
|
val random_small : t random_gen
|
||||||
val random_range : t -> t -> t random_gen
|
val random_range : t -> t -> t random_gen
|
||||||
|
|
@ -76,11 +30,6 @@ val fsign : t -> t
|
||||||
(** [fsign x] is one of [-1., -0., +0., +1.], or [nan] if [x] is NaN.
|
(** [fsign x] is one of [-1., -0., +0., +1.], or [nan] if [x] is NaN.
|
||||||
@since 0.7 *)
|
@since 0.7 *)
|
||||||
|
|
||||||
val round : t -> t
|
|
||||||
(** [round x] returns the closest integer value, either above or below.
|
|
||||||
For [n + 0.5], [round] returns [n].
|
|
||||||
@since 0.20 *)
|
|
||||||
|
|
||||||
exception TrapNaN of string
|
exception TrapNaN of string
|
||||||
|
|
||||||
val sign_exn : t -> int
|
val sign_exn : t -> int
|
||||||
|
|
@ -89,23 +38,11 @@ val sign_exn : t -> int
|
||||||
Note that infinities have defined signs in OCaml.
|
Note that infinities have defined signs in OCaml.
|
||||||
@since 0.7 *)
|
@since 0.7 *)
|
||||||
|
|
||||||
val to_int : t -> int
|
|
||||||
(** Alias to {!int_of_float}.
|
|
||||||
Unspecified if outside of the range of integers. *)
|
|
||||||
|
|
||||||
val of_int : int -> t
|
|
||||||
(** Alias to {!float_of_int}. *)
|
|
||||||
|
|
||||||
val to_string : t -> string
|
|
||||||
|
|
||||||
val of_string_exn : string -> t
|
val of_string_exn : string -> t
|
||||||
(** Alias to {!float_of_string}.
|
(** Alias to {!float_of_string}.
|
||||||
@raise Failure in case of failure.
|
@raise Failure in case of failure.
|
||||||
@since 1.2 *)
|
@since 1.2 *)
|
||||||
|
|
||||||
val of_string_opt : string -> t option
|
|
||||||
(** @since 3.0 *)
|
|
||||||
|
|
||||||
val equal_precision : epsilon:t -> t -> t -> bool
|
val equal_precision : epsilon:t -> t -> t -> bool
|
||||||
(** Equality with allowed error up to a non negative epsilon value. *)
|
(** Equality with allowed error up to a non negative epsilon value. *)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,8 @@ let break fmt (m, n) = Format.pp_print_break fmt m n
|
||||||
let newline = Format.pp_force_newline
|
let newline = Format.pp_force_newline
|
||||||
let substring out (s, i, len) : unit = string out (String.sub s i len)
|
let substring out (s, i, len) : unit = string out (String.sub s i len)
|
||||||
let text = Format.pp_print_text
|
let text = Format.pp_print_text
|
||||||
|
let option = Format.pp_print_option
|
||||||
|
let result = Format.pp_print_result
|
||||||
|
|
||||||
let string_lines out (s : string) : unit =
|
let string_lines out (s : string) : unit =
|
||||||
fprintf out "@[<v>";
|
fprintf out "@[<v>";
|
||||||
|
|
|
||||||
|
|
@ -99,11 +99,20 @@ val arrayi : ?sep:unit printer -> (int * 'a) printer -> 'a array printer
|
||||||
val seq : ?sep:unit printer -> 'a printer -> 'a Seq.t printer
|
val seq : ?sep:unit printer -> 'a printer -> 'a Seq.t printer
|
||||||
val iter : ?sep:unit printer -> 'a printer -> 'a iter printer
|
val iter : ?sep:unit printer -> 'a printer -> 'a iter printer
|
||||||
|
|
||||||
|
val option : ?none:unit printer -> 'a printer -> 'a option printer
|
||||||
|
(** [option ?none pp] prints options as follows:
|
||||||
|
- [Some x] will become [pp x]
|
||||||
|
- [None] will become [none ()]
|
||||||
|
Alias of {!Format.pp_print_option}
|
||||||
|
@since NEXT_RELEASE *)
|
||||||
|
|
||||||
val opt : 'a printer -> 'a option printer
|
val opt : 'a printer -> 'a option printer
|
||||||
(** [opt pp] prints options as follows:
|
(** [opt pp] prints options as follows:
|
||||||
- [Some x] will become "some foo" if [pp x ---> "foo"].
|
- [Some x] will become "some foo" if [pp x ---> "foo"].
|
||||||
- [None] will become "none". *)
|
- [None] will become "none". *)
|
||||||
|
|
||||||
|
val result : ok:'a printer -> error:'e printer -> ('a, 'e) result printer
|
||||||
|
|
||||||
(** In the tuple printers, the [sep] argument is only available.
|
(** In the tuple printers, the [sep] argument is only available.
|
||||||
@since 0.17 *)
|
@since 0.17 *)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -189,11 +189,6 @@ module type S = sig
|
||||||
using [f] in an unspecified order.
|
using [f] in an unspecified order.
|
||||||
@since 3.3 *)
|
@since 3.3 *)
|
||||||
|
|
||||||
val add_seq : 'a t -> (key * 'a) Seq.t -> unit
|
|
||||||
(** Add the corresponding pairs to the table, using {!Hashtbl.add}.
|
|
||||||
Renamed from [add_std_seq] since 3.0.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val add_seq_with :
|
val add_seq_with :
|
||||||
f:(key -> 'a -> 'a -> 'a) -> 'a t -> (key * 'a) Seq.t -> unit
|
f:(key -> 'a -> 'a -> 'a) -> 'a t -> (key * 'a) Seq.t -> unit
|
||||||
(** Add the corresponding pairs to the table, using {!Hashtbl.add}.
|
(** Add the corresponding pairs to the table, using {!Hashtbl.add}.
|
||||||
|
|
@ -211,11 +206,6 @@ module type S = sig
|
||||||
using [f] in an unspecified order.
|
using [f] in an unspecified order.
|
||||||
@since 3.3 *)
|
@since 3.3 *)
|
||||||
|
|
||||||
val of_seq : (key * 'a) Seq.t -> 'a t
|
|
||||||
(** From the given bindings, added in order.
|
|
||||||
Renamed from [of_std_seq] since 3.0.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val of_seq_with : f:(key -> 'a -> 'a -> 'a) -> (key * 'a) Seq.t -> 'a t
|
val of_seq_with : f:(key -> 'a -> 'a -> 'a) -> (key * 'a) Seq.t -> 'a t
|
||||||
(** From the given bindings, added in order.
|
(** From the given bindings, added in order.
|
||||||
If a key occurs multiple times in the input, the values are combined
|
If a key occurs multiple times in the input, the values are combined
|
||||||
|
|
@ -349,8 +339,6 @@ module Make (X : Hashtbl.HashedType) :
|
||||||
| exception Not_found -> add tbl k v
|
| exception Not_found -> add tbl k v
|
||||||
| v2 -> replace tbl k (f k v v2))
|
| v2 -> replace tbl k (f k v v2))
|
||||||
|
|
||||||
let add_seq tbl seq = Seq.iter (fun (k, v) -> add tbl k v) seq
|
|
||||||
|
|
||||||
let add_seq_with ~f tbl seq =
|
let add_seq_with ~f tbl seq =
|
||||||
Seq.iter
|
Seq.iter
|
||||||
(fun (k, v) ->
|
(fun (k, v) ->
|
||||||
|
|
@ -366,7 +354,6 @@ module Make (X : Hashtbl.HashedType) :
|
||||||
tbl
|
tbl
|
||||||
|
|
||||||
let of_iter i = mk_tbl_ add_iter i
|
let of_iter i = mk_tbl_ add_iter i
|
||||||
let of_seq i = mk_tbl_ add_seq i
|
|
||||||
let of_iter_with ~f i = mk_tbl_ (add_iter_with ~f) i
|
let of_iter_with ~f i = mk_tbl_ (add_iter_with ~f) i
|
||||||
let of_seq_with ~f i = mk_tbl_ (add_seq_with ~f) i
|
let of_seq_with ~f i = mk_tbl_ (add_seq_with ~f) i
|
||||||
let add_iter_count tbl i = i (fun k -> incr tbl k)
|
let add_iter_count tbl i = i (fun k -> incr tbl k)
|
||||||
|
|
|
||||||
|
|
@ -253,11 +253,6 @@ module type S = sig
|
||||||
using [f] in an unspecified order.
|
using [f] in an unspecified order.
|
||||||
@since 3.3 *)
|
@since 3.3 *)
|
||||||
|
|
||||||
val add_seq : 'a t -> (key * 'a) Seq.t -> unit
|
|
||||||
(** Add the corresponding pairs to the table, using {!Hashtbl.add}.
|
|
||||||
Renamed from [add_std_seq] since 3.0.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val add_seq_with :
|
val add_seq_with :
|
||||||
f:(key -> 'a -> 'a -> 'a) -> 'a t -> (key * 'a) Seq.t -> unit
|
f:(key -> 'a -> 'a -> 'a) -> 'a t -> (key * 'a) Seq.t -> unit
|
||||||
(** Add the corresponding pairs to the table, using {!Hashtbl.add}.
|
(** Add the corresponding pairs to the table, using {!Hashtbl.add}.
|
||||||
|
|
@ -275,11 +270,6 @@ module type S = sig
|
||||||
using [f] in an unspecified order.
|
using [f] in an unspecified order.
|
||||||
@since 3.3 *)
|
@since 3.3 *)
|
||||||
|
|
||||||
val of_seq : (key * 'a) Seq.t -> 'a t
|
|
||||||
(** From the given bindings, added in order.
|
|
||||||
Renamed from [of_std_seq] since 3.0.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val of_seq_with : f:(key -> 'a -> 'a -> 'a) -> (key * 'a) Seq.t -> 'a t
|
val of_seq_with : f:(key -> 'a -> 'a -> 'a) -> (key * 'a) Seq.t -> 'a t
|
||||||
(** From the given bindings, added in order.
|
(** From the given bindings, added in order.
|
||||||
If a key occurs multiple times in the input, the values are combined
|
If a key occurs multiple times in the input, the values are combined
|
||||||
|
|
|
||||||
|
|
@ -2,24 +2,8 @@
|
||||||
|
|
||||||
include Int
|
include Int
|
||||||
|
|
||||||
type t = int
|
|
||||||
type 'a iter = ('a -> unit) -> unit
|
type 'a iter = ('a -> unit) -> unit
|
||||||
|
|
||||||
let zero = 0
|
|
||||||
let one = 1
|
|
||||||
let minus_one = -1
|
|
||||||
let add = ( + )
|
|
||||||
let sub = ( - )
|
|
||||||
let mul = ( * )
|
|
||||||
let div = ( / )
|
|
||||||
let succ = succ
|
|
||||||
let pred = pred
|
|
||||||
let abs = abs
|
|
||||||
let max_int = max_int
|
|
||||||
let min_int = min_int
|
|
||||||
let equal (a : int) b = Stdlib.( = ) a b
|
|
||||||
let compare (a : int) b = compare a b
|
|
||||||
|
|
||||||
(* use FNV:
|
(* use FNV:
|
||||||
https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function *)
|
https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function *)
|
||||||
let hash (n : int) : int =
|
let hash (n : int) : int =
|
||||||
|
|
@ -65,7 +49,6 @@ let range' i j yield =
|
||||||
range i (j + 1) yield
|
range i (j + 1) yield
|
||||||
|
|
||||||
let sign i = compare i 0
|
let sign i = compare i 0
|
||||||
let neg i = -i
|
|
||||||
|
|
||||||
let pow a b =
|
let pow a b =
|
||||||
let rec aux acc = function
|
let rec aux acc = function
|
||||||
|
|
@ -119,9 +102,13 @@ end
|
||||||
|
|
||||||
include Infix
|
include Infix
|
||||||
|
|
||||||
|
[@@@iflt 4.13]
|
||||||
|
|
||||||
let min : t -> t -> t = Stdlib.min
|
let min : t -> t -> t = Stdlib.min
|
||||||
let max : t -> t -> t = Stdlib.max
|
let max : t -> t -> t = Stdlib.max
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let floor_div a n =
|
let floor_div a n =
|
||||||
if a < 0 && n >= 0 then
|
if a < 0 && n >= 0 then
|
||||||
((a + 1) / n) - 1
|
((a + 1) / n) - 1
|
||||||
|
|
@ -147,11 +134,8 @@ let random_small = random 100
|
||||||
let random_range i j st = i + random (j - i) st
|
let random_range i j st = i + random (j - i) st
|
||||||
let pp fmt = Format.pp_print_int fmt
|
let pp fmt = Format.pp_print_int fmt
|
||||||
let most_significant_bit = -1 lxor (-1 lsr 1)
|
let most_significant_bit = -1 lxor (-1 lsr 1)
|
||||||
let to_string = string_of_int
|
|
||||||
let of_string s = try Some (int_of_string s) with Failure _ -> None
|
let of_string s = try Some (int_of_string s) with Failure _ -> None
|
||||||
let of_string_exn = Stdlib.int_of_string
|
let of_string_exn = Stdlib.int_of_string
|
||||||
let to_float = float_of_int
|
|
||||||
let of_float = int_of_float
|
|
||||||
|
|
||||||
type output = char -> unit
|
type output = char -> unit
|
||||||
|
|
||||||
|
|
@ -248,11 +232,3 @@ let popcount (b : int) : int =
|
||||||
let b = add b (shift_right_logical b 32) in
|
let b = add b (shift_right_logical b 32) in
|
||||||
let b = logand b 0x7fL in
|
let b = logand b 0x7fL in
|
||||||
to_int b
|
to_int b
|
||||||
|
|
||||||
let logand = ( land )
|
|
||||||
let logor = ( lor )
|
|
||||||
let logxor = ( lxor )
|
|
||||||
let lognot = lnot
|
|
||||||
let shift_left = ( lsl )
|
|
||||||
let shift_right = ( asr )
|
|
||||||
let shift_right_logical = ( lsr )
|
|
||||||
|
|
|
||||||
|
|
@ -5,65 +5,6 @@
|
||||||
include module type of Int
|
include module type of Int
|
||||||
(** @inline *)
|
(** @inline *)
|
||||||
|
|
||||||
type t = int
|
|
||||||
|
|
||||||
val zero : t
|
|
||||||
(** [zero] is the integer [0].
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val one : t
|
|
||||||
(** [one] is the integer [1].
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val minus_one : t
|
|
||||||
(** [minus_one] is the integer [-1].
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val add : t -> t -> t
|
|
||||||
(** [add x y] is [x + y].
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val sub : t -> t -> t
|
|
||||||
(** [sub x y] is [x - y].
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val mul : t -> t -> t
|
|
||||||
(** [mul x y] is [x * y].
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val div : t -> t -> t
|
|
||||||
(** [div x y] is [x / y]
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val succ : t -> t
|
|
||||||
(** [succ x] is [x + 1].
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val pred : t -> t
|
|
||||||
(** [pred x] is [x - 1].
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val abs : t -> t
|
|
||||||
(** [abs x] is the absolute value of [x]. It is [x] if [x] is positive
|
|
||||||
and [neg x] otherwise.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val max_int : t
|
|
||||||
(** [max_int] is the maximum integer.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val min_int : t
|
|
||||||
(** [min_int] is the minimum integer.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val compare : t -> t -> int
|
|
||||||
(** [compare x y] is the comparison function for integers
|
|
||||||
with the same specification as {!Stdlib.compare}. *)
|
|
||||||
|
|
||||||
val equal : t -> t -> bool
|
|
||||||
(** [equal x y] is [true] iff [x] and [y] are equal.
|
|
||||||
Equality function for integers. *)
|
|
||||||
|
|
||||||
val hash : t -> int
|
val hash : t -> int
|
||||||
(** [hash x] computes the hash of [x]. *)
|
(** [hash x] computes the hash of [x]. *)
|
||||||
|
|
||||||
|
|
@ -71,11 +12,6 @@ val sign : t -> int
|
||||||
(** [sign x] return [0] if [x = 0], [-1] if [x < 0] and [1] if [x > 0].
|
(** [sign x] return [0] if [x = 0], [-1] if [x < 0] and [1] if [x > 0].
|
||||||
Same as [compare x 0].*)
|
Same as [compare x 0].*)
|
||||||
|
|
||||||
val neg : t -> t
|
|
||||||
(** [neg x] is [- x].
|
|
||||||
Unary negation.
|
|
||||||
@since 0.5 *)
|
|
||||||
|
|
||||||
val pow : t -> t -> t
|
val pow : t -> t -> t
|
||||||
(** [pow base exponent] returns [base] raised to the power of [exponent].
|
(** [pow base exponent] returns [base] raised to the power of [exponent].
|
||||||
[pow x y = x^y] for positive integers [x] and [y].
|
[pow x y = x^y] for positive integers [x] and [y].
|
||||||
|
|
@ -103,22 +39,6 @@ val random_range : int -> int -> t random_gen
|
||||||
val pp : t printer
|
val pp : t printer
|
||||||
(** [pp ppf x] prints the integer [x] on [ppf]. *)
|
(** [pp ppf x] prints the integer [x] on [ppf]. *)
|
||||||
|
|
||||||
val to_float : t -> float
|
|
||||||
(** [to_float] is the same as [float_of_int]
|
|
||||||
@since 3.0*)
|
|
||||||
|
|
||||||
[@@@ocaml.warning "-32"]
|
|
||||||
|
|
||||||
val of_float : float -> t
|
|
||||||
(** [to_float] is the same as [int_of_float]
|
|
||||||
@since 3.0*)
|
|
||||||
|
|
||||||
[@@@ocaml.warning "+32"]
|
|
||||||
|
|
||||||
val to_string : t -> string
|
|
||||||
(** [to_string x] returns the string representation of the integer [x], in signed decimal.
|
|
||||||
@since 0.13 *)
|
|
||||||
|
|
||||||
val of_string : string -> t option
|
val of_string : string -> t option
|
||||||
(** [of_string s] converts the given string [s] into an integer.
|
(** [of_string s] converts the given string [s] into an integer.
|
||||||
Safe version of {!of_string_exn}.
|
Safe version of {!of_string_exn}.
|
||||||
|
|
@ -130,11 +50,6 @@ val of_string_exn : string -> t
|
||||||
@raise Failure in case of failure.
|
@raise Failure in case of failure.
|
||||||
@since 3.0 *)
|
@since 3.0 *)
|
||||||
|
|
||||||
val of_float : float -> t
|
|
||||||
(** [of_float x] converts the given floating-point number [x] to an integer.
|
|
||||||
Alias to {!int_of_float}.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val pp_binary : t printer
|
val pp_binary : t printer
|
||||||
(** [pp_binary ppf x] prints [x] on [ppf].
|
(** [pp_binary ppf x] prints [x] on [ppf].
|
||||||
Print as "0b00101010".
|
Print as "0b00101010".
|
||||||
|
|
@ -144,6 +59,8 @@ val to_string_binary : t -> string
|
||||||
(** [to_string_binary x] returns the string representation of the integer [x], in binary.
|
(** [to_string_binary x] returns the string representation of the integer [x], in binary.
|
||||||
@since 0.20 *)
|
@since 0.20 *)
|
||||||
|
|
||||||
|
[@@@iflt 4.13]
|
||||||
|
|
||||||
val min : t -> t -> t
|
val min : t -> t -> t
|
||||||
(** [min x y] returns the minimum of the two integers [x] and [y].
|
(** [min x y] returns the minimum of the two integers [x] and [y].
|
||||||
@since 0.17 *)
|
@since 0.17 *)
|
||||||
|
|
@ -152,6 +69,8 @@ val max : t -> t -> t
|
||||||
(** [max x y] returns the maximum of the two integers [x] and [y].
|
(** [max x y] returns the maximum of the two integers [x] and [y].
|
||||||
@since 0.17 *)
|
@since 0.17 *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val range_by : step:t -> t -> t -> t iter
|
val range_by : step:t -> t -> t -> t iter
|
||||||
(** [range_by ~step i j] iterates on integers from [i] to [j] included,
|
(** [range_by ~step i j] iterates on integers from [i] to [j] included,
|
||||||
where the difference between successive elements is [step].
|
where the difference between successive elements is [step].
|
||||||
|
|
@ -173,34 +92,6 @@ val popcount : t -> int
|
||||||
(** Number of bits set to 1
|
(** Number of bits set to 1
|
||||||
@since 3.0 *)
|
@since 3.0 *)
|
||||||
|
|
||||||
val logand : t -> t -> t
|
|
||||||
(** [logand] is the same as [(land)].
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val logor : t -> t -> t
|
|
||||||
(** [logand] is the same as [(lor)].
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val logxor : t -> t -> t
|
|
||||||
(** [logxor] is the same as [(lxor)].
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val lognot : t -> t
|
|
||||||
(** [logand] is the same as [lnot].
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val shift_left : t -> int -> t
|
|
||||||
(** [shift_left] is the same as [(lsl)].
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val shift_right : t -> int -> t
|
|
||||||
(** [shift_right] is the same as [(asr)].
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val shift_right_logical : t -> int -> t
|
|
||||||
(** [shift_right_logical] is the same as [(lsr)].
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
(** {2 Infix Operators}
|
(** {2 Infix Operators}
|
||||||
|
|
||||||
@since 0.17 *)
|
@since 0.17 *)
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,18 @@
|
||||||
|
|
||||||
include Int32
|
include Int32
|
||||||
|
|
||||||
|
[@@@iflt 4.13]
|
||||||
|
|
||||||
let min : t -> t -> t = Stdlib.min
|
let min : t -> t -> t = Stdlib.min
|
||||||
let max : t -> t -> t = Stdlib.max
|
let max : t -> t -> t = Stdlib.max
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
[@@@iflt 5.1]
|
||||||
|
|
||||||
let hash x = Stdlib.abs (to_int x)
|
let hash x = Stdlib.abs (to_int x)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let sign i = compare i zero
|
let sign i = compare i zero
|
||||||
|
|
||||||
let pow a b =
|
let pow a b =
|
||||||
|
|
@ -110,7 +119,6 @@ let random_range i j st = add i (random (sub j i) st)
|
||||||
|
|
||||||
let of_string_exn = of_string
|
let of_string_exn = of_string
|
||||||
let of_string x = try Some (of_string_exn x) with Failure _ -> None
|
let of_string x = try Some (of_string_exn x) with Failure _ -> None
|
||||||
let of_string_opt = of_string
|
|
||||||
let most_significant_bit = logxor (neg 1l) (shift_right_logical (neg 1l) 1)
|
let most_significant_bit = logxor (neg 1l) (shift_right_logical (neg 1l) 1)
|
||||||
|
|
||||||
type output = char -> unit
|
type output = char -> unit
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,8 @@ include module type of struct
|
||||||
include Int32
|
include Int32
|
||||||
end
|
end
|
||||||
|
|
||||||
|
[@@@iflt 4.13]
|
||||||
|
|
||||||
val min : t -> t -> t
|
val min : t -> t -> t
|
||||||
(** [min x y] returns the minimum of the two integers [x] and [y].
|
(** [min x y] returns the minimum of the two integers [x] and [y].
|
||||||
@since 3.0 *)
|
@since 3.0 *)
|
||||||
|
|
@ -26,10 +28,15 @@ val max : t -> t -> t
|
||||||
(** [max x y] returns the maximum of the two integers [x] and [y].
|
(** [max x y] returns the maximum of the two integers [x] and [y].
|
||||||
@since 3.0 *)
|
@since 3.0 *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
[@@@iflt 5.1]
|
||||||
|
|
||||||
val hash : t -> int
|
val hash : t -> int
|
||||||
(** [hash x] computes the hash of [x].
|
(** [hash x] computes the hash of [x].
|
||||||
Like {!Stdlib.abs (to_int x)}. *)
|
Like {!Stdlib.abs (to_int x)}. *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val sign : t -> int
|
val sign : t -> int
|
||||||
(** [sign x] return [0] if [x = 0], [-1] if [x < 0] and [1] if [x > 0].
|
(** [sign x] return [0] if [x = 0], [-1] if [x < 0] and [1] if [x > 0].
|
||||||
Same as [compare x zero].
|
Same as [compare x zero].
|
||||||
|
|
@ -81,9 +88,6 @@ val of_string : string -> t option
|
||||||
(** [of_string s] is the safe version of {!of_string_exn}.
|
(** [of_string s] is the safe version of {!of_string_exn}.
|
||||||
Like {!of_string_exn}, but return [None] instead of raising. *)
|
Like {!of_string_exn}, but return [None] instead of raising. *)
|
||||||
|
|
||||||
val of_string_opt : string -> t option
|
|
||||||
(** [of_string_opt s] is an alias to {!of_string}. *)
|
|
||||||
|
|
||||||
val of_string_exn : string -> t
|
val of_string_exn : string -> t
|
||||||
(** [of_string_exn s] converts the given string [s] into a 32-bit integer.
|
(** [of_string_exn s] converts the given string [s] into a 32-bit integer.
|
||||||
Alias to {!Int32.of_string}.
|
Alias to {!Int32.of_string}.
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,13 @@
|
||||||
|
|
||||||
include Int64
|
include Int64
|
||||||
|
|
||||||
|
[@@@iflt 4.13]
|
||||||
|
|
||||||
let min : t -> t -> t = Stdlib.min
|
let min : t -> t -> t = Stdlib.min
|
||||||
let max : t -> t -> t = Stdlib.max
|
let max : t -> t -> t = Stdlib.max
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let sign i = compare i zero
|
let sign i = compare i zero
|
||||||
|
|
||||||
(* use FNV:
|
(* use FNV:
|
||||||
|
|
@ -126,7 +131,6 @@ let random_range i j st = add i (random (sub j i) st)
|
||||||
|
|
||||||
let of_string_exn = of_string
|
let of_string_exn = of_string
|
||||||
let of_string x = try Some (of_string_exn x) with Failure _ -> None
|
let of_string x = try Some (of_string_exn x) with Failure _ -> None
|
||||||
let of_string_opt = of_string
|
|
||||||
let most_significant_bit = logxor (neg 1L) (shift_right_logical (neg 1L) 1)
|
let most_significant_bit = logxor (neg 1L) (shift_right_logical (neg 1L) 1)
|
||||||
|
|
||||||
type output = char -> unit
|
type output = char -> unit
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,8 @@ include module type of struct
|
||||||
include Int64
|
include Int64
|
||||||
end
|
end
|
||||||
|
|
||||||
|
[@@@iflt 4.13]
|
||||||
|
|
||||||
val min : t -> t -> t
|
val min : t -> t -> t
|
||||||
(** [min x y] returns the minimum of the two integers [x] and [y].
|
(** [min x y] returns the minimum of the two integers [x] and [y].
|
||||||
@since 3.0 *)
|
@since 3.0 *)
|
||||||
|
|
@ -26,10 +28,15 @@ val max : t -> t -> t
|
||||||
(** [max x y] returns the maximum of the two integers [x] and [y].
|
(** [max x y] returns the maximum of the two integers [x] and [y].
|
||||||
@since 3.0 *)
|
@since 3.0 *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
[@@@iflt 5.1]
|
||||||
|
|
||||||
val hash : t -> int
|
val hash : t -> int
|
||||||
(** [hash x] computes the hash of [x], a non-negative integer.
|
(** [hash x] computes the hash of [x], a non-negative integer.
|
||||||
Uses FNV since 3.10 *)
|
Uses FNV since 3.10 *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val hash_to_int64 : t -> t
|
val hash_to_int64 : t -> t
|
||||||
(** Like {!hash} but does not truncate.
|
(** Like {!hash} but does not truncate.
|
||||||
Uses FNV.
|
Uses FNV.
|
||||||
|
|
@ -86,10 +93,6 @@ val of_string : string -> t option
|
||||||
(** [of_string s] is the safe version of {!of_string_exn}.
|
(** [of_string s] is the safe version of {!of_string_exn}.
|
||||||
Like {!of_string_exn}, but return [None] instead of raising. *)
|
Like {!of_string_exn}, but return [None] instead of raising. *)
|
||||||
|
|
||||||
val of_string_opt : string -> t option
|
|
||||||
(** [of_string_opt s] is an alias to {!of_string}.
|
|
||||||
@since 2.1 *)
|
|
||||||
|
|
||||||
val of_string_exn : string -> t
|
val of_string_exn : string -> t
|
||||||
(** [of_string_exn s] converts the given string [s] into a 64-bit integer.
|
(** [of_string_exn s] converts the given string [s] into a 64-bit integer.
|
||||||
Alias to {!Int64.of_string}.
|
Alias to {!Int64.of_string}.
|
||||||
|
|
|
||||||
|
|
@ -1,43 +1,15 @@
|
||||||
(* backport new functions from stdlib here *)
|
|
||||||
|
|
||||||
[@@@ocaml.warning "-32"]
|
|
||||||
|
|
||||||
let rec compare_lengths l1 l2 =
|
|
||||||
match l1, l2 with
|
|
||||||
| [], [] -> 0
|
|
||||||
| [], _ :: _ -> -1
|
|
||||||
| _ :: _, [] -> 1
|
|
||||||
| _ :: tail1, _ :: tail2 -> compare_lengths tail1 tail2
|
|
||||||
|
|
||||||
let rec compare_length_with l n =
|
|
||||||
match l, n with
|
|
||||||
| _ when n < 0 -> 1
|
|
||||||
| [], 0 -> 0
|
|
||||||
| [], _ -> -1
|
|
||||||
| _ :: tail, _ -> compare_length_with tail (n - 1)
|
|
||||||
|
|
||||||
let rec assoc_opt x = function
|
|
||||||
| [] -> None
|
|
||||||
| (y, v) :: _ when Stdlib.( = ) x y -> Some v
|
|
||||||
| _ :: tail -> assoc_opt x tail
|
|
||||||
|
|
||||||
let rec assq_opt x = function
|
|
||||||
| [] -> None
|
|
||||||
| (y, v) :: _ when Stdlib.( == ) x y -> Some v
|
|
||||||
| _ :: tail -> assq_opt x tail
|
|
||||||
|
|
||||||
[@@@ocaml.warning "+32"]
|
|
||||||
|
|
||||||
(* end of backport *)
|
|
||||||
|
|
||||||
include List
|
include List
|
||||||
|
|
||||||
let empty = []
|
let empty = []
|
||||||
|
|
||||||
|
[@@@iflt 5.1]
|
||||||
|
|
||||||
let is_empty = function
|
let is_empty = function
|
||||||
| [] -> true
|
| [] -> true
|
||||||
| _ :: _ -> false
|
| _ :: _ -> false
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let mguard c =
|
let mguard c =
|
||||||
if c then
|
if c then
|
||||||
[ () ]
|
[ () ]
|
||||||
|
|
@ -391,25 +363,27 @@ let[@tail_mod_cons] rec unfold f seed =
|
||||||
| Some (v, next) -> v :: unfold f next
|
| Some (v, next) -> v :: unfold f next
|
||||||
|
|
||||||
[@@@endif]
|
[@@@endif]
|
||||||
|
[@@@iflt 4.12]
|
||||||
|
|
||||||
let rec compare f l1 l2 =
|
let rec compare cmp l1 l2 =
|
||||||
match l1, l2 with
|
match l1, l2 with
|
||||||
| [], [] -> 0
|
| [], [] -> 0
|
||||||
| _, [] -> 1
|
| _, [] -> 1
|
||||||
| [], _ -> -1
|
| [], _ -> -1
|
||||||
| x1 :: l1', x2 :: l2' ->
|
| x1 :: l1', x2 :: l2' ->
|
||||||
let c = f x1 x2 in
|
let c = cmp x1 x2 in
|
||||||
if c <> 0 then
|
if c <> 0 then
|
||||||
c
|
c
|
||||||
else
|
else
|
||||||
compare f l1' l2'
|
compare cmp l1' l2'
|
||||||
|
|
||||||
let rec equal f l1 l2 =
|
let rec equal eq l1 l2 =
|
||||||
match l1, l2 with
|
match l1, l2 with
|
||||||
| [], [] -> true
|
| [], [] -> true
|
||||||
| [], _ | _, [] -> false
|
| [], _ | _, [] -> false
|
||||||
| x1 :: l1', x2 :: l2' -> f x1 x2 && equal f l1' l2'
|
| x1 :: l1', x2 :: l2' -> eq x1 x2 && equal eq l1' l2'
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
[@@@iflt 5.1]
|
[@@@iflt 5.1]
|
||||||
|
|
||||||
let rec flat_map_kont f l kont =
|
let rec flat_map_kont f l kont =
|
||||||
|
|
@ -986,6 +960,8 @@ let find_pred_exn p l =
|
||||||
| None -> raise Not_found
|
| None -> raise Not_found
|
||||||
| Some x -> x
|
| Some x -> x
|
||||||
|
|
||||||
|
[@@@iflt 5.1]
|
||||||
|
|
||||||
let find_mapi f l =
|
let find_mapi f l =
|
||||||
let rec aux f i = function
|
let rec aux f i = function
|
||||||
| [] -> None
|
| [] -> None
|
||||||
|
|
@ -996,8 +972,13 @@ let find_mapi f l =
|
||||||
in
|
in
|
||||||
aux f 0 l
|
aux f 0 l
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
[@@@iflt 4.10]
|
||||||
|
|
||||||
let find_map f l = find_mapi (fun _ -> f) l
|
let find_map f l = find_mapi (fun _ -> f) l
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let find_idx p l =
|
let find_idx p l =
|
||||||
find_mapi
|
find_mapi
|
||||||
(fun i x ->
|
(fun i x ->
|
||||||
|
|
@ -1016,6 +997,8 @@ let remove ~eq x l =
|
||||||
in
|
in
|
||||||
remove' eq x [] l
|
remove' eq x [] l
|
||||||
|
|
||||||
|
[@@@iflt 5.1]
|
||||||
|
|
||||||
let filter_map f l =
|
let filter_map f l =
|
||||||
let rec recurse acc l =
|
let rec recurse acc l =
|
||||||
match l with
|
match l with
|
||||||
|
|
@ -1030,6 +1013,8 @@ let filter_map f l =
|
||||||
in
|
in
|
||||||
recurse [] l
|
recurse [] l
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let keep_some l = filter_map (fun x -> x) l
|
let keep_some l = filter_map (fun x -> x) l
|
||||||
|
|
||||||
let keep_ok l =
|
let keep_ok l =
|
||||||
|
|
@ -1232,6 +1217,9 @@ let inter ~eq l1 l2 =
|
||||||
in
|
in
|
||||||
inter eq [] l1 l2
|
inter eq [] l1 l2
|
||||||
|
|
||||||
|
[@@@iflt 5.1]
|
||||||
|
|
||||||
|
(* Because our map is tail rec between 4.13 and 5.1 *)
|
||||||
let mapi f l =
|
let mapi f l =
|
||||||
let r = ref 0 in
|
let r = ref 0 in
|
||||||
map
|
map
|
||||||
|
|
@ -1241,6 +1229,8 @@ let mapi f l =
|
||||||
y)
|
y)
|
||||||
l
|
l
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let iteri f l =
|
let iteri f l =
|
||||||
let rec aux f i l =
|
let rec aux f i l =
|
||||||
match l with
|
match l with
|
||||||
|
|
@ -1564,11 +1554,6 @@ let to_string ?(start = "") ?(stop = "") ?(sep = ", ") item_to_string l =
|
||||||
|
|
||||||
let to_iter l k = List.iter k l
|
let to_iter l k = List.iter k l
|
||||||
|
|
||||||
let rec to_seq l () =
|
|
||||||
match l with
|
|
||||||
| [] -> Seq.Nil
|
|
||||||
| x :: tl -> Seq.Cons (x, to_seq tl)
|
|
||||||
|
|
||||||
let of_iter i =
|
let of_iter i =
|
||||||
let l = ref [] in
|
let l = ref [] in
|
||||||
i (fun x -> l := x :: !l);
|
i (fun x -> l := x :: !l);
|
||||||
|
|
|
||||||
|
|
@ -16,10 +16,14 @@ type +'a t = 'a list
|
||||||
val empty : 'a t
|
val empty : 'a t
|
||||||
(** [empty] is [[]]. *)
|
(** [empty] is [[]]. *)
|
||||||
|
|
||||||
|
[@@@iflt 5.1]
|
||||||
|
|
||||||
val is_empty : _ t -> bool
|
val is_empty : _ t -> bool
|
||||||
(** [is_empty l] returns [true] iff [l = []].
|
(** [is_empty l] returns [true] iff [l = []].
|
||||||
@since 0.11 *)
|
@since 0.11 *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val cons_maybe : 'a option -> 'a t -> 'a t
|
val cons_maybe : 'a option -> 'a t -> 'a t
|
||||||
(** [cons_maybe (Some x) l] is [x :: l].
|
(** [cons_maybe (Some x) l] is [x :: l].
|
||||||
[cons_maybe None l] is [l].
|
[cons_maybe None l] is [l].
|
||||||
|
|
@ -127,11 +131,6 @@ val count_true_false : ('a -> bool) -> 'a list -> int * int
|
||||||
that satisfy the predicate [p], and [int2] the number of elements that do not satisfy [p].
|
that satisfy the predicate [p], and [int2] the number of elements that do not satisfy [p].
|
||||||
@since 2.4 *)
|
@since 2.4 *)
|
||||||
|
|
||||||
val init : int -> (int -> 'a) -> 'a t
|
|
||||||
(** [init len f] is [f 0; f 1; …; f (len-1)].
|
|
||||||
@raise Invalid_argument if len < 0.
|
|
||||||
@since 0.6 *)
|
|
||||||
|
|
||||||
val combine : 'a list -> 'b list -> ('a * 'b) list
|
val combine : 'a list -> 'b list -> ('a * 'b) list
|
||||||
(** [combine [a1; …; an] [b1; …; bn]] is [[(a1,b1); …; (an,bn)]].
|
(** [combine [a1; …; an] [b1; …; bn]] is [[(a1,b1); …; (an,bn)]].
|
||||||
Transform two lists into a list of pairs.
|
Transform two lists into a list of pairs.
|
||||||
|
|
@ -161,25 +160,17 @@ val split : ('a * 'b) t -> 'a t * 'b t
|
||||||
@since 1.2, but only
|
@since 1.2, but only
|
||||||
@since 2.2 with labels *)
|
@since 2.2 with labels *)
|
||||||
|
|
||||||
|
[@@@iflt 4.12]
|
||||||
|
|
||||||
val compare : ('a -> 'a -> int) -> 'a t -> 'a t -> int
|
val compare : ('a -> 'a -> int) -> 'a t -> 'a t -> int
|
||||||
(** [compare cmp l1 l2] compares the two lists [l1] and [l2]
|
(** [compare cmp l1 l2] compares the two lists [l1] and [l2]
|
||||||
using the given comparison function [cmp]. *)
|
using the given comparison function [cmp]. *)
|
||||||
|
|
||||||
val compare_lengths : 'a t -> 'b t -> int
|
|
||||||
(** [compare_lengths l1 l2] compare the lengths of the two lists [l1] and [l2].
|
|
||||||
Equivalent to [compare (length l1) (length l2)] but more efficient.
|
|
||||||
@since 1.5, but only
|
|
||||||
@since 2.2 with labels *)
|
|
||||||
|
|
||||||
val compare_length_with : 'a t -> int -> int
|
|
||||||
(** [compare_length_with l x] compares the length of the list [l] to an integer [x].
|
|
||||||
Equivalent to [compare (length l) x] but more efficient.
|
|
||||||
@since 1.5, but only
|
|
||||||
@since 2.2 with labels *)
|
|
||||||
|
|
||||||
val equal : ('a -> 'a -> bool) -> 'a t -> 'a t -> bool
|
val equal : ('a -> 'a -> bool) -> 'a t -> 'a t -> bool
|
||||||
(** [equal p l1 l2] returns [true] if [l1] and [l2] are equal. *)
|
(** [equal p l1 l2] returns [true] if [l1] and [l2] are equal. *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val flat_map : ('a -> 'b t) -> 'a t -> 'b t
|
val flat_map : ('a -> 'b t) -> 'a t -> 'b t
|
||||||
(** [flat_map f l] maps and flattens at the same time (safe). Evaluation order is not guaranteed. *)
|
(** [flat_map f l] maps and flattens at the same time (safe). Evaluation order is not guaranteed. *)
|
||||||
|
|
||||||
|
|
@ -437,26 +428,28 @@ val find_pred : ('a -> bool) -> 'a t -> 'a option
|
||||||
or returns [None] if no element satisfies [p].
|
or returns [None] if no element satisfies [p].
|
||||||
@since 0.11 *)
|
@since 0.11 *)
|
||||||
|
|
||||||
val find_opt : ('a -> bool) -> 'a t -> 'a option
|
|
||||||
(** [find_opt p l] is the safe version of {!find}.
|
|
||||||
@since 1.5, but only
|
|
||||||
@since 2.2 with labels *)
|
|
||||||
|
|
||||||
val find_pred_exn : ('a -> bool) -> 'a t -> 'a
|
val find_pred_exn : ('a -> bool) -> 'a t -> 'a
|
||||||
(** [find_pred_exn p l] is the unsafe version of {!find_pred}.
|
(** [find_pred_exn p l] is the unsafe version of {!find_pred}.
|
||||||
@raise Not_found if no such element is found.
|
@raise Not_found if no such element is found.
|
||||||
@since 0.11 *)
|
@since 0.11 *)
|
||||||
|
|
||||||
|
[@@@iflt 4.10]
|
||||||
|
|
||||||
val find_map : ('a -> 'b option) -> 'a t -> 'b option
|
val find_map : ('a -> 'b option) -> 'a t -> 'b option
|
||||||
(** [find_map f l] traverses [l], applying [f] to each element. If for
|
(** [find_map f l] traverses [l], applying [f] to each element. If for
|
||||||
some element [x], [f x = Some y], then [Some y] is returned. Otherwise
|
some element [x], [f x = Some y], then [Some y] is returned. Otherwise
|
||||||
the call returns [None].
|
the call returns [None].
|
||||||
@since 0.11 *)
|
@since 0.11 *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
[@@@iflt 5.1]
|
||||||
|
|
||||||
val find_mapi : (int -> 'a -> 'b option) -> 'a t -> 'b option
|
val find_mapi : (int -> 'a -> 'b option) -> 'a t -> 'b option
|
||||||
(** [find_mapi f l] is like {!find_map}, but also pass the index to the predicate function.
|
(** [find_mapi f l] is like {!find_map}, but also pass the index to the predicate function.
|
||||||
@since 0.11 *)
|
@since 0.11 *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val find_idx : ('a -> bool) -> 'a t -> (int * 'a) option
|
val find_idx : ('a -> bool) -> 'a t -> (int * 'a) option
|
||||||
(** [find_idx p x] returns [Some (i,x)] where [x] is the [i]-th element of [l],
|
(** [find_idx p x] returns [Some (i,x)] where [x] is the [i]-th element of [l],
|
||||||
and [p x] holds. Otherwise returns [None]. *)
|
and [p x] holds. Otherwise returns [None]. *)
|
||||||
|
|
@ -467,11 +460,6 @@ val remove : eq:('a -> 'a -> bool) -> key:'a -> 'a t -> 'a t
|
||||||
@since 0.11 *)
|
@since 0.11 *)
|
||||||
(* FIXME: the original CCList.mli uses ~x instead of ~key !! *)
|
(* FIXME: the original CCList.mli uses ~x instead of ~key !! *)
|
||||||
|
|
||||||
val filter_map : ('a -> 'b option) -> 'a t -> 'b t
|
|
||||||
(** [filter_map f l] is the sublist of [l] containing only elements for which
|
|
||||||
[f] returns [Some e].
|
|
||||||
Map and remove elements at the same time. *)
|
|
||||||
|
|
||||||
val keep_some : 'a option t -> 'a t
|
val keep_some : 'a option t -> 'a t
|
||||||
(** [keep_some l] retains only elements of the form [Some x].
|
(** [keep_some l] retains only elements of the form [Some x].
|
||||||
Like [filter_map CCFun.id].
|
Like [filter_map CCFun.id].
|
||||||
|
|
@ -574,16 +562,6 @@ val group_succ : eq:('a -> 'a -> bool) -> 'a list -> 'a list list
|
||||||
|
|
||||||
(** {2 Indices} *)
|
(** {2 Indices} *)
|
||||||
|
|
||||||
val mapi : (int -> 'a -> 'b) -> 'a t -> 'b t
|
|
||||||
(** [mapi f l] is like {!map}, but the function [f] is applied to the index of
|
|
||||||
the element as first argument (counting from 0), and the element
|
|
||||||
itself as second argument. *)
|
|
||||||
|
|
||||||
val iteri : (int -> 'a -> unit) -> 'a t -> unit
|
|
||||||
(** [iteri f l] is like {!val-iter}, but the function [f] is applied to the index of
|
|
||||||
the element as first argument (counting from 0), and the element
|
|
||||||
itself as second argument. *)
|
|
||||||
|
|
||||||
val iteri2 : (int -> 'a -> 'b -> unit) -> 'a t -> 'b t -> unit
|
val iteri2 : (int -> 'a -> 'b -> unit) -> 'a t -> 'b t -> unit
|
||||||
(** [iteri2 f l1 l2] applies [f] to the two lists [l1] and [l2] simultaneously.
|
(** [iteri2 f l1 l2] applies [f] to the two lists [l1] and [l2] simultaneously.
|
||||||
The integer passed to [f] indicates the index of element.
|
The integer passed to [f] indicates the index of element.
|
||||||
|
|
@ -758,14 +736,6 @@ val assoc_opt : eq:('a -> 'a -> bool) -> 'a -> ('a * 'b) t -> 'b option
|
||||||
@since 1.5, but only
|
@since 1.5, but only
|
||||||
@since 2.0 with labels *)
|
@since 2.0 with labels *)
|
||||||
|
|
||||||
val assq_opt : 'a -> ('a * 'b) t -> 'b option
|
|
||||||
(** [assq_opt k alist] returns [Some v] if the given key [k] is present into [alist].
|
|
||||||
Like [Assoc.assoc_opt] but use physical equality instead of structural equality
|
|
||||||
to compare keys.
|
|
||||||
Safe version of {!assq}.
|
|
||||||
@since 1.5, but only
|
|
||||||
@since 2.0 with labels *)
|
|
||||||
|
|
||||||
val mem_assoc : ?eq:('a -> 'a -> bool) -> 'a -> ('a * _) t -> bool
|
val mem_assoc : ?eq:('a -> 'a -> bool) -> 'a -> ('a * _) t -> bool
|
||||||
(** [mem_assoc ?eq k alist] returns [true] iff [k] is a key in [alist].
|
(** [mem_assoc ?eq k alist] returns [true] iff [k] is a key in [alist].
|
||||||
Like [Assoc.mem].
|
Like [Assoc.mem].
|
||||||
|
|
@ -884,11 +854,6 @@ val to_iter : 'a t -> 'a iter
|
||||||
(** [to_iter l] returns a [iter] of the elements of the list [l].
|
(** [to_iter l] returns a [iter] of the elements of the list [l].
|
||||||
@since 2.8 *)
|
@since 2.8 *)
|
||||||
|
|
||||||
val to_seq : 'a t -> 'a Seq.t
|
|
||||||
(** [to_seq l] returns a [Seq.t] of the elements of the list [l].
|
|
||||||
Renamed from [to_std_seq] since 3.0.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val of_iter : 'a iter -> 'a t
|
val of_iter : 'a iter -> 'a t
|
||||||
(** [of_iter iter] builds a list from a given [iter].
|
(** [of_iter iter] builds a list from a given [iter].
|
||||||
In the result, elements appear in the same order as they did in the source [iter].
|
In the result, elements appear in the same order as they did in the source [iter].
|
||||||
|
|
@ -899,12 +864,6 @@ val of_seq_rev : 'a Seq.t -> 'a t
|
||||||
Renamed from [to_std_seq_rev] since 3.0.
|
Renamed from [to_std_seq_rev] since 3.0.
|
||||||
@since 3.0 *)
|
@since 3.0 *)
|
||||||
|
|
||||||
val of_seq : 'a Seq.t -> 'a t
|
|
||||||
(** [of_seq seq] builds a list from a given [Seq.t].
|
|
||||||
In the result, elements appear in the same order as they did in the source [Seq.t].
|
|
||||||
Renamed from [of_std_seq] since 3.0.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val to_gen : 'a t -> 'a gen
|
val to_gen : 'a t -> 'a gen
|
||||||
(** [to_gen l] returns a [gen] of the elements of the list [l]. *)
|
(** [to_gen l] returns a [gen] of the elements of the list [l]. *)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,18 +18,18 @@ type 'a t = 'a list
|
||||||
val empty : 'a t
|
val empty : 'a t
|
||||||
(** [empty] is [[]]. *)
|
(** [empty] is [[]]. *)
|
||||||
|
|
||||||
|
[@@@iflt 5.1]
|
||||||
|
|
||||||
val is_empty : _ t -> bool
|
val is_empty : _ t -> bool
|
||||||
(** [is_empty l] returns [true] iff [l = []].
|
(** [is_empty l] returns [true] iff [l = []].
|
||||||
@since 0.11 *)
|
@since 0.11 *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val map : f:('a -> 'b) -> 'a t -> 'b t
|
val map : f:('a -> 'b) -> 'a t -> 'b t
|
||||||
(** [map ~f [a0; a1; …; an]] applies function [f] in turn to [[a0; a1; …; an]].
|
(** [map ~f [a0; a1; …; an]] applies function [f] in turn to [[a0; a1; …; an]].
|
||||||
Safe version of {!List.map}. *)
|
Safe version of {!List.map}. *)
|
||||||
|
|
||||||
val cons : 'a -> 'a t -> 'a t
|
|
||||||
(** [cons x l] is [x::l].
|
|
||||||
@since 0.12 *)
|
|
||||||
|
|
||||||
val append : 'a t -> 'a t -> 'a t
|
val append : 'a t -> 'a t -> 'a t
|
||||||
(** [append l1 l2] returns the list that is the concatenation of [l1] and [l2].
|
(** [append l1 l2] returns the list that is the concatenation of [l1] and [l2].
|
||||||
Safe version of {!List.append}. *)
|
Safe version of {!List.append}. *)
|
||||||
|
|
@ -160,11 +160,6 @@ val count_true_false : f:('a -> bool) -> 'a list -> int * int
|
||||||
that satisfy the predicate [f], and [int2] the number of elements that do not satisfy [f].
|
that satisfy the predicate [f], and [int2] the number of elements that do not satisfy [f].
|
||||||
@since 2.4 *)
|
@since 2.4 *)
|
||||||
|
|
||||||
val init : int -> f:(int -> 'a) -> 'a t
|
|
||||||
(** [init len ~f] is [f 0; f 1; …; f (len-1)].
|
|
||||||
@raise Invalid_argument if len < 0.
|
|
||||||
@since 0.6 *)
|
|
||||||
|
|
||||||
val combine : 'a list -> 'b list -> ('a * 'b) list
|
val combine : 'a list -> 'b list -> ('a * 'b) list
|
||||||
(** [combine [a1; …; an] [b1; …; bn]] is [[(a1,b1); …; (an,bn)]].
|
(** [combine [a1; …; an] [b1; …; bn]] is [[(a1,b1); …; (an,bn)]].
|
||||||
Transform two lists into a list of pairs.
|
Transform two lists into a list of pairs.
|
||||||
|
|
@ -194,25 +189,17 @@ val split : ('a * 'b) t -> 'a t * 'b t
|
||||||
@since 1.2, but only
|
@since 1.2, but only
|
||||||
@since 2.2 with labels *)
|
@since 2.2 with labels *)
|
||||||
|
|
||||||
val compare : ('a -> 'a -> int) -> 'a t -> 'a t -> int
|
[@@@iflt 4.12]
|
||||||
|
|
||||||
|
val compare : cmp:('a -> 'a -> int) -> 'a t -> 'a t -> int
|
||||||
(** [compare cmp l1 l2] compares the two lists [l1] and [l2]
|
(** [compare cmp l1 l2] compares the two lists [l1] and [l2]
|
||||||
using the given comparison function [cmp]. *)
|
using the given comparison function [cmp]. *)
|
||||||
|
|
||||||
val compare_lengths : 'a t -> 'b t -> int
|
val equal : eq:('a -> 'a -> bool) -> 'a t -> 'a t -> bool
|
||||||
(** [compare_lengths l1 l2] compare the lengths of the two lists [l1] and [l2].
|
|
||||||
Equivalent to [compare (length l1) (length l2)] but more efficient.
|
|
||||||
@since 1.5, but only
|
|
||||||
@since 2.2 with labels *)
|
|
||||||
|
|
||||||
val compare_length_with : 'a t -> int -> int
|
|
||||||
(** [compare_length_with l x] compares the length of the list [l] to an integer [x].
|
|
||||||
Equivalent to [compare (length l) x] but more efficient.
|
|
||||||
@since 1.5, but only
|
|
||||||
@since 2.2 with labels *)
|
|
||||||
|
|
||||||
val equal : ('a -> 'a -> bool) -> 'a t -> 'a t -> bool
|
|
||||||
(** [equal p l1 l2] returns [true] if [l1] and [l2] are equal. *)
|
(** [equal p l1 l2] returns [true] if [l1] and [l2] are equal. *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val flat_map : f:('a -> 'b t) -> 'a t -> 'b t
|
val flat_map : f:('a -> 'b t) -> 'a t -> 'b t
|
||||||
(** [flat_map ~f l] maps and flattens at the same time (safe). Evaluation order is not guaranteed. *)
|
(** [flat_map ~f l] maps and flattens at the same time (safe). Evaluation order is not guaranteed. *)
|
||||||
|
|
||||||
|
|
@ -470,26 +457,28 @@ val find_pred : f:('a -> bool) -> 'a t -> 'a option
|
||||||
or returns [None] if no element satisfies [f].
|
or returns [None] if no element satisfies [f].
|
||||||
@since 0.11 *)
|
@since 0.11 *)
|
||||||
|
|
||||||
val find_opt : f:('a -> bool) -> 'a t -> 'a option
|
|
||||||
(** [find_opt ~f l] is the safe version of {!find}.
|
|
||||||
@since 1.5, but only
|
|
||||||
@since 2.2 with labels *)
|
|
||||||
|
|
||||||
val find_pred_exn : f:('a -> bool) -> 'a t -> 'a
|
val find_pred_exn : f:('a -> bool) -> 'a t -> 'a
|
||||||
(** [find_pred_exn ~f l] is the unsafe version of {!find_pred}.
|
(** [find_pred_exn ~f l] is the unsafe version of {!find_pred}.
|
||||||
@raise Not_found if no such element is found.
|
@raise Not_found if no such element is found.
|
||||||
@since 0.11 *)
|
@since 0.11 *)
|
||||||
|
|
||||||
|
[@@@iflt 4.10]
|
||||||
|
|
||||||
val find_map : f:('a -> 'b option) -> 'a t -> 'b option
|
val find_map : f:('a -> 'b option) -> 'a t -> 'b option
|
||||||
(** [find_map ~f l] traverses [l], applying [f] to each element. If for
|
(** [find_map ~f l] traverses [l], applying [f] to each element. If for
|
||||||
some element [x], [f x = Some y], then [Some y] is returned. Otherwise
|
some element [x], [f x = Some y], then [Some y] is returned. Otherwise
|
||||||
the call returns [None].
|
the call returns [None].
|
||||||
@since 0.11 *)
|
@since 0.11 *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
[@@@iflt 5.1]
|
||||||
|
|
||||||
val find_mapi : f:(int -> 'a -> 'b option) -> 'a t -> 'b option
|
val find_mapi : f:(int -> 'a -> 'b option) -> 'a t -> 'b option
|
||||||
(** [find_mapi ~f l] is like {!find_map}, but also pass the index to the predicate function.
|
(** [find_mapi ~f l] is like {!find_map}, but also pass the index to the predicate function.
|
||||||
@since 0.11 *)
|
@since 0.11 *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val find_idx : f:('a -> bool) -> 'a t -> (int * 'a) option
|
val find_idx : f:('a -> bool) -> 'a t -> (int * 'a) option
|
||||||
(** [find_idx ~f x] returns [Some (i,x)] where [x] is the [i]-th element of [l],
|
(** [find_idx ~f x] returns [Some (i,x)] where [x] is the [i]-th element of [l],
|
||||||
and [f x] holds. Otherwise returns [None]. *)
|
and [f x] holds. Otherwise returns [None]. *)
|
||||||
|
|
@ -501,11 +490,6 @@ val remove :
|
||||||
@since 0.11 *)
|
@since 0.11 *)
|
||||||
(* FIXME: the original CCList.mli uses ~x instead of ~key !! *)
|
(* FIXME: the original CCList.mli uses ~x instead of ~key !! *)
|
||||||
|
|
||||||
val filter_map : f:('a -> 'b option) -> 'a t -> 'b t
|
|
||||||
(** [filter_map ~f l] is the sublist of [l] containing only elements for which
|
|
||||||
[f] returns [Some e].
|
|
||||||
Map and remove elements at the same time. *)
|
|
||||||
|
|
||||||
val keep_some : 'a option t -> 'a t
|
val keep_some : 'a option t -> 'a t
|
||||||
(** [keep_some l] retains only elements of the form [Some x].
|
(** [keep_some l] retains only elements of the form [Some x].
|
||||||
Like [filter_map CCFun.id].
|
Like [filter_map CCFun.id].
|
||||||
|
|
@ -612,16 +596,6 @@ val group_succ : eq:(('a -> 'a -> bool)[@keep_label]) -> 'a list -> 'a list list
|
||||||
|
|
||||||
(** {2 Indices} *)
|
(** {2 Indices} *)
|
||||||
|
|
||||||
val mapi : f:(int -> 'a -> 'b) -> 'a t -> 'b t
|
|
||||||
(** [mapi ~f l] is like {!map}, but the function [f] is applied to the index of
|
|
||||||
the element as first argument (counting from 0), and the element
|
|
||||||
itself as second argument. *)
|
|
||||||
|
|
||||||
val iteri : f:(int -> 'a -> unit) -> 'a t -> unit
|
|
||||||
(** [iteri ~f l] is like {!iter}, but the function [f] is applied to the index of
|
|
||||||
the element as first argument (counting from 0), and the element
|
|
||||||
itself as second argument. *)
|
|
||||||
|
|
||||||
val iteri2 : f:(int -> 'a -> 'b -> unit) -> 'a t -> 'b t -> unit
|
val iteri2 : f:(int -> 'a -> 'b -> unit) -> 'a t -> 'b t -> unit
|
||||||
(** [iteri2 ~f l1 l2] applies [f] to the two lists [l1] and [l2] simultaneously.
|
(** [iteri2 ~f l1 l2] applies [f] to the two lists [l1] and [l2] simultaneously.
|
||||||
The integer passed to [f] indicates the index of element.
|
The integer passed to [f] indicates the index of element.
|
||||||
|
|
@ -900,11 +874,6 @@ val to_iter : 'a t -> 'a iter
|
||||||
(** [to_iter l] returns a [iter] of the elements of the list [l].
|
(** [to_iter l] returns a [iter] of the elements of the list [l].
|
||||||
@since 2.8 *)
|
@since 2.8 *)
|
||||||
|
|
||||||
val to_seq : 'a t -> 'a Seq.t
|
|
||||||
(** [to_seq l] returns a [Seq.t] of the elements of the list [l].
|
|
||||||
Renamed from [to_std_seq] since 3.0.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val of_iter : 'a iter -> 'a t
|
val of_iter : 'a iter -> 'a t
|
||||||
(** [of_iter iter] builds a list from a given [iter].
|
(** [of_iter iter] builds a list from a given [iter].
|
||||||
In the result, elements appear in the same order as they did in the source [iter].
|
In the result, elements appear in the same order as they did in the source [iter].
|
||||||
|
|
@ -915,12 +884,6 @@ val of_seq_rev : 'a Seq.t -> 'a t
|
||||||
Renamed from [of_std_seq_rev] since 3.0.
|
Renamed from [of_std_seq_rev] since 3.0.
|
||||||
@since 3.0 *)
|
@since 3.0 *)
|
||||||
|
|
||||||
val of_seq : 'a Seq.t -> 'a t
|
|
||||||
(** [of_seq seq] builds a list from a given [Seq.t].
|
|
||||||
In the result, elements appear in the same order as they did in the source [Seq.t].
|
|
||||||
Renamed from [of_std_seq] since 3.0.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val to_gen : 'a t -> 'a gen
|
val to_gen : 'a t -> 'a gen
|
||||||
(** [to_gen l] returns a [gen] of the elements of the list [l]. *)
|
(** [to_gen l] returns a [gen] of the elements of the list [l]. *)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,47 +20,6 @@ module type S = sig
|
||||||
and returns [default] otherwise (if [k] doesn't belong in [m]).
|
and returns [default] otherwise (if [k] doesn't belong in [m]).
|
||||||
@since 0.16 *)
|
@since 0.16 *)
|
||||||
|
|
||||||
val update : key -> ('a option -> 'a option) -> 'a t -> 'a t
|
|
||||||
(** [update k f m] calls [f (Some v)] if [find k m = v],
|
|
||||||
otherwise it calls [f None]. In any case, if the result is [None]
|
|
||||||
[k] is removed from [m], and if the result is [Some v'] then
|
|
||||||
[add k v' m] is returned. *)
|
|
||||||
|
|
||||||
val choose_opt : 'a t -> (key * 'a) option
|
|
||||||
(** [choose_opt m] returns one binding of the given map [m], or [None] if [m] is empty.
|
|
||||||
Safe version of {!choose}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val min_binding_opt : 'a t -> (key * 'a) option
|
|
||||||
(** [min_binding_opt m] returns the smallest binding of the given map [m],
|
|
||||||
or [None] if [m] is empty.
|
|
||||||
Safe version of {!min_binding}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val max_binding_opt : 'a t -> (key * 'a) option
|
|
||||||
(** [max_binding_opt m] returns the largest binding of the given map [m],
|
|
||||||
or [None] if [m] is empty.
|
|
||||||
Safe version of {!max_binding}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val find_opt : key -> 'a t -> 'a option
|
|
||||||
(** [find_opt k m] returns [Some v] if the current binding of [k] in [m] is [v],
|
|
||||||
or [None] if the key [k] is not present.
|
|
||||||
Safe version of {!find}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val find_first : (key -> bool) -> 'a t -> key * 'a
|
|
||||||
(** [find_first f m] where [f] is a monotonically increasing function, returns the binding of [m]
|
|
||||||
with the lowest key [k] such that [f k], or raises [Not_found] if no such key exists.
|
|
||||||
See {!Map.S.find_first}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val find_first_opt : (key -> bool) -> 'a t -> (key * 'a) option
|
|
||||||
(** [find_first_opt f m] where [f] is a monotonically increasing function, returns an option containing
|
|
||||||
the binding of [m] with the lowest key [k] such that [f k], or [None] if no such key exists.
|
|
||||||
Safe version of {!find_first}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val merge_safe :
|
val merge_safe :
|
||||||
f:(key -> [ `Left of 'a | `Right of 'b | `Both of 'a * 'b ] -> 'c option) ->
|
f:(key -> [ `Left of 'a | `Right of 'b | `Both of 'a * 'b ] -> 'c option) ->
|
||||||
'a t ->
|
'a t ->
|
||||||
|
|
@ -69,24 +28,12 @@ module type S = sig
|
||||||
(** [merge_safe ~f a b] merges the maps [a] and [b] together.
|
(** [merge_safe ~f a b] merges the maps [a] and [b] together.
|
||||||
@since 0.17 *)
|
@since 0.17 *)
|
||||||
|
|
||||||
val add_seq : 'a t -> (key * 'a) Seq.t -> 'a t
|
|
||||||
(** [add_seq m seq] adds the given [Seq.t] of bindings to the map [m].
|
|
||||||
Like {!add_list}.
|
|
||||||
Renamed from [add_std_seq] since 3.0.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val add_seq_with :
|
val add_seq_with :
|
||||||
f:(key -> 'a -> 'a -> 'a) -> 'a t -> (key * 'a) Seq.t -> 'a t
|
f:(key -> 'a -> 'a -> 'a) -> 'a t -> (key * 'a) Seq.t -> 'a t
|
||||||
(** [add_seq ~f m l] adds the given seq [l] of bindings to the map [m],
|
(** [add_seq ~f m l] adds the given seq [l] of bindings to the map [m],
|
||||||
using [f] to combine values that have the same key.
|
using [f] to combine values that have the same key.
|
||||||
@since 3.3 *)
|
@since 3.3 *)
|
||||||
|
|
||||||
val of_seq : (key * 'a) Seq.t -> 'a t
|
|
||||||
(** [of_seq seq] builds a map from the given [Seq.t] of bindings.
|
|
||||||
Like {!of_list}.
|
|
||||||
Renamed from [of_std_seq] since 3.0.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val of_seq_with : f:(key -> 'a -> 'a -> 'a) -> (key * 'a) Seq.t -> 'a t
|
val of_seq_with : f:(key -> 'a -> 'a -> 'a) -> (key * 'a) Seq.t -> 'a t
|
||||||
(** [of_seq_with ~f l] builds a map from the given seq [l] of bindings [k_i -> v_i],
|
(** [of_seq_with ~f l] builds a map from the given seq [l] of bindings [k_i -> v_i],
|
||||||
added in order using {!add}.
|
added in order using {!add}.
|
||||||
|
|
@ -178,62 +125,6 @@ module Make (O : Map.OrderedType) = struct
|
||||||
(* backport functions from recent stdlib.
|
(* backport functions from recent stdlib.
|
||||||
they will be shadowed by inclusion of [S] if present. *)
|
they will be shadowed by inclusion of [S] if present. *)
|
||||||
|
|
||||||
[@@@ocaml.warning "-32"]
|
|
||||||
|
|
||||||
let union f a b =
|
|
||||||
M.merge
|
|
||||||
(fun k v1 v2 ->
|
|
||||||
match v1, v2 with
|
|
||||||
| None, None -> assert false
|
|
||||||
| None, (Some _ as r) -> r
|
|
||||||
| (Some _ as r), None -> r
|
|
||||||
| Some v1, Some v2 -> f k v1 v2)
|
|
||||||
a b
|
|
||||||
|
|
||||||
let update k f m =
|
|
||||||
let x = try f (Some (M.find k m)) with Not_found -> f None in
|
|
||||||
match x with
|
|
||||||
| None -> M.remove k m
|
|
||||||
| Some v' -> M.add k v' m
|
|
||||||
|
|
||||||
let choose_opt m = try Some (M.choose m) with Not_found -> None
|
|
||||||
let find_opt k m = try Some (M.find k m) with Not_found -> None
|
|
||||||
let max_binding_opt m = try Some (M.max_binding m) with Not_found -> None
|
|
||||||
let min_binding_opt m = try Some (M.min_binding m) with Not_found -> None
|
|
||||||
|
|
||||||
exception Find_binding_exit
|
|
||||||
|
|
||||||
let find_first_opt f m =
|
|
||||||
let res = ref None in
|
|
||||||
try
|
|
||||||
M.iter
|
|
||||||
(fun k v ->
|
|
||||||
if f k then (
|
|
||||||
res := Some (k, v);
|
|
||||||
raise Find_binding_exit
|
|
||||||
))
|
|
||||||
m;
|
|
||||||
None
|
|
||||||
with Find_binding_exit -> !res
|
|
||||||
|
|
||||||
let find_first f m =
|
|
||||||
match find_first_opt f m with
|
|
||||||
| None -> raise Not_found
|
|
||||||
| Some (k, v) -> k, v
|
|
||||||
|
|
||||||
(* linear time, must traverse the whole map… *)
|
|
||||||
let find_last_opt f m =
|
|
||||||
let res = ref None in
|
|
||||||
M.iter (fun k v -> if f k then res := Some (k, v)) m;
|
|
||||||
!res
|
|
||||||
|
|
||||||
let find_last f m =
|
|
||||||
match find_last_opt f m with
|
|
||||||
| None -> raise Not_found
|
|
||||||
| Some (k, v) -> k, v
|
|
||||||
|
|
||||||
[@@@ocaml.warning "+32"]
|
|
||||||
|
|
||||||
(* === include M.
|
(* === include M.
|
||||||
This will shadow some values depending on OCaml's current version
|
This will shadow some values depending on OCaml's current version
|
||||||
=== *)
|
=== *)
|
||||||
|
|
@ -253,11 +144,6 @@ module Make (O : Map.OrderedType) = struct
|
||||||
| Some v1, Some v2 -> f k (`Both (v1, v2)))
|
| Some v1, Some v2 -> f k (`Both (v1, v2)))
|
||||||
a b
|
a b
|
||||||
|
|
||||||
let add_seq m s =
|
|
||||||
let m = ref m in
|
|
||||||
Seq.iter (fun (k, v) -> m := add k v !m) s;
|
|
||||||
!m
|
|
||||||
|
|
||||||
let add_seq_with ~f m s =
|
let add_seq_with ~f m s =
|
||||||
let combine k v = function
|
let combine k v = function
|
||||||
| None -> Some v
|
| None -> Some v
|
||||||
|
|
@ -265,7 +151,6 @@ module Make (O : Map.OrderedType) = struct
|
||||||
in
|
in
|
||||||
Seq.fold_left (fun m (k, v) -> update k (combine k v) m) m s
|
Seq.fold_left (fun m (k, v) -> update k (combine k v) m) m s
|
||||||
|
|
||||||
let of_seq s = add_seq empty s
|
|
||||||
let of_seq_with ~f s = add_seq_with ~f empty s
|
let of_seq_with ~f s = add_seq_with ~f empty s
|
||||||
|
|
||||||
let add_iter m s =
|
let add_iter m s =
|
||||||
|
|
@ -296,10 +181,20 @@ module Make (O : Map.OrderedType) = struct
|
||||||
in
|
in
|
||||||
List.fold_left (fun m (k, v) -> update k (combine k v) m) m l
|
List.fold_left (fun m (k, v) -> update k (combine k v) m) m l
|
||||||
|
|
||||||
|
[@@@iflt 5.1]
|
||||||
|
|
||||||
let of_list l = add_list empty l
|
let of_list l = add_list empty l
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let of_list_with ~f l = add_list_with ~f empty l
|
let of_list_with ~f l = add_list_with ~f empty l
|
||||||
|
|
||||||
|
[@@@iflt 5.1]
|
||||||
|
|
||||||
let to_list m = fold (fun k v acc -> (k, v) :: acc) m []
|
let to_list m = fold (fun k v acc -> (k, v) :: acc) m []
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let pp ?(pp_start = fun _ () -> ()) ?(pp_stop = fun _ () -> ())
|
let pp ?(pp_start = fun _ () -> ()) ?(pp_stop = fun _ () -> ())
|
||||||
?(pp_arrow = fun fmt () -> Format.fprintf fmt "@ -> ")
|
?(pp_arrow = fun fmt () -> Format.fprintf fmt "@ -> ")
|
||||||
?(pp_sep = fun fmt () -> Format.fprintf fmt ",@ ") pp_k pp_v fmt m =
|
?(pp_sep = fun fmt () -> Format.fprintf fmt ",@ ") pp_k pp_v fmt m =
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ module type OrderedType = Map.OrderedType
|
||||||
|
|
||||||
module type S = sig
|
module type S = sig
|
||||||
include Map.S
|
include Map.S
|
||||||
|
(** @inline *)
|
||||||
|
|
||||||
val get : key -> 'a t -> 'a option
|
val get : key -> 'a t -> 'a option
|
||||||
(** [get k m] returns [Some v] if the current binding of [k] in [m] is [v],
|
(** [get k m] returns [Some v] if the current binding of [k] in [m] is [v],
|
||||||
|
|
@ -27,47 +28,6 @@ module type S = sig
|
||||||
and returns [default] otherwise (if [k] doesn't belong in [m]).
|
and returns [default] otherwise (if [k] doesn't belong in [m]).
|
||||||
@since 0.16 *)
|
@since 0.16 *)
|
||||||
|
|
||||||
val update : key -> ('a option -> 'a option) -> 'a t -> 'a t
|
|
||||||
(** [update k f m] calls [f (Some v)] if [find k m = v],
|
|
||||||
otherwise it calls [f None]. In any case, if the result is [None]
|
|
||||||
[k] is removed from [m], and if the result is [Some v'] then
|
|
||||||
[add k v' m] is returned. *)
|
|
||||||
|
|
||||||
val choose_opt : 'a t -> (key * 'a) option
|
|
||||||
(** [choose_opt m] returns one binding of the given map [m], or [None] if [m] is empty.
|
|
||||||
Safe version of {!choose}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val min_binding_opt : 'a t -> (key * 'a) option
|
|
||||||
(** [min_binding_opt m] returns the smallest binding of the given map [m],
|
|
||||||
or [None] if [m] is empty.
|
|
||||||
Safe version of {!min_binding}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val max_binding_opt : 'a t -> (key * 'a) option
|
|
||||||
(** [max_binding_opt m] returns the largest binding of the given map [m],
|
|
||||||
or [None] if [m] is empty.
|
|
||||||
Safe version of {!max_binding}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val find_opt : key -> 'a t -> 'a option
|
|
||||||
(** [find_opt k m] returns [Some v] if the current binding of [k] in [m] is [v],
|
|
||||||
or [None] if the key [k] is not present.
|
|
||||||
Safe version of {!find}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val find_first : (key -> bool) -> 'a t -> key * 'a
|
|
||||||
(** [find_first f m] where [f] is a monotonically increasing function, returns the binding of [m]
|
|
||||||
with the lowest key [k] such that [f k], or raises [Not_found] if no such key exists.
|
|
||||||
See {!Map.S.find_first}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val find_first_opt : (key -> bool) -> 'a t -> (key * 'a) option
|
|
||||||
(** [find_first_opt f m] where [f] is a monotonically increasing function, returns an option containing
|
|
||||||
the binding of [m] with the lowest key [k] such that [f k], or [None] if no such key exists.
|
|
||||||
Safe version of {!find_first}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val merge_safe :
|
val merge_safe :
|
||||||
f:(key -> [ `Left of 'a | `Right of 'b | `Both of 'a * 'b ] -> 'c option) ->
|
f:(key -> [ `Left of 'a | `Right of 'b | `Both of 'a * 'b ] -> 'c option) ->
|
||||||
'a t ->
|
'a t ->
|
||||||
|
|
@ -76,12 +36,6 @@ module type S = sig
|
||||||
(** [merge_safe ~f a b] merges the maps [a] and [b] together.
|
(** [merge_safe ~f a b] merges the maps [a] and [b] together.
|
||||||
@since 0.17 *)
|
@since 0.17 *)
|
||||||
|
|
||||||
val add_seq : 'a t -> (key * 'a) Seq.t -> 'a t
|
|
||||||
(** [add_seq m seq] adds the given [Seq.t] of bindings to the map [m].
|
|
||||||
Like {!add_list}.
|
|
||||||
Renamed from [add_std_seq] since 3.0.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val add_seq_with :
|
val add_seq_with :
|
||||||
f:(key -> 'a -> 'a -> 'a) -> 'a t -> (key * 'a) Seq.t -> 'a t
|
f:(key -> 'a -> 'a -> 'a) -> 'a t -> (key * 'a) Seq.t -> 'a t
|
||||||
(** [add_seq ~f m l] adds the given seq [l] of bindings to the map [m],
|
(** [add_seq ~f m l] adds the given seq [l] of bindings to the map [m],
|
||||||
|
|
@ -91,12 +45,6 @@ module type S = sig
|
||||||
later in the seq than [v2].
|
later in the seq than [v2].
|
||||||
@since 3.3 *)
|
@since 3.3 *)
|
||||||
|
|
||||||
val of_seq : (key * 'a) Seq.t -> 'a t
|
|
||||||
(** [of_seq seq] builds a map from the given [Seq.t] of bindings.
|
|
||||||
Like {!of_list}.
|
|
||||||
Renamed from [of_std_seq] since 3.0.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val of_seq_with : f:(key -> 'a -> 'a -> 'a) -> (key * 'a) Seq.t -> 'a t
|
val of_seq_with : f:(key -> 'a -> 'a -> 'a) -> (key * 'a) Seq.t -> 'a t
|
||||||
(** [of_seq_with ~f l] builds a map from the given seq [l] of bindings [k_i -> v_i],
|
(** [of_seq_with ~f l] builds a map from the given seq [l] of bindings [k_i -> v_i],
|
||||||
added in order using {!add}.
|
added in order using {!add}.
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,13 @@
|
||||||
|
|
||||||
include Nativeint
|
include Nativeint
|
||||||
|
|
||||||
|
[@@@iflt 4.13]
|
||||||
|
|
||||||
let min : t -> t -> t = Stdlib.min
|
let min : t -> t -> t = Stdlib.min
|
||||||
let max : t -> t -> t = Stdlib.max
|
let max : t -> t -> t = Stdlib.max
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let hash x = Stdlib.abs (to_int x)
|
let hash x = Stdlib.abs (to_int x)
|
||||||
let sign i = compare i zero
|
let sign i = compare i zero
|
||||||
|
|
||||||
|
|
@ -95,8 +100,7 @@ let random_range i j st = add i (random (sub j i) st)
|
||||||
(** {2 Conversion} *)
|
(** {2 Conversion} *)
|
||||||
|
|
||||||
let of_string_exn = of_string
|
let of_string_exn = of_string
|
||||||
let of_string x = try Some (of_string_exn x) with Failure _ -> None
|
let of_string = of_string_opt
|
||||||
let of_string_opt = of_string
|
|
||||||
let most_significant_bit = logxor (neg 1n) (shift_right_logical (neg 1n) 1)
|
let most_significant_bit = logxor (neg 1n) (shift_right_logical (neg 1n) 1)
|
||||||
|
|
||||||
type output = char -> unit
|
type output = char -> unit
|
||||||
|
|
|
||||||
|
|
@ -2,14 +2,14 @@
|
||||||
|
|
||||||
(** Helpers for processor-native integers
|
(** Helpers for processor-native integers
|
||||||
|
|
||||||
This module provides operations on the type [nativeint] of signed 32-bit integers
|
This module provides operations on the type [nativeint] of signed 32-bit integers
|
||||||
(on 32-bit platforms) or signed 64-bit integers (on 64-bit platforms).
|
(on 32-bit platforms) or signed 64-bit integers (on 64-bit platforms).
|
||||||
This integer type has exactly the same width as that of a pointer type in the C compiler.
|
This integer type has exactly the same width as that of a pointer type in the C compiler.
|
||||||
All arithmetic operations over nativeint are taken modulo 2{^32} or 2{^64} depending
|
All arithmetic operations over nativeint are taken modulo 2{^32} or 2{^64} depending
|
||||||
on the word size of the architecture.
|
on the word size of the architecture.
|
||||||
|
|
||||||
Performance notice: values of type [nativeint] occupy more memory space than values of type [int],
|
Performance notice: values of type [nativeint] occupy more memory space than values of type [int],
|
||||||
and arithmetic operations on [nativeint] are generally slower than those on [int].
|
and arithmetic operations on [nativeint] are generally slower than those on [int].
|
||||||
Use [nativeint] only when the application requires the extra bit of precision over the [int] type.
|
Use [nativeint] only when the application requires the extra bit of precision over the [int] type.
|
||||||
|
|
||||||
@since 2.1 *)
|
@since 2.1 *)
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
include module type of struct
|
include module type of struct
|
||||||
include Nativeint
|
include Nativeint
|
||||||
end
|
end
|
||||||
|
(** @inline *)
|
||||||
|
|
||||||
val min : t -> t -> t
|
val min : t -> t -> t
|
||||||
(** [min x y] returns the minimum of the two integers [x] and [y].
|
(** [min x y] returns the minimum of the two integers [x] and [y].
|
||||||
|
|
@ -117,7 +118,7 @@ val pp_binary : t printer
|
||||||
|
|
||||||
module Infix : sig
|
module Infix : sig
|
||||||
val ( + ) : t -> t -> t
|
val ( + ) : t -> t -> t
|
||||||
(** [x + y] is the sum of [x] and [y].
|
(** [x + y] is the sum of [x] and [y].
|
||||||
Addition. *)
|
Addition. *)
|
||||||
|
|
||||||
val ( - ) : t -> t -> t
|
val ( - ) : t -> t -> t
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,7 @@
|
||||||
|
|
||||||
(** {1 Options} *)
|
(** {1 Options} *)
|
||||||
|
|
||||||
type 'a t = 'a option
|
include Option
|
||||||
|
|
||||||
let[@inline] map f = function
|
|
||||||
| None -> None
|
|
||||||
| Some x -> Some (f x)
|
|
||||||
|
|
||||||
let map_or ~default f = function
|
let map_or ~default f = function
|
||||||
| None -> default
|
| None -> default
|
||||||
|
|
@ -16,30 +12,7 @@ let map_lazy default_fn f = function
|
||||||
| None -> default_fn ()
|
| None -> default_fn ()
|
||||||
| Some x -> f x
|
| Some x -> f x
|
||||||
|
|
||||||
let is_some = function
|
|
||||||
| None -> false
|
|
||||||
| Some _ -> true
|
|
||||||
|
|
||||||
let is_none = function
|
|
||||||
| None -> true
|
|
||||||
| Some _ -> false
|
|
||||||
|
|
||||||
let compare f o1 o2 =
|
|
||||||
match o1, o2 with
|
|
||||||
| None, None -> 0
|
|
||||||
| Some _, None -> 1
|
|
||||||
| None, Some _ -> -1
|
|
||||||
| Some x, Some y -> f x y
|
|
||||||
|
|
||||||
let equal f o1 o2 =
|
|
||||||
match o1, o2 with
|
|
||||||
| None, None -> true
|
|
||||||
| Some _, None | None, Some _ -> false
|
|
||||||
| Some x, Some y -> f x y
|
|
||||||
|
|
||||||
let return x = Some x
|
let return x = Some x
|
||||||
let some = return
|
|
||||||
let none = None
|
|
||||||
|
|
||||||
let[@inline] flat_map f o =
|
let[@inline] flat_map f o =
|
||||||
match o with
|
match o with
|
||||||
|
|
@ -51,7 +24,6 @@ let[@inline] flat_map_l f o =
|
||||||
| None -> []
|
| None -> []
|
||||||
| Some x -> f x
|
| Some x -> f x
|
||||||
|
|
||||||
let[@inline] bind o f = flat_map f o
|
|
||||||
let ( >>= ) = bind
|
let ( >>= ) = bind
|
||||||
let pure x = Some x
|
let pure x = Some x
|
||||||
let k_compose f g x = f x |> flat_map g
|
let k_compose f g x = f x |> flat_map g
|
||||||
|
|
@ -99,11 +71,6 @@ let for_all p = function
|
||||||
| None -> true
|
| None -> true
|
||||||
| Some x -> p x
|
| Some x -> p x
|
||||||
|
|
||||||
let iter f o =
|
|
||||||
match o with
|
|
||||||
| None -> ()
|
|
||||||
| Some x -> f x
|
|
||||||
|
|
||||||
let fold f acc o =
|
let fold f acc o =
|
||||||
match o with
|
match o with
|
||||||
| None -> acc
|
| None -> acc
|
||||||
|
|
@ -121,11 +88,6 @@ let apply_or f x =
|
||||||
|
|
||||||
let ( |?> ) x f = apply_or f x
|
let ( |?> ) x f = apply_or f x
|
||||||
|
|
||||||
let value x ~default =
|
|
||||||
match x with
|
|
||||||
| None -> default
|
|
||||||
| Some y -> y
|
|
||||||
|
|
||||||
let get_exn = function
|
let get_exn = function
|
||||||
| Some x -> x
|
| Some x -> x
|
||||||
| None -> invalid_arg "CCOption.get_exn"
|
| None -> invalid_arg "CCOption.get_exn"
|
||||||
|
|
@ -164,11 +126,6 @@ let wrap2 ?(handler = fun _ -> true) f x y =
|
||||||
else
|
else
|
||||||
raise e
|
raise e
|
||||||
|
|
||||||
let to_list o =
|
|
||||||
match o with
|
|
||||||
| None -> []
|
|
||||||
| Some x -> [ x ]
|
|
||||||
|
|
||||||
let of_list = function
|
let of_list = function
|
||||||
| x :: _ -> Some x
|
| x :: _ -> Some x
|
||||||
| [] -> None
|
| [] -> None
|
||||||
|
|
@ -254,11 +211,6 @@ let to_iter o k =
|
||||||
| None -> ()
|
| None -> ()
|
||||||
| Some x -> k x
|
| Some x -> k x
|
||||||
|
|
||||||
let to_seq o () =
|
|
||||||
match o with
|
|
||||||
| None -> Seq.Nil
|
|
||||||
| Some x -> Seq.Cons (x, Seq.empty)
|
|
||||||
|
|
||||||
let pp ppx out = function
|
let pp ppx out = function
|
||||||
| None -> Format.pp_print_string out "None"
|
| None -> Format.pp_print_string out "None"
|
||||||
| Some x -> Format.fprintf out "@[Some %a@]" ppx x
|
| Some x -> Format.fprintf out "@[Some %a@]" ppx x
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,8 @@
|
||||||
This module replaces `CCOpt`.
|
This module replaces `CCOpt`.
|
||||||
@since 3.6 *)
|
@since 3.6 *)
|
||||||
|
|
||||||
type +'a t = 'a option
|
include module type of Option
|
||||||
|
(** @inline *)
|
||||||
val map : ('a -> 'b) -> 'a t -> 'b t
|
|
||||||
(** [map f o] applies the function [f] to the element inside [o], if any. *)
|
|
||||||
|
|
||||||
val map_or : default:'b -> ('a -> 'b) -> 'a t -> 'b
|
val map_or : default:'b -> ('a -> 'b) -> 'a t -> 'b
|
||||||
(** [map_or ~default f o] is [f x] if [o = Some x], [default] otherwise.
|
(** [map_or ~default f o] is [f x] if [o = Some x], [default] otherwise.
|
||||||
|
|
@ -18,33 +16,9 @@ val map_lazy : (unit -> 'b) -> ('a -> 'b) -> 'a t -> 'b
|
||||||
(** [map_lazy default_fn f o] is [f x] if [o = Some x], [default_fn ()] otherwise.
|
(** [map_lazy default_fn f o] is [f x] if [o = Some x], [default_fn ()] otherwise.
|
||||||
@since 1.2 *)
|
@since 1.2 *)
|
||||||
|
|
||||||
val is_some : _ t -> bool
|
|
||||||
(** [is_some (Some x)] returns [true] otherwise it returns [false]. *)
|
|
||||||
|
|
||||||
val is_none : _ t -> bool
|
|
||||||
(** [is_none None] returns [true] otherwise it returns [false].
|
|
||||||
@since 0.11 *)
|
|
||||||
|
|
||||||
val compare : ('a -> 'a -> int) -> 'a t -> 'a t -> int
|
|
||||||
(** [compare comp o1 o2] compares two options [o1] and [o2],
|
|
||||||
using custom comparators [comp] for the value.
|
|
||||||
[None] is always assumed to be less than [Some _]. *)
|
|
||||||
|
|
||||||
val equal : ('a -> 'a -> bool) -> 'a t -> 'a t -> bool
|
|
||||||
(** [equal p o1 o2] tests for equality between option types [o1] and [o2],
|
|
||||||
using a custom equality predicate [p]. *)
|
|
||||||
|
|
||||||
val return : 'a -> 'a t
|
val return : 'a -> 'a t
|
||||||
(** [return x] is a monadic return, that is [return x = Some x]. *)
|
(** [return x] is a monadic return, that is [return x = Some x]. *)
|
||||||
|
|
||||||
val some : 'a -> 'a t
|
|
||||||
(** Alias to {!return}.
|
|
||||||
@since 3.5 *)
|
|
||||||
|
|
||||||
val none : 'a t
|
|
||||||
(** Alias to {!None}.
|
|
||||||
@since 3.5 *)
|
|
||||||
|
|
||||||
val flat_map : ('a -> 'b t) -> 'a t -> 'b t
|
val flat_map : ('a -> 'b t) -> 'a t -> 'b t
|
||||||
(** [flat_map f o] is equivalent to {!map} followed by {!flatten}.
|
(** [flat_map f o] is equivalent to {!map} followed by {!flatten}.
|
||||||
Flip version of {!(>>=)}. *)
|
Flip version of {!(>>=)}. *)
|
||||||
|
|
@ -53,11 +27,6 @@ val flat_map_l : ('a -> 'b list) -> 'a t -> 'b list
|
||||||
(** [flat_map_l f o] is [[]] if [o] is [None], or [f x] if [o] is [Some x].
|
(** [flat_map_l f o] is [[]] if [o] is [None], or [f x] if [o] is [Some x].
|
||||||
@since 3.12 *)
|
@since 3.12 *)
|
||||||
|
|
||||||
val bind : 'a t -> ('a -> 'b t) -> 'b t
|
|
||||||
(** [bind o f] is [f v] if [o] is [Some v], [None] otherwise.
|
|
||||||
Monadic bind.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val k_compose : ('a -> 'b t) -> ('b -> 'c t) -> 'a -> 'c t
|
val k_compose : ('a -> 'b t) -> ('b -> 'c t) -> 'a -> 'c t
|
||||||
(** Kleisli composition. Monadic equivalent of {!CCFun.compose}
|
(** Kleisli composition. Monadic equivalent of {!CCFun.compose}
|
||||||
@since 3.13.1 *)
|
@since 3.13.1 *)
|
||||||
|
|
@ -65,9 +34,6 @@ val k_compose : ('a -> 'b t) -> ('b -> 'c t) -> 'a -> 'c t
|
||||||
val map2 : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
|
val map2 : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
|
||||||
(** [map2 f o1 o2] maps ['a option] and ['b option] to a ['c option] using [f]. *)
|
(** [map2 f o1 o2] maps ['a option] and ['b option] to a ['c option] using [f]. *)
|
||||||
|
|
||||||
val iter : ('a -> unit) -> 'a t -> unit
|
|
||||||
(** [iter f o] applies [f] to [o]. Iterate on 0 or 1 element. *)
|
|
||||||
|
|
||||||
val fold : ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a
|
val fold : ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a
|
||||||
(** [fold f init o] is [f init x] if [o] is [Some x], or [init] if [o] is [None].
|
(** [fold f init o] is [f init x] if [o] is [Some x], or [init] if [o] is [None].
|
||||||
Fold on 0 or 1 element. *)
|
Fold on 0 or 1 element. *)
|
||||||
|
|
@ -102,10 +68,6 @@ val apply_or : ('a -> 'a t) -> 'a -> 'a
|
||||||
turning functions like "remove" into "remove_if_it_exists".
|
turning functions like "remove" into "remove_if_it_exists".
|
||||||
@since 3.13.1 *)
|
@since 3.13.1 *)
|
||||||
|
|
||||||
val value : 'a t -> default:'a -> 'a
|
|
||||||
(** [value o ~default] is similar to the Stdlib's [Option.value] and to {!get_or}.
|
|
||||||
@since 2.8 *)
|
|
||||||
|
|
||||||
val get_exn : 'a t -> 'a
|
val get_exn : 'a t -> 'a
|
||||||
[@@ocaml.deprecated "use CCOption.get_exn_or instead"]
|
[@@ocaml.deprecated "use CCOption.get_exn_or instead"]
|
||||||
(** [get_exn o] returns [x] if [o] is [Some x] or fails if [o] is [None].
|
(** [get_exn o] returns [x] if [o] is [Some x] or fails if [o] is [None].
|
||||||
|
|
@ -207,9 +169,6 @@ include module type of Infix
|
||||||
|
|
||||||
(** {2 Conversion and IO} *)
|
(** {2 Conversion and IO} *)
|
||||||
|
|
||||||
val to_list : 'a t -> 'a list
|
|
||||||
(** [to_list o] returns [[x]] if [o] is [Some x] or the empty list [[]] if [o] is [None]. *)
|
|
||||||
|
|
||||||
val of_list : 'a list -> 'a t
|
val of_list : 'a list -> 'a t
|
||||||
(** [of_list l] returns [Some x] (x being the head of the list l), or [None] if [l] is the empty list. *)
|
(** [of_list l] returns [Some x] (x being the head of the list l), or [None] if [l] is the empty list. *)
|
||||||
|
|
||||||
|
|
@ -246,13 +205,6 @@ val to_gen : 'a t -> 'a gen
|
||||||
(** [to_gen o] is [o] as a [gen]. [Some x] is the singleton [gen] containing [x]
|
(** [to_gen o] is [o] as a [gen]. [Some x] is the singleton [gen] containing [x]
|
||||||
and [None] is the empty [gen]. *)
|
and [None] is the empty [gen]. *)
|
||||||
|
|
||||||
val to_seq : 'a t -> 'a Seq.t
|
|
||||||
(** [to_seq o] is [o] as a sequence [Seq.t]. [Some x] is the singleton sequence containing [x]
|
|
||||||
and [None] is the empty sequence.
|
|
||||||
Same as {!Stdlib.Option.to_seq}
|
|
||||||
Renamed from [to_std_seq] since 3.0.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val to_iter : 'a t -> 'a iter
|
val to_iter : 'a t -> 'a iter
|
||||||
(** [to_iter o] returns an internal iterator, like in the library [Iter].
|
(** [to_iter o] returns an internal iterator, like in the library [Iter].
|
||||||
@since 2.8 *)
|
@since 2.8 *)
|
||||||
|
|
|
||||||
|
|
@ -2,27 +2,53 @@
|
||||||
|
|
||||||
(** {1 Tuple Functions} *)
|
(** {1 Tuple Functions} *)
|
||||||
|
|
||||||
|
[@@@ifge 5.4]
|
||||||
|
|
||||||
|
include Pair
|
||||||
|
|
||||||
|
[@@@else_]
|
||||||
|
|
||||||
type ('a, 'b) t = 'a * 'b
|
type ('a, 'b) t = 'a * 'b
|
||||||
|
|
||||||
let make x y = x, y
|
let make x y = x, y
|
||||||
|
let fst = fst
|
||||||
|
let snd = snd
|
||||||
|
let swap (x, y) = y, x
|
||||||
let map_fst f (x, y) = f x, y
|
let map_fst f (x, y) = f x, y
|
||||||
let map_snd f (x, y) = x, f y
|
let map_snd f (x, y) = x, f y
|
||||||
let map f g (x, y) = f x, g y
|
let map f g (x, y) = f x, g y
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let map_same f (x, y) = f x, f y
|
let map_same f (x, y) = f x, f y
|
||||||
let map2 f g (a, b) (x, y) = f a x, g b y
|
let map2 f g (a, b) (x, y) = f a x, g b y
|
||||||
let map_same2 f (a, b) (x, y) = f a x, f b y
|
let map_same2 f (a, b) (x, y) = f a x, f b y
|
||||||
let fst_map f (x, _) = f x
|
let fst_map f (x, _) = f x
|
||||||
let snd_map f (_, x) = f x
|
let snd_map f (_, x) = f x
|
||||||
|
|
||||||
|
[@@@iflt 5.4]
|
||||||
|
|
||||||
let iter f (x, y) = f x y
|
let iter f (x, y) = f x y
|
||||||
let swap (x, y) = y, x
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let ( <<< ) = map_fst
|
let ( <<< ) = map_fst
|
||||||
let ( >>> ) = map_snd
|
let ( >>> ) = map_snd
|
||||||
let ( *** ) = map
|
let ( *** ) = map
|
||||||
let ( &&& ) f g x = f x, g x
|
let ( &&& ) f g x = f x, g x
|
||||||
let merge f (x, y) = f x y
|
let merge f (x, y) = f x y
|
||||||
|
|
||||||
|
[@@@iflt 5.4]
|
||||||
|
|
||||||
let fold = merge
|
let fold = merge
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let dup x = x, x
|
let dup x = x, x
|
||||||
let dup_map f x = x, f x
|
let dup_map f x = x, f x
|
||||||
|
|
||||||
|
[@@@iflt 5.4]
|
||||||
|
|
||||||
let equal f g (x1, y1) (x2, y2) = f x1 x2 && g y1 y2
|
let equal f g (x1, y1) (x2, y2) = f x1 x2 && g y1 y2
|
||||||
|
|
||||||
let compare f g (x1, y1) (x2, y2) =
|
let compare f g (x1, y1) (x2, y2) =
|
||||||
|
|
@ -32,6 +58,8 @@ let compare f g (x1, y1) (x2, y2) =
|
||||||
else
|
else
|
||||||
g y1 y2
|
g y1 y2
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let to_string ?(sep = ", ") a_to_string b_to_string (x, y) =
|
let to_string ?(sep = ", ") a_to_string b_to_string (x, y) =
|
||||||
Printf.sprintf "%s%s%s" (a_to_string x) sep (b_to_string y)
|
Printf.sprintf "%s%s%s" (a_to_string x) sep (b_to_string y)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,28 @@
|
||||||
|
|
||||||
(** Tuple Functions *)
|
(** Tuple Functions *)
|
||||||
|
|
||||||
|
[@@@ifge 5.4]
|
||||||
|
|
||||||
|
include module type of Pair
|
||||||
|
(** @inline *)
|
||||||
|
|
||||||
|
[@@@else_]
|
||||||
|
|
||||||
type ('a, 'b) t = 'a * 'b
|
type ('a, 'b) t = 'a * 'b
|
||||||
|
|
||||||
val make : 'a -> 'b -> ('a, 'b) t
|
val make : 'a -> 'b -> ('a, 'b) t
|
||||||
(** Make a tuple from its components.
|
(** Make a tuple from its components.
|
||||||
@since 0.16 *)
|
@since 0.16 *)
|
||||||
|
|
||||||
|
val fst : 'a * 'b -> 'a
|
||||||
|
(** [fst (a, b)] returns [a] *)
|
||||||
|
|
||||||
|
val snd : 'a * 'b -> 'b
|
||||||
|
(** [snd (a, b)] returns [b] *)
|
||||||
|
|
||||||
|
val swap : 'a * 'b -> 'b * 'a
|
||||||
|
(** Swap the components of the tuple. *)
|
||||||
|
|
||||||
val map_fst : ('a -> 'b) -> 'a * 'c -> 'b * 'c
|
val map_fst : ('a -> 'b) -> 'a * 'c -> 'b * 'c
|
||||||
(** [map_fst f (x, y)] returns [(f x, y)].
|
(** [map_fst f (x, y)] returns [(f x, y)].
|
||||||
Renamed from [map1] since 3.0. *)
|
Renamed from [map1] since 3.0. *)
|
||||||
|
|
@ -19,6 +35,8 @@ val map_snd : ('a -> 'b) -> 'c * 'a -> 'c * 'b
|
||||||
val map : ('a -> 'c) -> ('b -> 'd) -> 'a * 'b -> 'c * 'd
|
val map : ('a -> 'c) -> ('b -> 'd) -> 'a * 'b -> 'c * 'd
|
||||||
(** Synonym to {!( *** )}. Map on both sides of a tuple. *)
|
(** Synonym to {!( *** )}. Map on both sides of a tuple. *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val map_same : ('a -> 'b) -> 'a * 'a -> 'b * 'b
|
val map_same : ('a -> 'b) -> 'a * 'a -> 'b * 'b
|
||||||
(** Like {!map} but specialized for pairs with elements of the same type. *)
|
(** Like {!map} but specialized for pairs with elements of the same type. *)
|
||||||
|
|
||||||
|
|
@ -45,10 +63,11 @@ val snd_map : ('a -> 'b) -> _ * 'a -> 'b
|
||||||
Rename from [map_snd] since 3.0.
|
Rename from [map_snd] since 3.0.
|
||||||
@since 0.3.3 *)
|
@since 0.3.3 *)
|
||||||
|
|
||||||
|
[@@@iflt 5.4]
|
||||||
|
|
||||||
val iter : ('a -> 'b -> unit) -> 'a * 'b -> unit
|
val iter : ('a -> 'b -> unit) -> 'a * 'b -> unit
|
||||||
|
|
||||||
val swap : 'a * 'b -> 'b * 'a
|
[@@@endif]
|
||||||
(** Swap the components of the tuple. *)
|
|
||||||
|
|
||||||
val ( <<< ) : ('a -> 'b) -> 'a * 'c -> 'b * 'c
|
val ( <<< ) : ('a -> 'b) -> 'a * 'c -> 'b * 'c
|
||||||
(** Map on the left side of the tuple. *)
|
(** Map on the left side of the tuple. *)
|
||||||
|
|
@ -66,10 +85,14 @@ val ( &&& ) : ('a -> 'b) -> ('a -> 'c) -> 'a -> 'b * 'c
|
||||||
val merge : ('a -> 'b -> 'c) -> 'a * 'b -> 'c
|
val merge : ('a -> 'b -> 'c) -> 'a * 'b -> 'c
|
||||||
(** Uncurrying (merges the two components of a tuple). *)
|
(** Uncurrying (merges the two components of a tuple). *)
|
||||||
|
|
||||||
|
[@@@iflt 5.4]
|
||||||
|
|
||||||
val fold : ('a -> 'b -> 'c) -> 'a * 'b -> 'c
|
val fold : ('a -> 'b -> 'c) -> 'a * 'b -> 'c
|
||||||
(** Synonym to {!merge}.
|
(** Synonym to {!merge}.
|
||||||
@since 0.3.3 *)
|
@since 0.3.3 *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val dup : 'a -> 'a * 'a
|
val dup : 'a -> 'a * 'a
|
||||||
(** [dup x = (x,x)] (duplicate the value).
|
(** [dup x = (x,x)] (duplicate the value).
|
||||||
@since 0.3.3 *)
|
@since 0.3.3 *)
|
||||||
|
|
@ -79,12 +102,16 @@ val dup_map : ('a -> 'b) -> 'a -> 'a * 'b
|
||||||
to the second copy.
|
to the second copy.
|
||||||
@since 0.3.3 *)
|
@since 0.3.3 *)
|
||||||
|
|
||||||
|
[@@@iflt 5.4]
|
||||||
|
|
||||||
val equal :
|
val equal :
|
||||||
('a -> 'a -> bool) -> ('b -> 'b -> bool) -> 'a * 'b -> 'a * 'b -> bool
|
('a -> 'a -> bool) -> ('b -> 'b -> bool) -> 'a * 'b -> 'a * 'b -> bool
|
||||||
|
|
||||||
val compare :
|
val compare :
|
||||||
('a -> 'a -> int) -> ('b -> 'b -> int) -> 'a * 'b -> 'a * 'b -> int
|
('a -> 'a -> int) -> ('b -> 'b -> int) -> 'a * 'b -> 'a * 'b -> int
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val to_string :
|
val to_string :
|
||||||
?sep:string -> ('a -> string) -> ('b -> string) -> 'a * 'b -> string
|
?sep:string -> ('a -> string) -> ('b -> string) -> 'a * 'b -> string
|
||||||
(** Print tuple in a string
|
(** Print tuple in a string
|
||||||
|
|
|
||||||
|
|
@ -9,13 +9,7 @@ type 'a printer = Format.formatter -> 'a -> unit
|
||||||
|
|
||||||
(** {2 Basics} *)
|
(** {2 Basics} *)
|
||||||
|
|
||||||
type nonrec (+'good, +'bad) result = ('good, 'bad) result =
|
include Result
|
||||||
| Ok of 'good
|
|
||||||
| Error of 'bad
|
|
||||||
|
|
||||||
type (+'good, +'bad) t = ('good, 'bad) result =
|
|
||||||
| Ok of 'good
|
|
||||||
| Error of 'bad
|
|
||||||
|
|
||||||
let return x = Ok x
|
let return x = Ok x
|
||||||
let fail s = Error s
|
let fail s = Error s
|
||||||
|
|
@ -65,30 +59,14 @@ let opt_map f e =
|
||||||
| Ok x -> Ok (Some x)
|
| Ok x -> Ok (Some x)
|
||||||
| Error e -> Error e)
|
| Error e -> Error e)
|
||||||
|
|
||||||
let map f e =
|
let map_err = map_error
|
||||||
match e with
|
|
||||||
| Ok x -> Ok (f x)
|
|
||||||
| Error s -> Error s
|
|
||||||
|
|
||||||
let map_err f e =
|
|
||||||
match e with
|
|
||||||
| Ok _ as res -> res
|
|
||||||
| Error y -> Error (f y)
|
|
||||||
|
|
||||||
let map2 f g e =
|
let map2 f g e =
|
||||||
match e with
|
match e with
|
||||||
| Ok x -> Ok (f x)
|
| Ok x -> Ok (f x)
|
||||||
| Error s -> Error (g s)
|
| Error s -> Error (g s)
|
||||||
|
|
||||||
let iter f e =
|
let iter_err = iter_error
|
||||||
match e with
|
|
||||||
| Ok x -> f x
|
|
||||||
| Error _ -> ()
|
|
||||||
|
|
||||||
let iter_err f e =
|
|
||||||
match e with
|
|
||||||
| Ok _ -> ()
|
|
||||||
| Error err -> f err
|
|
||||||
|
|
||||||
exception Get_error
|
exception Get_error
|
||||||
|
|
||||||
|
|
@ -132,6 +110,13 @@ let flat_map f e =
|
||||||
| Ok x -> f x
|
| Ok x -> f x
|
||||||
| Error s -> Error s
|
| Error s -> Error s
|
||||||
|
|
||||||
|
[@@@iflt 5.4]
|
||||||
|
|
||||||
|
let retract = function
|
||||||
|
| Ok v | Error v -> v
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let k_compose f g x = f x |> flat_map g
|
let k_compose f g x = f x |> flat_map g
|
||||||
let ( >=> ) = k_compose
|
let ( >=> ) = k_compose
|
||||||
let ( <=< ) f g = g >=> f
|
let ( <=< ) f g = g >=> f
|
||||||
|
|
@ -149,24 +134,11 @@ let compare ~err cmp a b =
|
||||||
| _, Ok _ -> -1
|
| _, Ok _ -> -1
|
||||||
| Error s, Error s' -> err s s'
|
| Error s, Error s' -> err s s'
|
||||||
|
|
||||||
let fold ~ok ~error x =
|
|
||||||
match x with
|
|
||||||
| Ok x -> ok x
|
|
||||||
| Error s -> error s
|
|
||||||
|
|
||||||
let fold_ok f acc r =
|
let fold_ok f acc r =
|
||||||
match r with
|
match r with
|
||||||
| Ok x -> f acc x
|
| Ok x -> f acc x
|
||||||
| Error _ -> acc
|
| Error _ -> acc
|
||||||
|
|
||||||
let is_ok = function
|
|
||||||
| Ok _ -> true
|
|
||||||
| Error _ -> false
|
|
||||||
|
|
||||||
let is_error = function
|
|
||||||
| Ok _ -> false
|
|
||||||
| Error _ -> true
|
|
||||||
|
|
||||||
(** {2 Wrappers} *)
|
(** {2 Wrappers} *)
|
||||||
|
|
||||||
let guard f = try Ok (f ()) with e -> Error e
|
let guard f = try Ok (f ()) with e -> Error e
|
||||||
|
|
@ -185,18 +157,18 @@ let ( <*> ) f x =
|
||||||
| Error s -> fail s
|
| Error s -> fail s
|
||||||
| Ok f -> map f x
|
| Ok f -> map f x
|
||||||
|
|
||||||
let join t =
|
[@@@iflt 5.4]
|
||||||
match t with
|
|
||||||
| Ok (Ok o) -> Ok o
|
|
||||||
| Ok (Error e) -> Error e
|
|
||||||
| Error _ as e -> e
|
|
||||||
|
|
||||||
let both x y =
|
let product x y =
|
||||||
match x, y with
|
match x, y with
|
||||||
| Ok o, Ok o' -> Ok (o, o')
|
| Ok o, Ok o' -> Ok (o, o')
|
||||||
| Ok _, Error e -> Error e
|
| Ok _, Error e -> Error e
|
||||||
| Error e, _ -> Error e
|
| Error e, _ -> Error e
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
|
let both = product
|
||||||
|
|
||||||
(** {2 Collections} *)
|
(** {2 Collections} *)
|
||||||
|
|
||||||
let map_l f l =
|
let map_l f l =
|
||||||
|
|
@ -331,19 +303,12 @@ end
|
||||||
|
|
||||||
(** {2 Conversions} *)
|
(** {2 Conversions} *)
|
||||||
|
|
||||||
let to_opt = function
|
let to_opt = to_option
|
||||||
| Ok x -> Some x
|
|
||||||
| Error _ -> None
|
|
||||||
|
|
||||||
let of_opt = function
|
let of_opt = function
|
||||||
| None -> Error "of_opt"
|
| None -> Error "of_opt"
|
||||||
| Some x -> Ok x
|
| Some x -> Ok x
|
||||||
|
|
||||||
let to_seq e () =
|
|
||||||
match e with
|
|
||||||
| Ok x -> Seq.Cons (x, Seq.empty)
|
|
||||||
| Error _ -> Seq.Nil
|
|
||||||
|
|
||||||
let to_iter e k =
|
let to_iter e k =
|
||||||
match e with
|
match e with
|
||||||
| Ok x -> k x
|
| Ok x -> k x
|
||||||
|
|
|
||||||
|
|
@ -16,13 +16,8 @@ type 'a printer = Format.formatter -> 'a -> unit
|
||||||
|
|
||||||
(** {2 Basics} *)
|
(** {2 Basics} *)
|
||||||
|
|
||||||
type nonrec (+'good, +'bad) result = ('good, 'bad) result =
|
include module type of Result
|
||||||
| Ok of 'good
|
(** @inline *)
|
||||||
| Error of 'bad
|
|
||||||
|
|
||||||
type (+'good, +'bad) t = ('good, 'bad) result =
|
|
||||||
| Ok of 'good
|
|
||||||
| Error of 'bad
|
|
||||||
|
|
||||||
val return : 'a -> ('a, 'err) t
|
val return : 'a -> ('a, 'err) t
|
||||||
(** Successfully return a value. *)
|
(** Successfully return a value. *)
|
||||||
|
|
@ -68,22 +63,15 @@ val opt_map : ('a -> ('b, 'c) t) -> 'a option -> ('b option, 'c) t
|
||||||
(** Map a fallible operation through an option.
|
(** Map a fallible operation through an option.
|
||||||
@since 3.7 *)
|
@since 3.7 *)
|
||||||
|
|
||||||
val map : ('a -> 'b) -> ('a, 'err) t -> ('b, 'err) t
|
|
||||||
(** Map on success. *)
|
|
||||||
|
|
||||||
val map_err : ('err1 -> 'err2) -> ('a, 'err1) t -> ('a, 'err2) t
|
val map_err : ('err1 -> 'err2) -> ('a, 'err1) t -> ('a, 'err2) t
|
||||||
(** Map on the error variant. *)
|
(** Alias of [map_error] *)
|
||||||
|
|
||||||
val map2 : ('a -> 'b) -> ('err1 -> 'err2) -> ('a, 'err1) t -> ('b, 'err2) t
|
val map2 : ('a -> 'b) -> ('err1 -> 'err2) -> ('a, 'err1) t -> ('b, 'err2) t
|
||||||
(** Like {!map}, but also with a function that can transform
|
(** Like {!map}, but also with a function that can transform
|
||||||
the error message in case of failure. *)
|
the error message in case of failure. *)
|
||||||
|
|
||||||
val iter : ('a -> unit) -> ('a, _) t -> unit
|
|
||||||
(** Apply the function only in case of [Ok]. *)
|
|
||||||
|
|
||||||
val iter_err : ('err -> unit) -> (_, 'err) t -> unit
|
val iter_err : ('err -> unit) -> (_, 'err) t -> unit
|
||||||
(** Apply the function in case of [Error].
|
(** Alias of {!iter_error} *)
|
||||||
@since 2.4 *)
|
|
||||||
|
|
||||||
exception Get_error
|
exception Get_error
|
||||||
|
|
||||||
|
|
@ -120,6 +108,13 @@ val catch : ('a, 'err) t -> ok:('a -> 'b) -> err:('err -> 'b) -> 'b
|
||||||
|
|
||||||
val flat_map : ('a -> ('b, 'err) t) -> ('a, 'err) t -> ('b, 'err) t
|
val flat_map : ('a -> ('b, 'err) t) -> ('a, 'err) t -> ('b, 'err) t
|
||||||
|
|
||||||
|
[@@@iflt 5.4]
|
||||||
|
|
||||||
|
val retract : ('a, 'a) t -> 'a
|
||||||
|
(** [retract r] collapse [r] to [v] if [r] is either [Ok v] or [Error v]. *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val k_compose :
|
val k_compose :
|
||||||
('a -> ('b, 'err) t) -> ('b -> ('c, 'err) t) -> 'a -> ('c, 'err) t
|
('a -> ('b, 'err) t) -> ('b -> ('c, 'err) t) -> 'a -> ('c, 'err) t
|
||||||
(** Kleisli composition. Monadic equivalent of {!CCFun.compose}.
|
(** Kleisli composition. Monadic equivalent of {!CCFun.compose}.
|
||||||
|
|
@ -128,23 +123,11 @@ val k_compose :
|
||||||
val equal : err:'err equal -> 'a equal -> ('a, 'err) t equal
|
val equal : err:'err equal -> 'a equal -> ('a, 'err) t equal
|
||||||
val compare : err:'err ord -> 'a ord -> ('a, 'err) t ord
|
val compare : err:'err ord -> 'a ord -> ('a, 'err) t ord
|
||||||
|
|
||||||
val fold : ok:('a -> 'b) -> error:('err -> 'b) -> ('a, 'err) t -> 'b
|
|
||||||
(** [fold ~ok ~error e] opens [e] and, if [e = Ok x], returns
|
|
||||||
[ok x], otherwise [e = Error s] and it returns [error s]. *)
|
|
||||||
|
|
||||||
val fold_ok : ('a -> 'b -> 'a) -> 'a -> ('b, _) t -> 'a
|
val fold_ok : ('a -> 'b -> 'a) -> 'a -> ('b, _) t -> 'a
|
||||||
(** [fold_ok f acc r] will compute [f acc x] if [r=Ok x],
|
(** [fold_ok f acc r] will compute [f acc x] if [r=Ok x],
|
||||||
and return [acc] otherwise, as if the result were a mere option.
|
and return [acc] otherwise, as if the result were a mere option.
|
||||||
@since 1.2 *)
|
@since 1.2 *)
|
||||||
|
|
||||||
val is_ok : ('a, 'err) t -> bool
|
|
||||||
(** Return true if [Ok].
|
|
||||||
@since 1.0 *)
|
|
||||||
|
|
||||||
val is_error : ('a, 'err) t -> bool
|
|
||||||
(** Return true if [Error].
|
|
||||||
@since 1.0 *)
|
|
||||||
|
|
||||||
(** {2 Wrappers} *)
|
(** {2 Wrappers} *)
|
||||||
|
|
||||||
val guard : (unit -> 'a) -> ('a, exn) t
|
val guard : (unit -> 'a) -> ('a, exn) t
|
||||||
|
|
@ -172,15 +155,18 @@ val wrap3 : ('a -> 'b -> 'c -> 'd) -> 'a -> 'b -> 'c -> ('d, exn) t
|
||||||
val pure : 'a -> ('a, 'err) t
|
val pure : 'a -> ('a, 'err) t
|
||||||
(** Synonym of {!return}. *)
|
(** Synonym of {!return}. *)
|
||||||
|
|
||||||
val join : (('a, 'err) t, 'err) t -> ('a, 'err) t
|
[@@@iflt 5.4]
|
||||||
(** [join t], in case of success, returns [Ok o] from [Ok (Ok o)]. Otherwise,
|
|
||||||
it fails with [Error e] where [e] is the unwrapped error of [t]. *)
|
|
||||||
|
|
||||||
val both : ('a, 'err) t -> ('b, 'err) t -> ('a * 'b, 'err) t
|
val product : ('a, 'err) t -> ('b, 'err) t -> ('a * 'b, 'err) t
|
||||||
(** [both a b], in case of success, returns [Ok (o, o')] with the ok values
|
(** [product a b], in case of success, returns [Ok (o, o')] with the ok values
|
||||||
of [a] and [b]. Otherwise, it fails, and the error of [a] is chosen over the
|
of [a] and [b]. Otherwise, it fails, and the error of [a] is chosen over the
|
||||||
error of [b] if both fail. *)
|
error of [b] if both fail. *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
|
val both : ('a, 'err) t -> ('b, 'err) t -> ('a * 'b, 'err) t
|
||||||
|
(** Alias of {!product} *)
|
||||||
|
|
||||||
(** {2 Infix} *)
|
(** {2 Infix} *)
|
||||||
|
|
||||||
module Infix : sig
|
module Infix : sig
|
||||||
|
|
@ -279,7 +265,7 @@ end
|
||||||
(** {2 Conversions} *)
|
(** {2 Conversions} *)
|
||||||
|
|
||||||
val to_opt : ('a, _) t -> 'a option
|
val to_opt : ('a, _) t -> 'a option
|
||||||
(** Convert a result to an option. *)
|
(** Alias of {!to_option} *)
|
||||||
|
|
||||||
val of_opt : 'a option -> ('a, string) t
|
val of_opt : 'a option -> ('a, string) t
|
||||||
(** [of_opt opt] converts [Some v] to [Ok v] and [None] to [Error "of_opt"].*)
|
(** [of_opt opt] converts [Some v] to [Ok v] and [None] to [Error "of_opt"].*)
|
||||||
|
|
@ -287,10 +273,6 @@ val of_opt : 'a option -> ('a, string) t
|
||||||
val to_iter : ('a, _) t -> 'a iter
|
val to_iter : ('a, _) t -> 'a iter
|
||||||
(** @since 2.8 *)
|
(** @since 2.8 *)
|
||||||
|
|
||||||
val to_seq : ('a, _) t -> 'a Seq.t
|
|
||||||
(** Renamed from [to_std_seq] since 3.0.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
type ('a, 'b) error =
|
type ('a, 'b) error =
|
||||||
[ `Ok of 'a
|
[ `Ok of 'a
|
||||||
| `Error of 'b
|
| `Error of 'b
|
||||||
|
|
|
||||||
|
|
@ -9,10 +9,19 @@ type 'a printer = Format.formatter -> 'a -> unit
|
||||||
include Seq
|
include Seq
|
||||||
|
|
||||||
let nil () = Nil
|
let nil () = Nil
|
||||||
|
|
||||||
|
[@@@iflt 4.11]
|
||||||
|
|
||||||
let cons a b () = Cons (a, b)
|
let cons a b () = Cons (a, b)
|
||||||
let empty = nil
|
|
||||||
|
[@@@endif]
|
||||||
|
[@@@iflt 5.4]
|
||||||
|
|
||||||
let singleton x () = Cons (x, nil)
|
let singleton x () = Cons (x, nil)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
[@@@iflt 4.11]
|
||||||
|
|
||||||
let init n f =
|
let init n f =
|
||||||
let rec aux i () =
|
let rec aux i () =
|
||||||
if i >= n then
|
if i >= n then
|
||||||
|
|
@ -22,6 +31,8 @@ let init n f =
|
||||||
in
|
in
|
||||||
aux 0
|
aux 0
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let rec _forever x () = Cons (x, _forever x)
|
let rec _forever x () = Cons (x, _forever x)
|
||||||
|
|
||||||
let rec _repeat n x () =
|
let rec _repeat n x () =
|
||||||
|
|
@ -37,11 +48,15 @@ let repeat ?n x =
|
||||||
|
|
||||||
let rec forever f () = Cons (f (), forever f)
|
let rec forever f () = Cons (f (), forever f)
|
||||||
|
|
||||||
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
let is_empty l =
|
let is_empty l =
|
||||||
match l () with
|
match l () with
|
||||||
| Nil -> true
|
| Nil -> true
|
||||||
| Cons _ -> false
|
| Cons _ -> false
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let head_exn l =
|
let head_exn l =
|
||||||
match l () with
|
match l () with
|
||||||
| Nil -> raise Not_found
|
| Nil -> raise Not_found
|
||||||
|
|
@ -62,11 +77,15 @@ let tail l =
|
||||||
| Nil -> None
|
| Nil -> None
|
||||||
| Cons (_, l) -> Some l
|
| Cons (_, l) -> Some l
|
||||||
|
|
||||||
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
let uncons l =
|
let uncons l =
|
||||||
match l () with
|
match l () with
|
||||||
| Nil -> None
|
| Nil -> None
|
||||||
| Cons (h, t) -> Some (h, t)
|
| Cons (h, t) -> Some (h, t)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let rec equal eq l1 l2 =
|
let rec equal eq l1 l2 =
|
||||||
match l1 (), l2 () with
|
match l1 (), l2 () with
|
||||||
| Nil, Nil -> true
|
| Nil, Nil -> true
|
||||||
|
|
@ -100,14 +119,9 @@ let foldi f acc res =
|
||||||
in
|
in
|
||||||
aux acc 0 res
|
aux acc 0 res
|
||||||
|
|
||||||
let fold_lefti = foldi
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
let rec iter f l =
|
let fold_lefti = foldi
|
||||||
match l () with
|
|
||||||
| Nil -> ()
|
|
||||||
| Cons (x, l') ->
|
|
||||||
f x;
|
|
||||||
iter f l'
|
|
||||||
|
|
||||||
let iteri f l =
|
let iteri f l =
|
||||||
let rec aux f l i =
|
let rec aux f l i =
|
||||||
|
|
@ -151,11 +165,6 @@ let rec drop_while p l () =
|
||||||
| Cons (x, l') when p x -> drop_while p l' ()
|
| Cons (x, l') when p x -> drop_while p l' ()
|
||||||
| Cons _ as res -> res
|
| Cons _ as res -> res
|
||||||
|
|
||||||
let rec map f l () =
|
|
||||||
match l () with
|
|
||||||
| Nil -> Nil
|
|
||||||
| Cons (x, l') -> Cons (f x, map f l')
|
|
||||||
|
|
||||||
let mapi f l =
|
let mapi f l =
|
||||||
let rec aux f l i () =
|
let rec aux f l i () =
|
||||||
match l () with
|
match l () with
|
||||||
|
|
@ -164,36 +173,55 @@ let mapi f l =
|
||||||
in
|
in
|
||||||
aux f l 0
|
aux f l 0
|
||||||
|
|
||||||
let rec fmap f (l : 'a t) () =
|
[@@@endif]
|
||||||
match l () with
|
[@@@iflt 5.4]
|
||||||
| Nil -> Nil
|
|
||||||
| Cons (x, l') ->
|
|
||||||
(match f x with
|
|
||||||
| None -> fmap f l' ()
|
|
||||||
| Some y -> Cons (y, fmap f l'))
|
|
||||||
|
|
||||||
let rec filter p l () =
|
let filteri f l =
|
||||||
match l () with
|
let rec aux f l i () =
|
||||||
| Nil -> Nil
|
match l () with
|
||||||
| Cons (x, l') ->
|
| Nil -> Nil
|
||||||
if p x then
|
| Cons (x, tl) ->
|
||||||
Cons (x, filter p l')
|
if f i x then
|
||||||
else
|
Cons (x, aux f tl (i + 1))
|
||||||
filter p l' ()
|
else
|
||||||
|
aux f tl (i + 1) ()
|
||||||
|
in
|
||||||
|
aux f l 0
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
|
let fmap = filter_map
|
||||||
|
|
||||||
|
[@@@iflt 4.11]
|
||||||
|
|
||||||
let rec append l1 l2 () =
|
let rec append l1 l2 () =
|
||||||
match l1 () with
|
match l1 () with
|
||||||
| Nil -> l2 ()
|
| Nil -> l2 ()
|
||||||
| Cons (x, l1') -> Cons (x, append l1' l2)
|
| Cons (x, l1') -> Cons (x, append l1' l2)
|
||||||
|
|
||||||
let rec cycle l () = append l (cycle l) ()
|
[@@@endif]
|
||||||
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
|
let rec cycle l =
|
||||||
|
if is_empty l then
|
||||||
|
l
|
||||||
|
else
|
||||||
|
fun () ->
|
||||||
|
append l (cycle l) ()
|
||||||
|
|
||||||
let rec iterate f a () = Cons (a, iterate f (f a))
|
let rec iterate f a () = Cons (a, iterate f (f a))
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
[@@@iflt 4.11]
|
||||||
|
|
||||||
let rec unfold f acc () =
|
let rec unfold f acc () =
|
||||||
match f acc with
|
match f acc with
|
||||||
| None -> Nil
|
| None -> Nil
|
||||||
| Some (x, acc') -> Cons (x, unfold f acc')
|
| Some (x, acc') -> Cons (x, unfold f acc')
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
let rec for_all p l =
|
let rec for_all p l =
|
||||||
match l () with
|
match l () with
|
||||||
| Nil -> true
|
| Nil -> true
|
||||||
|
|
@ -221,6 +249,35 @@ let rec find_map f l =
|
||||||
| None -> find_map f tl
|
| None -> find_map f tl
|
||||||
| e -> e)
|
| e -> e)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
[@@@iflt 5.1]
|
||||||
|
|
||||||
|
let find_index p l =
|
||||||
|
let rec aux i l =
|
||||||
|
match l () with
|
||||||
|
| Nil -> None
|
||||||
|
| Cons (x, tl) ->
|
||||||
|
if p x then
|
||||||
|
Some i
|
||||||
|
else
|
||||||
|
aux (i + 1) tl
|
||||||
|
in
|
||||||
|
aux 0 l
|
||||||
|
|
||||||
|
let find_mapi f l =
|
||||||
|
let rec aux i l =
|
||||||
|
match l () with
|
||||||
|
| Nil -> None
|
||||||
|
| Cons (x, tl) ->
|
||||||
|
(match f i x with
|
||||||
|
| Some _ as res -> res
|
||||||
|
| None -> aux (i + 1) tl)
|
||||||
|
in
|
||||||
|
aux 0 l
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
[@@@iflt 5.1]
|
||||||
|
|
||||||
let rec scan f acc res () =
|
let rec scan f acc res () =
|
||||||
Cons
|
Cons
|
||||||
( acc,
|
( acc,
|
||||||
|
|
@ -229,18 +286,13 @@ let rec scan f acc res () =
|
||||||
| Nil -> Nil
|
| Nil -> Nil
|
||||||
| Cons (s, cont) -> scan f (f acc s) cont () )
|
| Cons (s, cont) -> scan f (f acc s) cont () )
|
||||||
|
|
||||||
let rec flat_map f l () =
|
[@@@endif]
|
||||||
match l () with
|
[@@@iflt 4.13]
|
||||||
| Nil -> Nil
|
|
||||||
| Cons (x, l') -> _flat_map_app f (f x) l' ()
|
|
||||||
|
|
||||||
and _flat_map_app f l l' () =
|
|
||||||
match l () with
|
|
||||||
| Nil -> flat_map f l' ()
|
|
||||||
| Cons (x, tl) -> Cons (x, _flat_map_app f tl l')
|
|
||||||
|
|
||||||
let concat_map = flat_map
|
let concat_map = flat_map
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let product_with f l1 l2 =
|
let product_with f l1 l2 =
|
||||||
let rec _next_left h1 tl1 h2 tl2 () =
|
let rec _next_left h1 tl1 h2 tl2 () =
|
||||||
match tl1 () with
|
match tl1 () with
|
||||||
|
|
@ -264,6 +316,8 @@ let product_with f l1 l2 =
|
||||||
in
|
in
|
||||||
_next_left [] l1 [] l2
|
_next_left [] l1 [] l2
|
||||||
|
|
||||||
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
let map_product = product_with
|
let map_product = product_with
|
||||||
let product l1 l2 = product_with (fun x y -> x, y) l1 l2
|
let product l1 l2 = product_with (fun x y -> x, y) l1 l2
|
||||||
|
|
||||||
|
|
@ -273,6 +327,8 @@ let rec group eq l () =
|
||||||
| Cons (x, l') ->
|
| Cons (x, l') ->
|
||||||
Cons (cons x (take_while (eq x) l'), group eq (drop_while (eq x) l'))
|
Cons (cons x (take_while (eq x) l'), group eq (drop_while (eq x) l'))
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let rec _uniq eq prev l () =
|
let rec _uniq eq prev l () =
|
||||||
match prev, l () with
|
match prev, l () with
|
||||||
| _, Nil -> Nil
|
| _, Nil -> Nil
|
||||||
|
|
@ -285,16 +341,13 @@ let rec _uniq eq prev l () =
|
||||||
|
|
||||||
let uniq eq l = _uniq eq None l
|
let uniq eq l = _uniq eq None l
|
||||||
|
|
||||||
let rec filter_map f l () =
|
[@@@iflt 4.13]
|
||||||
match l () with
|
|
||||||
| Nil -> Nil
|
|
||||||
| Cons (x, l') ->
|
|
||||||
(match f x with
|
|
||||||
| None -> filter_map f l' ()
|
|
||||||
| Some y -> Cons (y, filter_map f l'))
|
|
||||||
|
|
||||||
let flatten l = flat_map (fun x -> x) l
|
let concat l = flat_map (fun x -> x) l
|
||||||
let concat = flatten
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
|
let flatten = concat
|
||||||
|
|
||||||
let range i j =
|
let range i j =
|
||||||
let rec aux i j () =
|
let rec aux i j () =
|
||||||
|
|
@ -317,12 +370,18 @@ let ( --^ ) i j =
|
||||||
else
|
else
|
||||||
range i (j + 1)
|
range i (j + 1)
|
||||||
|
|
||||||
let rec fold2 f acc l1 l2 =
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
|
let rec fold_left2 f acc l1 l2 =
|
||||||
match l1 (), l2 () with
|
match l1 (), l2 () with
|
||||||
| Nil, _ | _, Nil -> acc
|
| Nil, _ | _, Nil -> acc
|
||||||
| Cons (x1, l1'), Cons (x2, l2') -> fold2 f (f acc x1 x2) l1' l2'
|
| Cons (x1, l1'), Cons (x2, l2') -> fold_left2 f (f acc x1 x2) l1' l2'
|
||||||
|
|
||||||
let fold_left2 = fold2
|
[@@@endif]
|
||||||
|
|
||||||
|
let fold2 = fold_left2
|
||||||
|
|
||||||
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
let rec map2 f l1 l2 () =
|
let rec map2 f l1 l2 () =
|
||||||
match l1 (), l2 () with
|
match l1 (), l2 () with
|
||||||
|
|
@ -346,17 +405,21 @@ let rec exists2 f l1 l2 =
|
||||||
| Nil, _ | _, Nil -> false
|
| Nil, _ | _, Nil -> false
|
||||||
| Cons (x1, l1'), Cons (x2, l2') -> f x1 x2 || exists2 f l1' l2'
|
| Cons (x1, l1'), Cons (x2, l2') -> f x1 x2 || exists2 f l1' l2'
|
||||||
|
|
||||||
let rec merge cmp l1 l2 () =
|
let rec sorted_merge cmp l1 l2 () =
|
||||||
match l1 (), l2 () with
|
match l1 (), l2 () with
|
||||||
| Nil, tl2 -> tl2
|
| Nil, tl2 -> tl2
|
||||||
| tl1, Nil -> tl1
|
| tl1, Nil -> tl1
|
||||||
| Cons (x1, l1'), Cons (x2, l2') ->
|
| Cons (x1, l1'), Cons (x2, l2') ->
|
||||||
if cmp x1 x2 < 0 then
|
if cmp x1 x2 < 0 then
|
||||||
Cons (x1, merge cmp l1' l2)
|
Cons (x1, sorted_merge cmp l1' l2)
|
||||||
else
|
else
|
||||||
Cons (x2, merge cmp l1 l2')
|
Cons (x2, sorted_merge cmp l1 l2')
|
||||||
|
|
||||||
let sorted_merge = merge
|
[@@@endif]
|
||||||
|
|
||||||
|
let merge = sorted_merge
|
||||||
|
|
||||||
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
let rec zip a b () =
|
let rec zip a b () =
|
||||||
match a (), b () with
|
match a (), b () with
|
||||||
|
|
@ -377,6 +440,8 @@ let unzip l =
|
||||||
|
|
||||||
let split = unzip
|
let split = unzip
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let zip_i seq =
|
let zip_i seq =
|
||||||
let rec loop i seq () =
|
let rec loop i seq () =
|
||||||
match seq () with
|
match seq () with
|
||||||
|
|
@ -387,7 +452,6 @@ let zip_i seq =
|
||||||
|
|
||||||
(** {2 Implementations} *)
|
(** {2 Implementations} *)
|
||||||
|
|
||||||
let return x () = Cons (x, nil)
|
|
||||||
let pure = return
|
let pure = return
|
||||||
let ( >>= ) xs f = flat_map f xs
|
let ( >>= ) xs f = flat_map f xs
|
||||||
let ( >|= ) xs f = map f xs
|
let ( >|= ) xs f = map f xs
|
||||||
|
|
@ -530,11 +594,15 @@ let rec memoize f =
|
||||||
|
|
||||||
(** {2 Fair Combinations} *)
|
(** {2 Fair Combinations} *)
|
||||||
|
|
||||||
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
let rec interleave a b () =
|
let rec interleave a b () =
|
||||||
match a () with
|
match a () with
|
||||||
| Nil -> b ()
|
| Nil -> b ()
|
||||||
| Cons (x, tail) -> Cons (x, interleave b tail)
|
| Cons (x, tail) -> Cons (x, interleave b tail)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
let rec fair_flat_map f a () =
|
let rec fair_flat_map f a () =
|
||||||
match a () with
|
match a () with
|
||||||
| Nil -> Nil
|
| Nil -> Nil
|
||||||
|
|
|
||||||
|
|
@ -17,38 +17,60 @@ include module type of Seq
|
||||||
(** @inline *)
|
(** @inline *)
|
||||||
|
|
||||||
val nil : 'a t
|
val nil : 'a t
|
||||||
val empty : 'a t
|
|
||||||
|
[@@@iflt 4.11]
|
||||||
|
|
||||||
val cons : 'a -> 'a t -> 'a t
|
val cons : 'a -> 'a t -> 'a t
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
[@@@iflt 5.4]
|
||||||
|
|
||||||
val singleton : 'a -> 'a t
|
val singleton : 'a -> 'a t
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
val init : int -> (int -> 'a) -> 'a t
|
val init : int -> (int -> 'a) -> 'a t
|
||||||
(** [init n f] corresponds to the sequence [f 0; f 1; ...; f (n-1)].
|
(** [init n f] corresponds to the sequence [f 0; f 1; ...; f (n-1)].
|
||||||
@raise Invalid_argument if n is negative.
|
@raise Invalid_argument if n is negative.
|
||||||
@since 3.10 *)
|
@since 3.10 *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val repeat : ?n:int -> 'a -> 'a t
|
val repeat : ?n:int -> 'a -> 'a t
|
||||||
(** [repeat ~n x] repeats [x] [n] times then stops. If [n] is omitted,
|
(** [repeat ~n x] repeats [x] [n] times then stops. If [n] is omitted,
|
||||||
then [x] is repeated forever. *)
|
then [x] is repeated forever. *)
|
||||||
|
|
||||||
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
val forever : (unit -> 'a) -> 'a t
|
val forever : (unit -> 'a) -> 'a t
|
||||||
(** [forever f] corresponds to the infinite sequence containing all the [f ()].
|
(** [forever f] corresponds to the infinite sequence containing all the [f ()].
|
||||||
@since 3.10 *)
|
@since 3.10 *)
|
||||||
|
|
||||||
val cycle : 'a t -> 'a t
|
val cycle : 'a t -> 'a t
|
||||||
(** Cycle through the iterator infinitely. The iterator shouldn't be empty. *)
|
(** Cycle through the sequence infinitely. The sequence should be persistent.
|
||||||
|
@since NEXT_RELEASE the sequence can be empty, in this case cycle return an empty sequence. *)
|
||||||
|
|
||||||
val iterate : ('a -> 'a) -> 'a -> 'a t
|
val iterate : ('a -> 'a) -> 'a -> 'a t
|
||||||
(** [iterate f a] corresponds to the infinite sequence containing [a], [f a], [f (f a)],
|
(** [iterate f a] corresponds to the infinite sequence containing [a], [f a], [f (f a)],
|
||||||
...
|
...
|
||||||
@since 3.10 *)
|
@since 3.10 *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
[@@@iflt 4.11]
|
||||||
|
|
||||||
val unfold : ('b -> ('a * 'b) option) -> 'b -> 'a t
|
val unfold : ('b -> ('a * 'b) option) -> 'b -> 'a t
|
||||||
(** [unfold f acc] calls [f acc] and:
|
(** [unfold f acc] calls [f acc] and:
|
||||||
- if [f acc = Some (x, acc')], yield [x], continue with [unfold f acc'].
|
- if [f acc = Some (x, acc')], yield [x], continue with [unfold f acc'].
|
||||||
- if [f acc = None], stops. *)
|
- if [f acc = None], stops. *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
val is_empty : 'a t -> bool
|
val is_empty : 'a t -> bool
|
||||||
(** [is_empty xs] checks in the sequence [xs] is empty *)
|
(** [is_empty xs] checks in the sequence [xs] is empty. [is_empty] acces the first element of the sequence, this can causes issue if the sequence is ephemeral. *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val head : 'a t -> 'a option
|
val head : 'a t -> 'a option
|
||||||
(** Head of the list. *)
|
(** Head of the list. *)
|
||||||
|
|
@ -64,10 +86,14 @@ val tail_exn : 'a t -> 'a t
|
||||||
(** Unsafe version of {!tail}.
|
(** Unsafe version of {!tail}.
|
||||||
@raise Not_found if the list is empty. *)
|
@raise Not_found if the list is empty. *)
|
||||||
|
|
||||||
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
val uncons : 'a t -> ('a * 'a t) option
|
val uncons : 'a t -> ('a * 'a t) option
|
||||||
(** [uncons xs] return [None] if [xs] is empty other
|
(** [uncons xs] return [None] if [xs] is empty other
|
||||||
@since 3.10 *)
|
@since 3.10 *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val equal : 'a equal -> 'a t equal
|
val equal : 'a equal -> 'a t equal
|
||||||
(** Equality step by step. Eager. *)
|
(** Equality step by step. Eager. *)
|
||||||
|
|
||||||
|
|
@ -86,12 +112,12 @@ val foldi : ('a -> int -> 'b -> 'a) -> 'a -> 'b t -> 'a
|
||||||
0) and [x] is the element of the sequence.
|
0) and [x] is the element of the sequence.
|
||||||
@since 3.10 *)
|
@since 3.10 *)
|
||||||
|
|
||||||
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
val fold_lefti : ('a -> int -> 'b -> 'a) -> 'a -> 'b t -> 'a
|
val fold_lefti : ('a -> int -> 'b -> 'a) -> 'a -> 'b t -> 'a
|
||||||
(** Alias of {!foldi}.
|
(** Alias of {!foldi}.
|
||||||
@since 3.10 *)
|
@since 3.10 *)
|
||||||
|
|
||||||
val iter : ('a -> unit) -> 'a t -> unit
|
|
||||||
|
|
||||||
val iteri : (int -> 'a -> unit) -> 'a t -> unit
|
val iteri : (int -> 'a -> unit) -> 'a t -> unit
|
||||||
(** Iterate with index (starts at 0). *)
|
(** Iterate with index (starts at 0). *)
|
||||||
|
|
||||||
|
|
@ -104,19 +130,33 @@ val take : int -> 'a t -> 'a t
|
||||||
val take_while : ('a -> bool) -> 'a t -> 'a t
|
val take_while : ('a -> bool) -> 'a t -> 'a t
|
||||||
val drop : int -> 'a t -> 'a t
|
val drop : int -> 'a t -> 'a t
|
||||||
val drop_while : ('a -> bool) -> 'a t -> 'a t
|
val drop_while : ('a -> bool) -> 'a t -> 'a t
|
||||||
val map : ('a -> 'b) -> 'a t -> 'b t
|
|
||||||
|
|
||||||
val mapi : (int -> 'a -> 'b) -> 'a t -> 'b t
|
val mapi : (int -> 'a -> 'b) -> 'a t -> 'b t
|
||||||
(** Map with index (starts at 0). *)
|
(** Map with index (starts at 0). *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
[@@@iflt 5.4]
|
||||||
|
|
||||||
|
val filteri : (int -> 'a -> bool) -> 'a t -> 'a t
|
||||||
|
(** Similar to {!filter} but the predicate takes aditionally the index of the elements. *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val fmap : ('a -> 'b option) -> 'a t -> 'b t
|
val fmap : ('a -> 'b option) -> 'a t -> 'b t
|
||||||
val filter : ('a -> bool) -> 'a t -> 'a t
|
(** Alias of {!filter_map}. *)
|
||||||
|
|
||||||
|
[@@@iflt 4.11]
|
||||||
|
|
||||||
val append : 'a t -> 'a t -> 'a t
|
val append : 'a t -> 'a t -> 'a t
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val product_with : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
|
val product_with : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
|
||||||
(** Fair product of two (possibly infinite) lists into a new list. Lazy.
|
(** Fair product of two (possibly infinite) lists into a new list. Lazy.
|
||||||
The first parameter is used to combine each pair of elements. *)
|
The first parameter is used to combine each pair of elements. *)
|
||||||
|
|
||||||
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
val map_product : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
|
val map_product : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
|
||||||
(** Alias of {!product_with}.
|
(** Alias of {!product_with}.
|
||||||
@since 3.10 *)
|
@since 3.10 *)
|
||||||
|
|
@ -129,11 +169,15 @@ val group : 'a equal -> 'a t -> 'a t t
|
||||||
For instance [group (=) [1;1;1;2;2;3;3;1]] yields
|
For instance [group (=) [1;1;1;2;2;3;3;1]] yields
|
||||||
[[1;1;1]; [2;2]; [3;3]; [1]]. *)
|
[[1;1;1]; [2;2]; [3;3]; [1]]. *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val uniq : 'a equal -> 'a t -> 'a t
|
val uniq : 'a equal -> 'a t -> 'a t
|
||||||
(** [uniq eq l] returns [l] but removes consecutive duplicates. Lazy.
|
(** [uniq eq l] returns [l] but removes consecutive duplicates. Lazy.
|
||||||
In other words, if several values that are equal follow one another,
|
In other words, if several values that are equal follow one another,
|
||||||
only the first of them is kept. *)
|
only the first of them is kept. *)
|
||||||
|
|
||||||
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
val for_all : ('a -> bool) -> 'a t -> bool
|
val for_all : ('a -> bool) -> 'a t -> bool
|
||||||
(** [for_all p [a1; ...; an]] checks if all elements of the sequence satisfy the
|
(** [for_all p [a1; ...; an]] checks if all elements of the sequence satisfy the
|
||||||
predicate [p]. That is, it returns [(p a1) && ... && (p an)] for a
|
predicate [p]. That is, it returns [(p a1) && ... && (p an)] for a
|
||||||
|
|
@ -158,23 +202,37 @@ val find_map : ('a -> 'b option) -> 'a t -> 'b option
|
||||||
[f ai = Some _] and return [None] otherwise.
|
[f ai = Some _] and return [None] otherwise.
|
||||||
@since 3.10 *)
|
@since 3.10 *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
[@@@iflt 5.1]
|
||||||
|
|
||||||
|
val find_index : ('a -> bool) -> 'a t -> int option
|
||||||
|
(** [find_index p xs] returns [Some i], where [i] is the index of the first value of [xs] satisfying [p]. It returns [None] if no value of [xs] satifies [p]. *)
|
||||||
|
|
||||||
|
val find_mapi : (int -> 'a -> 'b option) -> 'a t -> 'b option
|
||||||
|
(** Similar to {!find_map} but the predicate take aditionnaly the index of the element. *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
val scan : ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a t
|
val scan : ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a t
|
||||||
(** [scan f init xs] is the sequence containing the intermediate result of
|
(** [scan f init xs] is the sequence containing the intermediate result of
|
||||||
[fold f init xs].
|
[fold f init xs].
|
||||||
@since 3.10 *)
|
@since 3.10 *)
|
||||||
|
|
||||||
val flat_map : ('a -> 'b t) -> 'a t -> 'b t
|
[@@@endif]
|
||||||
|
[@@@iflt 4.13]
|
||||||
|
|
||||||
val concat_map : ('a -> 'b t) -> 'a t -> 'b t
|
val concat_map : ('a -> 'b t) -> 'a t -> 'b t
|
||||||
(** Alias of {!flat_map}
|
(** Alias of {!flat_map}
|
||||||
@since 3.10 *)
|
@since 3.10 *)
|
||||||
|
|
||||||
val filter_map : ('a -> 'b option) -> 'a t -> 'b t
|
|
||||||
val flatten : 'a t t -> 'a t
|
|
||||||
|
|
||||||
val concat : 'a t t -> 'a t
|
val concat : 'a t t -> 'a t
|
||||||
(** Alias of {!flatten}.
|
(** @since 3.10 *)
|
||||||
@since 3.10 *)
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
|
val flatten : 'a t t -> 'a t
|
||||||
|
(** Alias of {!concat} *)
|
||||||
|
|
||||||
val range : int -> int -> int t
|
val range : int -> int -> int t
|
||||||
|
|
||||||
|
|
@ -187,12 +245,18 @@ val ( --^ ) : int -> int -> int t
|
||||||
|
|
||||||
(** {2 Operations on two Collections} *)
|
(** {2 Operations on two Collections} *)
|
||||||
|
|
||||||
val fold2 : ('acc -> 'a -> 'b -> 'acc) -> 'acc -> 'a t -> 'b t -> 'acc
|
[@@@iflt 4.14]
|
||||||
(** Fold on two collections at once. Stop as soon as one of them ends. *)
|
|
||||||
|
|
||||||
val fold_left2 : ('acc -> 'a -> 'b -> 'acc) -> 'acc -> 'a t -> 'b t -> 'acc
|
val fold_left2 : ('acc -> 'a -> 'b -> 'acc) -> 'acc -> 'a t -> 'b t -> 'acc
|
||||||
(** Alias for {!fold2}.
|
(** Fold on two collections at once. Stop as soon as one of them ends.
|
||||||
@since 3.10 *)
|
@since 3.10 *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
|
val fold2 : ('acc -> 'a -> 'b -> 'acc) -> 'acc -> 'a t -> 'b t -> 'acc
|
||||||
|
(** Alias for {!fold_left2}. *)
|
||||||
|
|
||||||
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
val map2 : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
|
val map2 : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
|
||||||
(** Map on two collections at once. Stop as soon as one of the
|
(** Map on two collections at once. Stop as soon as one of the
|
||||||
|
|
@ -204,12 +268,19 @@ val iter2 : ('a -> 'b -> unit) -> 'a t -> 'b t -> unit
|
||||||
val for_all2 : ('a -> 'b -> bool) -> 'a t -> 'b t -> bool
|
val for_all2 : ('a -> 'b -> bool) -> 'a t -> 'b t -> bool
|
||||||
val exists2 : ('a -> 'b -> bool) -> 'a t -> 'b t -> bool
|
val exists2 : ('a -> 'b -> bool) -> 'a t -> 'b t -> bool
|
||||||
|
|
||||||
val merge : 'a ord -> 'a t -> 'a t -> 'a t
|
[@@@endif]
|
||||||
(** Merge two sorted iterators into a sorted iterator. *)
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
val sorted_merge : 'a ord -> 'a t -> 'a t -> 'a t
|
val sorted_merge : 'a ord -> 'a t -> 'a t -> 'a t
|
||||||
(** Alias of {!merge}.
|
(** Merge two sorted iterators into a sorted iterator.
|
||||||
@since 3.10 *)
|
@since 3.10 *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
|
val merge : 'a ord -> 'a t -> 'a t -> 'a t
|
||||||
|
(** Alias of {!sorted_merge}. *)
|
||||||
|
|
||||||
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
val zip : 'a t -> 'b t -> ('a * 'b) t
|
val zip : 'a t -> 'b t -> ('a * 'b) t
|
||||||
(** Combine elements pairwise. Stop as soon as one of the lists stops. *)
|
(** Combine elements pairwise. Stop as soon as one of the lists stops. *)
|
||||||
|
|
@ -221,6 +292,8 @@ val split : ('a * 'b) t -> 'a t * 'b t
|
||||||
(** Alias of {!unzip}.
|
(** Alias of {!unzip}.
|
||||||
@since 3.10 *)
|
@since 3.10 *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val zip_i : 'a t -> (int * 'a) t
|
val zip_i : 'a t -> (int * 'a) t
|
||||||
(** [zip_i seq] zips the index of each element with the element itself.
|
(** [zip_i seq] zips the index of each element with the element itself.
|
||||||
@since 3.8
|
@since 3.8
|
||||||
|
|
@ -241,9 +314,13 @@ val memoize : 'a t -> 'a t
|
||||||
|
|
||||||
(** {2 Fair Combinations} *)
|
(** {2 Fair Combinations} *)
|
||||||
|
|
||||||
|
[@@@iflt 4.14]
|
||||||
|
|
||||||
val interleave : 'a t -> 'a t -> 'a t
|
val interleave : 'a t -> 'a t -> 'a t
|
||||||
(** Fair interleaving of both streams. *)
|
(** Fair interleaving of both streams. *)
|
||||||
|
|
||||||
|
[@@@endif]
|
||||||
|
|
||||||
val fair_flat_map : ('a -> 'b t) -> 'a t -> 'b t
|
val fair_flat_map : ('a -> 'b t) -> 'a t -> 'b t
|
||||||
(** Fair version of {!flat_map}. *)
|
(** Fair version of {!flat_map}. *)
|
||||||
|
|
||||||
|
|
@ -252,7 +329,6 @@ val fair_app : ('a -> 'b) t -> 'a t -> 'b t
|
||||||
|
|
||||||
(** {2 Implementations} *)
|
(** {2 Implementations} *)
|
||||||
|
|
||||||
val return : 'a -> 'a t
|
|
||||||
val pure : 'a -> 'a t
|
val pure : 'a -> 'a t
|
||||||
val ( >>= ) : 'a t -> ('a -> 'b t) -> 'b t
|
val ( >>= ) : 'a t -> ('a -> 'b t) -> 'b t
|
||||||
val ( >|= ) : 'a t -> ('a -> 'b) -> 'b t
|
val ( >|= ) : 'a t -> ('a -> 'b) -> 'b t
|
||||||
|
|
|
||||||
|
|
@ -10,43 +10,11 @@ module type OrderedType = Set.OrderedType
|
||||||
module type S = sig
|
module type S = sig
|
||||||
include Set.S
|
include Set.S
|
||||||
|
|
||||||
val min_elt_opt : t -> elt option
|
|
||||||
(** Safe version of {!min_elt}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val max_elt_opt : t -> elt option
|
|
||||||
(** Safe version of {!max_elt}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val choose_opt : t -> elt option
|
|
||||||
(** Safe version of {!choose}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val find_opt : elt -> t -> elt option
|
|
||||||
(** Safe version of {!find}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val find_first : (elt -> bool) -> t -> elt
|
|
||||||
(** Find minimum element satisfying predicate.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val find_first_opt : (elt -> bool) -> t -> elt option
|
|
||||||
(** Safe version of {!find_first}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val find_first_map : (elt -> 'a option) -> t -> 'a option
|
val find_first_map : (elt -> 'a option) -> t -> 'a option
|
||||||
(** [find_first_map f s] find the minimum element [x] of [s] such that [f x = Some y]
|
(** [find_first_map f s] find the minimum element [x] of [s] such that [f x = Some y]
|
||||||
and return [Some y]. Otherwise returns [None].
|
and return [Some y]. Otherwise returns [None].
|
||||||
@since 3.12 *)
|
@since 3.12 *)
|
||||||
|
|
||||||
val find_last : (elt -> bool) -> t -> elt
|
|
||||||
(** Find maximum element satisfying predicate.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val find_last_opt : (elt -> bool) -> t -> elt option
|
|
||||||
(** Safe version of {!find_last}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val find_last_map : (elt -> 'a option) -> t -> 'a option
|
val find_last_map : (elt -> 'a option) -> t -> 'a option
|
||||||
(** [find_last_map f s] find the maximum element [x] of [s] such that [f x = Some y]
|
(** [find_last_map f s] find the maximum element [x] of [s] such that [f x = Some y]
|
||||||
and return [Some y]. Otherwise returns [None].
|
and return [Some y]. Otherwise returns [None].
|
||||||
|
|
@ -56,16 +24,9 @@ module type S = sig
|
||||||
(** Build a set from the given [iter] of elements.
|
(** Build a set from the given [iter] of elements.
|
||||||
@since 2.8 *)
|
@since 2.8 *)
|
||||||
|
|
||||||
val of_seq : elt Seq.t -> t
|
|
||||||
(** Build a set from the given [seq] of elements.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val add_iter : t -> elt iter -> t
|
val add_iter : t -> elt iter -> t
|
||||||
(** @since 2.8 *)
|
(** @since 2.8 *)
|
||||||
|
|
||||||
val add_seq : elt Seq.t -> t -> t
|
|
||||||
(** @since 3.0 *)
|
|
||||||
|
|
||||||
val to_iter : t -> elt iter
|
val to_iter : t -> elt iter
|
||||||
(** [to_iter t] converts the set [t] to a [iter] of the elements.
|
(** [to_iter t] converts the set [t] to a [iter] of the elements.
|
||||||
@since 2.8 *)
|
@since 2.8 *)
|
||||||
|
|
@ -103,31 +64,8 @@ module Make (O : Map.OrderedType) = struct
|
||||||
|
|
||||||
[@@@ocaml.warning "-32"]
|
[@@@ocaml.warning "-32"]
|
||||||
|
|
||||||
let find_opt x s = try Some (S.find x s) with Not_found -> None
|
|
||||||
let choose_opt s = try Some (S.choose s) with Not_found -> None
|
|
||||||
let min_elt_opt s = try Some (S.min_elt s) with Not_found -> None
|
|
||||||
let max_elt_opt s = try Some (S.max_elt s) with Not_found -> None
|
|
||||||
|
|
||||||
exception Find_binding_exit
|
exception Find_binding_exit
|
||||||
|
|
||||||
let find_first_opt f m =
|
|
||||||
let res = ref None in
|
|
||||||
try
|
|
||||||
S.iter
|
|
||||||
(fun x ->
|
|
||||||
if f x then (
|
|
||||||
res := Some x;
|
|
||||||
raise Find_binding_exit
|
|
||||||
))
|
|
||||||
m;
|
|
||||||
None
|
|
||||||
with Find_binding_exit -> !res
|
|
||||||
|
|
||||||
let find_first f m =
|
|
||||||
match find_first_opt f m with
|
|
||||||
| None -> raise Not_found
|
|
||||||
| Some x -> x
|
|
||||||
|
|
||||||
let find_first_map f m =
|
let find_first_map f m =
|
||||||
let res = ref None in
|
let res = ref None in
|
||||||
try
|
try
|
||||||
|
|
@ -142,22 +80,10 @@ module Make (O : Map.OrderedType) = struct
|
||||||
None
|
None
|
||||||
with Find_binding_exit -> !res
|
with Find_binding_exit -> !res
|
||||||
|
|
||||||
(* linear time, must traverse the whole set… *)
|
|
||||||
let find_last_opt f m =
|
|
||||||
let res = ref None in
|
|
||||||
S.iter (fun x -> if f x then res := Some x) m;
|
|
||||||
!res
|
|
||||||
|
|
||||||
let find_last f m =
|
|
||||||
match find_last_opt f m with
|
|
||||||
| None -> raise Not_found
|
|
||||||
| Some x -> x
|
|
||||||
|
|
||||||
[@@@ocaml.warning "+32"]
|
[@@@ocaml.warning "+32"]
|
||||||
|
|
||||||
include S
|
include S
|
||||||
|
|
||||||
(* Use find_last which is linear time on OCaml < 4.05 *)
|
|
||||||
let find_last_map f m =
|
let find_last_map f m =
|
||||||
let res = ref None in
|
let res = ref None in
|
||||||
let _ =
|
let _ =
|
||||||
|
|
@ -172,13 +98,6 @@ module Make (O : Map.OrderedType) = struct
|
||||||
in
|
in
|
||||||
!res
|
!res
|
||||||
|
|
||||||
let add_seq seq set =
|
|
||||||
let set = ref set in
|
|
||||||
Seq.iter (fun x -> set := add x !set) seq;
|
|
||||||
!set
|
|
||||||
|
|
||||||
let of_seq s = add_seq s empty
|
|
||||||
|
|
||||||
let add_iter set i =
|
let add_iter set i =
|
||||||
let set = ref set in
|
let set = ref set in
|
||||||
i (fun x -> set := add x !set);
|
i (fun x -> set := add x !set);
|
||||||
|
|
|
||||||
|
|
@ -16,43 +16,11 @@ module type OrderedType = Set.OrderedType
|
||||||
module type S = sig
|
module type S = sig
|
||||||
include Set.S
|
include Set.S
|
||||||
|
|
||||||
val min_elt_opt : t -> elt option
|
|
||||||
(** Safe version of {!min_elt}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val max_elt_opt : t -> elt option
|
|
||||||
(** Safe version of {!max_elt}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val choose_opt : t -> elt option
|
|
||||||
(** Safe version of {!choose}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val find_opt : elt -> t -> elt option
|
|
||||||
(** Safe version of {!find}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val find_first : (elt -> bool) -> t -> elt
|
|
||||||
(** Find minimum element satisfying predicate.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val find_first_opt : (elt -> bool) -> t -> elt option
|
|
||||||
(** Safe version of {!find_first}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val find_first_map : (elt -> 'a option) -> t -> 'a option
|
val find_first_map : (elt -> 'a option) -> t -> 'a option
|
||||||
(** [find_first_map f s] find the minimum element [x] of [s] such that [f x = Some y]
|
(** [find_first_map f s] find the minimum element [x] of [s] such that [f x = Some y]
|
||||||
and return [Some y]. Otherwise returns [None].
|
and return [Some y]. Otherwise returns [None].
|
||||||
@since 3.12 *)
|
@since 3.12 *)
|
||||||
|
|
||||||
val find_last : (elt -> bool) -> t -> elt
|
|
||||||
(** Find maximum element satisfying predicate.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val find_last_opt : (elt -> bool) -> t -> elt option
|
|
||||||
(** Safe version of {!find_last}.
|
|
||||||
@since 1.5 *)
|
|
||||||
|
|
||||||
val find_last_map : (elt -> 'a option) -> t -> 'a option
|
val find_last_map : (elt -> 'a option) -> t -> 'a option
|
||||||
(** [find_last_map f s] find the maximum element [x] of [s] such that [f x = Some y]
|
(** [find_last_map f s] find the maximum element [x] of [s] such that [f x = Some y]
|
||||||
and return [Some y]. Otherwise returns [None].
|
and return [Some y]. Otherwise returns [None].
|
||||||
|
|
@ -62,16 +30,9 @@ module type S = sig
|
||||||
(** Build a set from the given [iter] of elements.
|
(** Build a set from the given [iter] of elements.
|
||||||
@since 2.8 *)
|
@since 2.8 *)
|
||||||
|
|
||||||
val of_seq : elt Seq.t -> t
|
|
||||||
(** Build a set from the given [seq] of elements.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val add_iter : t -> elt iter -> t
|
val add_iter : t -> elt iter -> t
|
||||||
(** @since 2.8 *)
|
(** @since 2.8 *)
|
||||||
|
|
||||||
val add_seq : elt Seq.t -> t -> t
|
|
||||||
(** @since 3.0 *)
|
|
||||||
|
|
||||||
val to_iter : t -> elt iter
|
val to_iter : t -> elt iter
|
||||||
(** [to_iter t] converts the set [t] to a [iter] of the elements.
|
(** [to_iter t] converts the set [t] to a [iter] of the elements.
|
||||||
@since 2.8 *)
|
@since 2.8 *)
|
||||||
|
|
|
||||||
|
|
@ -692,24 +692,11 @@ let of_gen g =
|
||||||
|
|
||||||
let to_iter s k = String.iter k s
|
let to_iter s k = String.iter k s
|
||||||
|
|
||||||
let rec _to_seq s i len () =
|
|
||||||
if len = 0 then
|
|
||||||
Seq.Nil
|
|
||||||
else
|
|
||||||
Seq.Cons (s.[i], _to_seq s (i + 1) (len - 1))
|
|
||||||
|
|
||||||
let to_seq s = _to_seq s 0 (String.length s)
|
|
||||||
|
|
||||||
let of_iter i =
|
let of_iter i =
|
||||||
let b = Buffer.create 32 in
|
let b = Buffer.create 32 in
|
||||||
i (Buffer.add_char b);
|
i (Buffer.add_char b);
|
||||||
Buffer.contents b
|
Buffer.contents b
|
||||||
|
|
||||||
let of_seq seq =
|
|
||||||
let b = Buffer.create 32 in
|
|
||||||
Seq.iter (Buffer.add_char b) seq;
|
|
||||||
Buffer.contents b
|
|
||||||
|
|
||||||
let to_list s = _to_list s [] 0 (String.length s)
|
let to_list s = _to_list s [] 0 (String.length s)
|
||||||
|
|
||||||
let of_list l =
|
let of_list l =
|
||||||
|
|
|
||||||
|
|
@ -49,11 +49,6 @@ val to_iter : t -> char iter
|
||||||
(** [to_iter s] returns the [iter] of characters contained in the string [s].
|
(** [to_iter s] returns the [iter] of characters contained in the string [s].
|
||||||
@since 2.8 *)
|
@since 2.8 *)
|
||||||
|
|
||||||
val to_seq : t -> char Seq.t
|
|
||||||
(** [to_seq s] returns the [Seq.t] of characters contained in the string [s].
|
|
||||||
Renamed from [to std_seq] since 3.0.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val to_list : t -> char list
|
val to_list : t -> char list
|
||||||
(** [to_list s] returns the [list] of characters contained in the string [s]. *)
|
(** [to_list s] returns the [list] of characters contained in the string [s]. *)
|
||||||
|
|
||||||
|
|
@ -98,11 +93,6 @@ val of_iter : char iter -> string
|
||||||
(** [of_iter iter] converts an [iter] of characters to a string.
|
(** [of_iter iter] converts an [iter] of characters to a string.
|
||||||
@since 2.8 *)
|
@since 2.8 *)
|
||||||
|
|
||||||
val of_seq : char Seq.t -> string
|
|
||||||
(** [of_seq seq] converts a [seq] of characters to a string.
|
|
||||||
Renamed from [of_std_seq] since 3.0.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val of_list : char list -> string
|
val of_list : char list -> string
|
||||||
(** [of_list lc] converts a list of characters [lc] to a string. *)
|
(** [of_list lc] converts a list of characters [lc] to a string. *)
|
||||||
|
|
||||||
|
|
@ -113,7 +103,7 @@ val to_array : string -> char array
|
||||||
(** [to_array s] returns the array of characters contained in the string [s]. *)
|
(** [to_array s] returns the array of characters contained in the string [s]. *)
|
||||||
|
|
||||||
val find : ?start:int -> sub:string -> string -> int
|
val find : ?start:int -> sub:string -> string -> int
|
||||||
(** [find ~start ~sub s] returns the starting index of the first occurrence of [sub] within [s] or [-1].
|
(** [find ~start ~sub s] returns the starting index of the first occurrence of [sub] within [s] or [-1].
|
||||||
@param start starting position in [s]. *)
|
@param start starting position in [s]. *)
|
||||||
|
|
||||||
val find_all : ?start:int -> sub:string -> string -> int gen
|
val find_all : ?start:int -> sub:string -> string -> int gen
|
||||||
|
|
@ -472,10 +462,6 @@ module Split : sig
|
||||||
@since 0.16 *)
|
@since 0.16 *)
|
||||||
end
|
end
|
||||||
|
|
||||||
val split_on_char : char -> string -> string list
|
|
||||||
(** [split_on_char by s] splits the string [s] along the given char [by].
|
|
||||||
@since 1.2 *)
|
|
||||||
|
|
||||||
val split : by:string -> string -> string list
|
val split : by:string -> string -> string list
|
||||||
(** [split ~by s] splits the string [s] along the given string [by].
|
(** [split ~by s] splits the string [s] along the given string [by].
|
||||||
Alias to {!Split.list_cpy}.
|
Alias to {!Split.list_cpy}.
|
||||||
|
|
|
||||||
|
|
@ -49,11 +49,6 @@ val to_iter : t -> char iter
|
||||||
(** [to_iter s] returns the [iter] of characters contained in the string [s].
|
(** [to_iter s] returns the [iter] of characters contained in the string [s].
|
||||||
@since 2.8 *)
|
@since 2.8 *)
|
||||||
|
|
||||||
val to_seq : t -> char Seq.t
|
|
||||||
(** [to_seq s] returns the [Seq.t] of characters contained in the string [s].
|
|
||||||
Renamed from [to std_seq] since 3.0.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val to_list : t -> char list
|
val to_list : t -> char list
|
||||||
(** [to_list s] returns the [list] of characters contained in the string [s]. *)
|
(** [to_list s] returns the [list] of characters contained in the string [s]. *)
|
||||||
|
|
||||||
|
|
@ -103,11 +98,6 @@ val of_iter : char iter -> string
|
||||||
(** [of_iter iter] converts an [iter] of characters to a string.
|
(** [of_iter iter] converts an [iter] of characters to a string.
|
||||||
@since 2.8 *)
|
@since 2.8 *)
|
||||||
|
|
||||||
val of_seq : char Seq.t -> string
|
|
||||||
(** [of_seq seq] converts a [seq] of characters to a string.
|
|
||||||
Renamed from [of_std_seq] since 3.0.
|
|
||||||
@since 3.0 *)
|
|
||||||
|
|
||||||
val of_list : char list -> string
|
val of_list : char list -> string
|
||||||
(** [of_list lc] converts a list of characters [lc] to a string. *)
|
(** [of_list lc] converts a list of characters [lc] to a string. *)
|
||||||
|
|
||||||
|
|
@ -118,7 +108,7 @@ val to_array : string -> char array
|
||||||
(** [to_array s] returns the array of characters contained in the string [s]. *)
|
(** [to_array s] returns the array of characters contained in the string [s]. *)
|
||||||
|
|
||||||
val find : ?start:int -> sub:(string[@keep_label]) -> string -> int
|
val find : ?start:int -> sub:(string[@keep_label]) -> string -> int
|
||||||
(** [find ?start ~sub s] returns the starting index of the first occurrence of [sub] within [s] or [-1].
|
(** [find ?start ~sub s] returns the starting index of the first occurrence of [sub] within [s] or [-1].
|
||||||
@param start starting position in [s]. *)
|
@param start starting position in [s]. *)
|
||||||
|
|
||||||
val find_all : ?start:int -> sub:(string[@keep_label]) -> string -> int gen
|
val find_all : ?start:int -> sub:(string[@keep_label]) -> string -> int gen
|
||||||
|
|
@ -512,10 +502,6 @@ module Split : sig
|
||||||
@since 0.16 *)
|
@since 0.16 *)
|
||||||
end
|
end
|
||||||
|
|
||||||
val split_on_char : by:char -> string -> string list
|
|
||||||
(** [split_on_char ~by s] splits the string [s] along the given char [by].
|
|
||||||
@since 1.2 *)
|
|
||||||
|
|
||||||
val split : by:(string[@keep_label]) -> string -> string list
|
val split : by:(string[@keep_label]) -> string -> string list
|
||||||
(** [split ~by s] splits the string [s] along the given string [by].
|
(** [split ~by s] splits the string [s] along the given string [by].
|
||||||
Alias to {!Split.list_cpy}.
|
Alias to {!Split.list_cpy}.
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@ open CCFloat
|
||||||
module T = (val Containers_testlib.make ~__FILE__ ())
|
module T = (val Containers_testlib.make ~__FILE__ ())
|
||||||
include T;;
|
include T;;
|
||||||
|
|
||||||
t @@ fun () -> max nan 1. = 1.;;
|
t @@ fun () -> is_nan (max nan 1.);;
|
||||||
t @@ fun () -> min nan 1. = 1.;;
|
t @@ fun () -> is_nan (min nan 1.);;
|
||||||
t @@ fun () -> max 1. nan = 1.;;
|
t @@ fun () -> is_nan (max 1. nan);;
|
||||||
t @@ fun () -> min 1. nan = 1.;;
|
t @@ fun () -> is_nan (min 1. nan);;
|
||||||
|
|
||||||
q
|
q
|
||||||
Q.(pair float float)
|
Q.(pair float float)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue