rstm_core/rules/impls/
impl_rule.rs

1/*
2    Appellation: impl_rule <module>
3    Contrib: FL03 <jo3mccain@icloud.com>
4*/
5use crate::rules::Rule;
6use crate::state::RawState;
7use crate::types::{Head, Tail};
8
9impl<Q, S> core::convert::AsRef<Head<Q, S>> for Rule<Q, S>
10where
11    Q: RawState,
12{
13    fn as_ref(&self) -> &Head<Q, S> {
14        self.head()
15    }
16}
17
18impl<Q, S> core::convert::AsRef<Tail<Q, S>> for Rule<Q, S>
19where
20    Q: RawState,
21{
22    fn as_ref(&self) -> &Tail<Q, S> {
23        self.tail()
24    }
25}
26
27impl<Q, S> core::convert::AsMut<Head<Q, S>> for Rule<Q, S>
28where
29    Q: RawState,
30{
31    fn as_mut(&mut self) -> &mut Head<Q, S> {
32        self.head_mut()
33    }
34}
35
36impl<Q, S> core::convert::AsMut<Tail<Q, S>> for Rule<Q, S>
37where
38    Q: RawState,
39{
40    fn as_mut(&mut self) -> &mut Tail<Q, S> {
41        self.tail_mut()
42    }
43}
44
45impl<Q, S> core::borrow::Borrow<Head<Q, S>> for Rule<Q, S>
46where
47    Q: RawState,
48{
49    fn borrow(&self) -> &Head<Q, S> {
50        self.head()
51    }
52}
53
54impl<Q, S> core::borrow::Borrow<Tail<Q, S>> for Rule<Q, S>
55where
56    Q: RawState,
57{
58    fn borrow(&self) -> &Tail<Q, S> {
59        self.tail()
60    }
61}
62
63impl<Q, S> core::borrow::BorrowMut<Head<Q, S>> for Rule<Q, S>
64where
65    Q: RawState,
66{
67    fn borrow_mut(&mut self) -> &mut Head<Q, S> {
68        self.head_mut()
69    }
70}
71
72impl<Q, S> core::borrow::BorrowMut<Tail<Q, S>> for Rule<Q, S>
73where
74    Q: RawState,
75{
76    fn borrow_mut(&mut self) -> &mut Tail<Q, S> {
77        self.tail_mut()
78    }
79}
80
81impl<Q, S> PartialEq<(Head<Q, S>, Tail<Q, S>)> for Rule<Q, S>
82where
83    Q: RawState + PartialEq,
84    S: PartialEq,
85{
86    fn eq(&self, other: &(Head<Q, S>, Tail<Q, S>)) -> bool {
87        self.head == other.0 && self.tail == other.1
88    }
89}
90
91impl<Q, S> PartialEq<Head<Q, S>> for Rule<Q, S>
92where
93    Q: RawState + PartialEq,
94    S: PartialEq,
95{
96    fn eq(&self, other: &Head<Q, S>) -> bool {
97        &self.head == other
98    }
99}
100
101impl<Q, S> PartialEq<Tail<Q, S>> for Rule<Q, S>
102where
103    Q: RawState + PartialEq,
104    S: PartialEq,
105{
106    fn eq(&self, other: &Tail<Q, S>) -> bool {
107        &self.tail == other
108    }
109}
110
111impl<Q, S> From<(Head<Q, S>, Tail<Q, S>)> for Rule<Q, S>
112where
113    Q: RawState,
114{
115    fn from((head, tail): (Head<Q, S>, Tail<Q, S>)) -> Self {
116        Self { head, tail }
117    }
118}
119
120impl<Q, S> From<Rule<Q, S>> for (Head<Q, S>, Tail<Q, S>)
121where
122    Q: RawState,
123{
124    fn from(rule: Rule<Q, S>) -> Self {
125        (rule.head, rule.tail)
126    }
127}