(* * 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. *) module Poly = struct external ( = ) : 'a -> 'a -> bool = "%equal" external ( <> ) : 'a -> 'a -> bool = "%notequal" external ( < ) : 'a -> 'a -> bool = "%lessthan" external ( > ) : 'a -> 'a -> bool = "%greaterthan" external ( <= ) : 'a -> 'a -> bool = "%lessequal" external ( >= ) : 'a -> 'a -> bool = "%greaterequal" external compare : 'a -> 'a -> int = "%compare" external equal : 'a -> 'a -> bool = "%equal" let min x y = if x <= y then x else y let max x y = if x >= y then x else y end external ( = ) : int -> int -> bool = "%equal" external ( <> ) : int -> int -> bool = "%notequal" external ( < ) : int -> int -> bool = "%lessthan" external ( > ) : int -> int -> bool = "%greaterthan" external ( <= ) : int -> int -> bool = "%lessequal" external ( >= ) : int -> int -> bool = "%greaterequal" let compare (a : int) b = let int_of_bool (b : bool) = (Obj.magic b : int) in int_of_bool (a > b) - int_of_bool (a < b) external equal : int -> int -> bool = "%equal" let min x y = if x <= y then x else y let max x y = if x >= y then x else y (** Tuple operations *) let fst3 (x, _, _) = x let snd3 (_, y, _) = y let trd3 (_, _, z) = z (** Function combinators *) let ( >> ) f g x = g (f x) let ( << ) f g x = f (g x) let ( $ ) f g x = f x ; g x let ( $> ) x f = f x ; x let ( <$ ) f x = f x ; x (** Pretty-printer for argument type. *) type 'a pp = Format.formatter -> 'a -> unit (** Format strings. *) type ('a, 'b) fmt = ('a, 'b) Trace.fmt module Hash = Ppx_hash_lib.Std.Hash module Sexp = Sexplib.Sexp module type Applicative_syntax = sig type 'a t val ( let+ ) : 'a t -> ('a -> 'b) -> 'b t val ( and+ ) : 'a t -> 'b t -> ('a * 'b) t end module type Monad_syntax = sig include Applicative_syntax val ( let* ) : 'a t -> ('a -> 'b t) -> 'b t val ( and* ) : 'a t -> 'b t -> ('a * 'b) t end module type OrderedType = sig type t val compare : t -> t -> int val sexp_of_t : t -> Sexp.t end exception Duplicate module Return = struct type 'r t = {return: 'a. 'r -> 'a} [@@unboxed] end let with_return (type a) f = let module M = struct exception Return of a end in let return a = raise_notrace (M.Return a) in try f {Return.return} with M.Return a -> a