use crate::change::RemoteChange;
use crate::node::{Node, StaticNode};
use crate::options::{EipsOptions, NodeAllocOptions};
use crate::{Eips, Id};
use core::marker::PhantomData;
use fixed_typed_arena::iter::{Iter as ArenaIter, Position as ArenaPosition};
pub struct Changes<'a, Id, Opt>
where
Opt: EipsOptions,
{
pub(crate) nodes: ArenaIter<'a, Node<Id, Opt>, NodeAllocOptions<Id, Opt>>,
pub(crate) eips: &'a Eips<Id, Opt>,
}
impl<Id, Opt> Changes<'_, Id, Opt>
where
Opt: EipsOptions,
{
pub fn pause(self) -> PausedChanges<Id, Opt> {
PausedChanges {
position: self.nodes.as_position(),
_phantom: PhantomData,
}
}
}
impl<Id, Opt> Iterator for Changes<'_, Id, Opt>
where
Id: self::Id,
Opt: EipsOptions,
{
type Item = (RemoteChange<Id>, Option<usize>);
fn next(&mut self) -> Option<Self::Item> {
self.nodes.next().map(|n| {
let node = unsafe { StaticNode::new(n.into()) };
self.eips.node_to_indexed_change(node)
})
}
}
impl<Id, Opt> Clone for Changes<'_, Id, Opt>
where
Opt: EipsOptions,
{
fn clone(&self) -> Self {
Self {
nodes: self.nodes.clone(),
eips: self.eips,
}
}
}
pub struct PausedChanges<Id, Opt> {
position: ArenaPosition,
_phantom: PhantomData<fn() -> (Id, Opt)>,
}
impl<Id, Opt> PausedChanges<Id, Opt>
where
Opt: EipsOptions,
{
pub fn resume(self, eips: &Eips<Id, Opt>) -> Changes<'_, Id, Opt> {
Changes {
nodes: eips.node_alloc.iter_at(&self.position),
eips,
}
}
}
impl<Id, Opt> Clone for PausedChanges<Id, Opt>
where
Opt: EipsOptions,
{
fn clone(&self) -> Self {
Self {
position: self.position.clone(),
_phantom: PhantomData,
}
}
}