123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172includeFancyletio_buffer_size=65536(* XXX(dinosaure): if [margin] is set to [io_buffer_size], we should never add
an [FWS] token. *)letcreate=Pretty.createletis_empty=Pretty.is_emptyletflush=Pretty.flushletkflush=Pretty.kflushletto_string?(margin=78)?(new_line="\r\n")genvalue=letbuf=Buffer.create0x100inletemitter=letwriteax=letopenEnclosure.IOVecinletopenEnclosure.Bufferinmatchxwith|{buffer=Stringx;off;len;}->Buffer.add_substringbufxofflen;a+len|{buffer=Bytesx;off;len;}->Buffer.add_subbytesbufxofflen;a+len|{buffer=Bigstringx;off;len;}->letx=Bigstringaf.substringx~off~leninBuffer.add_stringbufx;a+leninList.fold_leftwrite0inletencoder=Pretty.create~emitter~margin~new_line0x100inletkendencoder=ifPretty.is_emptyencoderthen()elseFmt.failwith"Leave a non-empty encoder"inletencoder=evalencoderFancy.[!!gen;]valueinlet()=Pretty.kflushkendencoderinBuffer.contentsbufletto_stream?(margin=78)?(new_line="\r\n")genvalue=letqueue=Queue.create()inletline=Buffer.create4096inletemitteriovecs=letwriteax=letopenEnclosure.IOVecinletopenEnclosure.Bufferinmatchxwith|{buffer=Stringx;off;len;}->Buffer.add_substringlinexofflen;a+len|{buffer=Bytesx;off;len;}->Buffer.add_subbyteslinexofflen;a+len|{buffer=Bigstringx;off;len;}->letx=Bigstringaf.substringx~off~leninBuffer.add_stringlinex;a+leninletlen=List.fold_leftwrite0iovecsinletres=Buffer.contentslineinifString.lengthres>0thenQueue.addresqueue;Buffer.clearline;leninletconsumer()=matchQueue.popqueuewith|x->Somex|exceptionQueue.Empty->Noneinletencoder=Pretty.create~emitter~margin~new_line4096inletkendencoder=ifPretty.is_emptyencoderthen()elseFmt.failwith"Leave with a non-empty encoder"inlet()=keval(Pretty.kflushkend)encoderFancy.[!!gen]valueinconsumermoduleIOVec=Enclosure.IOVecmoduleBuffer=Enclosure.Buffer