@@ -58,9 +58,25 @@ let make_vb_nd ~has_config ~loc ~str_loc ?axis_labels ~ident ~init_nd string =
5858 let vb = Ast_helper.Vb. mk ~loc pat v in
5959 (pat, vb)
6060
61- let rec translate ~is_toplevel ~has_config ?label expr =
61+ let lift_config_vb ~loop ~num_configs ?label ~expr1 ~c_expr arg_exprs =
62+ let vbs1, e1 = loop ?label expr1 in
63+ let vbss, es = List. unzip @@ List. map arg_exprs ~f: loop in
64+ let ident = " config_block__" ^ Int. to_string ! num_configs in
65+ Int. incr num_configs;
66+ let loc = expr1.pexp_loc in
67+ let pat = Ast_helper.Pat. var ~loc { loc = c_expr.pexp_loc; txt = ident } in
68+ let v = [% expr [% e e1] ~config: [% e c_expr]] in
69+ let vb = Ast_helper.Vb. mk ~loc pat v in
70+ ( Map. add_exn ~key: ident ~data: vb @@ reduce_vbss (vbs1 :: vbss),
71+ match es with
72+ | [] -> [% expr [% e pat2expr pat]]
73+ | [ e2 ] -> [% expr [% e pat2expr pat] [% e e2]]
74+ | [ e2; e3 ] -> [% expr [% e pat2expr pat] [% e e2] [% e e3]]
75+ | _ -> assert false )
76+
77+ let rec translate ~num_configs ~is_toplevel ~has_config ?label expr =
6278 let loc = expr.pexp_loc in
63- let loop = translate ~is_toplevel: false ~has_config in
79+ let loop = translate ~num_configs ~ is_toplevel:false ~has_config in
6480 match expr with
6581 | { pexp_desc = Pexp_constant (Pconst_float _ ); _ } ->
6682 (no_vbs, [% expr TDSL. number ?label:[% e opt_expr ~loc label] [% e expr]])
@@ -130,6 +146,12 @@ let rec translate ~is_toplevel ~has_config ?label expr =
130146 | [% expr [% e? expr1] **. [% e? expr2]] ->
131147 let vbs, e1 = loop expr1 in
132148 (vbs, [% expr TDSL.O. ( **. ) ?label:[% e opt_expr ~loc label] [% e e1] [% e expr2]])
149+ | [% expr [% e? expr1] ~config: [% e? c_expr] [% e? expr2] [% e? expr3]] ->
150+ lift_config_vb ~loop ~num_configs ?label ~expr1 ~c_expr [ expr2; expr3 ]
151+ | [% expr [% e? expr1] ~config: [% e? c_expr] [% e? expr2]] ->
152+ lift_config_vb ~loop ~num_configs ?label ~expr1 ~c_expr [ expr2 ]
153+ | [% expr [% e? expr1] ~config: [% e? c_expr]] ->
154+ lift_config_vb ~loop ~num_configs ?label ~expr1 ~c_expr []
133155 | [% expr [% e? expr1] [% e? expr2] [% e? expr3]] ->
134156 let vbs1, e1 = loop ?label expr1 in
135157 let vbs2, e2 = loop expr2 in
@@ -138,13 +160,11 @@ let rec translate ~is_toplevel ~has_config ?label expr =
138160 | [% expr [% e? expr1] [% e? expr2]] ->
139161 let vbs1, e1 = loop ?label expr1 in
140162 let vbs2, e2 = loop expr2 in
141- (Map. merge_skewed vbs1 vbs2 ~combine: (fun ~key :_ _v1 v2 -> v2), [% expr [% e e1] [% e e2]])
142- | [% expr fun ~config -> [% e? body]] ->
143- let vbs, body = translate ~is_toplevel: true ~has_config: true ?label body in
144- (no_vbs, [% expr fun ~config -> [% e let_opt ~loc vbs body]])
145- | [% expr fun ~(config : [%typ? config_ty] ) -> [% e? body]] ->
146- let vbs, body = translate ~is_toplevel: true ~has_config: true ?label body in
147- (no_vbs, [% expr fun ~(config : [%typ ty] ) -> [% e let_opt ~loc vbs body]])
163+ (reduce_vbss [ vbs1; vbs2 ], [% expr [% e e1] [% e e2]])
164+ | { pexp_desc = Pexp_fun (Labelled "config" , c_e , c_pat , body ); _ } ->
165+ let vbs, body = translate ~num_configs ~is_toplevel: true ~has_config: true ?label body in
166+ let body = let_opt ~loc vbs body in
167+ (no_vbs, {expr with pexp_desc = Pexp_fun (Labelled " config" , c_e, c_pat, body)})
148168 | [% expr fun [%p ? pat ] -> [% e? body]] when is_toplevel ->
149169 let input_label =
150170 let loc = pat.ppat_loc in
@@ -240,7 +260,7 @@ let rec translate ~is_toplevel ~has_config ?label expr =
240260
241261let translate ?ident_label expr =
242262 let vbs, expr =
243- translate ~is_toplevel: true ~has_config: false
263+ translate ~num_configs: ( ref 0 ) ~ is_toplevel:true ~has_config: false
244264 ~label: (opt_pat2string_list ~loc: expr.pexp_loc ident_label)
245265 expr
246266 in
0 commit comments