123456789101112131415161718192021222324252627282930313233343536open!Core_kernelopen!Importtype'au=|Emptyof'aIvar.t|Full[@@derivingsexp_of]type'at='auref[@@derivingsexp_of]letinvariant_t=Invariant.invariant[%here]t[%sexp_of:_t](fun()->match!twith|Full->()|Emptyivar->assert(Ivar.is_emptyivar));;letcreate()=letivar=Ivar.create()inlett=ref(Emptyivar)int,Ivar.readivar;;letis_emptyt=match!twith|Empty_->true|Full->false;;letfillta=match!twith|Emptyi->t:=Full;Ivar.fillia|Full->raise_s[%message"attempt to fill full ivar"];;