123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167moduletypeT=sigtype('a,'deser,'ser)direndmoduleMake(T:T)=structtypepacked=Packed|Not_packedtypeextension_ranges=(int*int)listtypeextensions=(int*Field.t)listtype'amerge='a->'a->'atype_spec=|Double:floatspec|Float:floatspec|Int32:Int32.tspec|UInt32:Int32.tspec|SInt32:Int32.tspec|Fixed32:Int32.tspec|SFixed32:Int32.tspec|Int32_int:intspec|UInt32_int:intspec|SInt32_int:intspec|Fixed32_int:intspec|SFixed32_int:intspec|UInt64:Int64.tspec|Int64:Int64.tspec|SInt64:Int64.tspec|Fixed64:Int64.tspec|SFixed64:Int64.tspec|UInt64_int:intspec|Int64_int:intspec|SInt64_int:intspec|Fixed64_int:intspec|SFixed64_int:intspec|Bool:boolspec|String:stringspec|Bytes:bytesspec|Enum:('a,int->'a,'a->int)T.dir->'aspec|Message:('a,((Reader.t->'a)*'amerge),Writer.t->'a->Writer.t)T.dir->'aspec(* Existential types *)typeespec=Espec:_spec->espec[@@unboxed]type_oneof=|Oneof_elem:int*'bspec*('a,('b->'a),'b)T.dir->'aoneoftype_compound=(* A field, where the default value is know (and set). This cannot be used for message types *)|Basic:int*'aspec*'a->'acompound(* Proto2/proto3 optional fields. *)|Basic_opt:int*'aspec->'aoptioncompound(* Proto2 required fields (and oneof fields) *)|Basic_req:int*'aspec->'acompound(* Repeated fields *)|Repeated:int*'aspec*packed->'alistcompound|Oneof:('a,'aoneoflist,'a->unitoneof)T.dir->([>`not_set]as'a)compoundtype(_,_)compound_list=(* End of list *)|Nil:('a,'a)compound_list(* Nil_ext denotes that the message contains extensions *)|Nil_ext:extension_ranges->(extensions->'a,'a)compound_list(* List element *)|Cons:('acompound)*('b,'c)compound_list->('a->'b,'c)compound_listmoduleC=structletdouble=Doubleletfloat=Floatletint32=Int32letint64=Int64letuint32=UInt32letuint64=UInt64letsint32=SInt32letsint64=SInt64letfixed32=Fixed32letfixed64=Fixed64letsfixed32=SFixed32letsfixed64=SFixed64letint32_int=Int32_intletint64_int=Int64_intletuint32_int=UInt32_intletuint64_int=UInt64_intletsint32_int=SInt32_intletsint64_int=SInt64_intletfixed32_int=Fixed32_intletfixed64_int=Fixed64_intletsfixed32_int=SFixed32_intletsfixed64_int=SFixed64_intletbool=Boolletstring=Stringletbytes=Bytesletenumf=Enumfletmessagef=Messagefletsomev=Somevletnone=Noneletdefault_bytesv=(Some(Bytes.of_stringv))letrepeated(i,s,p)=Repeated(i,s,p)letbasic(i,s,d)=Basic(i,s,d)letbasic_req(i,s)=Basic_req(i,s)letbasic_opt(i,s)=Basic_opt(i,s)letoneofs=Oneofsletoneof_elem(a,b,c)=Oneof_elem(a,b,c)letpacked=Packedletnot_packed=Not_packedlet(^::)ab=Cons(a,b)letnil=Nilletnil_extextension_ranges=Nil_extextension_rangesletshow:typea.aspec->string=function|Double->"Double"|Float->"Float"|Int32->"Int32"|UInt32->"UInt32"|SInt32->"SInt32"|Fixed32->"Fixed32"|SFixed32->"SFixed32"|Int32_int->"Int32_int"|UInt32_int->"UInt32_int"|SInt32_int->"SInt32_int"|Fixed32_int->"Fixed32_int"|SFixed32_int->"SFixed32_int"|UInt64->"UInt64"|Int64->"Int64"|SInt64->"SInt64"|Fixed64->"Fixed64"|SFixed64->"SFixed64"|UInt64_int->"UInt64_int"|Int64_int->"Int64_int"|SInt64_int->"SInt64_int"|Fixed64_int->"Fixed64_int"|SFixed64_int->"SFixed64_int"|Bool->"Bool"|String->"String"|Bytes->"Bytes"|Enum_->"Enum"|Message_->"Message"endendmoduleDeserialize=Make(structtype('a,'deser,'ser)dir='deserend)moduleSerialize=Make(structtype('a,'deser,'ser)dir='serend)