@@ -29,6 +29,12 @@ let mk_longident' = function
2929
3030let mk_longident ident = mk_loc (mk_longident' ident)
3131let mk_constr_exp ?arg cstr = Exp. construct (mk_longident cstr) arg
32+
33+ let mk_constr_pat ?arg cstr =
34+ Pat. construct (mk_longident cstr) (Option. map (fun a -> ([] , a)) arg)
35+
36+ let mk_variant_exp ?arg cstr = Exp. variant (mk_loc (mk_loc cstr)) arg
37+ let mk_variant_pat ?arg cstr = Pat. variant (mk_loc (mk_loc cstr)) arg
3238let same_longident a b = Longident. flatten a = b
3339let mk_exp_ident ident = Exp. ident (mk_longident ident)
3440let mk_exp_var s = mk_exp_ident [ s ]
@@ -42,6 +48,11 @@ let mk_none_ident = mk_longident [ "None" ]
4248let mk_exp_some x = Exp. construct mk_some_ident (Some x)
4349let mk_exp_none = Exp. construct mk_none_ident None
4450let mk_typ_constr ?(params = [] ) lid = Typ. constr (mk_longident lid) params
51+ let mk_const_int i = Exp. constant (Const. integer i)
52+ let mk_lbl s = Labelled (mk_loc s)
53+ let mk_lblopt s = Optional (mk_loc s)
54+ let mk_pat_some arg = mk_constr_pat ~arg [ " Some" ]
55+ let mk_pat_none = mk_constr_pat [ " None" ]
4556
4657(* Construct [let var = lhs in (rhs var)]. *)
4758let mk_let_var ident lhs rhs =
@@ -56,32 +67,41 @@ module Mk_function : sig
5667 let open Mk_function in
5768 mk_function
5869 (return (fun a b -> Exp.tuple [ a; b ])
59- $ (Nolabel, "a") $ (Nolabel, "b") )
70+ $ arg "a" $ arg "b")
6071 in
6172 ]} *)
6273
6374 type 'a t
75+ type arg
6476
65- val ( $ ) : (expression -> 'a) t -> arg_label * string -> 'a t
77+ val arg : ?lbl : [ `Lbl | `Opt of expression option ] -> string -> arg
78+ val ( $ ) : (expression -> 'a) t -> arg -> 'a t
6679 val return : 'a -> 'a t
6780 val mk_function : ?typ : type_constraint -> expression t -> expression
6881end = struct
6982 type 'a t = expr_function_param list * 'a
83+ type arg = expr_function_param * expression
7084
71- let ( $ ) (params , body ) (lbl , ident ) =
72- let exp = mk_exp_var ident and pat = Pat. var (mk_loc ident) in
73- let params = mk_function_param ~lbl pat :: params in
74- (params, body exp)
75-
85+ let ( $ ) (params , body ) (param , exp ) = (param :: params, body exp)
7686 let return f = ([] , f)
7787
88+ let arg ?lbl name =
89+ let lbl, def =
90+ match lbl with
91+ | Some `Lbl -> (Some (mk_lbl name), None )
92+ | Some (`Opt def ) -> (Some (mk_lblopt name), def)
93+ | None -> (None , None )
94+ in
95+ let exp = mk_exp_var name and pat = Pat. var (mk_loc name) in
96+ (mk_function_param ?lbl ?def pat, exp)
97+
7898 let mk_function ?typ (params , body ) =
7999 Exp. function_ (List. rev params) typ (Pfunction_body body)
80100end
81101
82- let mk_fun ?(arg_lbl = Nolabel ) ?( arg_name = " x" ) f =
102+ let mk_fun ?(arg_name = " x" ) f =
83103 let open Mk_function in
84- mk_function (return f $ (arg_lbl, arg_name) )
104+ mk_function (return f $ arg arg_name)
85105
86106let is_unit_val = function
87107 | { pexp_desc = Pexp_construct (ident , None); _ } ->
@@ -98,13 +118,24 @@ let mk_binding_op ?(loc = !default_loc) ?(is_pun = false) op pat ?(args = [])
98118 ?(typ = None ) exp =
99119 Exp. binding_op op pat args typ exp is_pun loc
100120
101- let mk_lbl s = Labelled (mk_loc s)
102- let mk_lblopt s = Optional (mk_loc s)
103121let mk_apply_ident ident args = Exp. apply (mk_exp_ident ident) args
104122
105123let mk_apply_simple f_ident args =
106124 mk_apply_ident f_ident (List. map (fun x -> (Nolabel , x)) args)
107125
126+ (* * Generate an expression that read the value of a optional argument obtained
127+ with [Unpack_apply.take_lblopt]. *)
128+ let value_of_lblopt ~default arg =
129+ match arg with
130+ | Some (exp , `Lbl) -> exp
131+ | Some (exp , `Opt) ->
132+ Exp. match_ exp
133+ [
134+ Exp. case (mk_pat_some (Pat. var (mk_loc " x" ))) (mk_exp_var " x" );
135+ Exp. case mk_pat_none default;
136+ ]
137+ | None -> default
138+
108139(* * Flatten a pipelines composed of [|>] and [@@] into a [Pexp_apply] node. *)
109140let rec flatten_apply exp =
110141 let flatten callee arg =
0 commit comments