use crate::{BlankId, BlankIdBuf, Id, LocalTerm, Term};
pub trait MaybeBlankId {
type BlankId;
}
impl MaybeBlankId for Id {
type BlankId = BlankIdBuf;
}
impl MaybeBlankId for Term {
type BlankId = BlankIdBuf;
}
impl MaybeBlankId for LocalTerm {
type BlankId = BlankIdBuf;
}
pub trait TryAsBlankId: MaybeBlankId {
fn try_as_blank(&self) -> Option<&BlankId>;
fn is_blank(&self) -> bool {
self.try_as_blank().is_some()
}
}
impl TryAsBlankId for Id {
fn try_as_blank(&self) -> Option<&BlankId> {
self.as_blank_id()
}
}
impl TryAsBlankId for Term {
fn try_as_blank(&self) -> Option<&BlankId> {
None
}
}
impl TryAsBlankId for LocalTerm {
fn try_as_blank(&self) -> Option<&BlankId> {
self.as_blank_id()
}
}
pub trait TryIntoBlankId: MaybeBlankId + Sized {
fn try_into_blank(self) -> Result<BlankIdBuf, Self>;
}
impl TryIntoBlankId for Id {
fn try_into_blank(self) -> Result<BlankIdBuf, Self> {
match self {
Self::BlankId(b) => Ok(b),
other => Err(other),
}
}
}
impl TryIntoBlankId for Term {
fn try_into_blank(self) -> Result<BlankIdBuf, Self> {
Err(self)
}
}
impl TryIntoBlankId for LocalTerm {
fn try_into_blank(self) -> Result<BlankIdBuf, Self> {
match self {
Self::BlankId(b) => Ok(b),
other => Err(other),
}
}
}
pub trait FromBlankId: MaybeBlankId {
fn from_blank(b: BlankIdBuf) -> Self;
}
impl FromBlankId for Id {
fn from_blank(b: BlankIdBuf) -> Self {
Self::BlankId(b)
}
}
impl FromBlankId for LocalTerm {
fn from_blank(b: BlankIdBuf) -> Self {
Self::BlankId(b)
}
}