use super::{CompactTupleSketch, TupleInput, TupleSummary};
use crate::error::SketchError;
use apache_datasketches_sys::tuple_generic_input::TupleGenericInputRef;
use apache_datasketches_sys::tuple_generic_intersection::ffi as sys;
use cxx::UniquePtr;
use std::marker::PhantomData;
pub struct TupleIntersection<S: TupleSummary> {
inner: UniquePtr<sys::TupleGenericIntersectionShim>,
_marker: PhantomData<fn() -> S>,
}
unsafe impl<S: TupleSummary> Send for TupleIntersection<S> {}
impl<S: TupleSummary> Default for TupleIntersection<S> {
fn default() -> Self {
Self::new()
}
}
impl<S: TupleSummary> TupleIntersection<S> {
pub fn new() -> Self {
Self {
inner: sys::new_tuple_generic_intersection(),
_marker: PhantomData,
}
}
pub fn update(&mut self, input: &impl TupleInput<S>) {
match input.as_input() {
TupleGenericInputRef::Sketch(s) => self.inner.pin_mut().update_with_sketch(s),
TupleGenericInputRef::Compact(c) => self.inner.pin_mut().update_with_compact(c),
}
}
pub fn get_result(&self, ordered: bool) -> Result<CompactTupleSketch<S>, SketchError> {
if !self.inner.has_result() {
return Err(SketchError::EmptyIntersection);
}
let inner = self
.inner
.get_result(ordered)
.map_err(|e| SketchError::Cpp(e.what().to_string()))?;
Ok(CompactTupleSketch::from_shim(inner))
}
pub fn has_result(&self) -> bool {
self.inner.has_result()
}
}