difftreelog
perf move std.setInter to native
in: master
3 files changed
crates/jrsonnet-stdlib/src/lib.rsdiffbeforeafterboth--- a/crates/jrsonnet-stdlib/src/lib.rs
+++ b/crates/jrsonnet-stdlib/src/lib.rs
@@ -42,6 +42,8 @@
pub use misc::*;
mod sets;
pub use sets::*;
+mod compat;
+pub use compat::*;
pub fn stdlib_uncached(settings: Rc<RefCell<Settings>>) -> ObjValue {
let mut builder = ObjValueBuilder::new();
@@ -147,6 +149,7 @@
("endsWith", builtin_ends_with::INST),
// Sets
("setMember", builtin_set_member::INST),
+ ("setInter", builtin_set_inter::INST),
]
.iter()
.cloned()
crates/jrsonnet-stdlib/src/sets.rsdiffbeforeafterboth5 function::{builtin, FuncVal},5 function::{builtin, FuncVal},6 operator::evaluate_compare_op,6 operator::evaluate_compare_op,7 val::ArrValue,7 val::ArrValue,8 Val,8 Thunk, Val,9};9};10use jrsonnet_gcmodule::Cc;10use jrsonnet_parser::BinaryOpType;11use jrsonnet_parser::BinaryOpType;111212#[builtin]13#[builtin]13#[allow(non_snake_case)]14#[allow(non_snake_case)]14pub fn builtin_set_member(x: Val, arr: ArrValue, keyF: Option<FuncVal>) -> Result<bool> {15pub fn builtin_set_member(x: Thunk<Val>, arr: ArrValue, keyF: Option<FuncVal>) -> Result<bool> {15 let mut low = 0;16 let mut low = 0;16 let mut high = arr.len();17 let mut high = arr.len();171818 let keyF = keyF.unwrap_or(FuncVal::Id).into_native::<((Val,), Val)>();19 let keyF = keyF20 .unwrap_or(FuncVal::Id)21 .into_native::<((Thunk<Val>,), Val)>();192220 let x = keyF(x)?;23 let x = keyF(x)?;212422 while low < high {25 while low < high {23 let middle = (high + low) / 2;26 let middle = (high + low) / 2;27 let comp = keyF(arr.get_lazy(middle).expect("in bounds"))?;24 match evaluate_compare_op(&arr.get(middle)?.expect("in bounds"), &x, BinaryOpType::Lt)? {28 match evaluate_compare_op(&comp, &x, BinaryOpType::Lt)? {25 Ordering::Less => low = middle + 1,29 Ordering::Less => low = middle + 1,26 Ordering::Equal => return Ok(true),30 Ordering::Equal => return Ok(true),27 Ordering::Greater => high = middle,31 Ordering::Greater => high = middle,30 Ok(false)34 Ok(false)31}35}3637#[builtin]38#[allow(non_snake_case)]39pub fn builtin_set_inter(a: ArrValue, b: ArrValue, keyF: Option<FuncVal>) -> Result<ArrValue> {40 let mut a = a.iter_lazy();41 let mut b = b.iter_lazy();4243 let keyF = keyF44 .unwrap_or(FuncVal::identity())45 .into_native::<((Thunk<Val>,), Val)>();46 let keyF = |v| keyF(v);4748 let mut av = a.next();49 let mut bv = b.next();50 let mut ak = av.clone().map(keyF).transpose()?;51 let mut bk = bv.map(keyF).transpose()?;5253 let mut out = Vec::new();54 while let (Some(ac), Some(bc)) = (&ak, &bk) {55 match evaluate_compare_op(ac, bc, BinaryOpType::Lt)? {56 Ordering::Less => {57 av = a.next();58 ak = av.clone().map(keyF).transpose()?;59 }60 Ordering::Greater => {61 bv = b.next();62 bk = bv.map(keyF).transpose()?;63 }64 Ordering::Equal => {65 out.push(av.clone().expect("ak != None => av != None"));66 av = a.next();67 ak = av.clone().map(keyF).transpose()?;68 bv = b.next();69 bk = bv.map(keyF).transpose()?;70 }71 };72 }73 Ok(ArrValue::lazy(Cc::new(out)))74}3275crates/jrsonnet-stdlib/src/std.jsonnetdiffbeforeafterboth--- a/crates/jrsonnet-stdlib/src/std.jsonnet
+++ b/crates/jrsonnet-stdlib/src/std.jsonnet
@@ -214,19 +214,6 @@
aux(a, b, i, j + 1, acc + [b[j]]) tailstrict;
aux(a, b, 0, 0, []),
- setInter(a, b, keyF=id)::
- local aux(a, b, i, j, acc) =
- if i >= std.length(a) || j >= std.length(b) then
- acc
- else
- if keyF(a[i]) == keyF(b[j]) then
- aux(a, b, i + 1, j + 1, acc + [a[i]]) tailstrict
- else if keyF(a[i]) < keyF(b[j]) then
- aux(a, b, i + 1, j, acc) tailstrict
- else
- aux(a, b, i, j + 1, acc) tailstrict;
- aux(a, b, 0, 0, []) tailstrict,
-
setDiff(a, b, keyF=id)::
local aux(a, b, i, j, acc) =
if i >= std.length(a) then