12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697(* This file provides a generic way to build high-level module on *)(* array like structures *)moduletypeArrayLike=sigtypeelemtypetvalarray_get:t->int->elemvalarray_set:t->int->elem->unitvalarray_length:t->intvalmake:elem->int->tvalempty:tendmoduleMake(A:ArrayLike)=structletarray_foldfaarr=letsize=A.array_lengtharrinletrecauxaccuidx=ifidx>=sizethenaccuelseaux(faccu(A.array_getarridx))(idx+1)inauxa0letarray_iterfarr=array_fold(fun_a->fa)()arrletarray_iterifarr=leti=ref0inarray_iter(f!i)arrletarray_for_allpredarr=tryarray_iter(funa->ifpreda|>notthenraiseExit)arr;truewithExit->falseletarray_existspredarr=tryarray_iter(funa->ifpredathenraiseExit)arr;truewithExit->falseletarray_to_listarr=letrecauxaccuidx=ifidx<0thenaccuelseaux((A.array_getarridx)::accu)(idx-1)inaux[](A.array_lengtharr-1)letarray_of_list=function|[]->A.empty|h::_asl->letsize=List.lengthlinletear=A.makehsizeinList.iteri(A.array_setear)l;earendmoduleLinconsExt=Make(structopenApronincludeLincons1typeelem=ttypet=earrayletmakeelem=array_makeelem.envletempty=array_make(Environment.make[||][||])0end)moduleTconsExt=Make(structopenApronincludeTcons1typeelem=ttypet=earrayletmakeelem=array_makeelem.envletempty=array_make(Environment.make[||][||])0end)moduleGeneratorExt=Make(structopenApronincludeGenerator1typeelem=ttypet=earrayletmakeelem=array_makeelem.envletempty=array_make(Environment.make[||][||])0end)