#![feature(const_fn)]
use std::ops::{Deref, DerefMut};
use std::borrow::{Borrow, BorrowMut};
use std::convert::{AsRef, AsMut, From, Into};
mod derive_ident;
mod ident_collections;
pub use self::derive_ident::*;
pub use self::ident_collections::*;
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
pub struct WithIdent<T, I = usize> {
identifier: I,
value: T,
}
impl<T, I,> WithIdent<T, I,> {
#[inline]
pub const fn new(identifier: I, value: T) -> Self {
Self { identifier, value }
}
#[inline]
pub const fn ident(&self) -> &I {
&self.identifier
}
#[inline]
pub fn into_value(wi: Self) -> T { wi.value }
#[inline]
pub fn map<F, U>(wi: Self, f: F) -> WithIdent<U, I,>
where F: FnOnce(T) -> U {
WithIdent::new(wi.identifier, f(wi.value))
}
#[inline]
pub fn map_ident<F, U>(wi: Self, f: F) -> WithIdent<T, U>
where F: FnOnce(I) -> U, {
WithIdent::new(f(wi.identifier), wi.value)
}
}
impl<T, I: Eq,> WithIdent<T, I,> {
#[inline]
pub fn same_ident<U>(a: &WithIdent<T, I,>, b: &WithIdent<U, I,>) -> bool {
a.ident() == b.ident()
}
}
impl<T, I: Clone> WithIdent<T, I,> {
#[inline]
pub fn as_ref(wi: &Self) -> WithIdent<&T, I,> {
WithIdent::new(wi.identifier.clone(), &wi.value)
}
#[inline]
pub fn as_mut(wi: &mut Self) -> WithIdent<&mut T, I,> {
WithIdent::new(wi.identifier.clone(), &mut wi.value)
}
}
impl<T: Eq, I,> WithIdent<T, I,> {
#[inline]
pub fn same_value<U>(a: &WithIdent<T, I,>, b: &WithIdent<T, U>) -> bool {
a.value == b.value
}
}
impl<T, I,> From<(I, T)> for WithIdent<T, I,> {
#[inline]
fn from((id, value): (I, T)) -> Self { Self::new(id, value) }
}
impl<T, I,> Into<(I, T)> for WithIdent<T, I,> {
#[inline]
fn into(self) -> (I, T) { (self.identifier, self.value) }
}
impl<T, I,> Deref for WithIdent<T, I,> {
type Target = T;
#[inline]
fn deref(&self) -> &Self::Target { &self.value }
}
impl<T, I,> DerefMut for WithIdent<T, I,> {
#[inline]
fn deref_mut(&mut self) -> &mut Self::Target { &mut self.value }
}
impl<T, I,> Borrow<T> for WithIdent<T, I,> {
#[inline]
fn borrow(&self) -> &T { self.deref() }
}
impl<T, I,> BorrowMut<T> for WithIdent<T, I,> {
#[inline]
fn borrow_mut(&mut self) -> &mut T { self.deref_mut() }
}
impl<T, I,> AsRef<T> for WithIdent<T, I,> {
#[inline]
fn as_ref(&self) -> &T { self.borrow() }
}
impl<T, I,> AsMut<T> for WithIdent<T, I,> {
#[inline]
fn as_mut(&mut self) -> &mut T { self.borrow_mut() }
}