|
|
|
(*
|
|
|
|
* 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.
|
|
|
|
*)
|
|
|
|
|
|
|
|
(** Global namespace opened in each source file by the build system *)
|
|
|
|
|
|
|
|
include Stdio
|
|
|
|
module Command = Core.Command
|
|
|
|
include Import0
|
|
|
|
|
|
|
|
(** 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
|
|
|
|
|
|
|
|
(** Failures *)
|
|
|
|
|
|
|
|
let fail = Trace.fail
|
|
|
|
|
|
|
|
exception Unimplemented of string
|
|
|
|
|
|
|
|
let todo fmt = Trace.raisef (fun msg -> Unimplemented msg) fmt
|
|
|
|
|
|
|
|
let warn fmt =
|
|
|
|
let fs = Format.std_formatter in
|
|
|
|
Format.pp_open_box fs 2 ;
|
|
|
|
Format.pp_print_string fs "Warning: " ;
|
|
|
|
Format.kfprintf
|
|
|
|
(fun fs () ->
|
|
|
|
Format.pp_close_box fs () ;
|
|
|
|
Format.pp_force_newline fs () )
|
|
|
|
fs fmt
|
|
|
|
|
|
|
|
(** Assertions *)
|
|
|
|
|
|
|
|
let assertf cnd fmt =
|
|
|
|
if not cnd then fail fmt
|
|
|
|
else Format.ikfprintf (fun _ () -> ()) Format.str_formatter fmt
|
|
|
|
|
|
|
|
let checkf cnd fmt =
|
|
|
|
if not cnd then fail fmt
|
|
|
|
else Format.ikfprintf (fun _ () -> true) Format.str_formatter fmt
|
|
|
|
|
|
|
|
let check f x =
|
|
|
|
assert (f x ; true) ;
|
|
|
|
x
|
|
|
|
|
|
|
|
let violates f x =
|
|
|
|
assert (f x ; true) ;
|
|
|
|
assert false
|
|
|
|
|
|
|
|
type 'a or_error = ('a, exn * Caml.Printexc.raw_backtrace) result
|
|
|
|
|
|
|
|
let or_error f x () =
|
|
|
|
try Ok (f x) with exn -> Error (exn, Caml.Printexc.get_raw_backtrace ())
|
|
|
|
|
|
|
|
(** Extensions *)
|
|
|
|
|
|
|
|
module Invariant = struct
|
|
|
|
include Base.Invariant
|
|
|
|
|
|
|
|
let invariant here t sexp_of_t f =
|
|
|
|
assert (
|
|
|
|
( try f ()
|
|
|
|
with exn ->
|
|
|
|
let bt = Caml.Printexc.get_raw_backtrace () in
|
|
|
|
let exn =
|
|
|
|
Base.Error.to_exn
|
|
|
|
(Base.Error.create_s
|
|
|
|
(Base.Sexp.message "invariant failed"
|
|
|
|
[ ("", Sexplib.Conv.sexp_of_exn exn)
|
|
|
|
; ("", Base.Source_code_position.sexp_of_t here)
|
|
|
|
; ("", sexp_of_t t) ]))
|
|
|
|
in
|
|
|
|
Caml.Printexc.raise_with_backtrace exn bt ) ;
|
|
|
|
true )
|
|
|
|
end
|
|
|
|
|
|
|
|
module Unit = Base.Unit
|
|
|
|
|
|
|
|
type unit = Unit.t [@@deriving compare, equal, hash, sexp]
|
|
|
|
|
|
|
|
module Bool = Base.Bool
|
|
|
|
|
|
|
|
type bool = Bool.t [@@deriving compare, equal, hash, sexp]
|
|
|
|
|
|
|
|
module Char = Base.Char
|
|
|
|
|
|
|
|
type char = Char.t [@@deriving compare, equal, hash, sexp]
|
|
|
|
|
|
|
|
module Int = Base.Int
|
|
|
|
|
|
|
|
type int = Int.t [@@deriving compare, equal, hash, sexp]
|
|
|
|
|
|
|
|
module Int64 = Base.Int64
|
|
|
|
|
|
|
|
type int64 = Int64.t [@@deriving compare, equal, hash, sexp]
|
|
|
|
|
|
|
|
module Z = struct
|
|
|
|
let pp = Z.pp_print
|
|
|
|
let hash = [%hash: Z.t]
|
|
|
|
let hash_fold_t s z = Hash.fold_int s (hash z)
|
|
|
|
let sexp_of_t z = Sexp.Atom (Z.to_string z)
|
|
|
|
|
|
|
|
let t_of_sexp = function
|
|
|
|
| Sexp.Atom s -> Z.of_string s
|
|
|
|
| _ -> assert false
|
|
|
|
|
|
|
|
(* the signed 1-bit integers are -1 and 0 *)
|
|
|
|
let true_ = Z.minus_one
|
|
|
|
let false_ = Z.zero
|
|
|
|
let of_bool = function true -> true_ | false -> false_
|
|
|
|
let is_true = Z.equal true_
|
|
|
|
let is_false = Z.equal false_
|
|
|
|
|
|
|
|
include Z
|
|
|
|
end
|
|
|
|
|
|
|
|
module Q = struct
|
|
|
|
let pp = Q.pp_print
|
|
|
|
let hash = Hashtbl.hash
|
|
|
|
let hash_fold_t s q = Hash.fold_int s (hash q)
|
|
|
|
let sexp_of_t q = Sexp.Atom (Q.to_string q)
|
|
|
|
|
|
|
|
let t_of_sexp = function
|
|
|
|
| Sexp.Atom s -> Q.of_string s
|
|
|
|
| _ -> assert false
|
|
|
|
|
|
|
|
let of_z = Q.of_bigint
|
|
|
|
|
|
|
|
include Q
|
|
|
|
end
|
|
|
|
|
|
|
|
module String = struct
|
|
|
|
module T = struct
|
|
|
|
include Base.String
|
|
|
|
|
|
|
|
let hash_fold_t = Hash.fold_string
|
|
|
|
let hash = Hash.of_fold hash_fold_t
|
|
|
|
let t_of_sexp = Sexplib.Conv.string_of_sexp
|
|
|
|
let sexp_of_t = Sexplib.Conv.sexp_of_string
|
|
|
|
end
|
|
|
|
|
|
|
|
include T
|
|
|
|
module Map = Map.Make (T)
|
|
|
|
end
|
|
|
|
|
|
|
|
type string = String.t [@@deriving compare, equal, hash, sexp]
|
|
|
|
|
|
|
|
module Option = Option
|
|
|
|
|
|
|
|
type 'a option = 'a Option.t [@@deriving compare, equal, hash, sexp]
|
|
|
|
|
|
|
|
include Option.Monad_infix
|
|
|
|
include Option.Monad_syntax
|
|
|
|
module Result = Base.Result
|
|
|
|
|
|
|
|
module Array = struct
|
|
|
|
include Base.Array
|
|
|
|
|
|
|
|
let pp sep pp_elt fs a = List.pp sep pp_elt fs (to_list a)
|
|
|
|
end
|
|
|
|
|
|
|
|
module Vector = Vector
|
|
|
|
include Vector.Infix
|
|
|
|
module List = List
|
|
|
|
|
|
|
|
type 'a list = 'a List.t [@@deriving compare, equal, hash, sexp]
|
|
|
|
|
|
|
|
module Hash_queue = Core_kernel.Hash_queue
|
|
|
|
module Set = Set
|
|
|
|
module Hash_set = Base.Hash_set
|
|
|
|
module Map = Map
|
|
|
|
module Qset = Qset
|
|
|
|
module Hashtbl = Base.Hashtbl
|