git.delta.rocks / jrsonnet / refs/commits / 747b2b782cb8

difftreelog

perf make std.splitLimit builtin

Yaroslav Bolyukin2021-07-12parent: #02b7991.patch.diff
in: master

2 files changed

modifiedcrates/jrsonnet-evaluator/src/builtin/mod.rsdiffbeforeafterboth
121 ("reverse".into(), builtin_reverse),121 ("reverse".into(), builtin_reverse),
122 ("id".into(), builtin_id),122 ("id".into(), builtin_id),
123 ("strReplace".into(), builtin_str_replace),123 ("strReplace".into(), builtin_str_replace),
124 ("splitLimit".into(), builtin_splitlimit),
124 ("parseJson".into(), builtin_parse_json),125 ("parseJson".into(), builtin_parse_json),
125 ].iter().cloned().collect()126 ].iter().cloned().collect()
126 };127 };
751 })752 })
752}753}
754
755fn builtin_splitlimit(
756 context: Context,
757 _loc: Option<&ExprLocation>,
758 args: &ArgsDesc,
759) -> Result<Val> {
760 parse_args!(context, "splitLimit", args, 3, [
761 0, str: ty!(string) => Val::Str;
762 1, c: ty!(char) => Val::Str;
763 2, maxsplits: ty!(number) => Val::Num;
764 ], {
765 let maxsplits = maxsplits as isize;
766 let c = c.chars().next().unwrap();
767
768 let out: Vec<Val> = if maxsplits == -1 {
769 str.split(c).map(|s| Val::Str(s.into())).collect()
770 } else {
771 str.splitn(maxsplits as usize + 1, c).map(|s| Val::Str(s.into())).collect()
772 };
773
774 Ok(Val::Arr(out.into()))
775 })
776}
753777
754pub fn call_builtin(778pub fn call_builtin(
755 context: Context,779 context: Context,
modifiedcrates/jrsonnet-stdlib/src/std.jsonnetdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/std.jsonnet
+++ b/crates/jrsonnet-stdlib/src/std.jsonnet
@@ -123,21 +123,7 @@
     assert std.length(c) == 1 : 'std.split second parameter should have length 1, got ' + std.length(c);
     std.splitLimit(str, c, -1),
 
-  splitLimit(str, c, maxsplits)::
-    assert std.isString(str) : 'std.splitLimit first parameter should be a string, got ' + std.type(str);
-    assert std.isString(c) : 'std.splitLimit second parameter should be a string, got ' + std.type(c);
-    assert std.length(c) == 1 : 'std.splitLimit second parameter should have length 1, got ' + std.length(c);
-    assert std.isNumber(maxsplits) : 'std.splitLimit third parameter should be a number, got ' + std.type(maxsplits);
-    local aux(str, delim, i, arr, v) =
-      local c = str[i];
-      local i2 = i + 1;
-      if i >= std.length(str) then
-        arr + [v]
-      else if c == delim && (maxsplits == -1 || std.length(arr) < maxsplits) then
-        aux(str, delim, i2, arr + [v], '') tailstrict
-      else
-        aux(str, delim, i2, arr, v + c) tailstrict;
-    aux(str, c, 0, [], ''),
+  splitLimit:: $intrinsic(splitLimit),
 
   strReplace:: $intrinsic(strReplace),