12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182typeenv={encoder:Jsonm.encoder;on_partial:unit->unit}letmake_env~encoder?(on_partial=fun()->failwith"Not expecting `Partial")()={encoder;on_partial}letmake_encoder'x{encoder;on_partial}=letrecawait()=on_partial();matchJsonm.encodeencoder`Awaitwith`Ok->()|`Partial->await()inmatchJsonm.encodeencoderxwith`Ok->()|`Partial->await()letmake_encoderlenv=make_encoder'(`Lexemel)envtypev=env->unitlet(>>)(v1:v)(v2:v):v=funenv->v1env;v2envletiterencodexs:v=funenv->xs|>List.iter(funx->encodexenv)letobject_start=make_encoder`Osletnamex=make_encoder(`Namex)letobject_end=make_encoder`Oeletarray_start=make_encoder`Asletarray_end=make_encoder`Aeletend_=make_encoder'`EndmoduleJsonm_encodeable=structtypevalue=vletto_string(_v:value):string=failwith"Not implemented"letof_stringx:value=make_encoder(`Stringx)letof_intx:value=make_encoder(`Float(float_of_intx))letof_floatx:value=make_encoder(`Floatx)letof_boolx:value=make_encoder(`Boolx)letnull:value=make_encoder`Nullletof_list(xs:valuelist):value=array_start>>iter(funx->x)xs>>array_endletof_key_value_pairs(xs:(value*value)list):value=object_start>>iter(fun(k,v)->k>>v)xs>>object_endendincludeDecoders.Encode.Make(Jsonm_encodeable)(* Override with more efficient implementations *)letlistencodexs=array_start>>iterencodexs>>array_endletobj(xs:(string*value)list):value=object_start>>iter(fun(k,v)->namek>>v)xs>>object_endletencode_valueencoderx=encoderx>>end_letencode_stringencoderx=letb=Buffer.create16inletenv=make_env~encoder:(Jsonm.encoder~minify:true(`Bufferb))()inlet()=encode_valueencoderxenvinBuffer.contentsb