@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.
@@ -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 === 2 ? emit(args[1]) : "undef";
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,EAAiD,MAAM,iBAAiB,CAAA;AAqDhG,MAAM,WAAW,kBAAkB;IACjC,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB,8EAA8E;IAC9E,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,qBAAa,WAAY,SAAQ,WAAY,YAAW,aAAa,CAAC,aAAa,CAAC;IAClF,IAAI,SAAgB;IACpB,SAAS,SAAa;IACtB,qBAAqB,UAAO;IAG5B,kBAAkB,EAAG,cAAc,CAAS;IAE5C;;;;;;;;;;;OAWG;IACH,kBAAkB,EAAE,yBAAyB,CAA0B;IAEvE,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAiB;IAC/B;;;;;;OAMG;IACH,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,WAAW,CAAyB;IAC5C;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB,CAAyB;IAEjD,YAAY,OAAO,GAAE,kBAAuB,EAM3C;IAED,QAAQ,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,aAAa,CAoEzE;IAMD,OAAO,CAAC,2BAA2B;IAenC,OAAO,CAAC,sBAAsB;IAa9B;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/B;IAMD,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,CAAC,aAAa,CAAC,GAAG,MAAM,CAE1F;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7B;IAED,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAEzC;IAED,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,CAAC,aAAa,CAAC,GAAG,MAAM,CAElG;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,CAAC,aAAa,CAAC,GAAG,MAAM,CAEpF;IAED,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,CAAC,aAAa,CAAC,GAAG,MAAM,CAE9F;IAED,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,CAAC,aAAa,CAAC,GAAG,MAAM,CAE5F;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7B;IAED,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,CAAC,aAAa,CAAC,GAAG,MAAM,CAElG;IAED,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,CAAC,aAAa,CAAC,GAAG,MAAM,CAE5F;IAED,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,CAAC,aAAa,CAAC,GAAG,MAAM,CAEtF;IAMD,aAAa,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAuBxC;IAMD,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAe3C;IAMD,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAsC7C;IAED,OAAO,CAAC,gBAAgB;IAOxB;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAcnC;;;;;OAKG;IACH,OAAO,CAAC,gCAAgC;IA8ExC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAsH/B;IAMD;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CA+BpC;IAED,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CA0CzC;IAED,OAAO,CAAC,sBAAsB,CAAI;IAElC,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,UAAU;IAIlB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAgBjC;IAMD;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CA8FlC;IAED,OAAO,CAAC,gBAAgB;IA0BxB,iBAAiB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAIjD;IAED,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvC;IAED,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvC;IAMD;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAqB5B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAuBhC,OAAO,CAAC,kBAAkB;IAiC1B,OAAO,CAAC,wBAAwB;IAsBhC,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,iCAAiC;IAmCzC;;;;;;;OAOG;IACH,OAAO,CAAC,gCAAgC;IAmBxC;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,+BAA+B;IA+BvC,OAAO,CAAC,uBAAuB;IAqC/B;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAI9B;;;;OAIG;IACH;4EACwE;IACxE,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExC;IAED,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAYvD;IAED,iFAAiF;IACjF,2BAA2B,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnE;CACF;AAulBD,eAAO,MAAM,WAAW,aAAoB,CAAA"}
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 === 2 ? emit(args[1]) : "undef";
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 === 2 ? emit(args[1]) : "undef";
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
  }