1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768openCoremoduleDeferred=Deferred1moduleT=structtype'at='aOption.tDeferred.tendincludeTincludeMonad.Make(structincludeTletreturna=Deferred.return(Somea)letbindt~f=Deferred.bindt~f:(function|Somea->fa|None->Deferred.returnNone);;letmapt~f=Deferred.mapt~f:(funr->Option.mapr~f)letmap=`Custommapend)moduleContainer=struct(* Every function below is some instance of deferred [Option.value_map]. *)letvalue_mapoption~default~f=matchoptionwith|None->Deferred.returndefault|Somevalue->fvalue;;letfoldoption~init~f=value_mapoption~default:init~f:(funvalue->finitvalue)letexistsoption~f=value_mapoption~default:false~fletfor_alloption~f=value_mapoption~default:true~fletiteroption~f=value_mapoption~default:()~fletmapoption~f=value_mapoption~default:None~f:(funvalue->Deferred.map~f:Option.return(fvalue));;letalloption=value_mapoption~default:None~f:(fundeferred->Deferred.map~f:Option.returndeferred);;letall_unitoption=value_mapoption~default:()~f:Fn.id(* Several exported functions are equivalent to a deferred [Option.bind]. *)letbindoption~f=value_mapoption~default:None~fletconcat_map=bindletfilter_map=bindletfind_map=bind(* [find] and [filter] are equivalent. *)letfindoption~f=value_mapoption~default:None~f:(funvalue->Deferred.map(fvalue)~f:(function|false->None|true->Somevalue));;letfilter=findend