pub(crate) mod states;
pub(crate) mod types;
pub mod error;
use self::{
states::*,
types::{AliveElementsPart, ParentSequenceRef, ParentSequenceRefMut, RangePart},
};
pub struct SequencePart<P, S> {
part: P,
parent_sequence: S,
iter_index: usize,
}
pub trait SharedSequencePartBehavior<T> {
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
}
impl<'a, T, I> AliveElementsPart<'a, T, I> {
pub(super) fn new(parent_sequence: ParentSequenceRef<'a, T, I>) -> AliveElementsPart<'a, T, I> {
SequencePart {
parent_sequence,
part: AliveElements,
iter_index: 0,
}
}
pub fn nth_element(&self, index: usize) -> Option<&T> {
self.parent_sequence.nth_element_without_generation(index)
}
pub fn first_element(&self) -> Option<&T> {
self.nth_element(0)
}
pub fn last_element(&self) -> Option<&T> {
if self.is_empty() {
return None;
}
self.nth_element(self.len() - 1)
}
}
impl<'a, T, I> RangePart<'a, T, I> {
pub(super) fn new_range(
parent_sequence: ParentSequenceRefMut<'a, T, I>,
start: usize,
end: usize,
) -> RangePart<'a, T, I> {
SequencePart {
parent_sequence,
part: Range::new(start, end),
iter_index: start,
}
}
pub fn nth_element_is_in_range(&self, index: usize) -> bool {
index >= self.part.start() && index < self.part.end()
}
pub fn nth_element(&mut self, index: usize) -> Option<&T> {
if !self.nth_element_is_in_range(index) {
return None;
}
Some(self.parent_sequence.nth_element(index))
}
pub fn first_element(&mut self) -> Option<&T> {
self.nth_element(self.part.start())
}
pub fn last_element(&mut self) -> Option<&T> {
self.nth_element(self.part.end())
}
}
impl<'a, T, I> SharedSequencePartBehavior<T> for AliveElementsPart<'a, T, I> {
fn len(&self) -> usize {
self.parent_sequence.alive_elements_len()
}
}
impl<'a, T, I> SharedSequencePartBehavior<T> for RangePart<'a, T, I> {
fn len(&self) -> usize {
self.part.end() - self.part.start()
}
}
impl<'a, T: Clone, I> Iterator for AliveElementsPart<'a, T, I> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
let iter_index = self.iter_index;
if iter_index == self.len() {
self.iter_index = 0;
return None;
}
self.iter_index += 1;
self.nth_element(iter_index).cloned()
}
}
impl<'a, T: Clone, I> Iterator for RangePart<'a, T, I> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
let iter_index = self.iter_index;
if iter_index == self.part.end() {
self.iter_index = 0;
return None;
}
self.iter_index += 1;
self.nth_element(iter_index).cloned()
}
}