123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575openPpxlibopenAst_builder.Defaultletverbose=matchSys.getenv_opt"PPX_ENCODING_DEBUG"with|None|Some"0"|Some"false"|Some"no"->0|Somes->matchswith|"true"->1|s->matchint_of_string_optswith|Somei->i|None->0letfake=matchSys.getenv_opt"PPX_ENCODING_FAKE"with|Some"1"|Some"true"|Some"yes"->true|_->falseletremove_prefix_var=matchSys.getenv_opt"PPX_ENCODING_RM_PREFIX"with|Some"false"|Some"0"->false|_->trueletdebug?(v=1)?(force=false)fmt=ifforce||verbose>=vthenFormat.ksprintf(funs->Format.eprintf"%s@."s)fmtelsePrintf.ifprintf()fmtletjson_encoding_dot=ref"Json_encoding."letjson_encoding_tmp=ref!json_encoding_dotletwrap=function|None->json_encoding_tmp:=!json_encoding_dot|Some""->json_encoding_tmp:=!json_encoding_dot;json_encoding_dot:=""|Somes->json_encoding_tmp:=!json_encoding_dot;json_encoding_dot:=String.capitalize_asciis^"."letunwrap()=json_encoding_dot:=!json_encoding_tmplet()=wrap(Sys.getenv_opt"PPX_ENCODING_MODULE")letraise_error~locs=Location.raise_errorf~locsletenc_names:(string,string)Hashtbl.t=Hashtbl.create256letenc_name?(search=true)type_name=letauxname=matchList.rev@@String.split_on_char'.'namewith|[]->assertfalse|"t"::q->String.concat"."@@List.rev@@"enc"::q|_->name^"_enc"inifnotsearchthenauxtype_nameelsematchHashtbl.find_optenc_namestype_namewith|None->auxtype_name|Somename->nameletadd_enc_nametype_nameenc_name=Hashtbl.addenc_namestype_nameenc_nameletenc_mods=!json_encoding_dot^sletenc_var~locs=evar~loc(enc_mods)letenc_apply~locsl=eapply~loc(enc_var~locs)lletenc_apply0~locsl=pexp_apply~loc(enc_var~locs)lletpexp_funpe=pexp_fun~loc:e.pexp_locNolabelNonepeletllid~locs={txt=Longident.parses;loc}letesomee=letloc=e.pexp_locinpexp_construct~loc(llid~loc"Some")(Somee)leteoption~loc=function|None->[%exprNone]|Somee->esomeeletrecadd_params_funexpr=function|[]->expr|{ptyp_desc=Ptyp_varx;ptyp_loc=loc;_}::t->pexp_fun(ppat_constraint~loc(pvar~loc("_"^enc_namex))(ptyp_constr~loc(llid~loc(enc_mod"encoding"))[ptyp_var~locx]))(add_params_funexprt)|_::t->add_params_funexprtletrecadd_params_fun_sigtyp=function|[]->typ|{ptyp_desc=Ptyp_varx;ptyp_loc=loc;_}::t->ptyp_arrow~locNolabel(ptyp_constr~loc(llid~loc(enc_mod"encoding"))[ptyp_var~locx])(add_params_fun_sigtypt)|_::t->add_params_fun_sigtyptletparam_namesparams=List.rev@@List.fold_left(funacc(p,_)->matchp.ptyp_descwith|Ptyp_varx->x::acc|_->acc)[]paramsletstring_literal=function|Ppxlib.Pconst_string(s,_,_)->Somes|_->Noneletget_expr_attr=function|PStr[{pstr_desc=Pstr_eval(e,_);_}]->Somee|_->Noneletget_string_attr=function|PStr[{pstr_desc=Pstr_eval({pexp_desc=Pexp_constantcst;_},_);_}]->string_literalcst|_->Noneletrm_prefix_of_expre=matche.pexp_descwith|Pexp_construct({txt=Lident"true";_},_)->Some(`booltrue)|Pexp_construct({txt=Lident"false";_},_)->Some(`boolfalse)|Pexp_constant(Pconst_integer(s,None))->Some(`length(int_of_strings))|Pexp_constantcst->beginmatchstring_literalcstwith|Somes->Some(`prefixs)|None->Noneend|_->Noneletget_rm_prefix_attrpl=matchget_expr_attrplwith|None->None|Somee->rm_prefix_of_expreletschema_ence=letloc=e.pexp_locinletauxschx=enc_apply0~loc"conv"[Labelled"schema",sch;Nolabel,[%exprFun.id];Nolabel,[%exprFun.id];Nolabel,x]inmatche.pexp_descwith|Pexp_fun(Nolabel,None,({ppat_desc=Ppat_var{txt;_};_}asp),schema)->(fune->[%exprlet[%pp]=[%ee]in[%eauxschema(evar~loctxt)]])|_->auxeletread_onlyloc=schema_enc[%exprfunenc->Json_schema.(create{(root[%eenc_apply~loc"schema"[[%exprenc]]])withaccess=Some`read_only})]letwrite_onlyloc=schema_enc[%exprfunenc->Json_schema.(create{(root[%eenc_apply~loc"schema"[[%exprenc]]])withaccess=Some`write_only})]letto_snake?(sep='_')s=letn=String.lengthsinletb=Bytes.create(2*n)inletrecauxij=ifi=nthenjelseletc=String.getsiinletcode=Char.codecinifi=0&&code>=65&&code<=90then(Bytes.setbj(Char.chr(code+32));aux(i+1)(j+1))elseifcode>=65&&code<=90then(Bytes.setbjsep;Bytes.setb(j+1)(Char.chr(code+32));aux(i+1)(j+2))elseifc='-'||c='_'then(Bytes.setbjsep;aux(i+1)(j+1))else(Bytes.setbjc;aux(i+1)(j+1))inletm=aux00inBytes.(to_string@@subb0m)letto_camel?(pascal=false)s=letn=String.lengthsinletb=Bytes.createninletrecauxij=ifi=nthenjelseletc=String.getsiinif(c='_'||c='-')&&i<>(n-1)then(letcode=Char.code@@String.gets(i+1)inletc=ifcode>=97&&code<=122thenChar.chr(code-32)elseChar.chrcodeinBytes.setbjc;aux(i+2)(j+1))else(Bytes.setbjc;aux(i+1)(j+1))inletm=aux00inlets=Bytes.(to_string@@subb0m)inifpascalthenString.capitalize_asciiselseString.uncapitalize_asciistypefield_attributes={fa_field:string*bool*expressionoption;fa_key:string;fa_title:expressionoption;fa_description:expressionoption;fa_assoc:booloption;fa_enum:booloption;fa_exclude:expressionoption;fa_obj:booloption;fa_enc:expressionoption;fa_obj1:stringoption;fa_merge:bool;fa_construct_default:bool;fa_set:expressionoption;fa_map:expressionoptionoption;fa_schema:(expression->expression)option;}lettransform_case?case?(typ=`cons)s=matchcasewith|None->beginmatchtypwith|`cons->ifString.for_all(func->letcode=Char.codecincode>=65&&code<=90)sthenselseString.uncapitalize_asciis|`variant->send|Some`camel->to_camels|Some`snake->to_snakes|Some`pascal->to_camel~pascal:trues|Some`kebab->to_snake~sep:'-'s|Some`upper->String.uppercase_asciis|Some`lower->String.lowercase_asciis|Some`cap->String.capitalize_asciisletfield_attrs~key?(opt=false)?(option="opt")?case?set?map?schemal=letfa_field=matchopt,optionwith|false,_->("req",false,None)|_,"opt"->("opt",true,None)|_,"req"->("req",false,None)|_->letloc=!Ast_helper.default_locin("dft",false,Some[%exprNone])inletfa_key=transform_case?casekeyinList.fold_left(funfaa->matcha.attr_name.txtwith|"req"|"enc.req"->{fawithfa_field=("req",false,None)}|"opt"|"enc.opt"->{fawithfa_field=("opt",true,None)}|"dft"|"enc.dft"->{fawithfa_field=("dft",false,get_expr_attra.attr_payload)}|"ddft"|"enc.ddft"->{fawithfa_field=("dft",false,get_expr_attra.attr_payload);fa_construct_default=true}|"key"|"enc.key"->beginmatchget_string_attra.attr_payloadwith|None->failwith"key expression must be a string constant"|Somefa_key->{fawithfa_key}end|"title"|"enc.title"->{fawithfa_title=get_expr_attra.attr_payload}|"description"|"enc.description"->{fawithfa_description=get_expr_attra.attr_payload}|"assoc"|"enc.assoc"->{fawithfa_assoc=Sometrue}|"enum"|"enc.enum"->{fawithfa_enum=Sometrue}|"union"|"enc.union"->{fawithfa_enum=Somefalse}|"exclude"|"enc.exclude"->{fawithfa_exclude=get_expr_attra.attr_payload}|"object"|"enc.object"->{fawithfa_obj=Sometrue}|"encoding"|"enc.encoding"->{fawithfa_enc=get_expr_attra.attr_payload}|"obj1"|"enc.obj1"|"wrap"|"enc.wrap"->{fawithfa_obj1=get_string_attra.attr_payload}|"merge"|"enc.merge"->{fawithfa_merge=true}|"camel"|"enc.camel"->{fawithfa_key=to_camelfa.fa_key}|"snake"|"enc.snake"->{fawithfa_key=to_snakefa.fa_key}|"pascal"|"enc.pascal"->{fawithfa_key=to_camel~pascal:truefa.fa_key}|"kebab"|"enc.kebab"->{fawithfa_key=to_snake~sep:'-'fa.fa_key}|"set"|"enc.set"->{fawithfa_set=get_expr_attra.attr_payload}|"map"|"enc.map"->{fawithfa_map=Some(get_expr_attra.attr_payload)}|"upper"|"enc.upper"->{fawithfa_key=String.uppercase_asciifa.fa_key}|"lower"|"enc.lower"->{fawithfa_key=String.lowercase_asciifa.fa_key}|"cap"|"enc.cap"->{fawithfa_key=String.capitalize_asciifa.fa_key}|"schema"|"enc.schema"->{fawithfa_schema=Option.mapschema_enc@@get_expr_attra.attr_payload}|"readonly"|"enc.readonly"->{fawithfa_schema=Some(read_onlya.attr_loc)}|"writeonly"|"enc.writeonly"->{fawithfa_schema=Some(read_onlya.attr_loc)}|_->fa){fa_field;fa_key;fa_title=None;fa_description=None;fa_assoc=None;fa_enum=None;fa_exclude=None;fa_obj=None;fa_enc=None;fa_obj1=None;fa_merge=false;fa_construct_default=false;fa_set=set;fa_map=map;fa_schema=schema}lletpp_expression=Pprintast.expressiontypecs_attributes={cs_kind:stringoption;cs_kind_label:stringoption;cs_assoc:booloption;cs_enum:booloption;cs_transform:(string->string);cs_obj:booloption;cs_enc:expressionoption;cs_title:expressionoption;cs_description:expressionoption;cs_ignore:bool;cs_rm_prefix:[`boolofbool|`prefixofstring|`lengthofint];cs_obj1:stringoption;cs_empty:booloption;cs_case:expressionoption;cs_schema:(expression->expression)option;}letconstructor_attrs?case?typ?kindl=letcs_transforms=transform_case?case?typsinletcs_kind,cs_kind_label=matchkindwith|Some(Somek)->Some"",Somek|SomeNone->Some"",None|_->None,NoneinList.fold_left(funcsa->matcha.attr_name.txtwith|"kind"|"enc.kind"->letcs_kind=matchget_string_attra.attr_payloadwith|None->Some""|k->kin{cswithcs_kind}|"kind_label"|"enc.kind_label"->{cswithcs_kind_label=get_string_attra.attr_payload}|"assoc"|"enc.assoc"->{cswithcs_assoc=Sometrue}|"enum"|"enc.enum"->{cswithcs_enum=Sometrue}|"union"|"enc.union"->{cswithcs_enum=Somefalse}|"key"|"enc.key"->beginmatchget_string_attra.attr_payloadwith|None->failwith"key expression must be a string constant"|Somes->{cswithcs_transform=fun_->s}end|"object"|"enc.object"->{cswithcs_obj=Sometrue}|"encoding"|"enc.encoding"->{cswithcs_enc=get_expr_attra.attr_payload}|"title"|"enc.title"->{cswithcs_title=get_expr_attra.attr_payload}|"description"|"enc.desccription"->{cswithcs_description=get_expr_attra.attr_payload}|"ignore"|"enc.ignore"->{cswithcs_ignore=true}|"remove_prefix"|"enc.remove_prefix"->letcs_rm_prefix=matchget_rm_prefix_attra.attr_payloadwith|None->`booltrue|Somex->xin{cswithcs_rm_prefix}|"obj1"|"enc.obj1"|"wrap"|"enc.wrap"->{cswithcs_obj1=get_string_attra.attr_payload}|"empty"|"enc.empty"->{cswithcs_empty=Sometrue}|"camel"|"enc.camel"->{cswithcs_transform=to_camel}|"snake"|"enc.snake"->{cswithcs_transform=to_snake}|"pascal"|"enc.pascal"->{cswithcs_transform=to_camel~pascal:true}|"kebab"|"enc.kebab"->{cswithcs_transform=to_snake~sep:'-'}|"upper"|"enc.upper"->{cswithcs_transform=String.uppercase_ascii}|"lower"|"enc.lower"->{cswithcs_transform=String.lowercase_ascii}|"cap"|"enc.cap"->{cswithcs_transform=String.capitalize_ascii}|"case"|"enc.case"->{cswithcs_case=get_expr_attra.attr_payload}|"schema"|"enc.schema"->{cswithcs_schema=Option.mapschema_enc@@get_expr_attra.attr_payload}|"readonly"|"enc.readonly"->{cswithcs_schema=Some(read_onlya.attr_loc)}|"writeonly"|"enc.writeonly"->{cswithcs_schema=Some(read_onlya.attr_loc)}|_->cs){cs_kind;cs_assoc=None;cs_enum=None;cs_transform;cs_obj=None;cs_enc=None;cs_title=None;cs_description=None;cs_ignore=false;cs_rm_prefix=`boolfalse;cs_obj1=None;cs_kind_label;cs_empty=None;cs_case=None;cs_schema=None}ltypecore_attributes={co_assoc:booloption;co_enum:booloption;co_exclude:expressionoption;co_obj:booloption;co_enc:expressionoption;co_obj1:stringoption;co_merge:bool;co_rm_prefix:[`boolofbool|`prefixofstring|`lengthofint]option;co_set:expressionoption;co_map:expressionoptionoption;co_opt:expressionoptionoption;co_schema:(expression->expression)option;}letcore_attrs?assoc?enum?obj?enc?obj1?set?map?schemal=List.fold_left(funcoa->matcha.attr_name.txtwith|"assoc"|"enc.assoc"->{cowithco_assoc=Sometrue}|"enum"|"enc.enum"->{cowithco_enum=Sometrue}|"union"|"enc.union"->{cowithco_enum=Somefalse}|"exclude"|"enc.exclude"->{cowithco_exclude=get_expr_attra.attr_payload}|"object"|"enc.object"->{cowithco_obj=Sometrue}|"encoding"|"enc.encoding"->{cowithco_enc=get_expr_attra.attr_payload}|"obj1"|"enc.obj1"|"wrap"|"enc.wrap"->{cowithco_obj1=get_string_attra.attr_payload}|"merge"|"enc.merge"->{cowithco_merge=true}|"remove_prefix"|"enc.remove_prefix"->{cowithco_rm_prefix=get_rm_prefix_attra.attr_payload}|"set"|"enc.set"->{cowithco_set=get_expr_attra.attr_payload}|"map"|"enc.map"->{cowithco_map=Some(get_expr_attra.attr_payload)}|"opt"|"enc.opt"->{cowithco_opt=SomeNone}|"dft"|"enc.dft"->{cowithco_opt=Some(get_expr_attra.attr_payload)}|"schema"|"enc.schema"->{cowithco_schema=Option.mapschema_enc@@get_expr_attra.attr_payload}|"readonly"|"enc.readonly"->{cowithco_schema=Some(read_onlya.attr_loc)}|"writeonly"|"enc.writeonly"->{cowithco_schema=Some(read_onlya.attr_loc)}|_->co){co_assoc=assoc;co_enum=enum;co_exclude=None;co_obj=obj;co_enc=enc;co_obj1=obj1;co_merge=false;co_rm_prefix=None;co_set=set;co_map=map;co_opt=None;co_schema=schema}lletnew_var=leti=ref(-1)infun()->incri;"v"^string_of_int!iletstr_of_structuree=Pprintast.string_of_structureeletstr_of_signaturee=Pprintast.signatureFormat.str_formattere;Format.flush_str_formatter()letstr_of_coree=Pprintast.core_typeFormat.str_formattere;Format.flush_str_formatter()letrecflat_tuple_length=function|[]->0|`merge_::tl->1+flat_tuple_lengthtl|`objl::tl->List.lengthl+flat_tuple_lengthtlletsimple_obj_tuple?(v="x")?(i=0)~locvartuplel=letn=List.lengthlinletq=n/10inletr=nmod10inletrecaux~iq=ifq=1&&r=0thentuple~loc@@List.init10(funj->var~loc(v^string_of_int(i+j)))elseifq=0thentuple~loc@@List.initr(funj->var~loc(v^string_of_int(i+j)))elsetuple~loc[tuple~loc@@List.init10(funj->var~loc(v^string_of_int(i+j)));aux~i:(i+10)(q-1)]inaux~iqletrecencaps_tuple?(v="x")?(i=0)~locvartuple=function|[]->assertfalse|[`merge_]->var~loc(v^string_of_inti)|[`objl]->simple_obj_tuple~i~v~locvartuplel|`merge_::tl->tuple~loc[var~loc(v^string_of_inti);encaps_tuple~i:(i+1)~locvartupletl]|`objl::tl->tuple~loc[simple_obj_tuple~i~v~locvartuplel;encaps_tuple~i:(i+List.lengthl)~locvartupletl]letsimple_obj~loc~kindl=leta=Array.of_listlinletn=Array.lengthainletq=n/10inletr=nmod10inletrecauxqa=ifq=1&&r=0theneapply~loc(evar~loc(enc_mod(kind^string_of_int10)))(Array.to_lista)elseifq=0theneapply~loc(evar~loc(enc_mod(kind^string_of_intr)))(Array.to_lista)elseenc_apply~loc("merge_"^kind^"s")[eapply~loc(evar~loc(enc_mod(kind^"10")))(Array.to_list@@Array.suba010);aux(q-1)(Array.suba10((q-1)*10+r))]inauxqaletrecencaps_merge~loc?(kind="obj")=function|[]->assertfalse|[`mergeh]->h|[`objl]->simple_obj~loc~kindl|`mergeh::tl->enc_apply~loc("merge_"^kind^"s")[h;encaps_merge~loc~kindtl]|`objl::tl->enc_apply~loc("merge_"^kind^"s")[simple_obj~loc~kindl;encaps_merge~loc~kindtl]letobj_expr~loc?(kind="obj")?(v="x")l=letrecauxacc1acc2l=matchl,acc2with|[],None->List.revacc1|[],Someo->List.rev(`obj(List.revo)::acc1)|(h,merge)::tl,None->ifmergethenaux((`mergeh)::acc1)Nonetlelseauxacc1(Some[h])tl|(h,merge)::tl,Someo->ifmergethenaux(`mergeh::(`obj(List.revo))::acc1)Nonetlelseauxacc1(Some(h::o))tlinletlgrouped=aux[]Nonelinmatchlgroupedwith|[]->enc_var~loc"empty"|[`objo]whenList.lengtho<=10->simple_obj~loc~kindo|_->letn=flat_tuple_lengthlgroupedinenc_apply~loc"conv"[pexp_fun(ppat_tuple~loc(List.initn(funi->pvar~loc(v^string_of_inti))))(encaps_tuple~v~locevarpexp_tuplelgrouped);pexp_fun(encaps_tuple~locpvarppat_tuplelgrouped)(pexp_tuple~loc(List.initn(funi->evar~loc(v^string_of_inti))));encaps_merge~loc~kindlgrouped](* let no_merge = List.for_all (fun (_, b) -> not b) l in *)(* let n = List.length l in *)(* if n < 11 && no_merge then *)(* eapply ~loc (evar ~loc (enc_mod (kind ^ string_of_int n))) (List.map fst l) *)(* else *)(* let v = List.mapi (fun i _ -> "x" ^ string_of_int i) l in *)(* let f = "merge_" ^ kind ^ "s" in *)(* enc_apply ~loc "conv" [ *)(* pexp_fun (ppat_tuple ~loc (List.map (pvar ~loc) v)) (encaps_tuple ~loc evar pexp_tuple v); *)(* pexp_fun (encaps_tuple ~loc pvar ppat_tuple v) (pexp_tuple ~loc (List.map (evar ~loc) v)); *)(* encaps_merge ~loc ~f l ] *)letremove_prefixsn=String.subsn(String.lengths-n)letsame_prefixl=letcommon_prefixs1s2=letn1=String.lengths1inletn2=String.lengths2inletrecauxi=ifi<n1&&i<n2&&s1.[i]=s2.[i]thenaux(i+1)elsei,String.subs10iinaux0inletrecauxnpr=function|[]->n,pr|h::t->letn,pr=common_prefixhprinauxnprtinletchecknl=List.for_all(funs->String.lengths>n)linmatchlwith|[]|[_]->0|h::t->letn=fst(aux(String.lengthh)ht)inifchecknlthennelse0letremove_prefix_optionsl=function|Some(`boolfalse)->0|Some(`lengthn)->n|Some(`prefixs)->String.lengths|_->ifnotremove_prefix_varthen0elsesame_prefixlmoduletypeS=sigtype'aencodingtype'afieldtype'acasevalunit:unitencodingvalempty:unitencodingvalint:intencodingvalint32:int32encodingvalint53:int64encodingvalbool:boolencodingvalstring:stringencodingvalstring_enum:(string*'a)list->'aencodingvalconstant:string->unitencodingvalbytes:bytesencodingvalfloat:floatencodingvaloption:'aencoding->'aoptionencodingvalreq:?title:string->?description:string->string->'tencoding->'tfieldvalopt:?title:string->?description:string->string->'tencoding->'toptionfieldvaldft:?title:string->?description:string->string->'tencoding->'t->'tfieldvalobj1:'f1field->'f1encodingvalobj2:'f1field->'f2field->('f1*'f2)encodingvalobj3:'f1field->'f2field->'f3field->('f1*'f2*'f3)encodingvalobj4:'f1field->'f2field->'f3field->'f4field->('f1*'f2*'f3*'f4)encodingvalobj5:'f1field->'f2field->'f3field->'f4field->'f5field->('f1*'f2*'f3*'f4*'f5)encodingvalobj6:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->('f1*'f2*'f3*'f4*'f5*'f6)encodingvalobj7:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->'f7field->('f1*'f2*'f3*'f4*'f5*'f6*'f7)encodingvalobj8:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->'f7field->'f8field->('f1*'f2*'f3*'f4*'f5*'f6*'f7*'f8)encodingvalobj9:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->'f7field->'f8field->'f9field->('f1*'f2*'f3*'f4*'f5*'f6*'f7*'f8*'f9)encodingvalobj10:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->'f7field->'f8field->'f9field->'f10field->('f1*'f2*'f3*'f4*'f5*'f6*'f7*'f8*'f9*'f10)encodingvalmerge_objs:'aencoding->'bencoding->('a*'b)encodingvaltup1:'f1field->'f1encodingvaltup2:'f1field->'f2field->('f1*'f2)encodingvaltup3:'f1field->'f2field->'f3field->('f1*'f2*'f3)encodingvaltup4:'f1field->'f2field->'f3field->'f4field->('f1*'f2*'f3*'f4)encodingvaltup5:'f1field->'f2field->'f3field->'f4field->'f5field->('f1*'f2*'f3*'f4*'f5)encodingvaltup6:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->('f1*'f2*'f3*'f4*'f5*'f6)encodingvaltup7:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->'f7field->('f1*'f2*'f3*'f4*'f5*'f6*'f7)encodingvaltup8:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->'f7field->'f8field->('f1*'f2*'f3*'f4*'f5*'f6*'f7*'f8)encodingvaltup9:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->'f7field->'f8field->'f9field->('f1*'f2*'f3*'f4*'f5*'f6*'f7*'f8*'f9)encodingvaltup10:'f1field->'f2field->'f3field->'f4field->'f5field->'f6field->'f7field->'f8field->'f9field->'f10field->('f1*'f2*'f3*'f4*'f5*'f6*'f7*'f8*'f9*'f10)encodingvalmerge_tups:'aencoding->'bencoding->('a*'b)encodingvalarray:'aencoding->'aarrayencodingvallist:'aencoding->'alistencodingvalassoc:'aencoding->(string*'a)listencodingvalcase:?title:string->?description:string->('tencoding->('a->'toption)->('t->'a))list->'acasevalunion:'acaselist->'aencodingvalconv:('a->'b)->('b->'a)->'bencoding->'aencodingvalmu:string->?title:string->?description:string->('aencoding->'aencoding)->'aencodingvalany_ezjson_value:'aencodingvaldef:string->?title:string->?description:string->'aencoding->'aencodingend