use crate::abc::{Container, Keyed};
use crate::iter::{IntoIter, IntoValues, Iter, Values};
use crate::ops::{Get, Len, Modify, Put, Set, WithOne};
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(transparent))]
pub struct One<V> {
value: V,
}
impl<V> One<V> {
pub fn new(value: V) -> Self {
Self { value }
}
}
impl<V> Container for One<V> {
type Value = V;
}
impl<V> Keyed for One<V> {
type Key = usize;
}
impl<V> WithOne<V> for One<V> {
#[inline(always)]
fn with_one(value: V) -> Self {
Self { value }
}
}
impl<V> Get<usize> for One<V> {
#[inline(always)]
fn get(&self, index: &usize) -> Option<&V> {
if *index == 0 { Some(&self.value) } else { None }
}
}
impl<V> Set<usize> for One<V> {
type Output = Option<V>;
#[inline(always)]
fn set(&mut self, index: usize, value: V) -> Option<V> {
assert_eq!(index, 0);
Some(core::mem::replace(&mut self.value, value))
}
}
impl<V> Modify<usize> for One<V> {
#[inline(always)]
fn modify<F>(&mut self, index: &usize, mut f: F)
where
F: FnMut(&mut V),
{
assert_eq!(*index, 0);
f(&mut self.value)
}
}
impl<V> Put<V> for One<V> {
#[inline(always)]
fn put(&mut self, value: V) -> Option<V> {
Some(core::mem::replace(&mut self.value, value))
}
}
impl<V> Len for One<V> {
#[inline(always)]
fn len(&self) -> usize {
1
}
}
impl<'a, V: 'a> Values<'a> for One<V> {
type Values = core::iter::Once<&'a V>;
#[inline(always)]
fn values(&'a self) -> Self::Values {
core::iter::once(&self.value)
}
}
impl<V> IntoValues for One<V> {
type IntoValues = core::iter::Once<V>;
#[inline(always)]
fn into_values(self) -> Self::IntoValues {
core::iter::once(self.value)
}
}
impl<'a, V: 'a> Iter<'a, usize> for One<V> {
type Iter = core::iter::Once<(usize, &'a V)>;
#[inline(always)]
fn iter(&'a self) -> Self::Iter {
core::iter::once((0, &self.value))
}
}
impl<V> IntoIter<usize> for One<V> {
type IntoIter = core::iter::Enumerate<core::iter::Once<V>>;
#[inline(always)]
fn into_iter(self) -> Self::IntoIter {
core::iter::once(self.value).enumerate()
}
}