123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137moduleList=structincludeListletrecfind_mapf=function|[]->None|x::l->beginmatchfxwith|Some_asresult->result|None->find_mapflendendmoduleInt=structincludeIntletminxy=ifx<=ythenxelseyletmaxxy=ifx>=ythenxelseyendmoduleEither=structtype('a,'b)t=Leftof'a|Rightof'bendmoduleUchar=structincludeUcharletrep_=0xFFFDletrep=unsafe_of_intrep_letvalid_bit=27letdecode_bits=24let[@inline]utf_decode_is_validd=(dlsrvalid_bit)=1let[@inline]utf_decode_lengthd=(dlsrdecode_bits)land0b111let[@inline]utf_decode_uchard=unsafe_of_int(dland0xFFFFFF)let[@inline]utf_decodenu=((8lorn)lsldecode_bits)lor(to_intu)let[@inline]utf_decode_invalidn=(nlsldecode_bits)lorrep_endmoduleBytes=structincludeBytesexternalunsafe_get_uint8:bytes->int->int="%bytes_unsafe_get"let[@inline]not_in_x80_to_xBFb=blsr6<>0b10let[@inline]not_in_xA0_to_xBFb=blsr5<>0b101let[@inline]not_in_x80_to_x9Fb=blsr5<>0b100let[@inline]not_in_x90_to_xBFb=b<0x90||0xBF<blet[@inline]not_in_x80_to_x8Fb=blsr4<>0x8letdec_invalid=Uchar.utf_decode_invalidlet[@inline]dec_retnu=Uchar.utf_decoden(Uchar.unsafe_of_intu)let[@inline]utf_8_uchar_2b0b1=((b0land0x1F)lsl6)lor((b1land0x3F))let[@inline]utf_8_uchar_3b0b1b2=((b0land0x0F)lsl12)lor((b1land0x3F)lsl6)lor((b2land0x3F))let[@inline]utf_8_uchar_4b0b1b2b3=((b0land0x07)lsl18)lor((b1land0x3F)lsl12)lor((b2land0x3F)lsl6)lor((b3land0x3F))letget_utf_8_ucharbi=letb0=get_uint8biin(* raises if [i] is not a valid index. *)letget=unsafe_get_uint8inletmax=lengthb-1inmatchChar.unsafe_chrb0with(* See The Unicode Standard, Table 3.7 *)|'\x00'..'\x7F'->dec_ret1b0|'\xC2'..'\xDF'->leti=i+1inifi>maxthendec_invalid1elseletb1=getbiinifnot_in_x80_to_xBFb1thendec_invalid1elsedec_ret2(utf_8_uchar_2b0b1)|'\xE0'->leti=i+1inifi>maxthendec_invalid1elseletb1=getbiinifnot_in_xA0_to_xBFb1thendec_invalid1elseleti=i+1inifi>maxthendec_invalid2elseletb2=getbiinifnot_in_x80_to_xBFb2thendec_invalid2elsedec_ret3(utf_8_uchar_3b0b1b2)|'\xE1'..'\xEC'|'\xEE'..'\xEF'->leti=i+1inifi>maxthendec_invalid1elseletb1=getbiinifnot_in_x80_to_xBFb1thendec_invalid1elseleti=i+1inifi>maxthendec_invalid2elseletb2=getbiinifnot_in_x80_to_xBFb2thendec_invalid2elsedec_ret3(utf_8_uchar_3b0b1b2)|'\xED'->leti=i+1inifi>maxthendec_invalid1elseletb1=getbiinifnot_in_x80_to_x9Fb1thendec_invalid1elseleti=i+1inifi>maxthendec_invalid2elseletb2=getbiinifnot_in_x80_to_xBFb2thendec_invalid2elsedec_ret3(utf_8_uchar_3b0b1b2)|'\xF0'->leti=i+1inifi>maxthendec_invalid1elseletb1=getbiinifnot_in_x90_to_xBFb1thendec_invalid1elseleti=i+1inifi>maxthendec_invalid2elseletb2=getbiinifnot_in_x80_to_xBFb2thendec_invalid2elseleti=i+1inifi>maxthendec_invalid3elseletb3=getbiinifnot_in_x80_to_xBFb3thendec_invalid3elsedec_ret4(utf_8_uchar_4b0b1b2b3)|'\xF1'..'\xF3'->leti=i+1inifi>maxthendec_invalid1elseletb1=getbiinifnot_in_x80_to_xBFb1thendec_invalid1elseleti=i+1inifi>maxthendec_invalid2elseletb2=getbiinifnot_in_x80_to_xBFb2thendec_invalid2elseleti=i+1inifi>maxthendec_invalid3elseletb3=getbiinifnot_in_x80_to_xBFb3thendec_invalid3elsedec_ret4(utf_8_uchar_4b0b1b2b3)|'\xF4'->leti=i+1inifi>maxthendec_invalid1elseletb1=getbiinifnot_in_x80_to_x8Fb1thendec_invalid1elseleti=i+1inifi>maxthendec_invalid2elseletb2=getbiinifnot_in_x80_to_xBFb2thendec_invalid2elseleti=i+1inifi>maxthendec_invalid3elseletb3=getbiinifnot_in_x80_to_xBFb3thendec_invalid3elsedec_ret4(utf_8_uchar_4b0b1b2b3)|_->dec_invalid1letfor_allps=letn=lengthsinletrecloopi=ifi=nthentrueelseifp(unsafe_getsi)thenloop(succi)elsefalseinloop0endmoduleString=structincludeStringmoduleB=Bytesletbos=B.unsafe_of_stringletget_utf_8_ucharsi=B.get_utf_8_uchar(boss)iletfor_allfs=B.for_allf(boss)end