123456789101112131415161718192021222324252627282930313233343536373839404142434445464748openCoretypet=String.Set.texceptionInvalid_specifierofstringletto_string_sett=t(* An int specifier looks like 1,3,5-7. This function converts to a col_specifier. *)letint_specifier_of_stringspec=letvalidation_pattern="\\d+(-\\d+)?(,\\d+(-\\d+)?)*"inifnot(Pcre.pmatch~pat:validation_patternspec)thenraise(Invalid_specifier"Column specifier formatted incorrectly")else(letsegments=Pcre.split~pat:","specinletconvert_segmentsegment=letendpoints=Pcre.split~pat:"-"segmentinletrangefirstlast=letrecauxlastaccum=iflast<firstthenaccumelseaux(last-1)(last::accum)inauxlast[]inmatchendpointswith|[h]->[int_of_stringh]|[first;last]->range(int_of_stringfirst)(int_of_stringlast)|_->raise(Invalid_specifier"Column specifier formatted incorrectly")inList.mapsegments~f:convert_segment|>List.fold~init:String.Set.empty~f:(funaccumcol_list->List.foldcol_list~init:accum~f:(funaccumcol->letcol=string_of_intcolinifSet.memaccumcolthenraise(Invalid_specifier("Invalid column specifier: column "^col^" duplicated."))elseSet.addaccumcol)));;(* A specifier string looks like f1,f3,f5,f7. *)letspecifier_of_stringspec=letfields=Pcre.split~pat:","specinList.foldfields~init:String.Set.empty~f:(funsetfield->ifSet.memsetfieldthenraise(Invalid_specifier("Column "^field^" duplicated"))elseSet.addsetfield);;