Module type
Class type

You can think of an Svar.t as like an Ivar.t whose purpose is to allow us to implement of_svar below.

(The difference between Svar and Ivar is that the former is synchronous. That is, when fill_if_empty is called, it will directly call all of the handlers rather than scheduling that they be called later. This semantics can be confusing to work with in large-scale programs, as it means the control flow of your application hops around a lot more. However, it does mean that you don't need a scheduler, so it's easier to implement.)

type 'a t
val create : unit -> 'a t
val upon : 'a t -> ('a -> unit) -> unit
val fill_if_empty : 'a t -> 'a -> unit
val peek : 'a t -> 'a option