use std::fmt;
use super::{MutableState, OwnedMutableState, State};
use crate::RuntimeHandle;
#[derive(Clone)]
pub struct SnapshotStateList<T: Clone + 'static> {
state: OwnedMutableState<Vec<T>>,
}
impl<T: Clone + 'static> SnapshotStateList<T> {
pub fn with_runtime<I>(values: I, runtime: RuntimeHandle) -> Self
where
I: IntoIterator<Item = T>,
{
let initial: Vec<T> = values.into_iter().collect();
Self {
state: OwnedMutableState::with_runtime(initial, runtime),
}
}
pub fn as_state(&self) -> State<Vec<T>> {
self.state.as_state()
}
pub fn as_mutable_state(&self) -> MutableState<Vec<T>> {
self.state.handle()
}
pub fn len(&self) -> usize {
self.state.with(Vec::len)
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn to_vec(&self) -> Vec<T> {
self.state.with(Clone::clone)
}
pub fn iter(&self) -> Vec<T> {
self.to_vec()
}
pub fn get(&self, index: usize) -> T {
self.state.with(|values| values[index].clone())
}
pub fn get_opt(&self, index: usize) -> Option<T> {
self.state.with(|values| values.get(index).cloned())
}
pub fn first(&self) -> Option<T> {
self.get_opt(0)
}
pub fn last(&self) -> Option<T> {
self.state.with(|values| values.last().cloned())
}
pub fn push(&self, value: T) {
self.state.update(|values| values.push(value));
}
pub fn extend<I>(&self, iter: I)
where
I: IntoIterator<Item = T>,
{
self.state.update(|values| values.extend(iter));
}
pub fn insert(&self, index: usize, value: T) {
self.state.update(|values| values.insert(index, value));
}
pub fn set(&self, index: usize, value: T) -> T {
self.state
.update(|values| std::mem::replace(&mut values[index], value))
}
pub fn remove(&self, index: usize) -> T {
self.state.update(|values| values.remove(index))
}
pub fn pop(&self) -> Option<T> {
self.state.update(Vec::pop)
}
pub fn clear(&self) {
self.state.replace(Vec::new());
}
pub fn retain<F>(&self, mut predicate: F)
where
F: FnMut(&T) -> bool,
{
self.state
.update(|values| values.retain(|value| predicate(value)));
}
pub fn replace_with<I>(&self, iter: I)
where
I: IntoIterator<Item = T>,
{
self.state.replace(iter.into_iter().collect());
}
}
impl<T: fmt::Debug + Clone + 'static> fmt::Debug for SnapshotStateList<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let contents = self.to_vec();
f.debug_struct("SnapshotStateList")
.field("values", &contents)
.finish()
}
}