123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113openImport0letphys_equal=phys_equalexternalpolymorphic_compare:'a->'a->int="%compare"externalpolymorphic_equal:'a->'a->bool="%equal"external(&&):bool->bool->bool="%sequand"letcompare_abstract~type_name__=Printf.ksprintffailwith"Compare called on the type %s, which is abstract in an implementation."type_nameletequal_abstract~type_name__=Printf.ksprintffailwith"Equal called on the type %s, which is abstract in an implementation."type_nametype'acompare='a->'a->inttype'aequal='a->'a->boolmoduleBuiltin=structletcompare_bool:boolcompare=Poly.compareletcompare_char:charcompare=Poly.compareletcompare_float:floatcompare=Poly.compareletcompare_int:intcompare=Poly.compareletcompare_int32:int32compare=Poly.compareletcompare_int64:int64compare=Poly.compareletcompare_nativeint:nativeintcompare=Poly.compareletcompare_string:stringcompare=Poly.compareletcompare_unit:unitcompare=Poly.compareletcompare_arraycompare_eltab=ifphys_equalabthen0elseletlen_a=Array0.lengthainletlen_b=Array0.lengthbinletret=comparelen_alen_binifret<>0thenretelseletrecloopi=ifi=len_athen0elseletl=Array0.unsafe_getaiandr=Array0.unsafe_getbiinletres=compare_eltlrinifres<>0thenreselseloop(i+1)inloop0letreccompare_listcompare_eltab=matcha,bwith|[],[]->0|[],_->-1|_,[]->1|x::xs,y::ys->letres=compare_eltxyinifres<>0thenreselsecompare_listcompare_eltxsysletcompare_optioncompare_eltab=matcha,bwith|None,None->0|None,Some_->-1|Some_,None->1|Somea,Someb->compare_eltabletcompare_refcompare_eltab=compare_elt!a!bletequal_bool:boolequal=Poly.equalletequal_char:charequal=Poly.equalletequal_int:intequal=Poly.equalletequal_int32:int32equal=Poly.equalletequal_int64:int64equal=Poly.equalletequal_nativeint:nativeintequal=Poly.equalletequal_string:stringequal=Poly.equalletequal_unit:unitequal=Poly.equal(* [Poly.equal] is IEEE compliant, which is not what we want here. *)letequal_floatxy=equal_int(compare_floatxy)0letequal_arrayequal_eltab=phys_equalab||(letlen_a=Array0.lengthainletlen_b=Array0.lengthbinequallen_alen_b&&(letrecloopi=i=len_a||(letl=Array0.unsafe_getaiandr=Array0.unsafe_getbiinequal_eltlr&&loop(i+1))inloop0))letrecequal_listequal_eltab=matcha,bwith|[],[]->true|[],_|_,[]->false|x::xs,y::ys->equal_eltxy&&equal_listequal_eltxsysletequal_optionequal_eltab=matcha,bwith|None,None->true|None,Some_|Some_,None->false|Somea,Someb->equal_eltabletequal_refequal_eltab=equal_elt!a!bend