use super::{summary::TupleSummary, TupleSketch};
use crate::error::SketchError;
use crate::tuple::ResizeFactor;
use std::marker::PhantomData;
pub struct TupleSketchBuilder<S: TupleSummary> {
lg_k: u8,
resize_factor: ResizeFactor,
p: f32,
_marker: PhantomData<fn() -> S>,
}
impl<S: TupleSummary> std::fmt::Debug for TupleSketchBuilder<S> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("TupleSketchBuilder")
.field("lg_k", &self.lg_k)
.field("resize_factor", &self.resize_factor)
.field("p", &self.p)
.finish()
}
}
impl<S: TupleSummary> Clone for TupleSketchBuilder<S> {
fn clone(&self) -> Self {
*self
}
}
impl<S: TupleSummary> Copy for TupleSketchBuilder<S> {}
impl<S: TupleSummary> Default for TupleSketchBuilder<S> {
fn default() -> Self {
Self {
lg_k: 12,
resize_factor: ResizeFactor::X8,
p: 1.0,
_marker: PhantomData,
}
}
}
impl<S: TupleSummary> TupleSketchBuilder<S> {
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<TupleSketch<S>, SketchError> {
TupleSketch::from_parts(self.lg_k, self.resize_factor, self.p)
}
}
pub(crate) fn resize_factor_multiplier(rf: ResizeFactor) -> u8 {
match rf {
ResizeFactor::X1 => 1,
ResizeFactor::X2 => 2,
ResizeFactor::X4 => 4,
ResizeFactor::X8 => 8,
}
}