12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485(* This file is free software, part of gen. See file "license" for more details. *)(** {1 Monadic Interface} *)moduletypeMONAD=GenM_intf.MONADmoduleMake(M:MONAD)=structmoduleM=Mlet(>>=)=M.(>>=)let(>|=)=M.(>|=)type+'at=unit->'aoptionM.tletreturnx=letfirst=reftrueinfun()->if!firstthen(first:=false;M.return(Somex))elseM.returnNoneletsequence_mg()=matchg()with|None->M.returnNone|Someact->act>|=funx->Somexletmapfg()=g()>|=function|None->None|Somex->Some(fx)letflat_mapfg=letrecnextfg()=g()>>=function|None->M.returnNone(* done *)|Somex->letcur=fxinmap_fromfgcur()andmap_fromfgcur()=letres=cur()inres>>=function|None->nextfg()|Some_->resinnextfgletrecfoldfaccg=g()>>=function|None->M.returnacc|Somex->letacc=faccxinfoldfaccgletrecfold_mfaccg=g()>>=function|None->M.returnacc|Somex->faccx>>=funacc->fold_mfaccgletreciterfg=g()>>=function|None->M.return()|Somex->fx;iterfgletreciter_sfg=g()>>=function|None->M.return()|Somex->fx>>=fun()->iter_sfgletreciter_pfg=g()>>=function|None->M.return()|Somex->let_=fxiniter_pfgmoduleInfix=structlet(>|=)xf=mapfxlet(>>=)xf=flat_mapfxendincludeInfixend