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