use std::{cmp::Ordering, iter::{Iterator, Peekable}, marker::PhantomData, sync::Arc};
use derive_getters::{Dissolve, Getters};
use derive_new::new;
use itertools::{Merge, Itertools};
use crate::{utilities::{functions::evaluate::{EvaluateFunction, EvaluateFunctionRef, LogicalNot}, order::{JudgeOrder, OrderOperatorAuto, OrderOperatorByKey, JudgePartialOrder}, sets::MapHasKeyOrSequenceHasElementEvaluateFunctionWrapper}, algebra::vectors::entries::KeyValGet};
pub type FilterOutMembers< J, Container > =
Filter<
J,
LogicalNot<
MapHasKeyOrSequenceHasElementEvaluateFunctionWrapper<
Container,
>
>
>;
pub type FilterOutNonmembers< J, Container > =
Filter<
J,
MapHasKeyOrSequenceHasElementEvaluateFunctionWrapper<
Container,
>
>;
pub fn result_iterators_are_elementwise_equal<I1, I2, T>(result1: Result<I1, T>, result2: Result<I2, T>) -> bool
where
I1: Iterator,
I2: Iterator,
I1::Item: PartialEq<I2::Item>,
T: PartialEq,
{
match (result1, result2) {
(Ok(iter1), Ok(iter2)) => iter1.eq(iter2),
(Err(err1), Err(err2)) => err1 == err2,
_ => false,
}
}
pub trait TransformIter{
fn require_strict_ascent< OrderOperator > ( self, order_operator: OrderOperator )
->
RequireStrictAscent< Self, OrderOperator >
where
Self: Sized + Iterator,
Self::Item: Clone,
OrderOperator: JudgePartialOrder< Self::Item >
{
RequireStrictAscent { iter: self, last_item: None, order_operator }
}
fn require_strict_ascent_with_panic< OrderOperator > ( self, order_operator: OrderOperator )
->
RequireStrictAscentWithPanic< Self, OrderOperator >
where
Self: Sized + Iterator,
Self::Item: Clone,
OrderOperator: JudgePartialOrder< Self::Item >
{
RequireStrictAscentWithPanic { iter: self, last_item: None, order_operator }
}
}
impl < T > TransformIter for T {}
#[derive(new,Copy,Debug,Dissolve,Eq,PartialEq,Getters,Ord,PartialOrd)]
pub struct HeadTail< I: Iterator >{
pub head: Option< I::Item >,
pub tail: I,
}
impl < I: Iterator >
Iterator for
HeadTail< I >
{
type Item = I::Item;
fn next(&mut self) -> Option<Self::Item> {
self.head.take().or_else(|| self.tail.next() )
}
}
impl < I: Iterator >
PeekUnqualified for
HeadTail< I >
{
fn peek_unqualified( &mut self ) -> Option< & Self::Item > {
self.head
.is_none()
.then(|| self.tail.next().map(|x| self.head.replace(x) ) );
self.head.as_ref()
}
}
impl < I >
Clone for
HeadTail< I >
where
I: Clone + Iterator,
I::Item: Clone,
{
fn clone(&self) -> Self {
HeadTail { head: self.head.clone(), tail: self.tail.clone() }
}
}
#[derive(Clone,Copy,Debug,Dissolve,Eq,PartialEq,Getters,Ord,PartialOrd)]
pub struct RequireStrictAscent
< Iter, OrderOperator >
where
Iter: Iterator,
Iter::Item: Clone,
OrderOperator: JudgePartialOrder< Iter::Item >,
{
pub iter: Iter,
pub last_item: Option< Iter::Item >,
pub order_operator: OrderOperator,
}
impl < Iter, OrderOperator >
RequireStrictAscent
< Iter, OrderOperator > where
Iter: Iterator,
Iter::Item: Clone,
OrderOperator: JudgePartialOrder< Iter::Item >,
{
pub fn new( iter: Iter, order_operator: OrderOperator ) -> Self {
RequireStrictAscent { iter, last_item: None, order_operator }
}
pub fn into_vec( self )
->
Result<
Vec< Iter::Item >,
(Iter::Item, Iter::Item),
>
{
return self.collect();
}
}
impl < Iter, OrderOperator >
Iterator for
RequireStrictAscent
< Iter, OrderOperator > where
Iter: Iterator,
Iter::Item: Clone,
OrderOperator: JudgePartialOrder< Iter::Item >,
{
type Item = Result< Iter::Item, (Iter::Item, Iter::Item) >;
fn next(&mut self) -> Option<Self::Item> {
if let Some( val_y ) = self.iter.next() { let x_opt = self.last_item.replace( val_y.clone() ); if let Some( val_x ) = x_opt { if self.order_operator.judge_ge( &val_x, &val_y ) { return Some( Err( (val_x, val_y) ) ) }
}
return Some( Ok(val_y) ) }
None }
}
#[derive(Clone,Copy,Debug,Dissolve,Eq,PartialEq,Getters,Ord,PartialOrd)]
pub struct RequireStrictAscentWithPanic
< Iter, OrderOperator >
where
Iter: Iterator,
Iter::Item: Clone,
OrderOperator: JudgePartialOrder< Iter::Item >,
{
pub iter: Iter,
pub last_item: Option< Iter::Item >,
pub order_operator: OrderOperator,
}
impl < Iter, OrderOperator >
RequireStrictAscentWithPanic
< Iter, OrderOperator > where
Iter: Iterator,
Iter::Item: Clone,
OrderOperator: JudgePartialOrder< Iter::Item >,
{
pub fn new( iter: Iter, order_operator: OrderOperator ) -> Self {
RequireStrictAscentWithPanic { iter, last_item: None, order_operator }
}
}
impl < Iter, OrderOperator >
Iterator for
RequireStrictAscentWithPanic
< Iter, OrderOperator > where
Iter: Iterator,
Iter::Item: Clone,
OrderOperator: JudgePartialOrder< Iter::Item >,
{
type Item = Iter::Item;
fn next(&mut self) -> Option<Self::Item> {
if let Some( val_y ) = self.iter.next() { let x_opt = self.last_item.replace( val_y.clone() ); if let Some( val_x ) = x_opt { if self.order_operator.judge_ge( &val_x, &val_y ) { panic!("\n\n| ERROR: An iterator placed inside a `RequireStrictAscentWithPanic` struct has returned two consecutive entries, (x,y) where x >= y.\n| NB: This message can also appear when using a reversed order operator, indicating a failure to strictly *descend*.\n| This error message is generated by OAT.\n\n");
}
}
return Some( val_y ) }
None }
}
impl < Iter, OrderOperator >
PeekUnqualified for
RequireStrictAscentWithPanic
< Iter, OrderOperator > where
Iter: Iterator + PeekUnqualified,
Iter::Item: Clone,
OrderOperator: JudgePartialOrder< Iter::Item >,
{
fn peek_unqualified( &mut self ) -> Option< & Self::Item > {
self.iter.peek_unqualified()
}
}
pub fn find_min< I >( iter: I ) -> Option< usize >
where
I: IntoIterator,
I::Item: Ord,
{
println!("replace this with the new position_min tool from itertools");
iter.into_iter()
.enumerate()
.min_by(|x,y| x.1.cmp(&y.1) )
.map(|x| x.0 )
}
pub fn minmax< T, Inner, Outer >( outer_iter: Outer )
->
Option< T >
where
T: Ord,
Inner: IntoIterator< Item = T >,
Outer: IntoIterator< Item = Inner >
{
outer_iter.into_iter().filter_map( |x| x.into_iter().max() ).min()
}
pub trait PeekUnqualified : Iterator {
fn peek_unqualified( &mut self ) -> Option < & Self::Item >;
}
impl < I : Iterator > PeekUnqualified for Peekable< I >
{
fn peek_unqualified( &mut self ) -> Option < &<Self as Iterator>::Item > { self.peek() }
}
pub trait SkipUntil : Iterator {
fn skip_until< P >( self, predicate: P ) -> Self
where
P: FnMut(&Self::Item) -> bool;
}
impl < I : Iterator + PeekUnqualified > SkipUntil for I
{
fn skip_until< P >( mut self, mut predicate: P ) -> Self
where
P: FnMut(&Self::Item) -> bool
{
while let Some( peek ) = self.peek_unqualified() { if predicate( peek ) { break } else { let _ = self.next(); } }
self
}
}
#[derive(Copy,Debug,Dissolve,Eq,PartialEq,Ord,PartialOrd)]
pub struct MapByTransform
< Iter, ItemNew, ItemwiseTransform >
where
Iter: Iterator,
ItemwiseTransform: EvaluateFunction< Iter::Item, ItemNew >
{
iter: Iter,
itemwise_transform: ItemwiseTransform,
phantom_itemnew: PhantomData< ItemNew >,
}
impl < Iter, ItemNew, ItemwiseTransform >
MapByTransform
< Iter, ItemNew, ItemwiseTransform >
where
Iter: Iterator,
ItemwiseTransform: EvaluateFunction< Iter::Item, ItemNew >
{
pub fn new( iter: Iter, itemwise_transform: ItemwiseTransform ) -> MapByTransform < Iter, ItemNew, ItemwiseTransform > {
MapByTransform{ iter, itemwise_transform, phantom_itemnew: PhantomData }
}
}
impl < Iter, ItemNew, ItemwiseTransform >
Iterator for
MapByTransform
< Iter, ItemNew, ItemwiseTransform >
where
Iter: Iterator,
ItemwiseTransform: EvaluateFunction< Iter::Item, ItemNew >
{
type Item = ItemNew;
fn next( &mut self ) -> Option< Self::Item > {
match self.iter.next() {
Some( item_old ) => { Some( self.itemwise_transform.evaluate_function( item_old ) ) },
None => { None }
}
}
}
impl < Iter, ItemNew, ItemwiseTransform >
Clone for
MapByTransform
< Iter, ItemNew, ItemwiseTransform >
where
Iter: Clone + Iterator,
ItemwiseTransform: Clone + EvaluateFunction< Iter::Item, ItemNew >
{
fn clone( & self ) -> Self { MapByTransform::new( self.iter.clone(), self.itemwise_transform.clone() )}
}
pub trait MapByTransformTrait< ItemwiseTransform > {
fn map_by_transform< ItemNew >( self, itemwise_transform: ItemwiseTransform )
->
MapByTransform
< Self, ItemNew, ItemwiseTransform >
where
Self: Iterator + Sized,
ItemwiseTransform: EvaluateFunction< Self::Item, ItemNew >
{
MapByTransform { iter: self, itemwise_transform, phantom_itemnew: PhantomData }
}
}
impl < ItemwiseTransform, Iter >
MapByTransformTrait
< ItemwiseTransform > for
Iter
where
Iter: Iterator
{}
#[derive(Copy,Debug,Dissolve,Eq,PartialEq,Getters,Ord,PartialOrd)]
pub struct FilterMapByTransform< I, FilteringObject, ItemNew >
where
I: Iterator,
FilteringObject: EvaluateFunction< I::Item, Option< ItemNew > >,
{
iter: I,
filtering_object: FilteringObject,
phantom_itemnew: PhantomData< ItemNew >
}
impl < I, FilteringObject, ItemNew >
FilterMapByTransform
< I, FilteringObject, ItemNew >
where
I: Iterator,
FilteringObject: EvaluateFunction< I::Item, Option< ItemNew > >,
{
pub fn new< Iterable: IntoIterator< IntoIter = I > >( iterable: Iterable, filtering_object: FilteringObject ) -> FilterMapByTransform< I, FilteringObject, ItemNew >
{ FilterMapByTransform{ iter: iterable.into_iter(), filtering_object, phantom_itemnew: PhantomData } }
}
impl < I, FilteringObject, ItemNew >
Iterator for
FilterMapByTransform< I, FilteringObject, ItemNew >
where
I: Iterator,
FilteringObject: EvaluateFunction< I::Item, Option< ItemNew > >
{
type Item = ItemNew;
fn next( &mut self ) -> Option< Self::Item > {
for next_item in self.iter.by_ref() {
match self.filtering_object.evaluate_function( next_item ) {
None => continue,
Some( new_item ) => { return Some( new_item ) }
}
}
None
}
}
impl < I, FilteringObject, ItemNew >
Clone for
FilterMapByTransform< I, FilteringObject, ItemNew >
where
I: Clone + Iterator,
FilteringObject: Clone + EvaluateFunction< I::Item, Option< ItemNew > >
{
fn clone( & self ) -> Self { FilterMapByTransform::new( self.iter.clone(), self.filtering_object.clone() )}
}
pub trait FilterMapByTransformTrait< ItemNew >
where
Self: Iterator + Sized,
{
fn filter_map_by_transform<
FilteringObject: EvaluateFunction< Self::Item, Option< ItemNew > >
>
( self, filtering_object: FilteringObject )
->
FilterMapByTransform< Self, FilteringObject, ItemNew > ;
}
impl < Iter, ItemNew >
FilterMapByTransformTrait
< ItemNew > for
Iter
where
Iter: Iterator
{
fn filter_map_by_transform< FilteringObject: EvaluateFunction< Self::Item, Option< ItemNew > > >
( self, filtering_object: FilteringObject ) -> FilterMapByTransform< Self, FilteringObject, ItemNew > {
FilterMapByTransform::new(self, filtering_object)
}
}
#[derive(Copy,Debug,Dissolve,Eq,PartialEq,Getters,Ord,PartialOrd)]
pub struct Filter< I, FilteringObject >
where
I: Iterator,
FilteringObject: EvaluateFunctionRef< I::Item, bool >,
{
iter: I,
filtering_object: FilteringObject,
}
impl < 'a, I, FilteringObject >
Filter
< I, FilteringObject >
where
I: Iterator,
FilteringObject: EvaluateFunctionRef< I::Item, bool >,
{
pub fn new< J: IntoIterator< IntoIter = I > >( iter: J, filtering_object: FilteringObject ) -> Filter< I, FilteringObject >
{ Filter{ iter: iter.into_iter(), filtering_object, } }
}
impl < I, FilteringObject >
Iterator for
Filter< I, FilteringObject, >
where
I: Iterator,
FilteringObject: EvaluateFunctionRef< I::Item, bool >
{
type Item = I::Item;
fn next( &mut self ) -> Option< Self::Item > {
for next_item in self.iter.by_ref() {
match self.filtering_object.evaluate_function_ref( &next_item ) {
false => continue,
true => { return Some( next_item ) }
}
}
None
}
}
impl < I, FilteringObject >
Clone for
Filter< I, FilteringObject >
where
I: Clone + Iterator,
FilteringObject: Clone + EvaluateFunctionRef< I::Item, bool >
{
fn clone( & self ) -> Self { Filter::new( self.iter.clone(), self.filtering_object.clone() )}
}
pub trait FilterTrait
where
Self: IntoIterator + Sized,
{
fn filter<
FilteringObject: EvaluateFunctionRef< Self::Item, bool >
>
( self, filtering_object: FilteringObject )
->
Filter< Self::IntoIter, FilteringObject >
{
Filter::new(self.into_iter(), filtering_object)
}
}
impl < Iter >
FilterTrait
for
Iter
where
Iter: IntoIterator,
{}
pub enum IntoTwoTypeIterator < I1, I2 >
where I1: IntoIterator,
I2: IntoIterator < Item = I1::Item >,
{
Version1( I1 ),
Version2( I2 ),
}
impl < I1, I2 >
IntoIterator
for IntoTwoTypeIterator < I1, I2 >
where I1: IntoIterator,
I2: IntoIterator < Item = I1::Item >,
{
type Item = I1::Item;
type IntoIter = TwoTypeIterator< I1::IntoIter, I2::IntoIter >;
fn into_iter(self) -> Self::IntoIter {
match self {
Self::Version1( iter1 ) => TwoTypeIterator::Version1( iter1.into_iter() ),
Self::Version2( iter2 ) => TwoTypeIterator::Version2( iter2.into_iter() ),
}
}
}
impl < I1, I2 >
Clone
for IntoTwoTypeIterator < I1, I2 >
where I1: Clone + Iterator,
I2: Clone + Iterator < Item = I1::Item >,
{
fn clone(&self) -> Self {
match self {
Self::Version1( iter1 ) => { Self::Version1( iter1.clone() ) },
Self::Version2( iter2 ) => { Self::Version2( iter2.clone() ) },
}
}
}
#[derive(Debug, Eq, PartialEq, Ord, PartialOrd)]
pub enum TwoTypeIterator < I1, I2 >
where I1: Iterator,
I2: Iterator < Item = I1::Item >,
{
Version1( I1 ),
Version2( I2 ),
}
impl < I1, I2 >
Iterator
for TwoTypeIterator < I1, I2 >
where I1: Iterator,
I2: Iterator < Item = I1::Item >,
{
type Item = I1::Item;
fn next( & mut self ) -> Option< Self::Item > {
use TwoTypeIterator::*;
match self {
Version1( iter1 ) => {
iter1.next()
},
Version2( iter2 ) => {
iter2.next()
}
}
}
}
impl < I1, I2 >
Clone for
TwoTypeIterator < I1, I2 >
where I1: Clone + Iterator,
I2: Clone + Iterator < Item = I1::Item >,
{
fn clone(&self) -> Self {
match self {
Self::Version1( iter1 ) => { Self::Version1( iter1.clone() ) },
Self::Version2( iter2 ) => { Self::Version2( iter2.clone() ) },
}
}
}
impl < I1, I2 >
PeekUnqualified for
TwoTypeIterator < I1, I2 >
where I1: PeekUnqualified + Iterator,
I2: PeekUnqualified + Iterator < Item = I1::Item >,
{
fn peek_unqualified( &mut self ) -> Option< & Self::Item > {
match self {
Self::Version1( iter ) => { iter.peek_unqualified() }
Self::Version2( iter ) => { iter.peek_unqualified() }
}
}
}
#[derive(Clone,Copy,Debug,Dissolve,Eq,PartialEq,Getters,Ord,PartialOrd)]
pub struct OnlyDuplicates< I: Iterator >{
iter_unwrapped: I,
next_candidate: Option< I::Item >,
}
impl < I >
OnlyDuplicates< I >
where
I: Iterator,
I::Item: std::cmp::PartialEq,
{
pub fn new< J: IntoIterator< IntoIter = I > >( iterable_unwrapped: J ) -> OnlyDuplicates< I > {
let mut iter_unwrapped = iterable_unwrapped.into_iter();
let next_candidate = iter_unwrapped.next();
OnlyDuplicates { iter_unwrapped, next_candidate }
}
}
impl < I >
Iterator for
OnlyDuplicates< I >
where
I: Iterator,
I::Item: std::cmp::PartialEq,
{
type Item = I::Item;
fn next( &mut self ) -> Option< Self::Item > {
let mut is_duplicate;
let mut following_candidate;
loop {
self.next_candidate.as_ref()?;
following_candidate = self.iter_unwrapped.next();
is_duplicate = self.next_candidate == following_candidate;
while following_candidate == self.next_candidate {
following_candidate = self.iter_unwrapped.next();
}
if is_duplicate{
std::mem::swap( &mut self.next_candidate, &mut following_candidate );
return following_candidate
} else {
self.next_candidate = following_candidate;
}
}
}
}
#[derive(Clone,Copy,Debug,Dissolve,Eq,PartialEq,Getters,Ord,PartialOrd)]
pub struct SkipDuplicates< I: Iterator >{
iter_unwrapped: I,
next_candidate: Option< I::Item >,
}
impl < I >
SkipDuplicates< I >
where
I: Iterator,
I::Item: std::cmp::PartialEq,
{
pub fn new< J: IntoIterator< IntoIter = I > >( iter_unwrapped: J ) -> SkipDuplicates< I > {
let mut iter_unwrapped = iter_unwrapped.into_iter();
let next_candidate = iter_unwrapped.next();
SkipDuplicates { iter_unwrapped, next_candidate }
}
}
impl < I >
Iterator for
SkipDuplicates< I >
where
I: Iterator,
I::Item: std::cmp::PartialEq,
{
type Item = I::Item;
fn next( &mut self ) -> Option< Self::Item > {
let mut is_duplicate;
let mut following_candidate;
loop {
self.next_candidate.as_ref()?;
following_candidate = self.iter_unwrapped.next();
is_duplicate = self.next_candidate == following_candidate;
while following_candidate == self.next_candidate {
following_candidate = self.iter_unwrapped.next();
}
if is_duplicate{
self.next_candidate = following_candidate;
} else {
std::mem::swap( &mut self.next_candidate, &mut following_candidate );
return following_candidate
}
}
}
}
pub fn ordered_iter_contains<I>( mut iter_large: I, iter_small: I ) -> bool
where
I: Iterator,
I::Item: Ord + PartialEq + std::fmt::Debug,
{
for item in iter_small{
loop{
match iter_large.next(){
None => { return false }
Some( x ) =>{
println!("{:?}", (&x, &item));
match x.cmp( &item ) {
std::cmp::Ordering::Less => { continue }
std::cmp::Ordering::Equal => { break },
std::cmp::Ordering::Greater => { return false }
}
}
}
}
}
true
}
pub fn intersect_n_ordered_iterators_of_keyval_pairs< T, I >(
iterators: T,
)
->
IntersectOrderedIterators
< I, OrderOperatorByKey >
where
T: IntoIterator<Item=I>,
I: Iterator,
I::Item: KeyValGet,
<<I as Iterator>::Item as KeyValGet>::Key: Ord, {
let mut iterators: Vec<_> = iterators.into_iter().collect();
iterators.shrink_to_fit();
IntersectOrderedIterators{ iterators, order_operator: OrderOperatorByKey::new(), confirmed_empty: false }
}
#[derive(Clone,Debug,Dissolve,Eq,PartialEq,Getters,Ord,PartialOrd)]
pub struct IntersectOrderedIterators< I, OrderOperator >
where
I: Iterator,
{
iterators: Vec< I >,
order_operator: OrderOperator,
confirmed_empty: bool, }
impl < I, OrderOperator >
IntersectOrderedIterators< I, OrderOperator >
where
I: Iterator,
OrderOperator: JudgeOrder< I::Item >,
{
pub fn with_custom_order< T: IntoIterator<Item=J>, J: IntoIterator< IntoIter = I > >(
iterators: T,
order_operator: OrderOperator
)
->
IntersectOrderedIterators
< I, OrderOperator >
{
let mut iterators: Vec<_> = iterators.into_iter().map(|iterable| iterable.into_iter()).collect();
iterators.shrink_to_fit();
IntersectOrderedIterators{ iterators, order_operator, confirmed_empty: false }
}
}
impl < I >
IntersectOrderedIterators< I, OrderOperatorAuto >
where
I: Iterator,
I::Item: Ord,
{
pub fn new< T: IntoIterator<Item=I> >(
iterators: T,
)
->
IntersectOrderedIterators
< I, OrderOperatorAuto >
{
let mut iterators: Vec<_> = iterators.into_iter().collect();
iterators.shrink_to_fit();
IntersectOrderedIterators{ iterators, order_operator: OrderOperatorAuto, confirmed_empty: false }
}
}
impl < I, OrderOperator >
Iterator for
IntersectOrderedIterators< I, OrderOperator >
where
I: Iterator,
OrderOperator: JudgeOrder< I::Item >,
{
type Item = I::Item;
fn next( &mut self ) -> Option< Self::Item > {
if self.confirmed_empty { return None }
if self.iterators.is_empty() { return None }
let mut source_old = 0;
let mut source_new = 0;
let mut item_old;
match self.iterators[source_old].next() {
None => {
self.confirmed_empty = true; return None
} Some( item_new ) => {
item_old = item_new;
loop {
source_new = ( source_new + 1 ) % self.iterators.len();
if source_new == source_old { return Some( item_old ) }
loop {
match self.iterators[source_new].next() {
None => {
self.confirmed_empty = true; return None
} Some( item_new ) => {
match self.order_operator.judge_cmp( &item_new, &item_old ) {
Ordering::Less => {
continue;
} Ordering::Equal => {
if source_new == 0 { item_old = item_new } break; } Ordering::Greater => {
item_old = item_new;
source_old = source_new;
break;
}
}
}
}
}
}
}
}
}
}
pub fn intersect_ordered_iterators< I >( iter1: I, iter2: I )
->
OnlyDuplicates< Merge< I, I > >
where
I: Iterator,
I::Item: PartialOrd,
{
OnlyDuplicates::new( iter1.merge( iter2 ))
}
pub fn symmetric_difference_of_ordered_iterators< I >( iter1: I, iter2: I )
->
SkipDuplicates< Merge< I, I > >
where
I: Iterator,
I::Item: PartialOrd,
{
SkipDuplicates::new( iter1.merge( iter2 ))
}
#[derive(Clone,Copy,Debug,Dissolve,Eq,PartialEq,Getters,Ord,PartialOrd)]
pub struct OncePeekable< T > { item_opt: Option< T > }
impl < T > OncePeekable< T > {
pub fn new( item: T ) -> OncePeekable< T > { OncePeekable{ item_opt: Some(item) } }
}
impl < T > Iterator for OncePeekable< T > {
type Item = T;
fn next( &mut self ) -> Option< Self::Item > {
self.item_opt.take() }
}
impl < T >
PeekUnqualified for
OncePeekable< T >
{
fn peek_unqualified( &mut self ) -> Option < & Self::Item > { self.item_opt.as_ref() }
}
#[derive(Clone,Debug,Dissolve,Eq,PartialEq,Getters,Ord,PartialOrd)]
pub struct IterWrappedArcVec< T > { unwrapped_vec: Arc<Vec< T >>, pointer_to_next_val: usize }
impl < T > IterWrappedArcVec < T > {
pub fn new( unwrapped_vec: Arc<Vec< T >> ) -> IterWrappedArcVec < T > { IterWrappedArcVec{ unwrapped_vec, pointer_to_next_val: 0 } }
pub fn reset_and_run_backward( self ) -> IterWrappedArcVecReverse< T > { IterWrappedArcVecReverse::new( self.unwrapped_vec ) }
}
impl < T: Clone > Iterator for IterWrappedArcVec< T > {
type Item = T;
fn next( &mut self ) -> Option< Self::Item > {
match self.pointer_to_next_val < self.unwrapped_vec.len() {
true => {
let a = self.unwrapped_vec[ self.pointer_to_next_val ].clone(); self.pointer_to_next_val += 1; Some( a ) }
false => { None }
}
}
}
#[derive(Clone,Debug,Dissolve,Eq,PartialEq,Getters,Ord,PartialOrd)]
pub struct IterWrappedArcVecReverse< T > { unwrapped_vec: Arc<Vec< T >>, steps_back_to_next_val: usize }
impl < T > IterWrappedArcVecReverse < T > {
pub fn new( unwrapped_vec: Arc<Vec< T >> ) -> IterWrappedArcVecReverse < T > { IterWrappedArcVecReverse{ unwrapped_vec, steps_back_to_next_val: 1 } }
pub fn reset_and_run_forward( self ) -> IterWrappedArcVec< T > { IterWrappedArcVec::new( self.unwrapped_vec ) }
}
impl < T: Clone > Iterator for IterWrappedArcVecReverse< T > {
type Item = T;
fn next( &mut self ) -> Option< Self::Item > {
let len = self.unwrapped_vec.len();
match self.steps_back_to_next_val <= len {
true => {
let a = self.unwrapped_vec[ len - self.steps_back_to_next_val ].clone(); self.steps_back_to_next_val += 1; Some( a ) }
false => { None }
}
}
}
#[derive(Clone,Debug,Dissolve,Eq,PartialEq,Getters,Ord,PartialOrd)]
pub struct IterWrappedVec< T > { unwrapped_vec: Vec< T >, pointer_to_next_val: usize }
impl < T > IterWrappedVec < T > {
pub fn new( unwrapped_vec: Vec< T > ) -> IterWrappedVec < T > { IterWrappedVec{ unwrapped_vec, pointer_to_next_val: 0 } }
pub fn reset_and_run_backward( self ) -> IterWrappedVecReverse< T > { IterWrappedVecReverse::new( self.unwrapped_vec ) }
}
impl < T: Clone > Iterator for IterWrappedVec< T > {
type Item = T;
fn next( &mut self ) -> Option< Self::Item > {
match self.pointer_to_next_val < self.unwrapped_vec.len() {
true => {
let a = self.unwrapped_vec[ self.pointer_to_next_val ].clone(); self.pointer_to_next_val += 1; Some( a ) }
false => { None }
}
}
}
#[derive(Clone,Debug,Dissolve,Eq,PartialEq,Getters,Ord,PartialOrd)]
pub struct IterWrappedVecReverse< T > { unwrapped_vec: Vec< T >, steps_back_to_next_val: usize }
impl < T > IterWrappedVecReverse < T > {
pub fn new( unwrapped_vec: Vec< T > ) -> IterWrappedVecReverse < T > { IterWrappedVecReverse{ unwrapped_vec, steps_back_to_next_val: 1 } }
pub fn reset_and_run_forward( self ) -> IterWrappedVec< T > { IterWrappedVec::new( self.unwrapped_vec ) }
}
impl < T: Clone > Iterator for IterWrappedVecReverse< T > {
type Item = T;
fn next( &mut self ) -> Option< Self::Item > {
let len = self.unwrapped_vec.len();
match self.steps_back_to_next_val <= len {
true => {
let a = self.unwrapped_vec[ len - self.steps_back_to_next_val ].clone(); self.steps_back_to_next_val += 1; Some( a ) }
false => { None }
}
}
}
#[cfg(test)]
mod doc_test_drafts {
use crate::utilities::functions::evaluate::EvaluateFunction;
#[test]
fn test_skip_until() {
use crate::utilities::iterators::general::SkipUntil;
let vec = vec![ 0, 1, 2, 1, 0];
let iter = vec.iter().cloned().peekable().skip_until( |x| x > &1);
itertools::assert_equal( iter, vec![ 2, 1, 0 ])
}
#[test]
fn test_filter_map_by_transform() {
use crate::utilities::iterators::general::FilterMapByTransform;
struct ShiftDown;
impl EvaluateFunction< usize, Option< i32 > > for ShiftDown{
fn evaluate_function( &self, input: usize ) -> Option< i32 > {
match input > 3 {
true => { None },
false => { Some( input as i32 - 3 ) }
}
}
}
let iter = 0..9;
let iter_transformed = FilterMapByTransform::new( iter, ShiftDown );
itertools::assert_equal( iter_transformed, vec![ -3, -2, -1, 0 ])
}
#[test]
fn test_filter_map_by_transform_2() {
use crate::utilities::iterators::general::{FilterMapByTransformTrait};
use std::collections::HashMap;
let mut hash = HashMap::new();
hash.insert( 1usize, -1);
hash.insert( 2usize, -2);
let iter_data = vec![0, 1, 2, 3];
let iter = iter_data.iter().cloned();
let iter_filtermapped = iter.filter_map_by_transform( & hash );
itertools::assert_equal( iter_filtermapped.cloned(), vec![-1, -2] );
}
#[test]
fn test_implementation_of_filtermapobjectmethod_on_hashmap() {
use crate::utilities::iterators::general::{FilterMapByTransformTrait};
use std::collections::HashMap;
let mut hash = HashMap::new();
hash.insert( 1usize, -1);
hash.insert( 2usize, -2);
let iter_data = vec![0, 1, 2, 3];
let iter = iter_data.iter().cloned();
let iter_filtermapped = iter.filter_map_by_transform( & hash );
itertools::assert_equal( iter_filtermapped.cloned(), vec![-1, -2] );
}
#[test]
fn test_map_by_transform() {
use crate::utilities::iterators::general::MapByTransform;
use crate::utilities::functions::evaluate::EvaluateFunctionFnMutWrapper;
let entrywise_transform_unwrapped = |x : usize| -> i32 { x as i32 };
let entrywise_transform_wrapped = EvaluateFunctionFnMutWrapper::new(entrywise_transform_unwrapped);
let vec = vec![ 1, 2, 3];
let iter = vec.iter().cloned();
let transformed_entrywise = MapByTransform::new( iter, entrywise_transform_wrapped );
itertools::assert_equal( transformed_entrywise, vec![ 1i32, 2, 3] );
}
}
#[cfg(test)]
mod unit_tests {
}