#![forbid(unsafe_code)]
#![deny(missing_docs, missing_debug_implementations)]
mod query;
mod sort;
use std::marker::PhantomData;
use std::ops::{Deref, Range};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
pub type Item<K, V> = (Range<K>, V);
pub type Node<K, V> = (Item<K, V>, K);
#[derive(Debug, Default, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", serde(transparent))]
pub struct ITree<K, V, S = Box<[Node<K, V>]>> {
nodes: S,
_marker: PhantomData<(K, V)>,
}
impl<K, V, S> Deref for ITree<K, V, S>
where
S: AsRef<[Node<K, V>]>,
{
type Target = [Node<K, V>];
fn deref(&self) -> &Self::Target {
self.nodes.as_ref()
}
}
impl<K, V, S> AsRef<[Node<K, V>]> for ITree<K, V, S>
where
S: AsRef<[Node<K, V>]>,
{
fn as_ref(&self) -> &[Node<K, V>] {
self.nodes.as_ref()
}
}
impl<K, V, S> ITree<K, V, S>
where
S: AsRef<[Node<K, V>]>,
{
pub fn new_unchecked(nodes: S) -> Self {
Self {
nodes,
_marker: PhantomData,
}
}
pub fn iter(&self) -> impl ExactSizeIterator<Item = &Item<K, V>> {
self.nodes.as_ref().iter().map(|node| &node.0)
}
}