Skip to content

Commit e4581b2

Browse files
committed
Remove the arity parameter of type function$.
1 parent a8ad4c9 commit e4581b2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+268
-411
lines changed

analysis/src/CompletionBackEnd.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1362,7 +1362,7 @@ let rec completeTypedValue ?(typeArgContext : typeArgContext option) ~rawOpens
13621362
| Tlink t1
13631363
| Tsubst t1
13641364
| Tpoly (t1, [])
1365-
| Tconstr (Pident {name = "function$"}, [t1; _], _) ->
1365+
| Tconstr (Pident {name = "function$"}, [t1], _) ->
13661366
fnReturnsTypeT t1
13671367
| Tarrow _ -> (
13681368
match TypeUtils.extractFunctionType ~env ~package:full.package t with

analysis/src/CompletionJsx.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ let getJsxLabels ~componentPath ~findTypeOfValue ~package =
238238
| Tlink t1
239239
| Tsubst t1
240240
| Tpoly (t1, [])
241-
| Tconstr (Pident {name = "function$"}, [t1; _], _) ->
241+
| Tconstr (Pident {name = "function$"}, [t1], _) ->
242242
getLabels t1
243243
| Tconstr (p, [propsType], _) when Path.name p = "React.component" -> (
244244
let rec getPropsType (t : Types.type_expr) =

analysis/src/CreateInterface.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ let printSignature ~extractor ~signature =
123123
Ctype.newconstr (Pdot (Pident (Ident.create "React"), "element", 0)) []
124124
in
125125
match typ.desc with
126-
| Tconstr (Pident {name = "function$"}, [typ; _], _) -> getComponentType typ
126+
| Tconstr (Pident {name = "function$"}, [typ], _) -> getComponentType typ
127127
| Tarrow
128128
(_, {desc = Tconstr (Path.Pident propsId, typeArgs, _)}, retType, _, _)
129129
when Ident.name propsId = "props" ->

analysis/src/SignatureHelp.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ let extractParameters ~signature ~typeStrForParser ~labelPrefixLen =
118118
ptyp_desc =
119119
Ptyp_constr
120120
( {txt = Lident "function$"},
121-
[({ptyp_desc = Ptyp_arrow _} as expr); _] );
121+
[({ptyp_desc = Ptyp_arrow _} as expr)] );
122122
};
123123
};
124124
} );

analysis/src/TypeUtils.ml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ let findTypeViaLoc ~full ~debug (loc : Location.t) =
3636

3737
let rec pathFromTypeExpr (t : Types.type_expr) =
3838
match t.desc with
39-
| Tconstr (Pident {name = "function$"}, [t; _], _) -> pathFromTypeExpr t
39+
| Tconstr (Pident {name = "function$"}, [t], _) -> pathFromTypeExpr t
4040
| Tconstr (path, _typeArgs, _)
4141
| Tlink {desc = Tconstr (path, _typeArgs, _)}
4242
| Tsubst {desc = Tconstr (path, _typeArgs, _)}
@@ -243,7 +243,7 @@ let rec extractFunctionType ~env ~package typ =
243243
match t.desc with
244244
| Tlink t1 | Tsubst t1 | Tpoly (t1, []) -> loop ~env acc t1
245245
| Tarrow (label, tArg, tRet, _, _) -> loop ~env ((label, tArg) :: acc) tRet
246-
| Tconstr (Pident {name = "function$"}, [t; _], _) ->
246+
| Tconstr (Pident {name = "function$"}, [t], _) ->
247247
extractFunctionType ~env ~package t
248248
| Tconstr (path, typeArgs, _) -> (
249249
match References.digConstructor ~env ~package path with
@@ -283,7 +283,7 @@ let rec extractFunctionType2 ?typeArgContext ~env ~package typ =
283283
| Tlink t1 | Tsubst t1 | Tpoly (t1, []) -> loop ?typeArgContext ~env acc t1
284284
| Tarrow (label, tArg, tRet, _, _) ->
285285
loop ?typeArgContext ~env ((label, tArg) :: acc) tRet
286-
| Tconstr (Pident {name = "function$"}, [t; _], _) ->
286+
| Tconstr (Pident {name = "function$"}, [t], _) ->
287287
extractFunctionType2 ?typeArgContext ~env ~package t
288288
| Tconstr (path, typeArgs, _) -> (
289289
match References.digConstructor ~env ~package path with
@@ -334,7 +334,7 @@ let rec extractType ?(printOpeningDebug = true)
334334
Some (Tstring env, typeArgContext)
335335
| Tconstr (Path.Pident {name = "exn"}, [], _) ->
336336
Some (Texn env, typeArgContext)
337-
| Tconstr (Pident {name = "function$"}, [t; _], _) -> (
337+
| Tconstr (Pident {name = "function$"}, [t], _) -> (
338338
match extractFunctionType2 ?typeArgContext t ~env ~package with
339339
| args, tRet, typeArgContext when args <> [] ->
340340
Some
@@ -910,7 +910,7 @@ let getArgs ~env (t : Types.type_expr) ~full =
910910
| Tlink t1
911911
| Tsubst t1
912912
| Tpoly (t1, [])
913-
| Tconstr (Pident {name = "function$"}, [t1; _], _) ->
913+
| Tconstr (Pident {name = "function$"}, [t1], _) ->
914914
getArgsLoop ~full ~env ~currentArgumentPosition t1
915915
| Tarrow (Labelled l, tArg, tRet, _, _) ->
916916
(SharedTypes.Completable.Labelled l, tArg)

compiler/frontend/ast_core_type_class_type.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ let typ_mapper (self : Bs_ast_mapper.mapper) (ty : Parsetree.core_type) =
7373
| Ptyp_constr
7474
(* function$<...> is re-wrapped around only in case Nothing below *)
7575
( {txt = Lident "function$"},
76-
[{ptyp_desc = Ptyp_arrow (label, args, body, _)}; _] ) );
76+
[{ptyp_desc = Ptyp_arrow (label, args, body, _)}] ) );
7777
(* let it go without regard label names,
7878
it will report error later when the label is not empty
7979
*)

compiler/frontend/ast_external_process.ml

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -935,21 +935,16 @@ let handle_attributes (loc : Bs_loc.t) (type_annotation : Parsetree.core_type)
935935
let prim_name_with_source = {name = prim_name; source = External} in
936936
let type_annotation, build_uncurried_type =
937937
match type_annotation.ptyp_desc with
938-
| Ptyp_constr (({txt = Lident "function$"; _} as lid), [t; arity_]) ->
938+
| Ptyp_constr (({txt = Lident "function$"; _} as lid), [t]) ->
939939
( t,
940940
fun ~arity (x : Parsetree.core_type) ->
941-
let t_arity =
942-
match arity with
943-
| Some arity -> Ast_uncurried.arity_type ~loc arity
944-
| None -> arity_
945-
in
946941
let x =
947942
match x.ptyp_desc with
948943
| Ptyp_arrow (l, t1, t2, _) ->
949944
{x with ptyp_desc = Ptyp_arrow (l, t1, t2, arity)}
950945
| _ -> x
951946
in
952-
{x with Parsetree.ptyp_desc = Ptyp_constr (lid, [x; t_arity])} )
947+
{x with Parsetree.ptyp_desc = Ptyp_constr (lid, [x])} )
953948
| _ -> (type_annotation, fun ~arity:_ x -> x)
954949
in
955950
let result_type, arg_types_ty =

compiler/gentype/TranslateTypeExprFromTypes.ml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,7 @@ let translate_constr ~config ~params_translation ~(path : Path.t) ~type_env =
231231
{param_translation with type_ = Promise param_translation.type_}
232232
| (["Js"; "Dict"; "t"] | ["Dict"; "t"] | ["dict"]), [param_translation] ->
233233
{param_translation with type_ = Dict param_translation.type_}
234-
| ["function$"], [arg; _arity] ->
235-
{dependencies = arg.dependencies; type_ = arg.type_}
234+
| ["function$"], [arg] -> {dependencies = arg.dependencies; type_ = arg.type_}
236235
| _ -> default_case ()
237236

238237
type process_variant = {

compiler/ml/ast_mapper_from0.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ module T = struct
123123
let fun_t =
124124
{fun_t with ptyp_desc = Ptyp_arrow (lbl, t1, t2, Some arity)}
125125
in
126-
{typ0 with ptyp_desc = Ptyp_constr (lid, [fun_t; t_arity])}
126+
{typ0 with ptyp_desc = Ptyp_constr (lid, [fun_t])}
127127
| _ -> typ0)
128128
| Ptyp_object (l, o) ->
129129
object_ ~loc ~attrs (List.map (object_field sub) l) o

compiler/ml/ast_mapper_to0.ml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,17 @@ module T = struct
101101
| Ptyp_arrow (lab, t1, t2, _) ->
102102
arrow ~loc ~attrs lab (sub.typ sub t1) (sub.typ sub t2)
103103
| Ptyp_tuple tyl -> tuple ~loc ~attrs (List.map (sub.typ sub) tyl)
104+
| Ptyp_constr
105+
( ({txt = Lident "function$"} as lid),
106+
[({ptyp_desc = Ptyp_arrow (_, _, _, Some arity)} as t_arg)] ) ->
107+
let encode_arity_string arity = "Has_arity" ^ string_of_int arity in
108+
let arity_type ~loc arity =
109+
Ast_helper0.Typ.variant ~loc
110+
[Rtag ({txt = encode_arity_string arity; loc}, [], true, [])]
111+
Closed None
112+
in
113+
constr ~loc ~attrs (map_loc sub lid)
114+
[sub.typ sub t_arg; arity_type ~loc:Location.none arity]
104115
| Ptyp_constr (lid, tl) ->
105116
constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tl)
106117
| Ptyp_object (l, o) ->

compiler/ml/ast_uncurried.ml

Lines changed: 7 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,13 @@
11
(* Uncurried AST *)
22

3-
let encode_arity_string arity = "Has_arity" ^ string_of_int arity
4-
5-
let arity_type ~loc arity =
6-
Ast_helper.Typ.variant ~loc
7-
[Rtag ({txt = encode_arity_string arity; loc}, [], true, [])]
8-
Closed None
9-
103
let uncurried_type ~loc ~arity (t_arg : Parsetree.core_type) =
114
let t_arg =
125
match t_arg.ptyp_desc with
136
| Ptyp_arrow (l, t1, t2, _) ->
147
{t_arg with ptyp_desc = Ptyp_arrow (l, t1, t2, Some arity)}
158
| _ -> assert false
169
in
17-
let t_arity = arity_type ~loc arity in
18-
Ast_helper.Typ.constr ~loc {txt = Lident "function$"; loc} [t_arg; t_arity]
10+
Ast_helper.Typ.constr ~loc {txt = Lident "function$"; loc} [t_arg]
1911

2012
let uncurried_fun ~arity fun_expr =
2113
let fun_expr =
@@ -38,40 +30,27 @@ let expr_extract_uncurried_fun (expr : Parsetree.expression) =
3830

3931
let core_type_is_uncurried_fun (typ : Parsetree.core_type) =
4032
match typ.ptyp_desc with
41-
| Ptyp_constr ({txt = Lident "function$"}, [{ptyp_desc = Ptyp_arrow _}; _]) ->
33+
| Ptyp_constr ({txt = Lident "function$"}, [{ptyp_desc = Ptyp_arrow _}]) ->
4234
true
4335
| _ -> false
4436

4537
let core_type_extract_uncurried_fun (typ : Parsetree.core_type) =
4638
match typ.ptyp_desc with
4739
| Ptyp_constr
4840
( {txt = Lident "function$"},
49-
[({ptyp_desc = Ptyp_arrow (_, _, _, Some arity)} as t_arg); _] ) ->
41+
[({ptyp_desc = Ptyp_arrow (_, _, _, Some arity)} as t_arg)] ) ->
5042
(arity, t_arg)
5143
| _ -> assert false
5244

5345
let type_is_uncurried_fun = Ast_uncurried_utils.type_is_uncurried_fun
5446

5547
let type_extract_uncurried_fun (typ : Types.type_expr) =
5648
match typ.desc with
57-
| Tconstr (Pident {name = "function$"}, [t_arg; _], _) -> t_arg
49+
| Tconstr (Pident {name = "function$"}, [t_arg], _) -> t_arg
5850
| _ -> assert false
5951

6052
(* Typed AST *)
6153

62-
let arity_to_type arity =
63-
let arity_s = encode_arity_string arity in
64-
Ctype.newty
65-
(Tvariant
66-
{
67-
row_fields = [(arity_s, Rpresent None)];
68-
row_more = Ctype.newty Tnil;
69-
row_bound = ();
70-
row_closed = true;
71-
row_fixed = false;
72-
row_name = None;
73-
})
74-
7554
let tarrow_to_arity (t_arity : Types.type_expr) =
7655
match (Ctype.repr t_arity).desc with
7756
| Tarrow (_, _, _, _, Some arity) -> arity
@@ -86,7 +65,6 @@ let tarrow_to_arity_opt (t_arity : Types.type_expr) =
8665
| _ -> None
8766

8867
let make_uncurried_type ~env ~arity (t : Types.type_expr) =
89-
let typ_arity = arity_to_type arity in
9068
let lid : Longident.t = Lident "function$" in
9169
let path = Env.lookup_type lid env in
9270
let t =
@@ -97,15 +75,14 @@ let make_uncurried_type ~env ~arity (t : Types.type_expr) =
9775
| Tvar _ -> t
9876
| _ -> assert false
9977
in
100-
Ctype.newconstr path [t; typ_arity]
78+
Ctype.newconstr path [t]
10179

10280
let uncurried_type_get_arity ~env typ =
10381
match (Ctype.expand_head env typ).desc with
104-
| Tconstr (Pident {name = "function$"}, [t; _arity], _) -> tarrow_to_arity t
82+
| Tconstr (Pident {name = "function$"}, [t], _) -> tarrow_to_arity t
10583
| _ -> assert false
10684

10785
let uncurried_type_get_arity_opt ~env typ =
10886
match (Ctype.expand_head env typ).desc with
109-
| Tconstr (Pident {name = "function$"}, [t; _arity], _) ->
110-
Some (tarrow_to_arity t)
87+
| Tconstr (Pident {name = "function$"}, [t], _) -> Some (tarrow_to_arity t)
11188
| _ -> None

compiler/ml/ast_uncurried_utils.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
let type_is_uncurried_fun (typ : Types.type_expr) =
22
match typ.desc with
3-
| Tconstr (Pident {name = "function$"}, [{desc = Tarrow _}; _], _) -> true
3+
| Tconstr (Pident {name = "function$"}, [{desc = Tarrow _}], _) -> true
44
| _ -> false

compiler/ml/ctype.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2299,7 +2299,7 @@ and unify3 env t1 t1' t2 t2' =
22992299
| Tfield _, Tfield _ ->
23002300
(* special case for GADTs *)
23012301
unify_fields env t1' t2'
2302-
| Tconstr (Pident {name = "function$"}, [t_fun; _], _), Tarrow _ ->
2302+
| Tconstr (Pident {name = "function$"}, [t_fun], _), Tarrow _ ->
23032303
(* subtype: an uncurried function is cast to a curried one *)
23042304
unify2 env t_fun t2
23052305
| _ -> (

compiler/ml/predef.ml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -319,13 +319,13 @@ let common_initial_env add_type add_extension empty_env =
319319
Record_regular );
320320
}
321321
and decl_uncurried =
322-
let tvar1, tvar2 = (newgenvar (), newgenvar ()) in
322+
let tvar1 = newgenvar () in
323323
{
324324
decl_abstr with
325-
type_params = [tvar1; tvar2];
326-
type_arity = 2;
325+
type_params = [tvar1];
326+
type_arity = 1;
327327
type_kind = Type_variant [cstr ident_ctor_uncurried [tvar1]];
328-
type_variance = [Variance.covariant; Variance.covariant];
328+
type_variance = [Variance.covariant];
329329
type_unboxed = Types.unboxed_true_default_false;
330330
}
331331
and decl_unknown =

compiler/ml/typecore.ml

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3530,7 +3530,7 @@ and type_application ?type_clash_context uncurried env funct (sargs : sargs) :
35303530
let has_uncurried_type funct =
35313531
let t = funct.exp_type in
35323532
match (expand_head env t).desc with
3533-
| Tconstr (Pident {name = "function$"}, [t; _t_arity], _) ->
3533+
| Tconstr (Pident {name = "function$"}, [t], _) ->
35343534
let arity =
35353535
match Ast_uncurried.tarrow_to_arity_opt t with
35363536
| Some arity -> arity
@@ -4333,10 +4333,7 @@ let report_error env ppf = function
43334333
"This function is a curried function where an uncurried function is \
43344334
expected"
43354335
| Expr_type_clash
4336-
( ( _,
4337-
{
4338-
desc = Tconstr (Pident {name = "function$"}, [{desc = Tvar _}; _], _);
4339-
} )
4336+
( (_, {desc = Tconstr (Pident {name = "function$"}, [{desc = Tvar _}], _)})
43404337
:: (_, {desc = Tarrow _})
43414338
:: _,
43424339
_ ) ->
@@ -4349,15 +4346,15 @@ let report_error env ppf = function
43494346
desc =
43504347
Tconstr
43514348
( Pident {name = "function$"},
4352-
[{desc = Tarrow (_, _, _, _, Some arity_a)}; _],
4349+
[{desc = Tarrow (_, _, _, _, Some arity_a)}],
43534350
_ );
43544351
} )
43554352
:: ( _,
43564353
{
43574354
desc =
43584355
Tconstr
43594356
( Pident {name = "function$"},
4360-
[{desc = Tarrow (_, _, _, _, Some arity_b)}; _],
4357+
[{desc = Tarrow (_, _, _, _, Some arity_b)}],
43614358
_ );
43624359
} )
43634360
:: _,

compiler/syntax/src/res_comments_table.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1865,7 +1865,7 @@ and walk_core_type typ t comments =
18651865
| Ptyp_variant (row_fields, _, _) ->
18661866
walk_list (row_fields |> List.map (fun rf -> RowField rf)) t comments
18671867
| Ptyp_constr
1868-
({txt = Lident "function$"}, [({ptyp_desc = Ptyp_arrow _} as desc); _]) ->
1868+
({txt = Lident "function$"}, [({ptyp_desc = Ptyp_arrow _} as desc)]) ->
18691869
walk_core_type desc t comments
18701870
| Ptyp_constr (longident, typexprs) ->
18711871
let before_longident, _afterLongident =

compiler/syntax/src/res_outcome_printer.ml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,10 @@ let rec print_out_type_doc (out_type : Outcometree.out_type) =
156156
[(Otyp_arrow _ as arrow_type)] ) ->
157157
(* Compatibility with compiler up to v10.x *)
158158
print_out_arrow_type arrow_type
159-
| Otyp_constr (Oide_ident "function$", [(Otyp_arrow _ as arrow_type); _arity])
160-
->
161-
(* function$<(int, int) => int, [#2]> -> (. int, int) => int *)
159+
| Otyp_constr (Oide_ident "function$", [(Otyp_arrow _ as arrow_type)]) ->
160+
(* function$<(int, int) => int> -> (int, int) => int *)
162161
print_out_arrow_type arrow_type
163-
| Otyp_constr (Oide_ident "function$", [Otyp_var _; _arity]) ->
162+
| Otyp_constr (Oide_ident "function$", [Otyp_var _]) ->
164163
(* function$<'a, arity> -> _ => _ *)
165164
print_out_type_doc (Otyp_stuff "_ => _")
166165
| Otyp_constr (out_ident, []) ->
@@ -299,7 +298,7 @@ and print_out_arrow_type typ =
299298
| [
300299
( _,
301300
( Otyp_tuple _ | Otyp_arrow _
302-
| Otyp_constr (Oide_ident "function$", [Otyp_arrow _; _]) ) );
301+
| Otyp_constr (Oide_ident "function$", [Otyp_arrow _]) ) );
303302
] ->
304303
true
305304
(* single argument should not be wrapped *)

tests/syntax_tests/data/parsing/errors/other/expected/labelledParameters.res.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,4 @@
3434
let f [arity:3]x ?(y= 2) z = (x + y) + z
3535
let g [arity:3]~x:((x)[@res.namedArgLoc ]) ?y:(((y)[@res.namedArgLoc ])= 2)
3636
~z:((z)[@res.namedArgLoc ]) = (x + y) + z
37-
type nonrec f = (x:int -> y:int -> int (a:2), [ `Has_arity2 ]) function$
37+
type nonrec f = (x:int -> y:int -> int (a:2)) function$

tests/syntax_tests/data/parsing/errors/other/expected/regionMissingComma.res.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424

2525
external make :
2626
(?style:((ReactDOMRe.Style.t)[@res.namedArgLoc ]) ->
27-
?image:((bool)[@res.namedArgLoc ]) -> React.element (a:2),
28-
[ `Has_arity2 ]) function$ = "ModalContent"
27+
?image:((bool)[@res.namedArgLoc ]) -> React.element (a:2))
28+
function$ = "ModalContent"
2929
type nonrec 'extraInfo student =
3030
{
3131
name: string ;

tests/syntax_tests/data/parsing/errors/structure/expected/external.res.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,4 @@
99
An external requires the name of the JS value you're referring to, like "setTimeout".
1010

1111
external setTimeout :
12-
((unit -> unit (a:1), [ `Has_arity1 ]) function$ -> int -> float (a:2),
13-
[ `Has_arity2 ]) function$
12+
((unit -> unit (a:1)) function$ -> int -> float (a:2)) function$

tests/syntax_tests/data/parsing/errors/typeDef/expected/inlineRecord.res.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,6 @@ type nonrec user =
4646
let make
4747
[arity:1](props :
4848
<
49-
handleClick: (Click.t -> unit (a:1), [ `Has_arity1 ])
50-
function$ ;value: string > )
49+
handleClick: (Click.t -> unit (a:1)) function$ ;value:
50+
string > )
5151
= render props

tests/syntax_tests/data/parsing/errors/typeDef/expected/namedParameters.res.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@
77

88
A labeled parameter starts with a `~`. Did you mean: `~stroke`?
99

10-
type nonrec draw = (stroke:pencil -> unit (a:1), [ `Has_arity1 ]) function$
10+
type nonrec draw = (stroke:pencil -> unit (a:1)) function$

0 commit comments

Comments
 (0)