12345678910111213141516171819202122232425262728293031323334353637383940414243444546open!BaseopenPpxlibopenAst_builder.Defaulttype'at={value_bindings:value_bindinglist;body:'a}includeMonad.Make(structtypenonrec'at='atletreturnbody={value_bindings=[];body}letbinda~f=letb=fa.bodyin{value_bindings=a.value_bindings@b.value_bindings;body=b.body};;letmap=`Define_using_bindend)letcreate~loc~prefix~tyrhs=letname=gen_symbol~prefix()inletlhs=pvar~locnameinletbody=evar~locnameinletty,rhs,body=ifHelpers.is_value_expressionrhsthenty,rhs,bodyelse((* Thunkify the value to evaluate when referred to. *)letty=[%type:Stdlib.Unit.t->[%tty]]inletrhs=[%exprfun()->[%erhs]]inletbody=[%expr[%ebody]()]inty,rhs,body)in{value_bindings=[value_binding~loc~pat:(ppat_constraint~loclhsty)~expr:rhs];body};;letlet_bind_user_expressions{value_bindings;body}~loc=ifList.is_emptyvalue_bindingsthenbodyelsepexp_let~locNonrecursivevalue_bindingsbody;;