use crate::SegmentedToken;
pub struct SentenceGroupedIterator<'a, I: Iterator<Item = SegmentedToken<'a>>> {
inner: I,
next_is_break: bool,
is_at_end: bool,
}
impl<'a, I: Iterator<Item = SegmentedToken<'a>>> SentenceGroupedIterator<'a, I> {
pub fn new(inner: I) -> Self {
Self {
inner,
next_is_break: false,
is_at_end: false,
}
}
pub fn is_at_end(&self) -> bool {
self.is_at_end
}
}
impl<'a, I: Iterator<Item = SegmentedToken<'a>>> Iterator for SentenceGroupedIterator<'a, I> {
type Item = SegmentedToken<'a>;
fn next(&mut self) -> Option<Self::Item> {
if self.next_is_break {
self.next_is_break = false;
None
} else if let Some(token) = self.inner.next() {
self.is_at_end = false;
if token.is_end_of_sentence {
if token.text.is_empty() {
None
} else {
self.next_is_break = true;
Some(token)
}
} else {
Some(token)
}
} else {
self.is_at_end = true;
None
}
}
}