use apache_datasketches_sys::theta_sketch::ffi as sys;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ResizeFactor {
X1,
X2,
X4,
#[default]
X8,
}
impl From<ResizeFactor> for sys::ResizeFactor {
fn from(rf: ResizeFactor) -> Self {
match rf {
ResizeFactor::X1 => sys::ResizeFactor::X1,
ResizeFactor::X2 => sys::ResizeFactor::X2,
ResizeFactor::X4 => sys::ResizeFactor::X4,
ResizeFactor::X8 => sys::ResizeFactor::X8,
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct ThetaSketchBuilder {
lg_k: u8,
resize_factor: ResizeFactor,
p: f32,
}
impl Default for ThetaSketchBuilder {
fn default() -> Self {
Self {
lg_k: 12,
resize_factor: ResizeFactor::default(),
p: 1.0,
}
}
}
impl ThetaSketchBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn lg_k(mut self, lg_k: u8) -> Self {
self.lg_k = lg_k;
self
}
pub fn resize_factor(mut self, resize_factor: ResizeFactor) -> Self {
self.resize_factor = resize_factor;
self
}
pub fn p(mut self, p: f32) -> Self {
self.p = p;
self
}
pub fn build(self) -> Result<super::ThetaSketch, crate::error::SketchError> {
super::ThetaSketch::from_parts(self.lg_k, self.resize_factor, self.p)
}
}