123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104(** Verbose level and loggers management. *)openTimedopenLplibopenBaseopenExtra(** [out_fmt] main output formatter. *)letout_fmt=Stdlib.refFormat.std_formatter(** Current verbosity level. *)letverbose=ref1(** Default verbosity level (may be set with command line arguments). *)letdefault_verbose=Stdlib.ref1(** [set_default_verbose i] sets the default verbosity level to [i]. *)letset_default_verbose:int->unit=funi->Stdlib.(default_verbose:=i);verbose:=i(** [out lvl fmt] prints an output message using the format [fmt], but only if
[lvl] is strictly greater than the current verbosity level. Note that the
output channel is automatically flushed if logging modes are enabled. *)letout:int->'aoutfmt->'a=funlvlfmt->letout=Format.(iflvl>!verbosethenifprintfelsefprintf)inoutStdlib.(!out_fmt)(fmt^^"@.")(** List of registered boolean flags, with their default values. *)letboolean_flags:(bool*boolref)StrMap.tStdlib.ref=Stdlib.refStrMap.empty(** [register_flag id d] registers a new boolean flag named [id], with default
value of [d]. Note the name should not have been used previously. *)letregister_flag:string->bool->boolref=funiddefault->ifStrMap.memidStdlib.(!boolean_flags)theninvalid_arg"Console.register_flag: already registered";letr=refdefaultinStdlib.(boolean_flags:=StrMap.addid(default,r)!boolean_flags);r(** [set_flag id b] sets the value of the flag named [id] to be [b], or raises
[Not_found] if no flag with this name was registered. *)letset_flag:string->bool->unit=funidb->snd(StrMap.findidStdlib.(!boolean_flags)):=b(** [reset_default ()] resets the verbosity level and the state of the loggers
to their default value (configurable by the user with command line flags).
The boolean flags are also reset to their default values. *)letreset_default:unit->unit=fun()->(* Reset verbosity level. *)verbose:=Stdlib.(!default_verbose);(* Reset debugging flags. *)Logger.reset_loggers();(* Reset flags to their default values. *)letreset_(default,r)=r:=defaultinStrMap.iterresetStdlib.(!boolean_flags)(** Module to manipulate imperative state of the typechecker. *)moduleState=struct(** Settings used to compile files. *)typet={verbose:int(** Verbosity level. *);loggers:string(** Loggers enabled. *);bflags:boolStrMap.t(** Boolean flags. *)}(** Stack of saved state for verbosity, loggers and boolean flags. *)letsaved:tlistref=ref[](* NOTE: could be hidden in the signature declaration. *)(** [push ()] saves the current state of [verbose], the loggers, and the
boolean flags, pushing it to the stack. *)letpush:unit->unit=fun()->letverbose=!verboseinletloggers=Logger.get_activated_loggers()inletbflags:boolStrMap.t=letfn(_,r)=!rinStrMap.mapfnStdlib.(!boolean_flags)insaved:={verbose;loggers;bflags}::!saved(** [apply st] restores the setting in [st]. *)letapply:t->unit=fun{verbose=v;loggers=l;bflags=f}->(* Reset verbosity level. *)verbose:=v;(* Reset debugging flags. *)Logger.reset_loggers~default:l();(* Reset boolean flags. *)letresetk(_,r)=tryr:=StrMap.findkfwithNot_found->()inStrMap.iterresetStdlib.(!boolean_flags)(** [pop ()] restores the settings saved by [push_state], removing it
from [saved_state]. *)letpop:unit->unit=fun()->lete=match!savedwith|[]->failwith"[Console.pop_state] not well-bracketed."|e::s->saved:=s;einapplyeend