arrow_arith::arity

Function binary_mut

Source
pub fn binary_mut<T, U, F>(
    a: PrimitiveArray<T>,
    b: &PrimitiveArray<U>,
    op: F,
) -> Result<Result<PrimitiveArray<T>, ArrowError>, PrimitiveArray<T>>
where T: ArrowPrimitiveType, U: ArrowPrimitiveType, F: Fn(T::Native, U::Native) -> T::Native,
Expand description

Applies a binary and infallible function to values in two arrays, replacing the values in the first array in place.

§Details

Given two arrays of length len, calls op(a[i], b[i]) for i in 0..len, modifying the [PrimitiveArray] a in place, if possible.

If any index is null in either a or b, the corresponding index in the result will also be null.

§Buffer Reuse

If the underlying buffers in a are not shared with other arrays, mutates the underlying buffer in place, without allocating.

If the underlying buffer in a are shared, returns Err(self)

Like unary the provided function is evaluated for every index, ignoring validity. This is beneficial when the cost of the operation is low compared to the cost of branching, and especially when the operation can be vectorised, however, requires op to be infallible for all possible values of its inputs

§Errors

  • If the arrays have different lengths
  • If the array is not mutable (see “Buffer Reuse”)

§See Also

  • Documentation on [PrimitiveArray::unary_mut] for operating on [ArrayRef].

§Example

// compute a + b for each element
let a = Float32Array::from(vec![Some(5.1f32), None, Some(6.8)]);
let b = Int32Array::from(vec![Some(1), None, Some(2)]);
// compute a + b, updating the value in a in place if possible
let a = binary_mut(a, &b, |a, b| a + b as f32).unwrap().unwrap();
// a is updated in place
assert_eq!(a, Float32Array::from(vec![Some(6.1), None, Some(8.8)]));

§Example with shared buffers

let a = Float32Array::from(vec![Some(5.1f32), None, Some(6.8)]);
let b = Float32Array::from(vec![Some(1.0f32), None, Some(2.0)]);
// a_clone shares the buffer with a
let a_cloned = a.clone();
// try to update a in place, but it is shared. Returns Err(a)
let a = binary_mut(a, &b, |a, b| a + b).unwrap_err();
assert_eq!(a_cloned, a);
// drop shared reference
drop(a_cloned);
// now a is not shared, so we can update it in place
let a = binary_mut(a, &b, |a, b| a + b).unwrap().unwrap();
assert_eq!(a, Float32Array::from(vec![Some(6.1), None, Some(8.8)]));