use super::TransitionAccount;
use primitives::{hash_map::Entry, Address, AddressMap, HashMap};
#[derive(Clone, Default, Debug, PartialEq, Eq)]
pub struct TransitionState {
pub transitions: AddressMap<TransitionAccount>,
}
impl TransitionState {
pub fn single(address: Address, transition: TransitionAccount) -> Self {
let mut transitions = HashMap::default();
transitions.insert(address, transition);
TransitionState { transitions }
}
pub fn take(&mut self) -> TransitionState {
core::mem::take(self)
}
pub fn clear(&mut self) {
self.transitions.clear();
}
pub fn add_transitions(
&mut self,
transitions: impl IntoIterator<Item = (Address, TransitionAccount)>,
) {
let transitions = transitions.into_iter();
if let Some(upper) = transitions.size_hint().1 {
self.transitions.reserve(upper);
}
for (address, account) in transitions {
match self.transitions.entry(address) {
Entry::Occupied(entry) => entry.into_mut().update(account),
Entry::Vacant(entry) => _ = entry.insert(account),
}
}
}
}