12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970moduleArray=ArrayLabelsmoduleList=ListLabelsmoduleString=StringLabelstypet=Sexp0.t=|Atomofstring|Listoftlist(* XXX otherwise the dependency isn't recorded by bootstrap *)moduleSexp_intf=Sexp_intfmoduleEncoder=structtypesexp=ttype'at='a->sexpletunit()=List[]letcharc=Atom(String.make1c)letstrings=Atomsletinti=Atom(string_of_inti)letfloatf=Atom(string_of_floatf)letboolb=Atom(string_of_boolb)letpairfafb(a,b)=List[faa;fbb]lettriplefafbfc(a,b,c)=List[faa;fbb;fcc]letlistfl=List(List.mapl~f)letarrayfa=listf(Array.to_lista)letoptionf=function|None->List[]|Somex->List[fx]letrecordl=List(List.mapl~f:(fun(n,v)->List[Atomn;v]))letunknown_=Atom"<unknown>"letconstrname=function|[]->Atomname|args->List(Atomname::args)endletrecto_string=function|Atoms->Escape.quote_if_neededs|Listl->Printf.sprintf"(%s)"(List.map~f:to_stringl|>String.concat~sep:" ")letpp=Sexp1.pplethash=Dune_caml.Hashtbl.hashletstring_equal(x:string)(y:string)=Pervasives.(=)xyletrecequalxy=matchx,ywith|Atomx,Atomy->string_equalxy|Listx,Listy->equal_listxy|_,_->falseandequal_listxsys=(* replicating List.equal to avoid circular deps *)matchxs,yswith|[],[]->true|x::xs,y::ys->equalxy&&equal_listxsys|_,_->falseletcomparexy=Ordering.of_int(comparexy)letrecto_dyn=letopenDyn0infunction|Atoms->Variant("Atom",[Strings])|Listxs->Variant("List",List.map~f:to_dynxs)