use std::borrow::Cow;
pub(crate) trait OpId<ActorId> {
fn actor(&self) -> ActorId;
fn counter(&self) -> u64;
}
#[derive(Clone, Debug)]
pub(crate) enum ObjId<O> {
Root,
Op(O),
}
impl<O> ObjId<O> {
pub(crate) fn map<F, P>(self, f: F) -> ObjId<P>
where
F: Fn(O) -> P,
{
match self {
ObjId::Root => ObjId::Root,
ObjId::Op(o) => ObjId::Op(f(o)),
}
}
}
#[derive(Clone)]
pub(crate) enum ElemId<O> {
Head,
Op(O),
}
impl<O> ElemId<O> {
pub(crate) fn map<F, P>(self, f: F) -> ElemId<P>
where
F: Fn(O) -> P,
{
match self {
ElemId::Head => ElemId::Head,
ElemId::Op(o) => ElemId::Op(f(o)),
}
}
}
#[derive(Clone)]
pub(crate) enum Key<'a, O> {
Prop(Cow<'a, smol_str::SmolStr>),
Elem(ElemId<O>),
}
impl<'a, O> Key<'a, O> {
pub(crate) fn map<F, P>(self, f: F) -> Key<'a, P>
where
F: Fn(O) -> P,
{
match self {
Key::Prop(p) => Key::Prop(p),
Key::Elem(e) => Key::Elem(e.map(f)),
}
}
}
impl OpId<usize> for crate::types::OpId {
fn counter(&self) -> u64 {
self.counter()
}
fn actor(&self) -> usize {
self.actor()
}
}
impl<'a> OpId<usize> for &'a crate::types::OpId {
fn counter(&self) -> u64 {
crate::types::OpId::counter(self)
}
fn actor(&self) -> usize {
crate::types::OpId::actor(self)
}
}