1use vortex_array::ArrayView;
5use vortex_array::ExecutionCtx;
6use vortex_array::scalar::Scalar;
7use vortex_array::vtable::OperationsVTable;
8use vortex_error::VortexExpect;
9use vortex_error::VortexResult;
10
11use crate::ALP;
12use crate::ALPArrayExt;
13use crate::ALPArraySlotsExt;
14use crate::ALPFloat;
15use crate::match_each_alp_float_ptype;
16
17impl OperationsVTable<ALP> for ALP {
18 fn scalar_at(
19 array: ArrayView<'_, ALP>,
20 index: usize,
21 _ctx: &mut ExecutionCtx,
22 ) -> VortexResult<Scalar> {
23 if let Some(patches) = array.patches()
24 && let Some(patch) = patches.get_patched(index)?
25 {
26 return patch.cast(array.dtype());
27 }
28
29 let encoded_val = array.encoded().scalar_at(index)?;
30
31 Ok(match_each_alp_float_ptype!(array.dtype().as_ptype(), |T| {
32 let encoded_val: <T as ALPFloat>::ALPInt =
33 (&encoded_val).try_into().vortex_expect("invalid ALPInt");
34 Scalar::primitive(
35 <T as ALPFloat>::decode_single(encoded_val, array.exponents()),
36 array.dtype().nullability(),
37 )
38 }))
39 }
40}