use parking_lot::Mutex;
use std::sync::Arc;
use super::Canvas;
use super::Point;
#[derive(Default)]
pub struct ScatterPlot {
points: Arc<Mutex<Vec<Point>>>,
canvas: Arc<Canvas>,
callback: Option<fn(&Self)>,
}
impl ScatterPlot {
pub fn new(canvas: Canvas) -> Self {
Self {
canvas: Arc::new(canvas),
..Self::default()
}
}
pub fn new_with_points(canvas: Canvas, points: Vec<Point>) -> Self {
Self {
points: Arc::new(Mutex::new(points)),
..Self::new(canvas)
}
}
pub fn new_with_callback(canvas: Canvas, func: fn(&Self)) -> Self {
Self {
callback: Some(func),
..Self::new(canvas)
}
}
pub fn points(&self) -> Vec<Point> {
self.points.lock().clone()
}
pub fn add_point(&mut self, point: Point) {
self.points.lock().push(point);
self.canvas.plot_point(&point);
if let Some(callback) = self.callback {
callback(self);
}
}
pub fn extend(&mut self, new_points: &[Point]) {
self.points.lock().extend(new_points.to_owned());
self.canvas.plot_points(new_points);
if let Some(callback) = self.callback {
callback(self);
}
}
pub fn refresh(&self) {
let points = self.points.lock();
self.canvas.plot_points(&points);
}
}
#[cfg(test)]
mod tests {
#[allow(unused_imports)]
use super::*;
}