use dspk_core::DspResult;
use crate::io::probe::SensorLayout;
use super::events::{MatchedSpike, SpikeEvent};
use super::snippets::SnippetBatch;
use super::template::WaveformTemplate;
pub trait SpikeDetector: Send + Sync {
fn detect(
&self,
data: &[f32],
channels: usize,
samples: usize,
sample_rate_hz: f64,
) -> DspResult<Vec<SpikeEvent>>;
}
pub trait WaveformDenoiser: Send + Sync {
fn denoise(&self, batch: &SnippetBatch) -> DspResult<SnippetBatch>;
}
pub trait FeatureEmbedder: Send + Sync {
fn embed(&self, batch: &SnippetBatch) -> DspResult<(Vec<f32>, usize)>;
}
pub trait PeakLocalizer: Send + Sync {
fn localize(&self, batch: &SnippetBatch, layout: &SensorLayout) -> DspResult<Vec<[f32; 3]>>;
}
pub trait SpikeMatcher: Send + Sync {
fn match_spikes(
&self,
client: &cubecl::prelude::Client,
data: &[f32],
channels: usize,
samples: usize,
templates: &[WaveformTemplate],
) -> DspResult<Vec<MatchedSpike>>;
}