difftreelog
perf native implementation of std.splitLimitR (#163)
in: master
* native implementation of std.splitLimitR * style: fix formatting ---------
5 files changed
crates/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),
crates/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)::
crates/jrsonnet-stdlib/src/strings.rsdiffbeforeafterboth46 }46 }47}47}4849#[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 into55 // a temporary vec56 {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}486749#[builtin]68#[builtin]50pub fn builtin_ascii_upper(str: IStr) -> String {69pub fn builtin_ascii_upper(str: IStr) -> String {tests/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),
+}
tests/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