@@ -76,6 +76,15 @@ let equal_mod = "GRAIN$MODULE$runtime/equal";
7676let equal_ident = Ident . create_persistent("equal" );
7777let equal_closure_ident = Ident . create_persistent("GRAIN$EXPORT$equal" );
7878
79+ /* List concat */
80+ let collection_concat_mod = "GRAIN$MODULE$runtime/concat" ;
81+ let list_concat_ident = Ident . create_persistent("listConcat" );
82+ let list_concat_closure_ident =
83+ Ident . create_persistent("GRAIN$EXPORT$listConcat" );
84+ let array_concat_ident = Ident . create_persistent("arrayConcat" );
85+ let array_concat_closure_ident =
86+ Ident . create_persistent("GRAIN$EXPORT$arrayConcat" );
87+
7988/* JS-runner support */
8089let console_mod = "console" ;
8190let tracepoint_ident = Ident . create_persistent("tracepoint" );
@@ -147,6 +156,24 @@ let grain_runtime_imports = [
147156 mimp_setup: MSetupNone ,
148157 mimp_used: false ,
149158 },
159+ {
160+ mimp_id: list_concat_closure_ident,
161+ mimp_mod: collection_concat_mod,
162+ mimp_name: Ident . name(list_concat_closure_ident),
163+ mimp_type: MGlobalImport (Types . Unmanaged (WasmI32 ), true ),
164+ mimp_kind: MImportWasm ,
165+ mimp_setup: MSetupNone ,
166+ mimp_used: false ,
167+ },
168+ {
169+ mimp_id: array_concat_closure_ident,
170+ mimp_mod: collection_concat_mod,
171+ mimp_name: Ident . name(array_concat_closure_ident),
172+ mimp_type: MGlobalImport (Types . Unmanaged (WasmI32 ), true ),
173+ mimp_kind: MImportWasm ,
174+ mimp_setup: MSetupNone ,
175+ mimp_used: false ,
176+ },
150177] ;
151178
152179let runtime_global_imports =
@@ -230,6 +257,24 @@ let grain_function_imports = [
230257 mimp_setup: MSetupNone ,
231258 mimp_used: false ,
232259 },
260+ {
261+ mimp_id: list_concat_ident,
262+ mimp_mod: collection_concat_mod,
263+ mimp_name: Ident . name(list_concat_ident),
264+ mimp_type: MFuncImport ([ Types . Managed , Types . Managed ] , [ Types . Managed ] ),
265+ mimp_kind: MImportWasm ,
266+ mimp_setup: MSetupNone ,
267+ mimp_used: false ,
268+ },
269+ {
270+ mimp_id: array_concat_ident,
271+ mimp_mod: collection_concat_mod,
272+ mimp_name: Ident . name(array_concat_ident),
273+ mimp_type: MFuncImport ([ Types . Managed , Types . Managed ] , [ Types . Managed ] ),
274+ mimp_kind: MImportWasm ,
275+ mimp_setup: MSetupNone ,
276+ mimp_used: false ,
277+ },
233278] ;
234279
235280let runtime_function_imports =
@@ -388,6 +433,44 @@ let call_equal = (wasm_mod, env, args) =>
388433 ] ,
389434 Type . int32,
390435 );
436+ let call_list_concat = (wasm_mod, env, args) => {
437+ let args = [
438+ Expression . Global_get . make(
439+ wasm_mod,
440+ get_wasm_imported_name(
441+ collection_concat_mod,
442+ list_concat_closure_ident,
443+ ),
444+ Type . int32,
445+ ),
446+ ... args,
447+ ] ;
448+ Expression . Call . make(
449+ wasm_mod,
450+ get_wasm_imported_name(collection_concat_mod, list_concat_ident),
451+ args,
452+ Type . int32,
453+ );
454+ };
455+ let call_array_concat = (wasm_mod, env, args) => {
456+ let args = [
457+ Expression . Global_get . make(
458+ wasm_mod,
459+ get_wasm_imported_name(
460+ collection_concat_mod,
461+ array_concat_closure_ident,
462+ ),
463+ Type . int32,
464+ ),
465+ ... args,
466+ ] ;
467+ Expression . Call . make(
468+ wasm_mod,
469+ get_wasm_imported_name(collection_concat_mod, array_concat_ident),
470+ args,
471+ Type . int32,
472+ );
473+ };
391474
392475/** Will print "tracepoint <n> reached" to the console when executed (for debugging WASM output) */
393476
@@ -3029,6 +3112,14 @@ and compile_instr = (wasm_mod, env, instr) =>
30293112 compile_record_op(wasm_mod, env, record, record_op)
30303113 | MClosureOp (closure_op , closure ) =>
30313114 compile_closure_op(wasm_mod, env, closure, closure_op)
3115+ | MCollectionConcat (t , colls ) =>
3116+ let colls_arr = allocate_array(wasm_mod, env, colls);
3117+ let concat =
3118+ switch (t) {
3119+ | TExpListConcat => call_list_concat
3120+ | TExpArrayConcat => call_array_concat
3121+ };
3122+ concat(wasm_mod, env, [ colls_arr] );
30323123 | MPrim0 (p0 ) => compile_prim0(wasm_mod, env, p0)
30333124 | MPrim1 (p1 , arg ) => compile_prim1(wasm_mod, env, p1, arg, instr. instr_loc)
30343125 | MPrim2 (p2 , arg1 , arg2 ) => compile_prim2(wasm_mod, env, p2, arg1, arg2)
0 commit comments