123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224typevec={off:intoption;len:intoption}type'astate='aLole.statetypeencoder=Lole.encodertypebigstring=Lole.bigstringtypeiovecs=Lole.IOVec.tlisttype-'at={run:'r.(encoder->'rstate)->encoder->'a->'rstate}type-'as={sub:'r.(encoder->'rstate)->encoder->?off:int->?len:int->'a->'rstate}letpeek:'at->'bt->('a,'b)Either.tt=funab->{run=(funke->functionLx->a.runkex|Ry->b.runkey)}letchar:chart={run=(funkev->Lole.write_charvke)}letint8:intt={run=(funkev->Lole.write_uint8vke)}letbeint16:intt={run=(funkev->Lole.BE.write_uint16vke)}letbeint32:int32t={run=(funkev->Lole.BE.write_uint32vke)}letbeint64:int64t={run=(funkev->Lole.BE.write_uint64vke)}letleint16:intt={run=(funkev->Lole.LE.write_uint16vke)}letleint32:int32t={run=(funkev->Lole.LE.write_uint32vke)}letleint64:int64t={run=(funkev->Lole.LE.write_uint64vke)}letbool:boolt={run=(funke->function|true->char.runke'1'|false->char.runke'0')}letsubstring:strings={sub=(funke?off?lenv->Lole.write_string?off?lenvke)}letsubbytes:bytess={sub=(funke?off?lenv->Lole.write_bytes?off?lenvke)}letsubbigstring:bigstrings={sub=(funke?off?lenv->Lole.write_bigstring?off?lenvke)}letblitterlengthblit:_s={sub=(funke?off?lenv->Lole.writek~blit~length?off?lenve)}letwhole(a:'vs):'vt={run=(funkev->a.sub?off:None?len:Nonekev)}letsub(a:'vs):(vec*'v)t={run=(funke({off;len},v)->a.sub?off?lenkev)}letstring:stringt=wholesubstringletbytes:bytest=wholesubbytesletbigstring:bigstringt=wholesubbigstringletlist?sepa:'alistt=letsepke=matchsepwithNone->ke|Somea->a.runke()inletrecrunke:_list->_state=function|[]->ke|[x]->a.runkex|x::r->a.run(sep(fune->runker))exin{run}letnop={run=(funke_->ke)}letoptionf:'aoptiont={run=(funke->functionSomev->f.runkev|None->ke)}exceptionFailofstringletpure~comparev={run=(funkev'->ifcomparevv'=0thenkeelseraise(Fail"fail at the pure operator"))}letfails={run=(fun_k_e_v->raise(Fails))}letconsts={run=(funkes'->ifString.equalss'thenLole.write_strings'keelseraise(Fail(Fmt.strf"const: %s <> %s"ss')))}let(<|>)pupv={run=(funkev->trypu.runkevwith|Fail_|Bijection.Exn.Bijection(_,_)->pv.runkev)}let(<$>)fp={run=(funkev->p.runke(fv))}let(<*>)ab={run=(funke(x,y)->a.run(fune->b.runkey)ex)}letprefixpr={run=(funkev->p.run(fune->r.runkev)e())}letsuffixsr={run=(funkev->r.run(fune->s.runke())ev)}exceptionBreakletfor_allpredicates=letl=String.lengthsintryfori=0tol-1doifnot(predicate(String.unsafe_getsi))thenraiseBreakdone;truewithBreak->falseletwhile0predicate={run=(funkev->iffor_allpredicatevthenLole.write_stringvkeelseraise(Fail"while0"))}letwhile1predicate={run=(funkev->ifString.lengthv>0&&for_allpredicatevthenLole.write_stringvkeelseraise(Fail"while1"))}letfor_allpredicateb=letl=Bigarray.Array1.dimbintryfori=0tol-1doifnot(predicateb.{i})thenraiseBreakdone;truewithBreak->falseletbigstring_while0predicate={run=(funkev->iffor_allpredicatevthenLole.write_bigstringvkeelseraise(Fail"bigstring_while0"))}letbigstring_while1predicate={run=(funkev->ifBigarray.Array1.dimv>0&&for_allpredicatevthenLole.write_bigstringvkeelseraise(Fail"bigstring_while1"))}lettaken=(* XXX(dinosaure): Angstrom.take consumes input, so [take] should produce output. *){run=(funkes->ifString.lengths=nthenstring.runkeselseraise(Fail"take"))}letbuffer=stringletbigstring_buffer=bigstringlet(<*)rs=suffixsrlet(*>)pr=prefixprletfixf=letrecp=lazy(fr)andr={run=(funkev->Lazy.(forcep).runkev)}inrletcommit={run=(funke()->Lole.flushke)}letkeval:'v'r.(encoder->'rstate)->(iovecs->int)->encoder->'vt->'v->'r=funkwetv->letrecgo=function|Lole.Endv->v|Lole.Continue{continue;encoder}->continueencoder|>go|Lole.Flush{continue;iovecs}->letlen=wiovecsincontinuelen|>goint.runkev|>goletevalwetv=keval(fun_e->Lole.End())we(t<*commit)vletrunt=t.runmoduleMake(S:sigtypeavalrun:(encoder->'rstate)->encoder->a->'rstateend)=structletx={run=S.run}endletto_string:typea.at->a->string=funtv->letbuf=Buffer.create16inletwriterl=List.iter(function|{Lole.IOVec.buffer=Lole.Buffer.Strings;off;len}->Buffer.add_substringbufsofflen|{Lole.IOVec.buffer=Lole.Buffer.Bytess;off;len}->Buffer.add_subbytesbufsofflen|{Lole.IOVec.buffer=Lole.Buffer.Bigstrings;off;len}->fori=0tolen-1doBuffer.add_charbufs.{off+i}done)l;Lole.IOVec.lengthvlinevalwriter(Lole.create0x100)tv;Buffer.contentsbuf