use serde::{Serialize, Deserialize};
use crate::Id;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Identified<T> {
id: Id,
value: T,
}
impl<T> Identified<T> {
pub fn new(id: &Id, value: T) -> Self {
Self { id: id.clone(), value }
}
pub const fn id(&self) -> &Id {
&self.id
}
pub const fn value(&self) -> &T {
&self.value
}
pub fn into_value(self) -> T {
self.value
}
pub fn as_ref(&self) -> Identified<&T> {
Identified { id: self.id.clone(), value: &self.value }
}
pub fn map<U>(self, f: impl FnOnce(T) -> U) -> Identified<U> {
Identified { id: self.id, value: f(self.value) }
}
pub fn map_with_id<U>(self, f: impl FnOnce(&Id, T) -> U) -> Identified<U> {
let value = f(&self.id, self.value);
Identified { id: self.id, value }
}
}
pub trait IdentifyExt where Self: Sized {
fn identify(self, id: impl Into<Id>) -> Identified<Self>;
}
impl<T> IdentifyExt for T {
fn identify(self, id: impl Into<Id>) -> Identified<Self> {
Identified { id: id.into(), value: self }
}
}