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
--- a/crates/jrsonnet-stdlib/src/strings.rs
+++ b/crates/jrsonnet-stdlib/src/strings.rs
@@ -47,6 +47,25 @@
 }
 
 #[builtin]
+pub fn builtin_splitlimitr(str: IStr, c: IStr, maxsplits: Either![usize, M1]) -> ArrValue {
+	use Either2::*;
+	match maxsplits {
+		A(n) =>
+		// rsplitn does not implement DoubleEndedIterator so collect into
+		// a temporary vec
+		{
+			str.rsplitn(n + 1, &c as &str)
+				.map(Val::string)
+				.collect::<Vec<_>>()
+				.into_iter()
+				.rev()
+				.collect()
+		}
+		B(_) => str.split(&c as &str).map(Val::string).collect(),
+	}
+}
+
+#[builtin]
 pub fn builtin_ascii_upper(str: IStr) -> String {
 	str.to_ascii_uppercase()
 }
addedtests/golden/builtin_strings.jsonnetdiffbeforeafterboth

no changes

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