I am pleased to announce the 111.25.00 release of the Core suite. With this release all packages are now compatible with OCaml 4.02. The following packages were upgraded: - async_extra - async_kernel - async - async_parallel - async_unix - core_extended - core_kernel - core - custom_printf - jenga - ocaml_plugin - patdiff - patience_diff - sexplib - textutils Files and documentation for this release are available on our website and all packages are in opam: https://ocaml.janestreet.com/ocaml-core/111.25.00/individual/ https://ocaml.janestreet.com/ocaml-core/111.25.00/doc/ Here is list of changes for this version: ## 111.25.00 ### async - add a dns example ### async_extra - Removed `lazy` from the core of `Log`. - Made `Log.Message.t` have a stable `bin_io`. The `Stable.V1` is the current serialization scheme, and `Stable.V0` is the serialization scheme in 111.18.00 and before, which is needed to talk to older systems. - Changed `Rpc` to return `Connection_closed` if a connection ends before a response makes it to the caller. Previously, the dispatch output was never determined. Also, removed an unused field in one of the internal data structures of Async RPC. - In `Versioned_rpc`, added `version:int` argument to `implement_multi` functions. - In `Versioned_rpc`, the `Pipe_rpc.Make` functors now return an additional output functor. `Register'` is like `Register` but has in its input module: ```ocaml val response_of_model : Model.response Queue.t -> response Queue.t Deferred.t ``` rather than ```ocaml val response_of_model : Model.response -> response ``` This is analogous to `Pipe.map'` and `Pipe.map`. - Added to `Log` a `V2` stable format and better readers for time-varying formats. - In `Log`, added an optional `?time:Time.t` argument to allow callers to pass in the logged time of an event rather than relying on `Time.now ()`. ### async_kernel - Fixed `Clock.run_at_intervals` to make the initial callback at an interval multiple. Previously, if `start` was in the past, `f` would run immediately rather than waiting for an interval of the form `start + i * span`. Now it always waits for an interval, even the first time it runs. ### async_parallel - improve error handling ### async_unix - Added `Unix.Addr_info` and `Name_info`, which wrap `getaddrinfo` and `getnameinfo`. - Improved the scheduler's error message when the thread pool is stuck. ### core - Added `Gc.disable_compaction` function. - Added `Time.to_string_abs_trimmed`, which prints a trimmed time and takes a `zone` argument. - Fixed `unix_stubs.c` to suppress a warning when building with some versions of gcc. - Changed `Time.Zone` to allow the zoneinfo location to be specified by an environment variable. Closes #40 - Fix compatibility with 4.02 ### core_extended - Moved `Quickcheck` from `core`. - Added [Int.gcd]. ### core_kernel - Fix build on FreeBSD Closes #10 - Added functions to `Container` interface: `sum`, `min_elt`, `max_elt`. ```ocaml (** Returns the sum of [f i] for i in the container *) val sum : (module Commutative_group.S with type t = 'sum) -> t -> f:(elt -> 'sum) -> 'sum (** Returns a min (resp max) element from the collection using the provided [cmp] function. In case of a tie, the first element encountered while traversing the collection is returned. The implementation uses [fold] so it has the same complexity as [fold]. Returns [None] iff the collection is empty. *) val min_elt : t -> cmp:(elt -> elt -> int) -> elt option val max_elt : t -> cmp:(elt -> elt -> int) -> elt option ``` - Made `Core_hashtbl_intf` more flexible. For instance supports modules that require typereps to be passed when creating a table. Address the following issues: The type `('a, 'b, 'z) create_options` needs to be consistently used so that `b` corresponds with the type of data values in the returned hash table. The type argument was wrong in several cases. Added the type `('a, 'z) map_options` to `Accessors` so that map-like functions -- those that output hash tables of a different type than they input -- can allow additional arguments. - Fixed a bug in `Dequeue`'s `bin_prot` implementation that caused it to raise when deserializing an empty dequeue. - Made `Container.Make`'s interface match `Monad.Make`. - Deprecated infix `or` in favor of `||`. - Simplified the interface of `Arg` (which was already deprecated in favor of `Command`). - Replaced `Bag.fold_elt` with `Bag.filter`. - `Memo.general` now raises on non-positive `cache_size_bound`. - Removed `Option.apply`. - Removed `Result.call`, `Result.apply`. - Moved `Quichcheck` to `core_extended`. It should not be used in new code. ### custom_printf - Fix 4.02 compatibility. ### jenga - Switched to un-version-numbered API. - Renamed `Tenacious_sample_lib.Tenacious` to `Tenacious_sample_lib.Tenacious_sample` to avoid conflicts in the public release. - Write `buildable_targets.list` (on alias `.info`). ### ocaml_plugin - ignore more warnings by default ### patdiff - add a `?file_names` argument to `Compare_core.diff_strings` ### patience_diff - refactoring and more unit tests ### sexplib - Fix compatibility with OCaml 4.02 -- Jeremie Dimino, for the Core team