1234567891011121314151617181920212223242526272829303132openCoretype+'at(* This [Obj.magic] is OK because we never allow user code access to [none] (except via
[unsafe_value]). We disallow [_ Uopt.t Uopt.t], so there is no chance of confusing
[none] with [some none]. And [float Uopt.t array] is similarly disallowed. *)letnone:'at=Obj.magic"Uopt.none"letsome(x:'a):'at=Obj.magicxletunsafe_value(x:'at):'a=Obj.magicxletis_nonet=phys_equaltnoneletis_somet=not(is_nonet)letinvariantinvariant_at=ifis_somettheninvariant_a(unsafe_valuet)letsexp_of_tsexp_of_at=ifis_nonetthen[%sexpNone]else[%sexpSome(unsafe_valuet:a)];;letvalue_exnt=ifis_nonetthenfailwith"Uopt.value_exn"elseunsafe_valuetletto_optiont=ifis_nonetthenNoneelseSome(unsafe_valuet)letof_option=function|None->none|Somea->somea;;moduleOptional_syntax=structmoduleOptional_syntax=structletis_none=is_noneletunsafe_value=unsafe_valueendend