[ANN] v0.13 release of Jane Street packages

Dear OCaml developers,

We are pleased to announce the v0.13 release of Jane Street packages!

This release comes with 14 new packages, and a number of fixes and
enhancements. The documentation for this release is available on our
website:

https://ocaml.janestreet.com/ocaml-core/v0.13/doc/

The remainder of this mail highlights the main changes since the v0.12
release; we hope it will be useful to developers in the process of
migrating to the new version. A comprehensive changelog is available
at the end.

Notable changes

  • Changed Base, Core_kernel, and Core functions to raise
    Not_found_s instead of Not_found. Hashtbl.find_exn and
    Map.find_exn now include the key in their error message.

  • Changed Core and Core_kernel to export int comparison rather
    than polymorphic comparison.

  • Removed the “robust” float comparison operators (>., =., …)
    from the default namespace.

  • Replaced sexp_* types (sexp_list, sexp_option, sexp_opaque,
    …) with preprocessor attributes ([@sexp.list], [@sexp.option],
    [@sexp.opaque], …).

  • Changed let%map syntax from let%map.Foo.Let_syntax to
    let%map.Foo.

  • Added to match%optional support for specifying a path, so you can
    write match%optional.Foo foo_option rather than let open Foo.Optional_syntax in match%optional foo_option.

  • Improved Base.Backtrace so that it enables recording of backtraces
    in more situations, specifically when OCAMLRUNPARAM is defined but
    doesn’t mention the backtrace flag, b.

  • Added javascript support for Zarith, Bigint, Bignum, and
    Bigdecimal.

  • Changed Hashtbl.create's default size from 128 to 0.

  • Changed Core_kernel.Command so that all commands accept double
    dash flags: --help, --version, and --build-info.

New packages

Deprecations / Removals

Async_kernel:

  • Deprecated monadic ignore functions in favor of ignore_m.

Base:

  • Deleted Array.replace and replace_all functions, which have been
    deprecated since before the last public release.

  • Deprecated Result.ok_unit; use Ok ().

  • Removed the Monad and Applicative interfaces’ all_ignore
    function; it was previously deprecated and replaced by all_unit.

  • Removed List.dedup, which has been deprecated since 2017-04.

  • Removed String mutation functions, which have been deprecated in
    favor of Bytes since 2017-10.

  • Deprecated Array.truncate, Obj_array.unsafe_truncate, and
    Uniform_array.unsafe_truncate.

  • Deprecated Sys.argv, which has been superseded by get_argv,
    which is a function, reflecting the fact that argv can change (as
    of OCaml 4.09).

Core_kernel:

  • Removed Core_kernel.Std, which had been deprecated for a year.

  • Deprecated type Command.Spec.param in favor of Command.Param.t.

  • Removed Hashtbl functions that had been deprecated for years.

  • Removed Float.to_string_round_trippable, which has been deprecated
    in favor of to_string since 2017-04.

  • Deprecated Fqueue functions where one should use Fdeque instead:
    bot, bot_exn, and enqueue_top.

  • Deleted Bus.unsubscribes, which will be obviated by a performance
    improvement to Bus.unsubscribe.

Timing_wheel:

  • Removed the alarm_upper_bound function, which has been deprecated
    for 6 months, and superseded by max_allowed_alarm_time.

Moves

Core_kernel:

  • Moved Bounded_int_table to a standalone library.

  • Moved the Pool and Tuple_type modules to a standalone library,
    Tuple_pool.

Async_unix:

  • Moved Unix.Fd.replace into a Private submodule.

Changelog

Async:

  • Added module Expect_test_config_with_unit_expect, an alternative
    to Expect_test_config in which [%expect] has type unit rather
    than unit Deferred.t.

Async_kernel:

  • Exposed type Async_kernel_config.t.

  • Added a public-facing interface to the Async_kernel_scheduler
    module, taking the subset of Async_unix.Scheduler that makes sense
    in Async_kernel.

  • Added to Time_source and Synchronous_time_source and Id
    submodule, so that you can put them in a hash table or map.

  • Added Deferred.Or_error.tag_s function.

  • Added to Require_explicit_timesource deprecations of Date.Today
    and Time.now.

  • Added Synchronous_time_source.length function.

  • Added Synchronous_time_source functions reschedule_at and
    reschedule_after.

  • Optimized Bvar so that its internal identity coercions can be
    inlined.

  • Added Time_source.advance_by_alarms_by function, like
    advance_by_alarms but takes Time_ns.Span.t.

  • Deprecated monadic ignore functions in favor of ignore_m.

  • Renamed Time_source.advance functions as advance_directly.

  • Added to Synchronous_time_source an advance_directly function.

  • Added Throttle.enqueue_exclusive function, which enqueues a job
    that occupies all slots of the throttle.

  • Optimized Pipe.of_list so that it creates one queue rather than
    two.

  • Added to Pipe.t a field, info : Sexp.t, intended to make debug
    messages more useful.

  • Added Pipe.empty function, equivalent to Pipe.of_list [].

Async_rpc_kernel:

  • Improved the error message when a message cannot be sent because it
    is too big, cutting out a lot of noise.

  • Added an expert function that constructs an Rpc.Implementation.t
    directly given just the rpc_tag and version.

  • Added Async_rpc_kernel_stable module.

  • Added type Implementations.on_unknown_rpc.

  • Added State_rpc.client_pushes_back function, like the same
    function in Pipe_rpc.

Async_unix:

  • Changed In_thread.run to not initialize the scheduler.

  • Optimized Unix.mkdir ~p:() to use Core.Unix.mkdir_p rather than
    its own loop, avoiding many calls to In_thread.syscall_exn.

  • Added to Log.Output creation functions an optional argument:
    ?perm:Unix.file_perm.

  • Added function Shutdown.is_shutting_down : unit -> bool.

  • Added to Process.run* functions an optional argument: ?argv0 : string, like Process.create.

  • Added to Unix types socket_domain and socket_type:
    [@@deriving compare, hash].

  • Changed the Async scheduler to clear its epoll set’s ready file
    descriptors after it processes them, so that the already-processed
    file descriptors do not misleadingly appear in the scheduler’s sexp.

  • Added to Require_explicit_timesource deprecations of
    Time.Ofday.now and Time_ns.Ofday.now.

  • Made In_thread.run's default ?when_finished configurable via a
    ref, so that an application can change the default globally.

  • Moved Unix.Fd.replace into a Private submodule.

  • Improved Socket.sexp_of_t.

  • In Tcp's socket-creation function, removed a call to
    Unix.set_close_on_exec, which is unnecessary because
    Socket.create already does it.

  • Fixed a bug in Reader.transfer where if the reader has no data to
    read and the output Pipe.Writer.t is closed, the returned deferred
    would not be determined.

  • Added support to Writer for using a custom Time_source.t instead
    of the wall clock.

  • Reworked Writer's buffer-age check.

  • Fixed a stack overflow in Writer sexp conversion.

  • Added to Process.run and related functions a ?prog_search_path
    argument.

  • Treat .mlt files as tests, in particular so that Writer uses
    synchronous output.

Base:

  • Added Or_error.tag_s function.

  • Updated Base for OCaml 4.08.

  • Changed Base functions to raise Not_found_s instead of
    Not_found. Hashtbl.find_exn and Map.find_exn now
    include the key in their error message.

  • Optimized Map.update.

  • Deleted Array.replace and replace_all functions, which have been
    deprecated since before the last public release.

  • Deprecated Result.ok_unit; use Ok ().

  • Added Map.fold_symmetric_diff function, which is more efficient
    than symmetric_diff, due to avoiding Sequence.

  • Removed the Monad and Applicative interfaces’ all_ignore
    function; it was previously deprecated and replaced by all_unit.

  • Removed List.dedup, which has been deprecated since 2017-04.

  • Added function Map.iteri_until.

  • Removed String mutation functions, which have been deprecated in
    favor of Bytes since 2017-10.

  • Updated Int63.t to use [@@immediate64] attribute.

  • Changed Hashtbl.create's default size from 128 to 0.

  • Added List functions drop_last and drop_last_exn.

  • Added Sequence.equal function.

  • Made Base build with OCaml 4.06.

  • Improved support for Applicative.S2, adding signatures
    (Applicative_infix2, Let_syntax2) and functors
    (Make_let_syntax2, Of_monad2).

  • Added Hash_set.union function.

  • Added Hashtbl functions choose and choose_exn, analogous to
    Set functions of the same name.

  • Added Map.M and Set.M support for [@@deriving equal].

  • Added functions Map.binary_search and Set.binary_search.

  • Deprecated Array.truncate, Obj_array.unsafe_truncate, and
    Uniform_array.unsafe_truncate.

  • Made Field.t_with_perm be [@@unboxed].

  • Added Sys.getenv and getenv_exn.

  • Added Comparable.reverse function, which reverses the ordering of
    a comparison function.

  • Changed Random.State.default to be lazily initialized,
    nondeterministically, when not in test.

  • Deprecated Sys.argv, which has been superseded by get_argv,
    which is a function, reflecting the fact that argv can change (as
    of OCaml 4.09).

  • Added Random functions char and ascii.

  • Added to Comparable.S functions: equal, min, max.

  • Added to Map functions for creating maps from sequences.

  • Fixed Float.box so that it works with flambda.

  • Fixed Map.t_of_sexp and Hashtbl.t_of_sexp so that on failure
    they raise Of_sexp_error, so that sexp loading functions report
    error locations.

  • Added Applicative.S3 interface.

  • Improved Backtrace so that it enables recording of backtraces in
    more situations, specifically when OCAMLRUNPARAM is defined but
    doesn’t mention the backtrace flag, b.

  • In Type_equal.Id.to_sexp, eliminated an unnecessary allocation
    when it is partially applied.

  • Added Option_array function unsafe_get_some_assuming_some, which
    is similar to unsafe_get_some_exn, except that it is faster and
    more unsafe because it avoids testing that its argument is Some.

  • Added to Sequence functions converting to and from Caml.Seq.t.

  • Removed from Sequence a vestigial performance hack intended to
    improve partial application.

  • Made List match Invariant.S1.

  • Changed Hashtbl.equal's argument order to match the standard
    order, taking the data equality function first.

  • Made many modules match Invariant.S: Bool, Char, Int, …

Base_bigstring:

  • Renamed safe, checking binary setters (e.g. set_int8), adding an
    _exn suffix to indicate that they may raise.

  • Fixed a bug in range-checking ~pos and ~len, which could
    overflow when they are large.

  • Added Bigstring.copy function.

  • Marked Bigstring.unsafe_blit as [@@noalloc].

Bignum:

  • Made Bignum match Equal.S.

  • Added javascript support for Zarith, Bigint, Bignum,
    Bigdecimal, and Big_dollars.

  • Added Bigint.Stable.V2 serialization format, which is always
    strictly smaller than the V1 format, and is always the same
    regardless of the architecture.

  • Adding a new serialization format, V3, which makes native and
    javascript serialize things the same way.

Core:

  • Added Unix.Cidr.arg_type.

  • Changed Core to export int comparison rather than polymorphic
    comparison.

  • Optimized Unix.mkdir_p to to create the directories starting from
    the deepest one instead of from the root.

  • Exposed type equality between Time_ns.comparator and
    Time_ns.Stable.V1.comparator.

  • Changed Unix.getnameinfo to raise Not_found_s.

  • Fixed a bug in Unix.mkdir_p, which mistakenly did not use its
    perm argument on the first directory it creates.

  • Added function Linux_ext.Epoll.Expert.clear_ready.

  • Replaced Unix.File_descr's [@@deriving bin_io, sexp] with
    [@@deriving sexp_of]; similarly for Linux_ext.Timer_fd and
    Unix.Process_info.

  • Changed Unix.File_descr.sexp_of_t to elide the file descriptor’s
    value when am_running_test.

  • Added Unix.Stable.Signal submodule.

  • Added Sys.override_argv function.

  • In bigstring_stubs.c, switched some uses of free to
    caml_stat_free.

  • Added Iobuf functions length_lo and length_hi.

  • Added Iobuf.memcmp function.

  • Added Iobuf.blit_maximal function.

  • Added to Unix.Cidr a function, broadcast_address, that returns
    the subnet’s broadcast address.

  • Add Iobuf expert-only setter functions for each field:
    Expert.set_{buf,lo_min,lo,hi,lo_max}.

  • Added Time and Time_ns functions for converting to and from
    Ofday.Zoned.t.

  • Added Iobuf.fillf_float function, for formatting a float in an
    iobof as specified by a C-style printf format string.

  • Changed the type of Thread.create so that the function to be run
    in the new thread must return unit.

  • Added to Thread.create a required argument on_uncaught_exn:[ `Kill_whole_process | `Print_to_stderr ].

  • Moved Core's time-zone parsing code into its own library,
    Timezone, that depends on Core_kernel.

Core_bench:

  • Made Core_bench stdless.

Core_kernel:

  • Added Core_kernel.eprint_s, like print_s but to stderr.

  • Removed Core_kernel.Std, which had been deprecated for a year.

  • Changed Command so that when command-line parsing fails, it prints
    a more descriptive message explaining how to get usage information.

  • Fixed Command so that for invalid command lines, it prints the
    entire error message on stderr, rather than printing some of it on
    stdout.

  • Made Filename match Comparable.S.

  • Deprecated type Command.Spec.param in favor of Command.Param.t.

  • Changed Core_kernel to export int comparison rather than
    polymorphic comparison.

  • Removed Hashtbl functions that had been deprecated for years.

  • Added support for type t = Map.M(Int).t [@@deriving bin_io] and
    type t = Set.M(Int).t [@@deriving bin_io].

  • Changed Bigbuffer.add_substitute to raise Not_found_s.

  • Moved Bounded_int_table to a standalone library.

  • Changed Command's autocompletion shell functions to disable word
    splitting using an empty string rather than a null byte, which works
    better for zsh.

  • Exposed Date.t as [@@immediate].

  • Added to Hash_queue accessor functions that are polymorphic in the
    key type, making its interface more like Hashtbl and Map.

  • Switched Hash_queue's implementation from custom exceptions to
    raise_s.

  • Added Percent rounding functions: round_significant,
    round_decimal_{mult,percentage,bp}.

  • Added to Time{,_ns}.Ofday.Zoned.With_nonchronological_compare:
    [@@deriving equal].

  • Added Time_ns functions: is_earlier, is_later.

  • Added Bag.S interface.

  • Added Doubly_linked.S] interface.

  • Added Gc.Control.t definition for the new OCaml 4.08 fields.

  • Added Quickcheck bindings to Time and Time_ns.

  • In bigstring_stubs.c, replaced uses of caml_ba_unmap_file with
    calls to the bigstring’s finalize function, in preparation for
    OCaml 4.08.

  • Added Or_error.Expect_test_config module.

  • Removed Float.to_string_round_trippable, which has been deprecated
    in favor of to_string since 2017-04.

  • Deprecated Fqueue functions where one should use Fdeque instead:
    bot, bot_exn, and enqueue_top.

  • Changed the definition of Nothing.t from an uninhabited
    Type_equal.t to an empty variant.

  • Moved the Pool and Tuple_type modules to a standalone library,
    Tuple_pool.

  • Added Fdeque and Fqueue functions to convert to and from
    Sequence.

  • Dropped Hash_set.create's unnecessary unit argument.

  • Changed Time_ns functions of_int_ns_since_epoch and
    Span.of_int_ns on on 32-bit platforms so that they work rather
    than always raising.

  • Changed Command.Param.choose_one's ~if_nothing_chosen argument
    from a polymorphic variant to a GADT, and added a constructor that
    makes it return an option.

  • Added Byte_units.zero.

  • Changed Byte_units to use uppercase letters for the unit suffixes.

  • Made Day_of_week derive quickcheck.

  • Added Map functions key_set and of_key_set, for converting
    between a Map.t and the Set.t of its keys.

  • Added Bus.unsubscribes function, for efficient batched
    unsubscription from a bus.

  • Made Percent match Quickcheckable.S.

  • Made String_id.S match Quickcheckable.S.

  • Improved the Quickcheck monad to allow nested let%map syntax.

  • Exported the Intable module.

  • Added Command.Param.and_arg_names, to extract arg names from a
    Command.Param.t.

  • Fixed a bug in Gc.keep_alive that caused it to sometimes not work
    with flambda.

  • Fixed a bug in deserialization of time zones without offsets (GMT,
    UTC).

  • Changed Command.basic to call String.strip on its ?readme
    argument.

  • Exposed Float.Robustly_comparable submodule.

  • Optimized Union_find not allocate in operations where one already
    has a root. This also affects Bag and Doubly_linked.

  • Removed the “robust” float comparison operators (>., =., …)
    from the default namespace.

  • Improved Command's generated help to clarify that listed and
    one_or_more flags can be repeated.

  • Deleted Bus.unsubscribes, which will be obviated by a performance
    improvement to Bus.unsubscribe.

  • Added Time_ns.Ofday.Option.of_span_since_start_of_day, which will
    return none on an invalid span.

  • Added Blang support for Quickcheckable.S1.

  • In Bus, optimized subscribe_exn and unsubscribe, changing them
    from linear time (in the number of subscribers) to amortized
    constant time.

  • In Bus, relaxed functions that take a 'callback Read_only.t to
    instead take a ('callback, [> read ]) t, which lets us eliminate a
    bunch of pointless calls to Bus.read_only in client code.

  • Added Time_ns functions add_saturating and sub_saturating,
    which clamp rather than overflow.

  • Added Option.Optional_syntax submodule, so that you can use
    ordinary options with immediate options in match%optional.

  • Included Byte_units.Infix operators in the main Byte_units
    module.

  • Changed Command so that all commands accept double dash flags:
    --help, --version, and --build-info.

  • Added Tuple2.map and Tuple3.map functions.

Delimited:

  • Changed Read with ~strip:true to use Char.is_whitespace,
    rather than strip only space characters.

Expect_test_helpers:

  • Generalized the Expect_test_helpers.run function’s ?print_stdout
    and ?print_stderr arguments from type bool to type Print_rule.t = Always | If_unclean_exit | Never.

  • Removed the require_no_allocation function’s ?cr:CR.t argument,
    which was an attractive nuisance.

Incremental:

  • Changed Clock.advance_clock so that it calls
    Timing_wheel.fire_past_alarms, so people don’t have to reason
    about [alarm_precision] when thinking about whether alarms have
    fired.

  • Changed Clock.advance_clock so that advancing time backwards is a
    no-op, rather than doing something wrong.

  • Improved Observer.sexp_of_t to show just the observer’s value or
    an informative message, omitting a bunch of internal state.

  • Changed Incremental.Clock's default timing-wheel configuration so
    that it handle alarms for all times up to
    Time_ns.max_value_representable.

  • Removed the advance_clock function’s ~deprecated_allow_backwards
    argument.

  • Added map11, …, map15 functions.

  • Added [@@unboxed] in a couple places to improve performance.

  • Generalized the unordered_array_fold function’s f_inverse
    argument to also allow an update function, which can more
    efficiently implement the composition of f_inverse and f.

  • Generalized step_function to allow the steps to be specified via a
    sequence and to allow the step function to be an incremental value.

  • Made it possible to write functions that deal with incrementals
    without committing to a particular instance of the module created by
    Incremental.Make.

  • Added generic sexp_of_t functions.

  • Added to type state_witness [@@deriving sexp_of].

  • Exposed more equalities between types in Incremental and
    Incremental.S.

  • Added Incremental.state accessor function.

  • Added Incremental.State.create, a generic function for creating an
    incremental state, along with its state_witness type.

Ppx_comapre:

  • Fixed a bug in [@compare.ignore], which generated unannotated
    ignores that were then rejected by ppx_js_style.

Sexp_pretty:

  • Fixed handing of block comments (#| |#).

Stdio:

  • Added Out_channel.eprint_s function.

Timing_wheel:

  • Changed Config.create to trim level_bits as needed according to
    alarm_precision.

  • Fixed Config.durations to not overflow.

  • Added to Level_bits.create_exn an optional argument,
    ?extend_to_max_num_bits:bool, which is useful for extending a
    timing wheel’s level bits so that the full range of times is
    covered.

  • Removed the alarm_upper_bound function, which has been deprecated
    for 6 months, and superseded by max_allowed_alarm_time.

  • Changed Timing_wheel's max supported time from:
    Time_ns.max_value_for_1us_rounding to
    Time_ns.max_value_representable.

  • Extended Timing_wheel's supported key bits from 61 to 62, so that
    it supports all Time_ns.t values with alarm_precision = 1ns.

  • Made all Timing_wheel tests run on 32-bit platforms.

Uopt:

  • Added support for match%optional syntax.
11 Likes

I would mention in the Moves section that the Udp module used to be provided in async_extra but was accidentally dropped during the v0.12 release and was too difficult to re-add post-release, after the mistake had been discovered, due to a refactor(?). Glad to see that it returned in its own package. :innocent:

Humble suggestion: any thoughts on fixing internal dev workflow so tests fail if public interfaces are changed (removed)? :innocent::innocent::innocent:

It’s perfectly understandable that Jane Street’s library interfaces will change due to deliberate improvement decisions, but in this case code broke needlessly and there was no obvious recovery.

Will there be a new release of async_ssl? I’m trying to use this but I’m getting errors because async_ssl v0.12 is incompatible with async v0.13

The current master of async_ssl is unfortunately based on
a patch against ctypes. We decided to release all packages
except async_ssl and async_smtp because v0.13 was
already overdue. As soon as async_ssl can be built with a
released ctypes version, we will release async_ssl and
async_smtp v0.13.

Here’s the PR where this issue is being worked on.

Thank you for your continued contributions to the open source OCaml community!

What need does ppx_yojson_conv address which ppx_deriving_yojson didn’t? At first glance, I can’t see much differences for developers or the end result.

Similarly, I’d love to hear what prompted the creation of postgres_async vs PGX (although young) and PG’OCaml (now free of camlp4) which are also pure OCaml implementations.

In both cases we haven’t settled on a library yet and any information which could help differentiate them would be very welcome. :slight_smile:

See [ANN] Ppx_yojson_conv: deriving plugin to generate Yojson conversion functions

1 Like

I wanted to try out bonsai, but it seems there’s an issue with the ppx_pattern_bind package. It installs, but then can’t be found by dune. Maybe I messed something up?

~/code/ppx_bind_test$ dune build
File "bin/dune", line 4, characters 26-42:
4 |  (libraries ppx_bind_test ppx_pattern_bind))
                              ^^^^^^^^^^^^^^^^
Error: Library "ppx_pattern_bind" not found.
Hint: try: dune external-lib-deps --missing @@default
~/code/ppx_bind_test$ dune external-lib-deps --missing @@default
Error: The following libraries are missing in the default context:
- ppx_pattern_bind
Hint: try: opam install ppx_pattern_bind
~/code/ppx_bind_test$ opam install ppx_pattern_bind
[NOTE] Package ppx_pattern_bind is already installed (current version is v0.13.0).
~/code/ppx_bind_test$ 

Met strange problem while trying to install ppx_variants_conv-0.13 in a fresh OCaml 4.09.0 switch (Alpine Linux Docker). Reported a bug at GitHub:

-> installed ppx_variants_conv.v0.13.0

#=== ERROR while installing ppx_variants_conv.v0.13.0 =========================#
opam: "mkdir" failed on /home/user/.opam/4.09.0/.opam-switch/packages/ppx_variants_conv.v0.13.0: No such file or directory


<><> Error report <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
+- The following actions failed
| - build   ppx_assert        v0.13.0
| - build   ppx_custom_printf v0.13.0
| - build   ppx_sexp_message  v0.13.0
| - build   ppx_sexp_value    v0.13.0
| - install ppx_variants_conv v0.13.0
+- 

got the same problem, seems current ppx_pattern_bind (in it’s git repos) is buggy, I’ve opened an issue on it’s github.

1 Like

There is indeed something weird with ppx_pattern_bind;
in particular the dune file which ended up on github does
not contain a fix we applied days ago to please our internal CI.

We will publish a point release shortly.

I have just re-run the build on Alpine with a 4.09.0 switch,
and cannot reproduce the problem.

Could your problem be a problem with opam?

Hi,

Congrats on releasing. I look forward to use sexp_select!

I have a question regarding compatibility.

When upgrading one of the codebases I’m involved in, the only impacting change was the deprecation of Sys.argv (that’s way easier than the 0.11 -> 0.12 transition). It seems that we have two ways to be compatible with 0.12 and 0.13:

  • suppress the deprecation warning (quickly forgetting about this and wondering why this breaks in 0.14 or when it is removed)
  • use Caml.Sys.argv instead (we went this route)

In that precise case, if there was a new point release that backported Sys.get_argv, it would be possible to stay compatible with both 0.12 and 0.13, while not “downgrading” to the standard lib behavior.

Do you have plans to do this kind of backports, or is the 0.12.x branch “done”?

Thanks!

I am not aware of such plans, but it might be worth dicussing
with Base developers.

1 Like

The following pull request is expected to fix the issue
with ppx_pattern_bind:

1 Like

it builds fine now, also bonsai builds fine, but it miss a version field in the META file, dunno if it’s a bug or feature :slight_smile:
THANKS!

1 Like

@xclerc yes, it was unrelated - seems out of space. Sorry about the false alarm.

Also works for me now! Thanks for the help and fast response @phstrauss @xclerc

What has happened to Condition.timedwait? There used to be a Core_condition module in Core, which implemented this function, but it has apparently now disappeared.

It was deleted because a search of the duniverse did not turn up any hits for timedwait, and it was not used at all internally.