123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122openImport0letphys_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_name;;letequal_abstract~type_name__=Printf.ksprintffailwith"Equal called on the type %s, which is abstract in an implementation."type_name;;type'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_equalabthen0else(letlen_a=Array0.lengthainletlen_b=Array0.lengthbinletret=comparelen_alen_binifret<>0thenretelse(letrecloopi=ifi=len_athen0else(letl=Array0.unsafe_getaiandr=Array0.unsafe_getbiinletres=compare_eltlrinifres<>0thenreselseloop(i+1))inloop0));;letreccompare_listcompare_eltab=matcha,bwith|[],[]->0|[],_->-1|_,[]->1|x::xs,y::ys->letres=compare_eltxyinifres<>0thenreselsecompare_listcompare_eltxsys;;letcompare_optioncompare_eltab=matcha,bwith|None,None->0|None,Some_->-1|Some_,None->1|Somea,Someb->compare_eltab;;letcompare_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_eltxsys;;letequal_optionequal_eltab=matcha,bwith|None,None->true|None,Some_|Some_,None->false|Somea,Someb->equal_eltab;;letequal_refequal_eltab=equal_elt!a!bend