12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576type'at={arr:'aarray;start:int;end_excl:int}letmake?lenarr~pos=letarr_len=Array.lengtharrinifpos<0||pos>Array.lengtharrtheninvalid_arg(Printf.sprintf"Array_view.make: expected pos to be in [0, %d] but received %d"arr_lenpos);letlength=Option.valuelen~default:(arr_len-pos)inletview_last_idx=pos+lengthinifview_last_idx>arr_lentheninvalid_arg(Printf.sprintf"Array_view.make: view's last idx = %d occurs after the array length = %d"view_last_idxarr_len);{arr;start=pos;end_excl=pos+length};;letoffset_indexti=letix=t.start+iinifix<t.end_exclthenixelseinvalid_arg"subarray index out of bounds";;letgetti=t.arr.(offset_indexti)letsettix=t.arr.(offset_indexti)<-xletlengtht=t.end_excl-t.startletis_emptyt=lengtht=0letcommon_suffix_lenaiaj=iflengthai=0||lengthaj=0then0else(leti=ref(lengthai-1)inletj=ref(lengthaj-1)inwhile!i>=0&&!j>=0&&getai!i=getaj!jdodecri;decrjdone;lengthai-!i-1);;letfold_left=letreclooparraccfji=ifInt.equalijthenaccelselooparr(faccarr.(i))fj(i+1)infunt~init~f->loopt.arrinitft.end_exclt.start;;letiterit~f=fori=0tot.end_excl-t.start-1dofit.arr.(t.start+i)done;;letsubt~pos~len=assert(len<=lengtht);letpos=t.start+posinmaket.arr~pos~len;;letblittarr~pos=letlen=t.end_excl-t.startinArrayLabels.blit~src:t.arr~src_pos:t.start~dst:arr~dst_pos:pos~len;;letcopyt=Array.init(t.end_excl-t.start)(funi->t.arr.(t.start+i))letbacking_array_postp=t.start+p