12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455(* Based on https://github.com/jaredly/belt/blob/master/belt_ppx/Belt_ppx.ml,
rewriten in ppxlib register and Context_free.Rule.special_function *)openPpxlibletexpandere=letrecexpander'e=letloc=e.pexp_locinmatche.pexp_descwith|Pexp_apply({pexp_desc=Pexp_ident{txt=Lident"|.";_};pexp_loc_stack;pexp_loc=_;pexp_attributes=_;},[(Nolabel,arg);(Nolabel,fn)])->(letfn=Option.value~default:fn(expander'fn)inletarg=Option.value~default:arg(expander'arg)inmatchfnwith|{pexp_desc=Pexp_apply(fn,args);pexp_loc;_}->letargs=List.filter_map(fun(lab,exp)->matchexpander'expwith|Somee->Some(lab,e)|None->Some(lab,exp))argsinSome{pexp_desc=Pexp_apply(fn,(Nolabel,arg)::args);pexp_attributes=[];pexp_loc;pexp_loc_stack;}|{pexp_desc=Pexp_construct(lident,None);pexp_loc;pexp_loc_stack;pexp_attributes=_;}->Some{pexp_desc=Pexp_construct(lident,Somearg);pexp_attributes=[];pexp_loc;pexp_loc_stack;}|_->Some(Ast_builder.Default.pexp_apply~locfn[(Nolabel,arg)]))|_->Noneinexpander'eletrule=Context_free.Rule.special_function"( |. )"expander