1use crate::{BlankId, BlankIdBuf, Id, LocalTerm, Term};
2
3pub trait MaybeBlankId {
5 type BlankId;
7}
8
9impl MaybeBlankId for Id {
10 type BlankId = BlankIdBuf;
11}
12
13impl MaybeBlankId for Term {
14 type BlankId = BlankIdBuf;
15}
16
17impl MaybeBlankId for LocalTerm {
18 type BlankId = BlankIdBuf;
19}
20
21pub trait TryAsBlankId: MaybeBlankId {
24 fn try_as_blank(&self) -> Option<&BlankId>;
26
27 fn is_blank(&self) -> bool {
28 self.try_as_blank().is_some()
29 }
30}
31
32impl TryAsBlankId for Id {
33 fn try_as_blank(&self) -> Option<&BlankId> {
34 self.as_blank_id()
35 }
36}
37
38impl TryAsBlankId for Term {
39 fn try_as_blank(&self) -> Option<&BlankId> {
40 None
41 }
42}
43
44impl TryAsBlankId for LocalTerm {
45 fn try_as_blank(&self) -> Option<&BlankId> {
46 self.as_blank_id()
47 }
48}
49
50pub trait TryIntoBlankId: MaybeBlankId + Sized {
52 fn try_into_blank(self) -> Result<BlankIdBuf, Self>;
53}
54
55impl TryIntoBlankId for Id {
56 fn try_into_blank(self) -> Result<BlankIdBuf, Self> {
57 match self {
58 Self::BlankId(b) => Ok(b),
59 other => Err(other),
60 }
61 }
62}
63
64impl TryIntoBlankId for Term {
65 fn try_into_blank(self) -> Result<BlankIdBuf, Self> {
66 Err(self)
67 }
68}
69
70impl TryIntoBlankId for LocalTerm {
71 fn try_into_blank(self) -> Result<BlankIdBuf, Self> {
72 match self {
73 Self::BlankId(b) => Ok(b),
74 other => Err(other),
75 }
76 }
77}
78
79pub trait FromBlankId: MaybeBlankId {
81 fn from_blank(b: BlankIdBuf) -> Self;
83}
84
85impl FromBlankId for Id {
86 fn from_blank(b: BlankIdBuf) -> Self {
87 Self::BlankId(b)
88 }
89}
90
91impl FromBlankId for LocalTerm {
92 fn from_blank(b: BlankIdBuf) -> Self {
93 Self::BlankId(b)
94 }
95}