pub mod prelude {
pub use crate::EternalIterator;
}
#[must_use]
pub unsafe trait EternalIterator: Iterator {
#[inline]
fn next_eternal(&mut self) -> Self::Item {
if let Some(item) = self.next() {
item
} else {
unreachable!()
}
}
fn next_array<const N: usize>(&mut self) -> [Self::Item; N] {
use core::mem::MaybeUninit;
let mut arr = MaybeUninit::<[Self::Item; N]>::uninit();
unsafe { &mut *(arr.as_mut_ptr() as *mut [MaybeUninit<Self::Item>; N]) }
.iter_mut()
.for_each(|mu| {
*mu = MaybeUninit::new(self.next_eternal());
});
unsafe { arr.assume_init() }
}
}
unsafe impl<I: EternalIterator + ?Sized> EternalIterator for &mut I {
#[inline]
fn next_eternal(&mut self) -> I::Item {
(**self).next_eternal()
}
}
macro_rules! impl_eternal_iterator {
($($(#[doc = $doc:expr])* impl [$($param:tt)*] for $obj:ty $({ $lassert:expr => [$($rassert:expr),*] })*;)+) => {
$(
// SAFETY: precondition is satisfied obviously.
$(
#[doc = $doc]
)*
$(
#[doc = concat!(
"```\n# use eternal_iterator::*;\nlet mut it = ",
$lassert,
$(concat!(
";\nassert_eq!(it.next_eternal(), ",
$rassert,
")"
),)*
";\n```"
)]
)*
unsafe impl<$($param)*> EternalIterator for $obj
where
$obj: Iterator
{
}
)+
};
}
macro_rules! impl_eternal_iterator_blanket {
($($(#[doc = $doc:expr])* $($pitem:ident)::+ [$($id:ident),+] $({ $lassert:expr => [$($rassert:expr),*] })*;)+) => {
$(
impl_eternal_iterator! { $(#[doc = $doc])* impl [$($id: EternalIterator),+] for $($pitem)::+<$($id),+> $({ $lassert => [$($rassert),*] })*; }
)+
};
}
impl_eternal_iterator! {
impl [A: Clone] for core::iter::Repeat<A> {
"std::iter::repeat(123)" => ["123", "123", "123"]
};
impl [A, F: FnMut() -> A] for core::iter::RepeatWith<F> {
"std::iter::repeat_with(|| 123)" => ["123", "123", "123"]
};
impl [I: Clone + Iterator] for core::iter::Cycle<I> {
"(0..2).cycle()" => ["0", "1", "0", "1"]
};
impl [A: Iterator, B: EternalIterator<Item = A::Item>] for core::iter::Chain<A, B> {
"(0..2).chain(4..)" => ["0", "1", "4", "5"]
};
impl [A: EternalIterator, B: EternalIterator] for core::iter::Zip<A, B> {
"(0..).zip(4..)" => ["(0, 4)", "(1, 5)", "(2, 6)"]
};
impl ['a, T: 'a + Clone, I: EternalIterator<Item = &'a T>] for core::iter::Cloned<I> {
"std::iter::repeat(&123).cloned()" => ["123", "123", "123"]
};
impl [I: EternalIterator, F] for core::iter::FilterMap<I, F> {
"(0..).filter_map(|x| (x % 2 == 0).then(|| x))" => ["0", "2", "4"]
};
impl [I: EternalIterator, F] for core::iter::Map<I, F> {
"(0..).map(|x| x * 2)" => ["0", "2", "4"]
};
impl [II: IntoIterator, I: EternalIterator<Item = II>] for core::iter::Flatten<I> {
"(0..).map(|x| x..(x + 2)).flatten()" => ["0", "1", "1", "2", "2"]
};
impl [I: EternalIterator, F] for core::iter::Inspect<I, F>;
impl [I: EternalIterator, P] for core::iter::Filter<I, P> {
"(0..).filter(|x| x % 2 == 0)" => ["0", "2", "4"]
};
impl [I: EternalIterator, P] for core::iter::SkipWhile<I, P> {
"(-3_i32..).skip_while(|x| x.is_negative())" => ["0", "1", "2"]
};
impl [I: EternalIterator, U: IntoIterator, F] for core::iter::FlatMap<I, U, F> {
"(0..).flat_map(|x| x..(x + 2))" => ["0", "1", "1", "2"]
};
impl [A] for core::ops::RangeFrom<A> {
"(0..)" => ["0", "1", "2"]
};
impl [I: EternalIterator<Item = u16>] for core::char::DecodeUtf16<I>;
}
impl_eternal_iterator_blanket! {
core::iter::Enumerate[I] {
"std::iter::repeat(123).enumerate()" => ["(0, 123)", "(1, 123)", "(2, 123)"]
};
core::iter::Copied[I] {
"std::iter::repeat(&123).copied()" => ["123", "123", "123"]
};
core::iter::Fuse[I] {
"(0..).fuse()" => ["0", "1", "2"]
};
core::iter::Skip[I] {
"(0..).skip(2)" => ["2", "3", "4"]
};
core::iter::StepBy[I]{
"(0..).step_by(2)" => ["0", "2", "4"]
};
core::iter::Peekable[I] {
"(0..).peekable()" => ["0", "1", "2"]
};
}
#[derive(Clone)]
pub struct FromFn<F>(F);
#[inline]
pub fn from_fn<T, F>(f: F) -> FromFn<F>
where
F: FnMut() -> T,
{
FromFn(f)
}
impl<T, F> Iterator for FromFn<F>
where
F: FnMut() -> T,
{
type Item = T;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
Some(self.next_eternal())
}
}
unsafe impl<T, F> EternalIterator for FromFn<F>
where
F: FnMut() -> T,
{
#[inline]
fn next_eternal(&mut self) -> Self::Item {
(self.0)()
}
}
#[derive(Clone)]
pub struct Successors<T, F> {
next: T,
succ: F,
}
pub fn successors<T, F>(next: T, succ: F) -> Successors<T, F> {
Successors { next, succ }
}
impl<T, F> Iterator for Successors<T, F>
where
F: FnMut(&T) -> T,
{
type Item = T;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
Some(self.next_eternal())
}
}
unsafe impl<T, F> EternalIterator for Successors<T, F>
where
F: FnMut(&T) -> T,
{
#[inline]
fn next_eternal(&mut self) -> Self::Item {
let item = (self.succ)(&self.next);
core::mem::replace(&mut self.next, item)
}
}
#[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Default, Debug)]
pub struct UnsafeWrapper<I>(I);
pub unsafe fn wrap_unsafe<II: IntoIterator>(slot: II) -> UnsafeWrapper<II::IntoIter> {
UnsafeWrapper(slot.into_iter())
}
pub fn wrap<I: EternalIterator, II: IntoIterator<IntoIter = I>>(slot: II) -> UnsafeWrapper<I> {
UnsafeWrapper(slot.into_iter())
}
impl<I: Iterator> Iterator for UnsafeWrapper<I> {
type Item = I::Item;
fn next(&mut self) -> Option<I::Item> {
self.0.next()
}
}
unsafe impl<I: Iterator> EternalIterator for UnsafeWrapper<I> {}
impl<I: Iterator> core::iter::FusedIterator for UnsafeWrapper<I> {}
impl<I: Iterator, const N: usize> From<UnsafeWrapper<I>> for [I::Item; N] {
fn from(mut it: UnsafeWrapper<I>) -> Self {
it.next_array()
}
}