git.delta.rocks / jrsonnet / refs/commits / 21712e70b26b

difftreelog

perf implement std.setDiff in native

Yaroslav Bolyukin2023-08-12parent: #0d47e9f.patch.diff
in: master

3 files changed

modifiedcrates/jrsonnet-stdlib/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/lib.rs
+++ b/crates/jrsonnet-stdlib/src/lib.rs
@@ -175,6 +175,7 @@
 		// Sets
 		("setMember", builtin_set_member::INST),
 		("setInter", builtin_set_inter::INST),
+		("setDiff", builtin_set_diff::INST),
 		// Compat
 		("__compare", builtin___compare::INST),
 	]
modifiedcrates/jrsonnet-stdlib/src/sets.rsdiffbeforeafterboth
71 }71 }
72 Ok(ArrValue::lazy(out))72 Ok(ArrValue::lazy(out))
73}73}
74#[builtin]
75#[allow(non_snake_case, clippy::redundant_closure)]
76pub fn builtin_set_diff(a: ArrValue, b: ArrValue, keyF: Option<FuncVal>) -> Result<ArrValue> {
77 let mut a = a.iter_lazy();
78 let mut b = b.iter_lazy();
79
80 let keyF = keyF
81 .unwrap_or(FuncVal::identity())
82 .into_native::<((Thunk<Val>,), Val)>();
83 let keyF = |v| keyF(v);
84
85 let mut av = a.next();
86 let mut bv = b.next();
87 let mut ak = av.clone().map(keyF).transpose()?;
88 let mut bk = bv.map(keyF).transpose()?;
89
90 let mut out = Vec::new();
91 while let (Some(ac), Some(bc)) = (&ak, &bk) {
92 match evaluate_compare_op(ac, bc, BinaryOpType::Lt)? {
93 Ordering::Less => {
94 // In a, but not in b
95 out.push(av.clone().expect("ak != None"));
96 av = a.next();
97 ak = av.clone().map(keyF).transpose()?;
98 }
99 Ordering::Greater => {
100 bv = b.next();
101 bk = bv.map(keyF).transpose()?;
102 }
103 Ordering::Equal => {
104 av = a.next();
105 ak = av.clone().map(keyF).transpose()?;
106 bv = b.next();
107 bk = bv.map(keyF).transpose()?;
108 }
109 };
110 }
111 while let Some(ac) = &ak {
112 // In a, but not in b
113 out.push(av.clone().expect("ak != None"));
114 av = a.next();
115 ak = av.clone().map(keyF).transpose()?;
116 }
117 Ok(ArrValue::lazy(out))
118}
74119
modifiedcrates/jrsonnet-stdlib/src/std.jsonnetdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/std.jsonnet
+++ b/crates/jrsonnet-stdlib/src/std.jsonnet
@@ -214,21 +214,6 @@
           aux(a, b, i, j + 1, acc + [b[j]]) tailstrict;
     aux(a, b, 0, 0, []),
 
-  setDiff(a, b, keyF=id)::
-    local aux(a, b, i, j, acc) =
-      if i >= std.length(a) then
-        acc
-      else if j >= std.length(b) then
-        acc + a[i:]
-      else
-        if keyF(a[i]) == keyF(b[j]) then
-          aux(a, b, i + 1, j + 1, acc) tailstrict
-        else if keyF(a[i]) < keyF(b[j]) then
-          aux(a, b, i + 1, j, acc + [a[i]]) tailstrict
-        else
-          aux(a, b, i, j + 1, acc) tailstrict;
-    aux(a, b, 0, 0, []) tailstrict,
-
   mergePatch(target, patch)::
     if std.isObject(patch) then
       local target_object =