@barefootjs/mojolicious 0.5.3 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter/index.js +91 -4
- package/dist/adapter/mojo-adapter.d.ts.map +1 -1
- package/dist/build.js +91 -4
- package/dist/index.js +91 -4
- package/lib/BarefootJS.pm +288 -0
- package/package.json +3 -3
- package/src/__tests__/mojo-adapter.test.ts +180 -20
- package/src/adapter/mojo-adapter.ts +183 -13
package/dist/adapter/index.js
CHANGED
|
@@ -770,7 +770,7 @@ function renderArrayMethod(method, object, args, emit) {
|
|
|
770
770
|
switch (method) {
|
|
771
771
|
case "join": {
|
|
772
772
|
const obj = emit(object);
|
|
773
|
-
const sep = emit(args[0])
|
|
773
|
+
const sep = args.length >= 1 ? emit(args[0]) : `','`;
|
|
774
774
|
return `join(${sep}, @{${obj}})`;
|
|
775
775
|
}
|
|
776
776
|
case "includes": {
|
|
@@ -787,18 +787,21 @@ function renderArrayMethod(method, object, args, emit) {
|
|
|
787
787
|
}
|
|
788
788
|
case "at": {
|
|
789
789
|
const obj = emit(object);
|
|
790
|
-
const idx = emit(args[0]);
|
|
790
|
+
const idx = args.length >= 1 ? emit(args[0]) : "0";
|
|
791
791
|
return `bf->at(${obj}, ${idx})`;
|
|
792
792
|
}
|
|
793
793
|
case "concat": {
|
|
794
|
+
if (args.length === 0) {
|
|
795
|
+
return emit(object);
|
|
796
|
+
}
|
|
794
797
|
const a = emit(object);
|
|
795
798
|
const b = emit(args[0]);
|
|
796
799
|
return `bf->concat(${a}, ${b})`;
|
|
797
800
|
}
|
|
798
801
|
case "slice": {
|
|
799
802
|
const recv = emit(object);
|
|
800
|
-
const start = emit(args[0]);
|
|
801
|
-
const end = args.length
|
|
803
|
+
const start = args.length >= 1 ? emit(args[0]) : "0";
|
|
804
|
+
const end = args.length >= 2 ? emit(args[1]) : "undef";
|
|
802
805
|
return `bf->slice(${recv}, ${start}, ${end})`;
|
|
803
806
|
}
|
|
804
807
|
case "reverse":
|
|
@@ -818,6 +821,53 @@ function renderArrayMethod(method, object, args, emit) {
|
|
|
818
821
|
const recv = emit(object);
|
|
819
822
|
return `bf->trim(${recv})`;
|
|
820
823
|
}
|
|
824
|
+
case "split": {
|
|
825
|
+
const recv = emit(object);
|
|
826
|
+
if (args.length === 0) {
|
|
827
|
+
return `bf->split(${recv})`;
|
|
828
|
+
}
|
|
829
|
+
const sep = emit(args[0]);
|
|
830
|
+
if (args.length === 1) {
|
|
831
|
+
return `bf->split(${recv}, ${sep})`;
|
|
832
|
+
}
|
|
833
|
+
const limit = emit(args[1]);
|
|
834
|
+
return `bf->split(${recv}, ${sep}, ${limit})`;
|
|
835
|
+
}
|
|
836
|
+
case "startsWith":
|
|
837
|
+
case "endsWith": {
|
|
838
|
+
const fn = method === "startsWith" ? "starts_with" : "ends_with";
|
|
839
|
+
const recv = emit(object);
|
|
840
|
+
const arg = emit(args[0]);
|
|
841
|
+
if (args.length >= 2) {
|
|
842
|
+
return `bf->${fn}(${recv}, ${arg}, ${emit(args[1])})`;
|
|
843
|
+
}
|
|
844
|
+
return `bf->${fn}(${recv}, ${arg})`;
|
|
845
|
+
}
|
|
846
|
+
case "replace": {
|
|
847
|
+
const recv = emit(object);
|
|
848
|
+
const oldS = emit(args[0]);
|
|
849
|
+
const newS = emit(args[1]);
|
|
850
|
+
return `bf->replace(${recv}, ${oldS}, ${newS})`;
|
|
851
|
+
}
|
|
852
|
+
case "repeat": {
|
|
853
|
+
const recv = emit(object);
|
|
854
|
+
const count = args.length === 0 ? "0" : emit(args[0]);
|
|
855
|
+
return `bf->repeat(${recv}, ${count})`;
|
|
856
|
+
}
|
|
857
|
+
case "padStart":
|
|
858
|
+
case "padEnd": {
|
|
859
|
+
const fn = method === "padStart" ? "pad_start" : "pad_end";
|
|
860
|
+
const recv = emit(object);
|
|
861
|
+
if (args.length === 0) {
|
|
862
|
+
return `bf->${fn}(${recv}, 0)`;
|
|
863
|
+
}
|
|
864
|
+
const target = emit(args[0]);
|
|
865
|
+
if (args.length === 1) {
|
|
866
|
+
return `bf->${fn}(${recv}, ${target})`;
|
|
867
|
+
}
|
|
868
|
+
const pad = emit(args[1]);
|
|
869
|
+
return `bf->${fn}(${recv}, ${target}, ${pad})`;
|
|
870
|
+
}
|
|
821
871
|
default: {
|
|
822
872
|
const _exhaustive = method;
|
|
823
873
|
throw new Error(`renderArrayMethod: unhandled ArrayMethod '${_exhaustive}'`);
|
|
@@ -834,6 +884,25 @@ function renderSortMethod(recv, c) {
|
|
|
834
884
|
});
|
|
835
885
|
return `bf->sort(${recv}, { keys => [${keyHashes.join(", ")}] })`;
|
|
836
886
|
}
|
|
887
|
+
function renderReduceMethod(recv, op, direction) {
|
|
888
|
+
const keyEntry = op.key.kind === "self" ? `key_kind => 'self'` : `key_kind => 'field', key => '${op.key.field}'`;
|
|
889
|
+
const init = op.type === "string" ? `'${op.init.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}'` : op.init;
|
|
890
|
+
return `bf->reduce(${recv}, { op => '${op.op}', ${keyEntry}, type => '${op.type}', init => ${init}, direction => '${direction}' })`;
|
|
891
|
+
}
|
|
892
|
+
function renderFlatMethod(recv, depth) {
|
|
893
|
+
const d = depth === "infinity" ? -1 : depth;
|
|
894
|
+
return `bf->flat(${recv}, ${d})`;
|
|
895
|
+
}
|
|
896
|
+
function renderFlatMapMethod(recv, op) {
|
|
897
|
+
const proj = op.projection;
|
|
898
|
+
if (proj.kind === "tuple") {
|
|
899
|
+
const specs = proj.elements.map((l) => l.kind === "self" ? `['self', '']` : `['field', '${l.field}']`).join(", ");
|
|
900
|
+
return `bf->flat_map_tuple(${recv}, ${specs})`;
|
|
901
|
+
}
|
|
902
|
+
if (proj.kind === "self")
|
|
903
|
+
return `bf->flat_map(${recv}, 'self', '')`;
|
|
904
|
+
return `bf->flat_map(${recv}, 'field', '${proj.field}')`;
|
|
905
|
+
}
|
|
837
906
|
function isStringTypeInfo(type) {
|
|
838
907
|
return type?.kind === "primitive" && type.primitive === "string";
|
|
839
908
|
}
|
|
@@ -958,6 +1027,15 @@ class MojoFilterEmitter {
|
|
|
958
1027
|
sortMethod(_method, object, comparator, emit) {
|
|
959
1028
|
return renderSortMethod(emit(object), comparator);
|
|
960
1029
|
}
|
|
1030
|
+
reduceMethod(method, object, reduceOp, emit) {
|
|
1031
|
+
return renderReduceMethod(emit(object), reduceOp, method === "reduceRight" ? "right" : "left");
|
|
1032
|
+
}
|
|
1033
|
+
flatMethod(object, depth, emit) {
|
|
1034
|
+
return renderFlatMethod(emit(object), depth);
|
|
1035
|
+
}
|
|
1036
|
+
flatMapMethod(object, op, emit) {
|
|
1037
|
+
return renderFlatMapMethod(emit(object), op);
|
|
1038
|
+
}
|
|
961
1039
|
conditional(_test, _consequent, _alternate) {
|
|
962
1040
|
return "1";
|
|
963
1041
|
}
|
|
@@ -1079,6 +1157,15 @@ class MojoTopLevelEmitter {
|
|
|
1079
1157
|
sortMethod(_method, object, comparator, emit) {
|
|
1080
1158
|
return renderSortMethod(emit(object), comparator);
|
|
1081
1159
|
}
|
|
1160
|
+
reduceMethod(method, object, reduceOp, emit) {
|
|
1161
|
+
return renderReduceMethod(emit(object), reduceOp, method === "reduceRight" ? "right" : "left");
|
|
1162
|
+
}
|
|
1163
|
+
flatMethod(object, depth, emit) {
|
|
1164
|
+
return renderFlatMethod(emit(object), depth);
|
|
1165
|
+
}
|
|
1166
|
+
flatMapMethod(object, op, emit) {
|
|
1167
|
+
return renderFlatMapMethod(emit(object), op);
|
|
1168
|
+
}
|
|
1082
1169
|
conditional(test, consequent, alternate, emit) {
|
|
1083
1170
|
return `(${emit(test)} ? ${emit(consequent)} : ${emit(alternate)})`;
|
|
1084
1171
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mojo-adapter.d.ts","sourceRoot":"","sources":["../../src/adapter/mojo-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,MAAM,EACN,SAAS,EACT,MAAM,EACN,YAAY,EACZ,aAAa,EACb,MAAM,EACN,WAAW,EACX,UAAU,EACV,MAAM,EACN,aAAa,EACb,UAAU,EACV,OAAO,EAMP,yBAAyB,EAC1B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAM3B,KAAK,aAAa,EAClB,KAAK,UAAU,EAUhB,MAAM,iBAAiB,CAAA;AAGxB;;;;;;GAMG;AACH,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAC1C,OAAO,KAAK,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"mojo-adapter.d.ts","sourceRoot":"","sources":["../../src/adapter/mojo-adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/build.js
CHANGED
|
@@ -770,7 +770,7 @@ function renderArrayMethod(method, object, args, emit) {
|
|
|
770
770
|
switch (method) {
|
|
771
771
|
case "join": {
|
|
772
772
|
const obj = emit(object);
|
|
773
|
-
const sep = emit(args[0])
|
|
773
|
+
const sep = args.length >= 1 ? emit(args[0]) : `','`;
|
|
774
774
|
return `join(${sep}, @{${obj}})`;
|
|
775
775
|
}
|
|
776
776
|
case "includes": {
|
|
@@ -787,18 +787,21 @@ function renderArrayMethod(method, object, args, emit) {
|
|
|
787
787
|
}
|
|
788
788
|
case "at": {
|
|
789
789
|
const obj = emit(object);
|
|
790
|
-
const idx = emit(args[0]);
|
|
790
|
+
const idx = args.length >= 1 ? emit(args[0]) : "0";
|
|
791
791
|
return `bf->at(${obj}, ${idx})`;
|
|
792
792
|
}
|
|
793
793
|
case "concat": {
|
|
794
|
+
if (args.length === 0) {
|
|
795
|
+
return emit(object);
|
|
796
|
+
}
|
|
794
797
|
const a = emit(object);
|
|
795
798
|
const b = emit(args[0]);
|
|
796
799
|
return `bf->concat(${a}, ${b})`;
|
|
797
800
|
}
|
|
798
801
|
case "slice": {
|
|
799
802
|
const recv = emit(object);
|
|
800
|
-
const start = emit(args[0]);
|
|
801
|
-
const end = args.length
|
|
803
|
+
const start = args.length >= 1 ? emit(args[0]) : "0";
|
|
804
|
+
const end = args.length >= 2 ? emit(args[1]) : "undef";
|
|
802
805
|
return `bf->slice(${recv}, ${start}, ${end})`;
|
|
803
806
|
}
|
|
804
807
|
case "reverse":
|
|
@@ -818,6 +821,53 @@ function renderArrayMethod(method, object, args, emit) {
|
|
|
818
821
|
const recv = emit(object);
|
|
819
822
|
return `bf->trim(${recv})`;
|
|
820
823
|
}
|
|
824
|
+
case "split": {
|
|
825
|
+
const recv = emit(object);
|
|
826
|
+
if (args.length === 0) {
|
|
827
|
+
return `bf->split(${recv})`;
|
|
828
|
+
}
|
|
829
|
+
const sep = emit(args[0]);
|
|
830
|
+
if (args.length === 1) {
|
|
831
|
+
return `bf->split(${recv}, ${sep})`;
|
|
832
|
+
}
|
|
833
|
+
const limit = emit(args[1]);
|
|
834
|
+
return `bf->split(${recv}, ${sep}, ${limit})`;
|
|
835
|
+
}
|
|
836
|
+
case "startsWith":
|
|
837
|
+
case "endsWith": {
|
|
838
|
+
const fn = method === "startsWith" ? "starts_with" : "ends_with";
|
|
839
|
+
const recv = emit(object);
|
|
840
|
+
const arg = emit(args[0]);
|
|
841
|
+
if (args.length >= 2) {
|
|
842
|
+
return `bf->${fn}(${recv}, ${arg}, ${emit(args[1])})`;
|
|
843
|
+
}
|
|
844
|
+
return `bf->${fn}(${recv}, ${arg})`;
|
|
845
|
+
}
|
|
846
|
+
case "replace": {
|
|
847
|
+
const recv = emit(object);
|
|
848
|
+
const oldS = emit(args[0]);
|
|
849
|
+
const newS = emit(args[1]);
|
|
850
|
+
return `bf->replace(${recv}, ${oldS}, ${newS})`;
|
|
851
|
+
}
|
|
852
|
+
case "repeat": {
|
|
853
|
+
const recv = emit(object);
|
|
854
|
+
const count = args.length === 0 ? "0" : emit(args[0]);
|
|
855
|
+
return `bf->repeat(${recv}, ${count})`;
|
|
856
|
+
}
|
|
857
|
+
case "padStart":
|
|
858
|
+
case "padEnd": {
|
|
859
|
+
const fn = method === "padStart" ? "pad_start" : "pad_end";
|
|
860
|
+
const recv = emit(object);
|
|
861
|
+
if (args.length === 0) {
|
|
862
|
+
return `bf->${fn}(${recv}, 0)`;
|
|
863
|
+
}
|
|
864
|
+
const target = emit(args[0]);
|
|
865
|
+
if (args.length === 1) {
|
|
866
|
+
return `bf->${fn}(${recv}, ${target})`;
|
|
867
|
+
}
|
|
868
|
+
const pad = emit(args[1]);
|
|
869
|
+
return `bf->${fn}(${recv}, ${target}, ${pad})`;
|
|
870
|
+
}
|
|
821
871
|
default: {
|
|
822
872
|
const _exhaustive = method;
|
|
823
873
|
throw new Error(`renderArrayMethod: unhandled ArrayMethod '${_exhaustive}'`);
|
|
@@ -834,6 +884,25 @@ function renderSortMethod(recv, c) {
|
|
|
834
884
|
});
|
|
835
885
|
return `bf->sort(${recv}, { keys => [${keyHashes.join(", ")}] })`;
|
|
836
886
|
}
|
|
887
|
+
function renderReduceMethod(recv, op, direction) {
|
|
888
|
+
const keyEntry = op.key.kind === "self" ? `key_kind => 'self'` : `key_kind => 'field', key => '${op.key.field}'`;
|
|
889
|
+
const init = op.type === "string" ? `'${op.init.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}'` : op.init;
|
|
890
|
+
return `bf->reduce(${recv}, { op => '${op.op}', ${keyEntry}, type => '${op.type}', init => ${init}, direction => '${direction}' })`;
|
|
891
|
+
}
|
|
892
|
+
function renderFlatMethod(recv, depth) {
|
|
893
|
+
const d = depth === "infinity" ? -1 : depth;
|
|
894
|
+
return `bf->flat(${recv}, ${d})`;
|
|
895
|
+
}
|
|
896
|
+
function renderFlatMapMethod(recv, op) {
|
|
897
|
+
const proj = op.projection;
|
|
898
|
+
if (proj.kind === "tuple") {
|
|
899
|
+
const specs = proj.elements.map((l) => l.kind === "self" ? `['self', '']` : `['field', '${l.field}']`).join(", ");
|
|
900
|
+
return `bf->flat_map_tuple(${recv}, ${specs})`;
|
|
901
|
+
}
|
|
902
|
+
if (proj.kind === "self")
|
|
903
|
+
return `bf->flat_map(${recv}, 'self', '')`;
|
|
904
|
+
return `bf->flat_map(${recv}, 'field', '${proj.field}')`;
|
|
905
|
+
}
|
|
837
906
|
function isStringTypeInfo(type) {
|
|
838
907
|
return type?.kind === "primitive" && type.primitive === "string";
|
|
839
908
|
}
|
|
@@ -958,6 +1027,15 @@ class MojoFilterEmitter {
|
|
|
958
1027
|
sortMethod(_method, object, comparator, emit) {
|
|
959
1028
|
return renderSortMethod(emit(object), comparator);
|
|
960
1029
|
}
|
|
1030
|
+
reduceMethod(method, object, reduceOp, emit) {
|
|
1031
|
+
return renderReduceMethod(emit(object), reduceOp, method === "reduceRight" ? "right" : "left");
|
|
1032
|
+
}
|
|
1033
|
+
flatMethod(object, depth, emit) {
|
|
1034
|
+
return renderFlatMethod(emit(object), depth);
|
|
1035
|
+
}
|
|
1036
|
+
flatMapMethod(object, op, emit) {
|
|
1037
|
+
return renderFlatMapMethod(emit(object), op);
|
|
1038
|
+
}
|
|
961
1039
|
conditional(_test, _consequent, _alternate) {
|
|
962
1040
|
return "1";
|
|
963
1041
|
}
|
|
@@ -1079,6 +1157,15 @@ class MojoTopLevelEmitter {
|
|
|
1079
1157
|
sortMethod(_method, object, comparator, emit) {
|
|
1080
1158
|
return renderSortMethod(emit(object), comparator);
|
|
1081
1159
|
}
|
|
1160
|
+
reduceMethod(method, object, reduceOp, emit) {
|
|
1161
|
+
return renderReduceMethod(emit(object), reduceOp, method === "reduceRight" ? "right" : "left");
|
|
1162
|
+
}
|
|
1163
|
+
flatMethod(object, depth, emit) {
|
|
1164
|
+
return renderFlatMethod(emit(object), depth);
|
|
1165
|
+
}
|
|
1166
|
+
flatMapMethod(object, op, emit) {
|
|
1167
|
+
return renderFlatMapMethod(emit(object), op);
|
|
1168
|
+
}
|
|
1082
1169
|
conditional(test, consequent, alternate, emit) {
|
|
1083
1170
|
return `(${emit(test)} ? ${emit(consequent)} : ${emit(alternate)})`;
|
|
1084
1171
|
}
|
package/dist/index.js
CHANGED
|
@@ -770,7 +770,7 @@ function renderArrayMethod(method, object, args, emit) {
|
|
|
770
770
|
switch (method) {
|
|
771
771
|
case "join": {
|
|
772
772
|
const obj = emit(object);
|
|
773
|
-
const sep = emit(args[0])
|
|
773
|
+
const sep = args.length >= 1 ? emit(args[0]) : `','`;
|
|
774
774
|
return `join(${sep}, @{${obj}})`;
|
|
775
775
|
}
|
|
776
776
|
case "includes": {
|
|
@@ -787,18 +787,21 @@ function renderArrayMethod(method, object, args, emit) {
|
|
|
787
787
|
}
|
|
788
788
|
case "at": {
|
|
789
789
|
const obj = emit(object);
|
|
790
|
-
const idx = emit(args[0]);
|
|
790
|
+
const idx = args.length >= 1 ? emit(args[0]) : "0";
|
|
791
791
|
return `bf->at(${obj}, ${idx})`;
|
|
792
792
|
}
|
|
793
793
|
case "concat": {
|
|
794
|
+
if (args.length === 0) {
|
|
795
|
+
return emit(object);
|
|
796
|
+
}
|
|
794
797
|
const a = emit(object);
|
|
795
798
|
const b = emit(args[0]);
|
|
796
799
|
return `bf->concat(${a}, ${b})`;
|
|
797
800
|
}
|
|
798
801
|
case "slice": {
|
|
799
802
|
const recv = emit(object);
|
|
800
|
-
const start = emit(args[0]);
|
|
801
|
-
const end = args.length
|
|
803
|
+
const start = args.length >= 1 ? emit(args[0]) : "0";
|
|
804
|
+
const end = args.length >= 2 ? emit(args[1]) : "undef";
|
|
802
805
|
return `bf->slice(${recv}, ${start}, ${end})`;
|
|
803
806
|
}
|
|
804
807
|
case "reverse":
|
|
@@ -818,6 +821,53 @@ function renderArrayMethod(method, object, args, emit) {
|
|
|
818
821
|
const recv = emit(object);
|
|
819
822
|
return `bf->trim(${recv})`;
|
|
820
823
|
}
|
|
824
|
+
case "split": {
|
|
825
|
+
const recv = emit(object);
|
|
826
|
+
if (args.length === 0) {
|
|
827
|
+
return `bf->split(${recv})`;
|
|
828
|
+
}
|
|
829
|
+
const sep = emit(args[0]);
|
|
830
|
+
if (args.length === 1) {
|
|
831
|
+
return `bf->split(${recv}, ${sep})`;
|
|
832
|
+
}
|
|
833
|
+
const limit = emit(args[1]);
|
|
834
|
+
return `bf->split(${recv}, ${sep}, ${limit})`;
|
|
835
|
+
}
|
|
836
|
+
case "startsWith":
|
|
837
|
+
case "endsWith": {
|
|
838
|
+
const fn = method === "startsWith" ? "starts_with" : "ends_with";
|
|
839
|
+
const recv = emit(object);
|
|
840
|
+
const arg = emit(args[0]);
|
|
841
|
+
if (args.length >= 2) {
|
|
842
|
+
return `bf->${fn}(${recv}, ${arg}, ${emit(args[1])})`;
|
|
843
|
+
}
|
|
844
|
+
return `bf->${fn}(${recv}, ${arg})`;
|
|
845
|
+
}
|
|
846
|
+
case "replace": {
|
|
847
|
+
const recv = emit(object);
|
|
848
|
+
const oldS = emit(args[0]);
|
|
849
|
+
const newS = emit(args[1]);
|
|
850
|
+
return `bf->replace(${recv}, ${oldS}, ${newS})`;
|
|
851
|
+
}
|
|
852
|
+
case "repeat": {
|
|
853
|
+
const recv = emit(object);
|
|
854
|
+
const count = args.length === 0 ? "0" : emit(args[0]);
|
|
855
|
+
return `bf->repeat(${recv}, ${count})`;
|
|
856
|
+
}
|
|
857
|
+
case "padStart":
|
|
858
|
+
case "padEnd": {
|
|
859
|
+
const fn = method === "padStart" ? "pad_start" : "pad_end";
|
|
860
|
+
const recv = emit(object);
|
|
861
|
+
if (args.length === 0) {
|
|
862
|
+
return `bf->${fn}(${recv}, 0)`;
|
|
863
|
+
}
|
|
864
|
+
const target = emit(args[0]);
|
|
865
|
+
if (args.length === 1) {
|
|
866
|
+
return `bf->${fn}(${recv}, ${target})`;
|
|
867
|
+
}
|
|
868
|
+
const pad = emit(args[1]);
|
|
869
|
+
return `bf->${fn}(${recv}, ${target}, ${pad})`;
|
|
870
|
+
}
|
|
821
871
|
default: {
|
|
822
872
|
const _exhaustive = method;
|
|
823
873
|
throw new Error(`renderArrayMethod: unhandled ArrayMethod '${_exhaustive}'`);
|
|
@@ -834,6 +884,25 @@ function renderSortMethod(recv, c) {
|
|
|
834
884
|
});
|
|
835
885
|
return `bf->sort(${recv}, { keys => [${keyHashes.join(", ")}] })`;
|
|
836
886
|
}
|
|
887
|
+
function renderReduceMethod(recv, op, direction) {
|
|
888
|
+
const keyEntry = op.key.kind === "self" ? `key_kind => 'self'` : `key_kind => 'field', key => '${op.key.field}'`;
|
|
889
|
+
const init = op.type === "string" ? `'${op.init.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}'` : op.init;
|
|
890
|
+
return `bf->reduce(${recv}, { op => '${op.op}', ${keyEntry}, type => '${op.type}', init => ${init}, direction => '${direction}' })`;
|
|
891
|
+
}
|
|
892
|
+
function renderFlatMethod(recv, depth) {
|
|
893
|
+
const d = depth === "infinity" ? -1 : depth;
|
|
894
|
+
return `bf->flat(${recv}, ${d})`;
|
|
895
|
+
}
|
|
896
|
+
function renderFlatMapMethod(recv, op) {
|
|
897
|
+
const proj = op.projection;
|
|
898
|
+
if (proj.kind === "tuple") {
|
|
899
|
+
const specs = proj.elements.map((l) => l.kind === "self" ? `['self', '']` : `['field', '${l.field}']`).join(", ");
|
|
900
|
+
return `bf->flat_map_tuple(${recv}, ${specs})`;
|
|
901
|
+
}
|
|
902
|
+
if (proj.kind === "self")
|
|
903
|
+
return `bf->flat_map(${recv}, 'self', '')`;
|
|
904
|
+
return `bf->flat_map(${recv}, 'field', '${proj.field}')`;
|
|
905
|
+
}
|
|
837
906
|
function isStringTypeInfo(type) {
|
|
838
907
|
return type?.kind === "primitive" && type.primitive === "string";
|
|
839
908
|
}
|
|
@@ -958,6 +1027,15 @@ class MojoFilterEmitter {
|
|
|
958
1027
|
sortMethod(_method, object, comparator, emit) {
|
|
959
1028
|
return renderSortMethod(emit(object), comparator);
|
|
960
1029
|
}
|
|
1030
|
+
reduceMethod(method, object, reduceOp, emit) {
|
|
1031
|
+
return renderReduceMethod(emit(object), reduceOp, method === "reduceRight" ? "right" : "left");
|
|
1032
|
+
}
|
|
1033
|
+
flatMethod(object, depth, emit) {
|
|
1034
|
+
return renderFlatMethod(emit(object), depth);
|
|
1035
|
+
}
|
|
1036
|
+
flatMapMethod(object, op, emit) {
|
|
1037
|
+
return renderFlatMapMethod(emit(object), op);
|
|
1038
|
+
}
|
|
961
1039
|
conditional(_test, _consequent, _alternate) {
|
|
962
1040
|
return "1";
|
|
963
1041
|
}
|
|
@@ -1079,6 +1157,15 @@ class MojoTopLevelEmitter {
|
|
|
1079
1157
|
sortMethod(_method, object, comparator, emit) {
|
|
1080
1158
|
return renderSortMethod(emit(object), comparator);
|
|
1081
1159
|
}
|
|
1160
|
+
reduceMethod(method, object, reduceOp, emit) {
|
|
1161
|
+
return renderReduceMethod(emit(object), reduceOp, method === "reduceRight" ? "right" : "left");
|
|
1162
|
+
}
|
|
1163
|
+
flatMethod(object, depth, emit) {
|
|
1164
|
+
return renderFlatMethod(emit(object), depth);
|
|
1165
|
+
}
|
|
1166
|
+
flatMapMethod(object, op, emit) {
|
|
1167
|
+
return renderFlatMapMethod(emit(object), op);
|
|
1168
|
+
}
|
|
1082
1169
|
conditional(test, consequent, alternate, emit) {
|
|
1083
1170
|
return `(${emit(test)} ? ${emit(consequent)} : ${emit(alternate)})`;
|
|
1084
1171
|
}
|