use crate::joint::JointPrefix;
use super::JointPrefixMap;
pub struct Iter<'a, P: JointPrefix, T> {
pub(crate) i1: Option<crate::map::Iter<'a, P::P1, T>>,
pub(crate) i2: Option<crate::map::Iter<'a, P::P2, T>>,
}
impl<P: JointPrefix, T> Default for Iter<'_, P, T> {
fn default() -> Self {
Self { i1: None, i2: None }
}
}
impl<P: JointPrefix, T> Clone for Iter<'_, P, T> {
fn clone(&self) -> Self {
Self {
i1: self.i1.clone(),
i2: self.i2.clone(),
}
}
}
impl<'a, P: JointPrefix, T> Iterator for Iter<'a, P, T> {
type Item = (P, &'a T);
fn next(&mut self) -> Option<(P, &'a T)> {
if let Some(i1) = self.i1.as_mut() {
if let Some((p, t)) = i1.next() {
return Some((P::from_p1(p), t));
}
self.i1 = None;
}
if let Some(i2) = self.i2.as_mut() {
if let Some((p, t)) = i2.next() {
return Some((P::from_p2(p), t));
}
self.i2 = None;
}
None
}
}
#[derive(Clone, Default)]
pub struct Keys<'a, P: JointPrefix, T> {
pub(crate) inner: Iter<'a, P, T>,
}
impl<P: JointPrefix, T> Iterator for Keys<'_, P, T> {
type Item = P;
fn next(&mut self) -> Option<P> {
self.inner.next().map(|(k, _)| k)
}
}
#[derive(Clone, Default)]
pub struct Values<'a, P: JointPrefix, T> {
pub(crate) inner: Iter<'a, P, T>,
}
impl<'a, P: JointPrefix, T> Iterator for Values<'a, P, T> {
type Item = &'a T;
fn next(&mut self) -> Option<&'a T> {
self.inner.next().map(|(_, v)| v)
}
}
#[derive(Clone)]
pub struct IntoIter<P: JointPrefix, T> {
pub(crate) i1: Option<crate::map::IntoIter<P::P1, T>>,
pub(crate) i2: Option<crate::map::IntoIter<P::P2, T>>,
}
impl<P: JointPrefix, T> Iterator for IntoIter<P, T> {
type Item = (P, T);
fn next(&mut self) -> Option<(P, T)> {
if let Some(i1) = self.i1.as_mut() {
if let Some((p, t)) = i1.next() {
return Some((P::from_p1(&p), t));
}
self.i1 = None;
}
if let Some(i2) = self.i2.as_mut() {
if let Some((p, t)) = i2.next() {
return Some((P::from_p2(&p), t));
}
self.i2 = None;
}
None
}
}
#[derive(Clone)]
pub struct IntoKeys<P: JointPrefix, T> {
pub(crate) inner: IntoIter<P, T>,
}
impl<P: JointPrefix, T> Iterator for IntoKeys<P, T> {
type Item = P;
fn next(&mut self) -> Option<P> {
self.inner.next().map(|(k, _)| k)
}
}
#[derive(Clone)]
pub struct IntoValues<P: JointPrefix, T> {
pub(crate) inner: IntoIter<P, T>,
}
impl<P: JointPrefix, T> Iterator for IntoValues<P, T> {
type Item = T;
fn next(&mut self) -> Option<T> {
self.inner.next().map(|(_, v)| v)
}
}
impl<P: JointPrefix, T> IntoIterator for JointPrefixMap<P, T> {
type Item = (P, T);
type IntoIter = IntoIter<P, T>;
fn into_iter(self) -> Self::IntoIter {
IntoIter {
i1: Some(self.t1.into_iter()),
i2: Some(self.t2.into_iter()),
}
}
}
impl<'a, P: JointPrefix, T> IntoIterator for &'a JointPrefixMap<P, T> {
type Item = (P, &'a T);
type IntoIter = Iter<'a, P, T>;
fn into_iter(self) -> Self::IntoIter {
Iter {
i1: Some(self.t1.iter()),
i2: Some(self.t2.iter()),
}
}
}
pub struct IterMut<'a, P: JointPrefix, T> {
pub(super) i1: Option<crate::map::IterMut<'a, P::P1, T>>,
pub(super) i2: Option<crate::map::IterMut<'a, P::P2, T>>,
}
impl<P: JointPrefix, T> Default for IterMut<'_, P, T> {
fn default() -> Self {
Self { i1: None, i2: None }
}
}
impl<'a, P: JointPrefix, T> Iterator for IterMut<'a, P, T> {
type Item = (P, &'a mut T);
fn next(&mut self) -> Option<Self::Item> {
if let Some(i1) = self.i1.as_mut() {
if let Some((p, t)) = i1.next() {
return Some((P::from_p1(p), t));
}
self.i1 = None;
}
if let Some(i2) = self.i2.as_mut() {
if let Some((p, t)) = i2.next() {
return Some((P::from_p2(p), t));
}
self.i2 = None;
}
None
}
}
#[derive(Default)]
pub struct ValuesMut<'a, P: JointPrefix, T> {
pub(crate) inner: IterMut<'a, P, T>,
}
impl<'a, P: JointPrefix, T> Iterator for ValuesMut<'a, P, T> {
type Item = &'a mut T;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(_, v)| v)
}
}
impl<P: JointPrefix, T> FromIterator<(P, T)> for JointPrefixMap<P, T> {
fn from_iter<I: IntoIterator<Item = (P, T)>>(iter: I) -> Self {
let mut map = Self::new();
iter.into_iter().for_each(|(p, v)| {
map.insert(p, v);
});
map
}
}
pub enum Cover<'a, 'p, P: JointPrefix, T> {
P1(crate::map::Cover<'a, 'p, P::P1, T>),
P2(crate::map::Cover<'a, 'p, P::P2, T>),
}
impl<'a, P: JointPrefix, T> Iterator for Cover<'a, '_, P, T> {
type Item = (P, &'a T);
fn next(&mut self) -> Option<Self::Item> {
match self {
Cover::P1(cover) => cover.next().map(|(p, t)| (P::from_p1(p), t)),
Cover::P2(cover) => cover.next().map(|(p, t)| (P::from_p2(p), t)),
}
}
}
pub struct CoverKeys<'a, 'p, P: JointPrefix, T>(pub(crate) Cover<'a, 'p, P, T>);
impl<P: JointPrefix, T> Iterator for CoverKeys<'_, '_, P, T> {
type Item = P;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(|(p, _)| p)
}
}
pub struct CoverValues<'a, 'p, P: JointPrefix, T>(pub(super) Cover<'a, 'p, P, T>);
impl<'a, P: JointPrefix, T> Iterator for CoverValues<'a, '_, P, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(|(_, t)| t)
}
}
pub struct Union<'a, P: JointPrefix, L, R> {
pub(crate) i1: Option<crate::trieview::Union<'a, P::P1, L, R>>,
pub(crate) i2: Option<crate::trieview::Union<'a, P::P2, L, R>>,
}
impl<'a, P: JointPrefix, L, R> Iterator for Union<'a, P, L, R> {
type Item = UnionItem<'a, P, L, R>;
fn next(&mut self) -> Option<Self::Item> {
if let Some(i1) = self.i1.as_mut() {
if let Some(next) = i1.next() {
return Some(UnionItem::from_p1(next));
}
self.i1 = None;
}
if let Some(i2) = self.i2.as_mut() {
if let Some(next) = i2.next() {
return Some(UnionItem::from_p2(next));
}
self.i2 = None;
}
None
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum UnionItem<'a, P, L, R> {
Left {
prefix: P,
left: &'a L,
right: Option<(P, &'a R)>,
},
Right {
prefix: P,
left: Option<(P, &'a L)>,
right: &'a R,
},
Both {
prefix: P,
left: &'a L,
right: &'a R,
},
}
impl<'a, P, L, R> UnionItem<'a, P, L, R> {
pub fn prefix(&self) -> &P {
match self {
UnionItem::Left { prefix, .. }
| UnionItem::Right { prefix, .. }
| UnionItem::Both { prefix, .. } => prefix,
}
}
pub fn into_prefix(self) -> P {
match self {
UnionItem::Left { prefix, .. }
| UnionItem::Right { prefix, .. }
| UnionItem::Both { prefix, .. } => prefix,
}
}
pub fn both(&self) -> Option<(&P, &'a L, &'a R)> {
match self {
UnionItem::Left { .. } | UnionItem::Right { .. } => None,
UnionItem::Both {
prefix,
left,
right,
} => Some((prefix, left, right)),
}
}
pub fn into_both(self) -> Option<(P, &'a L, &'a R)> {
match self {
UnionItem::Left { .. } | UnionItem::Right { .. } => None,
UnionItem::Both {
prefix,
left,
right,
} => Some((prefix, left, right)),
}
}
pub fn left(&self) -> Option<(&P, &'a L)> {
match self {
UnionItem::Right { left, .. } => left.as_ref().map(|(p, l)| (p, *l)),
UnionItem::Left { prefix, left, .. } | UnionItem::Both { prefix, left, .. } => {
Some((prefix, left))
}
}
}
pub fn into_left(self) -> Option<(P, &'a L)> {
match self {
UnionItem::Right { left, .. } => left,
UnionItem::Left { prefix, left, .. } | UnionItem::Both { prefix, left, .. } => {
Some((prefix, left))
}
}
}
pub fn right(&self) -> Option<(&P, &'a R)> {
match self {
UnionItem::Left { right, .. } => right.as_ref().map(|(p, r)| (p, *r)),
UnionItem::Right { prefix, right, .. } | UnionItem::Both { prefix, right, .. } => {
Some((prefix, right))
}
}
}
pub fn into_right(self) -> Option<(P, &'a R)> {
match self {
UnionItem::Left { right, .. } => right,
UnionItem::Right { prefix, right, .. } | UnionItem::Both { prefix, right, .. } => {
Some((prefix, right))
}
}
}
}
impl<'a, P: JointPrefix, L, R> UnionItem<'a, P, L, R> {
fn from_p1(value: crate::trieview::UnionItem<'a, P::P1, L, R>) -> Self {
match value {
crate::trieview::UnionItem::Left {
prefix,
left,
right,
} => UnionItem::Left {
prefix: P::from_p1(prefix),
left,
right: right.map(|(p, r)| (P::from_p1(p), r)),
},
crate::trieview::UnionItem::Right {
prefix,
left,
right,
} => UnionItem::Right {
prefix: P::from_p1(prefix),
left: left.map(|(p, l)| (P::from_p1(p), l)),
right,
},
crate::trieview::UnionItem::Both {
prefix,
left,
right,
} => UnionItem::Both {
prefix: P::from_p1(prefix),
left,
right,
},
}
}
fn from_p2(value: crate::trieview::UnionItem<'a, P::P2, L, R>) -> Self {
match value {
crate::trieview::UnionItem::Left {
prefix,
left,
right,
} => UnionItem::Left {
prefix: P::from_p2(prefix),
left,
right: right.map(|(p, r)| (P::from_p2(p), r)),
},
crate::trieview::UnionItem::Right {
prefix,
left,
right,
} => UnionItem::Right {
prefix: P::from_p2(prefix),
left: left.map(|(p, l)| (P::from_p2(p), l)),
right,
},
crate::trieview::UnionItem::Both {
prefix,
left,
right,
} => UnionItem::Both {
prefix: P::from_p2(prefix),
left,
right,
},
}
}
}
pub struct Intersection<'a, P: JointPrefix, L, R> {
pub(crate) i1: Option<crate::trieview::Intersection<'a, P::P1, L, R>>,
pub(crate) i2: Option<crate::trieview::Intersection<'a, P::P2, L, R>>,
}
impl<'a, P: JointPrefix, L, R> Iterator for Intersection<'a, P, L, R> {
type Item = (P, &'a L, &'a R);
fn next(&mut self) -> Option<Self::Item> {
if let Some(i1) = self.i1.as_mut() {
if let Some((p, l, r)) = i1.next() {
return Some((P::from_p1(p), l, r));
}
self.i1 = None;
}
if let Some(i2) = self.i2.as_mut() {
if let Some((p, l, r)) = i2.next() {
return Some((P::from_p2(p), l, r));
}
self.i2 = None;
}
None
}
}
pub struct Difference<'a, P: JointPrefix, L, R> {
pub(crate) i1: Option<crate::trieview::Difference<'a, P::P1, L, R>>,
pub(crate) i2: Option<crate::trieview::Difference<'a, P::P2, L, R>>,
}
impl<'a, P: JointPrefix, L, R> Iterator for Difference<'a, P, L, R> {
type Item = DifferenceItem<'a, P, L, R>;
fn next(&mut self) -> Option<Self::Item> {
if let Some(i1) = self.i1.as_mut() {
if let Some(next) = i1.next() {
return Some(DifferenceItem::from_p1(next));
}
self.i1 = None;
}
if let Some(i2) = self.i2.as_mut() {
if let Some(next) = i2.next() {
return Some(DifferenceItem::from_p2(next));
}
self.i2 = None;
}
None
}
}
pub struct CoveringDifference<'a, P: JointPrefix, L, R> {
pub(crate) i1: Option<crate::trieview::CoveringDifference<'a, P::P1, L, R>>,
pub(crate) i2: Option<crate::trieview::CoveringDifference<'a, P::P2, L, R>>,
}
impl<'a, P: JointPrefix, L, R> Iterator for CoveringDifference<'a, P, L, R> {
type Item = (P, &'a L);
fn next(&mut self) -> Option<Self::Item> {
if let Some(i1) = self.i1.as_mut() {
if let Some((p, l)) = i1.next() {
return Some((P::from_p1(p), l));
}
self.i1 = None;
}
if let Some(i2) = self.i2.as_mut() {
if let Some((p, l)) = i2.next() {
return Some((P::from_p2(p), l));
}
self.i2 = None;
}
None
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct DifferenceItem<'a, P, L, R> {
pub prefix: P,
pub value: &'a L,
pub right: Option<(P, &'a R)>,
}
impl<'a, P: JointPrefix, L, R> DifferenceItem<'a, P, L, R> {
fn from_p1(value: crate::trieview::DifferenceItem<'a, P::P1, L, R>) -> Self {
Self {
prefix: P::from_p1(value.prefix),
value: value.value,
right: value.right.map(|(p, r)| (P::from_p1(p), r)),
}
}
fn from_p2(value: crate::trieview::DifferenceItem<'a, P::P2, L, R>) -> Self {
Self {
prefix: P::from_p2(value.prefix),
value: value.value,
right: value.right.map(|(p, r)| (P::from_p2(p), r)),
}
}
}