12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758type('t,'a,'accum)fold='t->init:'accum->f:('accum->'a->'accum)->'accumtype('t,'a,'accum)foldi='t->init:'accum->f:(int->'accum->'a->'accum)->'accumtype('t,'a)iteri='t->f:(int->'a->unit)->unitmoduletypeS1=sigincludeContainer.S1(** These are all like their equivalents in [Container] except that an index starting at
0 is added as the first argument to [f]. *)valfoldi:('at,'a,_)foldivaliteri:('at,'a)iterivalexistsi:'at->f:(int->'a->bool)->boolvalfor_alli:'at->f:(int->'a->bool)->boolvalcounti:'at->f:(int->'a->bool)->intvalfindi:'at->f:(int->'a->bool)->(int*'a)optionvalfind_mapi:'at->f:(int->'a->'boption)->'boptionendmoduletypeMake_arg=sigincludeContainer_intf.Make_argvaliteri:[`Define_using_fold|`Customof('at,'a)iteri]valfoldi:[`Define_using_fold|`Customof('at,'a,_)foldi]endmoduletypeIndexed_container=sig(** Provides generic signatures for containers that support indexed iteration ([iteri],
[foldi], ...). In principle, any container that has [iter] can also implement [iteri],
but the idea is that [Indexed_container_intf] should be included only for containers
that have a meaningful underlying ordering. *)moduletypeS1=S1(** Generic definitions of [foldi] and [iteri] in terms of [fold].
E.g., [iteri ~fold t ~f = ignore (fold t ~init:0 ~f:(fun i x -> f i x; i + 1))]. *)valfoldi:fold:('t,'a,'accum)fold->('t,'a,'accum)foldivaliteri:fold:('t,'a,int)fold->('t,'a)iteri(** Generic definitions of indexed container operations in terms of [foldi]. *)valcounti:foldi:('t,'a,int)foldi->'t->f:(int->'a->bool)->int(** Generic definitions of indexed container operations in terms of [iteri]. *)valexistsi:iteri:('t,'a)iteri->'t->f:(int->'a->bool)->boolvalfor_alli:iteri:('t,'a)iteri->'t->f:(int->'a->bool)->boolvalfindi:iteri:('t,'a)iteri->'t->f:(int->'a->bool)->(int*'a)optionvalfind_mapi:iteri:('t,'a)iteri->'t->f:(int->'a->'boption)->'boptionmoduleMake(T:Make_arg):S1withtype'at:='aT.tend