ocaml-containers/src/core/CCInt.mli
2020-01-18 15:57:55 +01:00

154 lines
3.6 KiB
OCaml

(* This file is free software, part of containers. See file "license" for more details. *)
(** {1 Basic Int functions} *)
type t = int
val compare : t -> t -> int
(** The comparison function for integers with the same specification as {!Pervasives.compare}. *)
val equal : t -> t -> bool
(** Equality function for integers. *)
val hash : t -> int
val sign : t -> int
(** [sign i] is one of [-1, 0, 1]. *)
val neg : t -> t
(** Unary negation. [neg i = - i].
@since 0.5 *)
val pow : t -> t -> t
(** [pow base exponent] returns [base] raised to the power of [exponent].
[pow a b = a^b] for positive integers [a] and [b].
Raises [Invalid_argument] if [a = b = 0] or [b] < 0.
@since 0.11 *)
val floor_div : t -> t -> t
(** [floor_div a n] is integer division rounding towards negative infinity.
It satisfies [a = m * floor_div a n + rem a n].
@since 1.2 *)
val rem : t -> t -> t
(** [rem a n] is the remainder of dividing [a] by [n], with the same
sign as [n].
@since 1.2 *)
type 'a printer = Format.formatter -> 'a -> unit
type 'a random_gen = Random.State.t -> 'a
type 'a sequence = ('a -> unit) -> unit
val random : int -> t random_gen
val random_small : t random_gen
val random_range : int -> int -> t random_gen
val pp : t printer
val to_string : t -> string
(** Return the string representation of its argument, in signed decimal.
@since 0.13 *)
val of_string : string -> t option
(** @since 0.13 *)
val of_string_exn : string -> t
(** Alias to {!int_of_string}.
@raise Failure in case of failure.
@since NEXT_RELEASE *)
val pp_binary : t printer
(** Print as "0b00101010".
@since 0.20 *)
val to_string_binary : t -> string
(** @since 0.20 *)
val min : t -> t -> t
(** The minimum of two integers.
@since 0.17 *)
val max : t -> t -> t
(** The maximum of two integers.
@since 0.17 *)
val range_by : step:t -> t -> t -> t sequence
(** [range_by ~step i j] iterates on integers from [i] to [j] included,
where the difference between successive elements is [step].
Use a negative [step] for a decreasing list.
@raise Invalid_argument if [step=0].
@since 1.2 *)
val range : t -> t -> t sequence
(** [range i j] iterates on integers from [i] to [j] included . It works
both for decreasing and increasing ranges.
@since 1.2 *)
val range' : t -> t -> t sequence
(** Like {!range} but the second bound is excluded.
For instance [range' 0 5 = Iter.of_list [0;1;2;3;4]].
@since 1.2 *)
(** {2 Infix Operators}
@since 0.17 *)
module Infix : sig
val (=) : t -> t -> bool
(** @since 0.17 *)
val (<>) : t -> t -> bool
(** @since 0.17 *)
val (<) : t -> t -> bool
(** @since 0.17 *)
val (>) : t -> t -> bool
(** @since 0.17 *)
val (<=) : t -> t -> bool
(** @since 0.17 *)
val (>=) : t -> t -> bool
(** @since 0.17 *)
val (--) : t -> t -> t sequence
(** Alias to {!range}.
@since 1.2 *)
val (--^) : t -> t -> t sequence
(** Alias to {!range'}.
@since 1.2 *)
val (+) : t -> t -> t (** @since 2.1 *)
val (-) : t -> t -> t (** @since 2.1 *)
val (~-) : t -> t (** @since 2.1 *)
val ( * ) : t -> t -> t (** @since 2.1 *)
val (/) : t -> t -> t (** @since 2.1 *)
val ( ** ) : t -> t -> t (** @since 2.4 *)
val (mod) : t -> t -> t (** @since 2.1 *)
val (land) : t -> t -> t (** @since 2.1 *)
val (lor) : t -> t -> t (** @since 2.1 *)
val (lxor) : t -> t -> t (** @since 2.1 *)
val lnot : t -> t (** @since 2.1 *)
val (lsl) : t -> int -> t (** @since 2.1 *)
val (lsr) : t -> int -> t (** @since 2.1 *)
val (asr) : t -> int -> t (** @since 2.1 *)
end
include module type of Infix