123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172moduleUtils=Transept_utils.UtilsmoduleMonadic_via_response(R:Transept_specs.RESPONSE)=structlet(<$>)pfs=letopenRinfold(ps)(fun(s,a,consumed)->success(s,fa,consumed))(fun(s,consumed)->failure(s,consumed))let(>>=)pfs=letopenRinfold(ps)(fun(s,a,consumed_1)->fold(fas)(fun(s,b,consumed_2)->success(s,b,consumed_1||consumed_2))(fun(s,consumed)->failure(s,consumed)))(fun(s,consumed)->failure(s,consumed))endmoduleBasic_via_response_and_stream(R:Transept_specs.RESPONSE)(S:Transept_specs.STREAM)=structletreturnas=R.(success(s,a,false))letfails=R.(failure(s,false))leteoss=letopenRinS.(ifis_emptysthensuccess(s,(),false)elsefailure(s,false))letanys=letopenRinmatchS.nextswith|Somee,s->success(s,e,true)|None,s->failure(s,false)endmoduleFlow_via_response(R:Transept_specs.RESPONSE)=structopenMonadic_via_response(R)(* TODO review this code ASAP *)let(<&>)plprs=letopenRinfold(pls)(fun(s,a,consumed_1)->fold(prs)(fun(s,b,consumed_2)->success(s,(a,b),consumed_1||consumed_2))(fun(s,consumed_2)->failure(s,consumed_1||consumed_2)))(fun(s,consumed)->failure(s,consumed))let(<&)plpr=pl<&>pr<$>fstlet(&>)plpr=pl<&>pr<$>sndlet(<|>)plprs=letopenRinfold(pls)(fun(s,a,consumed)->success(s,a,consumed))(fun(s',consumed)->ifconsumedthenfailure(s',consumed)elseprs)let(<?>)pfs=letopenRinfold(ps)(fun(s,a,consumed)->iffathensuccess(s,a,consumed)elsefailure(s,false))(fun(s,_)->failure(s,false))letto_listp=p<$>(fun(e,l)->e::l)endmoduleExecution_via_response(R:Transept_specs.RESPONSE)=structletdo_tryps=letopenRinfold(ps)(fun(s,a,consumed)->success(s,a,consumed))(fun(s,_)->failure(s,false))letdo_lazyps=p()sletlookaheadps=letopenRinfold(ps)(fun(_,a,_)->success(s,a,false))(fun(s,b)->failure(s,b))endmoduleAtomic_via_response_and_stream(R:Transept_specs.RESPONSE)(S:Transept_specs.STREAM)=structopenBasic_via_response_and_stream(R)(S)(* TODO review this code ASAP *)openMonadic_via_response(R)(* TODO review this code ASAP *)openExecution_via_response(R)(* TODO review this code ASAP *)openFlow_via_response(R)(* TODO review this code ASAP *)letnotps=R.(fold(ps)(fun(s,_,_)->failure(s,false))(fun_->anys))letatome=any<?>(fune'->e'=e)letin_listl=any<?>(fune->List.memel)letin_rangeminmax=any<?>(fune'->min<=e'&&e'<=max)letatomsl=letopenListindo_try(fold_left(funpe->p<&atome)(return())l)<$>Utils.constantlendmoduleRepeatable_via_response(R:Transept_specs.RESPONSE)(S:Transept_specs.STREAM)=structopenBasic_via_response_and_stream(R)(S)(* TODO review this code ASAP *)openMonadic_via_response(R)(* TODO review this code ASAP *)openExecution_via_response(R)(* TODO review this code ASAP *)openFlow_via_response(R)(* TODO review this code ASAP *)letoptp=p<$>(fune->Somee)<|>returnNoneletsequenceoptionalps=letopenRin(* sequence is tail recursive *)letrecsequencesauxb=fold(ps)(fun(s,a,b')->sequences(a::aux)(b||b'))(fun(s',b')->ifaux!=[]||optionalthensuccess(s,List.revaux,b||b')elsefailure(s',b||b'))insequences[]falseletoptrepp=sequencetruepletrepp=sequencefalsependmoduleMake_via_response_and_stream(R:Transept_specs.RESPONSE)(S:Transept_specs.STREAM)(E:Transept_specs.ELEMENT)=structmoduleResponse=RmoduleStream=Stypee=E.ttype'at=eStream.t->(eStream.t,'a)Response.tletparseps=psincludeMonadic_via_response(R)includeBasic_via_response_and_stream(R)(S)includeFlow_via_response(R)includeAtomic_via_response_and_stream(R)(S)includeExecution_via_response(R)includeRepeatable_via_response(R)(S)endmoduleMake_via_stream(S:Transept_specs.STREAM)(E:Transept_specs.ELEMENT)=structincludeMake_via_response_and_stream(Response.Basic)(S)(E)end