123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566typeencoder={payload:Bytes.t;mutablepos:int}typeerror=[`No_enough_space]letpp_errorppf`No_enough_space=Fmt.stringppf"No enough space"type'errstate=|Writeof{buffer:string;off:int;len:int;continue:int->'errstate;}|Errorof'err|Doneletio_buffer_size=65536letcreate()={payload=Bytes.createio_buffer_size;pos=0}exceptionLeaveoferrorletleave_with(_:encoder)error=raise(Leaveerror)letsafe:(encoder->([>error]as'err)state)->encoder->'errstate=funkencoder->trykencoderwithLeave(#erroraserr)->Error(err:>'err)letflushk0encoder=ifencoder.pos>0thenletreck1n=ifn<encoder.posthenWrite{buffer=Bytes.unsafe_to_stringencoder.payload;off=n;len=encoder.pos-n;continue=(funm->k1(n+m));}else(encoder.pos<-0;k0encoder)ink10elsek0encoderletwriteencoders=letmax=Bytes.lengthencoder.payloadinletgojlencoder=letrem=max-encoder.posinletlen=ifl>remthenremelselinBytes.blit_stringsjencoder.payloadencoder.poslen;encoder.pos<-encoder.pos+len;iflen<lthenleave_withencoder`No_enough_spacein(* XXX(dinosaure): should never appear, but avoid continuation allocation. *)go0(String.lengths)encoderletblitencoder~buf~off~len=letmax=Bytes.lengthencoder.payloadinletgojlencoder=letrem=max-encoder.posinletlen=ifl>remthenremelselinBytes.blit_stringbuf(off+j)encoder.payloadencoder.poslen;encoder.pos<-encoder.pos+len;iflen<lthenleave_withencoder`No_enough_spaceingo0lenencoder