123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170(* available_space.ml *)(* Style type for representing available space as a sizing constraint *)typet=|Definiteoffloat(* The amount of space available is the specified number of pixels *)|Min_content(* The amount of space available is indefinite and the node should be laid
out under a min-content constraint *)|Max_content(* The amount of space available is indefinite and the node should be laid out
under a max-content constraint *)letzero=Definite0.0letmax_content=Max_contentletmin_content=Min_contentletof_lengthvalue=Definitevalueletis_definite=functionDefinite_->true|_->falseletto_option=functionDefinitevalue->Somevalue|_->Noneletunwrap_ortdefault=matchto_optiontwithSomevalue->value|None->defaultletunwrapt=matchto_optiontwith|Somevalue->value|None->invalid_arg"unwrap called on non-definite Available_space.t"letor_tdefault=matchtwithDefinite_->t|_->defaultletor_elsetdefault_cb=matchtwithDefinite_->t|_->default_cb()letunwrap_or_elsetdefault_cb=matchto_optiontwithSomevalue->value|None->default_cb()letset_or_selftvalue=matchvaluewithSomevalue->Definitevalue|None->tletmap_definite_valuetmap_function=matchtwithDefinitevalue->Definite(map_functionvalue)|_->tletcompute_free_spacetused_space=matchtwith|Max_content->Float.infinity|Min_content->0.0|Definiteavailable_space->available_space-.used_spaceletis_roughly_equaltother=match(t,other)with|Definitea,Definiteb->Float.abs(a-.b)<Float.epsilon|Min_content,Min_content->true|Max_content,Max_content->true|_->falseletof_floatvalue=Definitevalueletof_optionoption=matchoptionwithSomevalue->Definitevalue|None->Max_contenttypesize={width:t;height:t}letsize_to_options(t:size):floatoptionGeometry.size={width=to_optiont.width;height=to_optiont.height}letsize_maybe_set(t:size)(value:floatoptionGeometry.size):size={width=set_or_selft.widthvalue.width;height=set_or_selft.heightvalue.height;}letmaybe_set=set_or_self(* Alias for backward compatibility in struct field *)letto_string=function|Definitevalue->Printf.sprintf"Definite(%g)"value|Min_content->"MinContent"|Max_content->"MaxContent"letequalab=match(a,b)with|Definitex,Definitey->Float.abs(x-.y)<Float.epsilon|Min_content,Min_content->true|Max_content,Max_content->true|_->falseletcompareab=match(a,b)with|Definitex,Definitey->Float.comparexy|Definite_,_->-1|_,Definite_->1|Min_content,Min_content->0|Min_content,Max_content->-1|Max_content,Min_content->1|Max_content,Max_content->0letppfmtt=Format.pp_print_stringfmt(to_stringt)(* Operations with concrete values *)letmintrhs=matchtwith|Definiteval1->Definite(Float.minval1rhs)|Min_content->Definiterhs|Max_content->Definiterhsletmaxtrhs=matchtwith|Definiteval1->Definite(Float.maxval1rhs)|Min_content->Min_content|Max_content->Max_contentletclamptminmax=matchtwith|Definiteval1->Definite(Float.maxmin(Float.minmaxval1))|Min_content->Min_content|Max_content->Max_contentletaddtrhs=matchtwith|Definiteval1->Definite(val1+.rhs)|Min_content->Min_content|Max_content->Max_contentletsubtrhs=matchtwith|Definiteval1->Definite(val1-.rhs)|Min_content->Min_content|Max_content->Max_content(* Operations with optional values *)letmin_or_selftrhs=match(t,rhs)with|Definiteval1,Someval2->Definite(Float.minval1val2)|Definiteval1,None->Definiteval1|Min_content,Someval2->Definiteval2|Min_content,None->Min_content|Max_content,Someval2->Definiteval2|Max_content,None->Max_contentletmax_or_selftrhs=match(t,rhs)with|Definiteval1,Someval2->Definite(Float.maxval1val2)|Definiteval1,None->Definiteval1|Min_content,_->Min_content|Max_content,_->Max_contentletclamp_or_selftminmax=match(t,min,max)with|Definiteval1,Somemin_val,Somemax_val->Definite(Float.maxmin_val(Float.minmax_valval1))|Definiteval1,None,Somemax_val->Definite(Float.minmax_valval1)|Definiteval1,Somemin_val,None->Definite(Float.maxmin_valval1)|Definiteval1,None,None->Definiteval1|Min_content,_,_->Min_content|Max_content,_,_->Max_contentletadd_or_zerotrhs=match(t,rhs)with|Definiteval1,Someval2->Definite(val1+.val2)|Definiteval1,None->Definiteval1|Min_content,_->Min_content|Max_content,_->Max_contentletsub_or_zerotrhs=match(t,rhs)with|Definiteval1,Someval2->Definite(val1-.val2)|Definiteval1,None->Definiteval1|Min_content,_->Min_content|Max_content,_->Max_content