use std::fmt;
use std::marker::PhantomData;
use std::ops::Bound;
use serde::de::{SeqAccess, Visitor};
use serde::ser::SerializeSeq;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use crate::range_bounds_map::{IntoIter as RangeBoundsMapIntoIter, NiceRange};
use crate::{
OverlapError, OverlapOrTryFromBoundsError, RangeBoundsMap, TryFromBounds,
TryFromBoundsError,
};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RangeBoundsSet<I, K> {
inner: RangeBoundsMap<I, K, ()>,
}
impl<I, K> RangeBoundsSet<I, K>
where
I: Ord + Copy,
K: NiceRange<I>,
{
pub fn new() -> Self {
RangeBoundsSet {
inner: RangeBoundsMap::new(),
}
}
pub fn len(&self) -> usize {
self.inner.len()
}
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
pub fn overlaps<Q>(&self, range: Q) -> bool
where
Q: NiceRange<I>,
{
self.inner.overlaps(range)
}
pub fn overlapping<Q>(
&self,
range: Q,
) -> impl DoubleEndedIterator<Item = &K>
where
Q: NiceRange<I>,
{
self.inner.overlapping(range).map(first)
}
pub fn get_at_point(&self, point: I) -> Result<K, (Bound<I>, Bound<I>)> {
self.inner.get_entry_at_point(point).map(first).copied()
}
pub fn contains_point(&self, point: I) -> bool {
self.inner.contains_point(point)
}
pub fn iter(&self) -> impl DoubleEndedIterator<Item = &K> {
self.inner.iter().map(first)
}
pub fn remove_overlapping<'a, Q>(
&'a mut self,
range: Q,
) -> impl Iterator<Item = K> + '_
where
Q: NiceRange<I> + 'a,
{
self.inner.remove_overlapping(range).map(first)
}
pub fn cut<'a, Q>(
&'a mut self,
range: Q,
) -> Result<
impl Iterator<Item = (Bound<I>, Bound<I>)> + '_,
TryFromBoundsError,
>
where
Q: NiceRange<I> + 'a,
K: TryFromBounds<I>,
{
self.inner.cut(range).map(|x| x.map(first))
}
pub fn gaps<'a, Q>(
&'a self,
range: Q,
) -> impl DoubleEndedIterator<Item = (Bound<I>, Bound<I>)> + '_
where
Q: NiceRange<I> + 'a,
{
self.inner.gaps(range)
}
pub fn contains_range<Q>(&self, range: Q) -> bool
where
Q: NiceRange<I>,
{
self.inner.contains_range(range)
}
pub fn insert_strict(&mut self, range: K) -> Result<(), OverlapError> {
self.inner.insert_strict(range, ())
}
pub fn insert_merge_touching(
&mut self,
range: K,
) -> Result<K, OverlapOrTryFromBoundsError>
where
K: TryFromBounds<I>,
{
self.inner.insert_merge_touching(range, ())
}
pub fn insert_merge_overlapping(
&mut self,
range: K,
) -> Result<K, TryFromBoundsError>
where
K: TryFromBounds<I>,
{
self.inner.insert_merge_overlapping(range, ())
}
pub fn insert_merge_touching_or_overlapping(
&mut self,
range: K,
) -> Result<K, TryFromBoundsError>
where
K: TryFromBounds<I>,
{
self.inner.insert_merge_touching_or_overlapping(range, ())
}
pub fn insert_overwrite(
&mut self,
range: K,
) -> Result<(), TryFromBoundsError>
where
K: TryFromBounds<I>,
{
self.inner.insert_overwrite(range, ())
}
pub fn first(&self) -> Option<&K> {
self.inner.first_entry().map(first)
}
pub fn last(&self) -> Option<&K> {
self.inner.last_entry().map(first)
}
pub fn from_slice_strict<const N: usize>(
slice: [K; N],
) -> Result<RangeBoundsSet<I, K>, OverlapError> {
let mut set = RangeBoundsSet::new();
for range in slice {
set.insert_strict(range)?;
}
return Ok(set);
}
}
fn first<A, B>((a, _): (A, B)) -> A {
a
}
impl<I, K> IntoIterator for RangeBoundsSet<I, K> {
type Item = K;
type IntoIter = IntoIter<I, K>;
fn into_iter(self) -> Self::IntoIter {
return IntoIter {
inner: self.inner.into_iter(),
};
}
}
pub struct IntoIter<I, K> {
inner: RangeBoundsMapIntoIter<I, K, ()>,
}
impl<I, K> Iterator for IntoIter<I, K> {
type Item = K;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(first)
}
}
impl<I, K> Default for RangeBoundsSet<I, K>
where
I: PartialOrd,
{
fn default() -> Self {
RangeBoundsSet {
inner: RangeBoundsMap::default(),
}
}
}
impl<I, K> Serialize for RangeBoundsSet<I, K>
where
I: Ord + Copy,
K: NiceRange<I> + Serialize,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut seq = serializer.serialize_seq(Some(self.len()))?;
for range_bounds in self.iter() {
seq.serialize_element(&range_bounds)?;
}
seq.end()
}
}
impl<'de, I, K> Deserialize<'de> for RangeBoundsSet<I, K>
where
I: Ord + Copy,
K: NiceRange<I> + Deserialize<'de>,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_seq(RangeBoundsSetVisitor {
i: PhantomData,
k: PhantomData,
})
}
}
struct RangeBoundsSetVisitor<I, K> {
i: PhantomData<I>,
k: PhantomData<K>,
}
impl<'de, I, K> Visitor<'de> for RangeBoundsSetVisitor<I, K>
where
I: Ord + Copy,
K: NiceRange<I> + Deserialize<'de>,
{
type Value = RangeBoundsSet<I, K>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a RangeBoundsSet")
}
fn visit_seq<A>(self, mut access: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
let mut set = RangeBoundsSet::new();
while let Some(range_bounds) = access.next_element()? {
set.insert_strict(range_bounds)
.map_err(|_| serde::de::Error::custom("RangeBounds overlap"))?;
}
Ok(set)
}
}