git.delta.rocks / jrsonnet / refs/commits / f319c3545168

difftreelog

perf native implementation of std.splitLimitR (#163)

Tristan Stenner2024-05-17parent: #c5b983e.patch.diff
in: master
* native implementation of std.splitLimitR

* style: fix formatting

---------

5 files changed

modifiedcrates/jrsonnet-stdlib/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/lib.rs
+++ b/crates/jrsonnet-stdlib/src/lib.rs
@@ -178,6 +178,7 @@
 		("isEmpty", builtin_is_empty::INST),
 		("equalsIgnoreCase", builtin_equals_ignore_case::INST),
 		("splitLimit", builtin_splitlimit::INST),
+		("splitLimitR", builtin_splitlimitr::INST),
 		("asciiUpper", builtin_ascii_upper::INST),
 		("asciiLower", builtin_ascii_lower::INST),
 		("findSubstr", builtin_find_substr::INST),
modifiedcrates/jrsonnet-stdlib/src/std.jsonnetdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/std.jsonnet
+++ b/crates/jrsonnet-stdlib/src/std.jsonnet
@@ -20,13 +20,6 @@
   stripChars(str, chars)::
     std.lstripChars(std.rstripChars(str, chars), chars),
 
-  splitLimitR(str, c, maxsplits)::
-    if maxsplits == -1 then
-      std.splitLimit(str, c, -1)
-    else
-      local revStr(str) = std.join('', std.reverse(std.stringChars(str)));
-      std.map(function(e) revStr(e), std.reverse(std.splitLimit(revStr(str), revStr(c), maxsplits))),
-
   split(str, c):: std.splitLimit(str, c, -1),
 
   mapWithIndex(func, arr)::
modifiedcrates/jrsonnet-stdlib/src/strings.rsdiffbeforeafterboth
46 }46 }
47}47}
48
49#[builtin]
50pub fn builtin_splitlimitr(str: IStr, c: IStr, maxsplits: Either![usize, M1]) -> ArrValue {
51 use Either2::*;
52 match maxsplits {
53 A(n) =>
54 // rsplitn does not implement DoubleEndedIterator so collect into
55 // a temporary vec
56 {
57 str.rsplitn(n + 1, &c as &str)
58 .map(Val::string)
59 .collect::<Vec<_>>()
60 .into_iter()
61 .rev()
62 .collect()
63 }
64 B(_) => str.split(&c as &str).map(Val::string).collect(),
65 }
66}
4867
49#[builtin]68#[builtin]
50pub fn builtin_ascii_upper(str: IStr) -> String {69pub fn builtin_ascii_upper(str: IStr) -> String {
addedtests/golden/builtin_strings.jsonnetdiffbeforeafterboth
--- /dev/null
+++ b/tests/golden/builtin_strings.jsonnet
@@ -0,0 +1,7 @@
+local str = 'ab::cd::ef';
+{
+	split: std.split(str, '::'),
+	splitlimit: std.splitLimit(str, '::', 1),
+	splitlimitRNoLimit: std.splitLimit(str, '::', -1),
+	splitlimitR: std.splitLimitR(str, '::', 1),
+}
addedtests/golden/builtin_strings.jsonnet.goldendiffbeforeafterboth
--- /dev/null
+++ b/tests/golden/builtin_strings.jsonnet.golden
@@ -0,0 +1,20 @@
+{
+    "split": [
+        "ab",
+        "cd",
+        "ef"
+    ],
+    "splitlimit": [
+        "ab",
+        "cd::ef"
+    ],
+    "splitlimitR": [
+        "ab::cd",
+        "ef"
+    ],
+    "splitlimitRNoLimit": [
+        "ab",
+        "cd",
+        "ef"
+    ]
+}
\ No newline at end of file