use std::{mem, slice::SliceIndex};
use crate::error::Result;
pub trait StableVec<Index: StableVecIndex, Data>:
StableVecAccess<Index, Data> + From<Vec<Data>> + IntoIterator<Item = Data> + FromIterator<Data>
where
for<'a> &'a Self: IntoIterator<Item = &'a Data>,
for<'a> &'a mut Self: IntoIterator<Item = &'a mut Data>,
{
fn insert(&mut self, element: Data) -> Index;
fn insert_default(&mut self) -> Index
where
Data: Default,
{
self.insert(Default::default())
}
fn insert_in_place(&mut self, constructor: impl FnOnce(Index) -> Data) -> Index;
fn insert_at(&mut self, index: Index, element: Data) -> crate::error::Result<()>;
fn insert_at_arbitrary_index(
&mut self,
index: Index,
element: Data,
) -> crate::error::Result<()>;
fn set(&mut self, index: Index, mut element: Data) -> Option<Data> {
let index: usize = index.into();
if let Ok(existing_element) = self.get_mut(index.into()) {
mem::swap(&mut element, existing_element);
Some(element)
} else {
self.insert_at_arbitrary_index(index.into(), element)
.unwrap();
None
}
}
#[must_use = "this iterator must be completely exhausted in order to insert all given elements"]
fn insert_from_iter(
&mut self,
elements: impl IntoIterator<Item = Data>,
) -> impl Iterator<Item = Index> {
elements.into_iter().map(|element| self.insert(element))
}
#[must_use = "this iterator must be completely exhausted in order to insert all elements"]
fn insert_in_place_from_iter(
&mut self,
elements: impl IntoIterator<Item = impl FnOnce(Index) -> Data>,
) -> impl Iterator<Item = Index> {
elements
.into_iter()
.map(|constructor| self.insert_in_place(constructor))
}
fn remove(&mut self, index: Index) -> Result<Data>;
fn available_insertion_index_iterator<'result>(&self) -> impl 'result + Iterator<Item = Index>
where
Index: 'result;
fn iter<'this>(&'this self) -> impl 'this + Iterator<Item = (Index, &'this Data)>
where
Data: 'this;
fn iter_mut<'this>(&'this mut self) -> impl 'this + Iterator<Item = (Index, &'this mut Data)>
where
Data: 'this;
fn iter_elements<'this>(&'this self) -> impl 'this + Iterator<Item = &'this Data>
where
Data: 'this,
{
self.iter().map(|(_, element)| element)
}
fn iter_elements_mut<'this>(&'this mut self) -> impl 'this + Iterator<Item = &'this mut Data>
where
Data: 'this,
{
self.iter_mut().map(|(_, element)| element)
}
fn iter_indices<'this>(&'this self) -> impl 'this + Iterator<Item = Index>
where
Data: 'this,
{
self.iter().map(|(index, _)| index)
}
fn retain(&mut self, f: impl FnMut(&Data) -> bool);
fn clear(&mut self);
}
pub trait StableVecAccess<Index, Data> {
fn get(&self, index: Index) -> Result<&Data>;
fn get_mut(&mut self, index: Index) -> Result<&mut Data>;
fn get_disjoint_mut<const N: usize>(
&mut self,
indices: [Index; N],
) -> Result<[&mut <usize as SliceIndex<[Data]>>::Output; N]>;
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
}
pub trait StableVecIndex: From<usize> + Into<usize> {}