(*
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *)

open! NS0
include module type of Containers.Int
include module type of Stdlib.Int

type t = int [@@deriving compare, equal, hash, sexp]

val of_string : string -> int option
val of_string_exn : string -> int
val sign : int -> Sign.t
val incr : int ref -> unit
val decr : int ref -> unit

module Infix : sig
  val ( -- ) : t -> t -> t iter
  val ( --^ ) : t -> t -> t iter

  include module type of NS0.Int_compare

  external ( + ) : t -> t -> t = "%addint"
  external ( - ) : t -> t -> t = "%subint"
  external ( ~- ) : t -> t = "%negint"
  external ( * ) : t -> t -> t = "%mulint"
  external ( / ) : t -> t -> t = "%divint"
  val ( ** ) : t -> t -> t
  external ( mod ) : t -> t -> t = "%modint"
  external ( land ) : t -> t -> t = "%andint"
  external ( lor ) : t -> t -> t = "%orint"
  external ( lxor ) : t -> t -> t = "%xorint"
  val lnot : t -> t
  external ( lsl ) : t -> t -> t = "%lslint"
  external ( lsr ) : t -> t -> t = "%lsrint"
  external ( asr ) : t -> t -> t = "%asrint"
end

include module type of Infix
module Set : Set.S with type elt = int
module Map : Map.S with type key = int