12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455openPpxlibopenAst_helperletfresh_variable=letnext_fresh_var=ref0infun()->incrnext_fresh_var;letstr="ppx_monad_var_"^(string_of_int!next_fresh_var)inletloc=!default_locinPat.var{txt=str;loc},Exp.ident{txt=Longident.Lidentstr;loc}letrecfirst=function|[]->None|None::rest->firstrest|Someres::_->Someresletoption_mapf=function|None->None|Somex->Some(fx)let(<$>)=option_mapletdoes_not_support?(ppx_name="This PPX")feature=Location.raise_errorf"%s does not support %s"ppx_namefeatureletunwrap_or_does_not_support?ppx_namefeature=function|Somex->x|_->does_not_support?ppx_namefeatureletfirst_or_does_not_support?ppx_namefeatureoptions=unwrap_or_does_not_support?ppx_namefeature(firstoptions)letassert_or_does_not_support?ppx_namefeaturebool=ifnotboolthendoes_not_support?ppx_namefeatureletadd_catchall_if_needed~loc?mk_returncases=letis_catchallcase=letrecis_pat_catchallpat=matchpat.ppat_descwith|Ppat_any|Ppat_var_->true|Ppat_alias(pat,_)|Ppat_constraint(pat,_)->is_pat_catchallpat|_->falseincase.pc_guard=None&&is_pat_catchallcase.pc_lhsinifList.existsis_catchallcasesthencaseselsematchmk_returnwith|None->does_not_support"cases without catch-all"|Somemk_return->cases@[Exp.case[%pat?any](mk_return~loc[%exprany])]