123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263typepoint=inttypezone={a:point;b:point}typet=zoneoptiontype'awith_location={value:'a;location:t}type'aw='awith_location={value:'a;location:t}letmakeab=ifa<0||b<0thenFmt.invalid_arg"A point must be positive";ifa>bthenFmt.invalid_arg"[a] must be lower or equal to [b]";Some{a;b;}letsomezone=Somezoneletnone=Noneletunionab=matcha,bwith|None,None->None|Some_,None->a|None,Some_->b|Some{a;b;},Some{a=x;b=y}->leta=(min:int->int->int)axinletb=(max:int->int->int)byinSome{a;b;}letppppf=function|Some{a;b;}->Fmt.pfppf"%d:%d"ab|None->Fmt.stringppf"<none>"letleft=function|Some{a;_}->Somea|None->Noneletleft_exnt=matchlefttwith|Someleft->left|None->Fmt.invalid_arg"<dummy location>"letright=function|Some{b;_}->Someb|None->Noneletright_exnt=matchrighttwith|Someright->right|None->Fmt.invalid_arg"<dummy location>"letlength=function|Some{a;b;}->Some(b-a)|None->Noneletlength_exnt=matchlengthtwith|Somelength->length|None->Fmt.invalid_arg"<dummy location>"letwithout_location:'awith_location->'a=fun{value;_}->valueletlocation{location;_}=locationletwith_location~locationv={value=v;location;}letinj=with_locationletprj=without_location