mod simple;
pub use simple::{TotalTimeProfiler, TotalTimeStats};
pub trait Profiler {
fn start(&mut self);
fn end(&mut self);
}
pub struct ProfileEgress<I, P> {
inner: I,
profiler: P,
first_returned: bool,
}
pub struct ProfileIngress<I, P> {
inner: I,
profiler: P,
}
impl<I, P> ProfileEgress<I, P> {
pub fn new(inner: I, profiler: P) -> Self {
Self {
inner,
profiler,
first_returned: false,
}
}
}
impl<I, P> ProfileIngress<I, P> {
pub fn new(inner: I, profiler: P) -> Self {
Self { inner, profiler }
}
}
impl<I, P> Iterator for ProfileEgress<I, P>
where
I: Iterator,
P: Profiler,
{
type Item = I::Item;
fn next(&mut self) -> Option<Self::Item> {
if self.first_returned {
self.profiler.end();
} else {
self.first_returned = true;
}
let item = self.inner.next();
self.profiler.start();
return item;
}
}
impl<I, P> Iterator for ProfileIngress<I, P>
where
I: Iterator,
P: Profiler,
{
type Item = I::Item;
fn next(&mut self) -> Option<Self::Item> {
self.profiler.start();
let item = self.inner.next();
self.profiler.end();
return item;
}
}