1use crate::{iif, Own};
8
9impl<S> Own<S, ()> {
12 pub const fn empty(state: S) -> Own<S, ()> {
14 Own::new(state, ())
15 }
16}
17
18impl<S, V> Own<S, V> {
20 pub const fn new(state: S, value: V) -> Self {
22 Own { s: state, v: value }
23 }
24
25 #[rustfmt::skip]
29 pub fn sv(self) -> (S, V) {
30 (self.s, self.v)
31 }
32
33 #[rustfmt::skip]
35 pub const fn sv_ref(&self) -> (&S, &V) {
36 (&self.s, &self.v)
37 }
38
39 #[rustfmt::skip]
41 pub fn sv_mut(&mut self) -> (&mut S, &mut V) {
42 (&mut self.s, &mut self.v)
43 }
44
45 pub fn s_replace(self, new_state: S) -> Self {
49 Self::new(new_state, self.v)
50 }
51 pub fn v_replace(self, new_value: V) -> Self {
53 Self::new(self.s, new_value)
54 }
55 pub fn sv_replace(self, new_state: S, new_value: V) -> Self {
57 Self::new(new_state, new_value)
58 }
59
60 pub fn s_wrap_ok<E>(self) -> Own<Result<S, E>, V> {
64 Own::new(Ok(self.s), self.v)
65 }
66 pub fn s_wrap_some(self) -> Own<Option<S>, V> {
68 Own::new(Some(self.s), self.v)
69 }
70
71 pub fn v_wrap_ok<E>(self) -> Own<S, Result<V, E>> {
73 Own::new(self.s, Ok(self.v))
74 }
75 pub fn v_wrap_some(self) -> Own<S, Option<V>> {
77 Own::new(self.s, Some(self.v))
78 }
79
80 #[rustfmt::skip]
84 pub fn s_map<T, F: FnOnce(S) -> T>(self, f: F) -> Own<T, V> {
85 Own::new(f(self.s), self.v)
86 }
87
88 #[rustfmt::skip]
90 pub fn v_map<W, F: FnOnce(V) -> W>(self, f: F) -> Own<S, W> {
91 Own::new(self.s, f(self.v))
92 }
93
94 #[rustfmt::skip]
96 pub fn sv_map<F, G, T, W>(self, sf: F, vf: G) -> Own<T, W>
97 where F: FnOnce(S) -> T, G: FnOnce(V) -> W {
98 Own::new(sf(self.s), vf(self.v))
99 }
100
101 #[must_use] #[rustfmt::skip]
105 pub fn s_eq(&self, expected: &S) -> bool where S: PartialEq {
106 self.s == *expected
107 }
108 #[must_use] #[rustfmt::skip]
110 pub fn v_eq(&self, expected: &V) -> bool where V: PartialEq {
111 self.v == *expected
112 }
113 #[must_use] #[rustfmt::skip]
115 pub fn sv_eq(&self, expected_state: &S, expected_value: &V) -> bool
116 where S: PartialEq, V: PartialEq {
117 self.s == *expected_state && self.v == *expected_value
118 }
119
120 #[rustfmt::skip]
126 pub fn s_assert<F: FnOnce(&S) -> bool>(self, predicate: F) -> Self {
127 iif![predicate(&self.s); self; panic![]]
128 }
129 #[rustfmt::skip]
133 pub fn s_assert_or<F: FnOnce(&S) -> bool>(self, predicate: F, message: &str) -> Self {
134 iif![predicate(&self.s); self; panic!["{}", message]]
135 }
136 #[rustfmt::skip]
140 pub fn s_assert_eq(self, expected_state: &S) -> Self where S: PartialEq {
141 iif![self.s == *expected_state; self; panic![]]
142 }
143 #[rustfmt::skip]
147 pub fn s_assert_eq_or(self, expected_state: &S, message: &str) -> Self where S: PartialEq {
148 iif![self.s == *expected_state; self; panic!["{}", message]]
149 }
150
151 #[rustfmt::skip]
155 pub fn v_assert<F: FnOnce(&V) -> bool>(self, predicate: F) -> Self {
156 iif![predicate(&self.v); self; panic![]]
157 }
158 #[rustfmt::skip]
162 pub fn v_assert_or<F: FnOnce(&V) -> bool>(self, predicate: F, message: &str) -> Self {
163 iif![predicate(&self.v); self; panic!["{}", message]]
164 }
165 #[rustfmt::skip]
169 pub fn v_assert_eq(self, expected_value: &V) -> Self where V: PartialEq {
170 iif![self.v == *expected_value; self; panic![]]
171 }
172 #[rustfmt::skip]
176 pub fn v_assert_eq_or(self, expected_value: &V, message: &str) -> Self where V: PartialEq {
177 iif![self.v == *expected_value; self; panic!["{}", message]]
178 }
179
180 #[rustfmt::skip]
185 pub fn sv_assert<F, G>(self, s_predicate: F, v_predicate: G) -> Self
186 where F: FnOnce(&S) -> bool, G: FnOnce(&V) -> bool {
187 iif![s_predicate(&self.s) && v_predicate(&self.v); self; panic![]]
188 }
189 #[rustfmt::skip]
194 pub fn sv_assert_or<F, G>(self, s_predicate: F, v_predicate: G, message: &str) -> Self
195 where F: FnOnce(&S) -> bool, G: FnOnce(&V) -> bool {
196 iif![s_predicate(&self.s) && v_predicate(&self.v); self; panic!["{}", message]]
197 }
198 #[rustfmt::skip]
203 pub fn sv_assert_eq(self, expected_state: &S, expected_value: &V) -> Self
204 where S: PartialEq, V: PartialEq {
205 iif![self.s == *expected_state && self.v == *expected_value; self; panic![]]
206 }
207 #[rustfmt::skip]
212 pub fn sv_assert_eq_or(self, expected_state: &S, expected_value: &V, message: &str) -> Self
213 where S: PartialEq, V: PartialEq {
214 iif![self.s == *expected_state && self.v == *expected_value; self; panic!["{}", message]]
215 }
216}
217
218impl<S: Copy, V: Copy> Own<S, V> {
220 #[must_use] #[rustfmt::skip]
223 pub const fn sv_const(self) -> (S, V) {
224 (self.s, self.v)
225 }
226
227 pub const fn s_const_replace(self, s: S) -> Self {
229 Self::new(s, self.v)
230 }
231 pub const fn v_const_replace(self, v: V) -> Self {
233 Self::new(self.s, v)
234 }
235 pub const fn sv_const_replace(self, new_state: S, new_value: V) -> Self {
238 Self::new(new_state, new_value)
239 }
240
241 pub const fn s_const_wrap_ok<E>(self) -> Own<Result<S, E>, V> {
243 Own::new(Ok(self.s), self.v)
244 }
245 pub const fn s_const_wrap_some(self) -> Own<Option<S>, V> {
247 Own::new(Some(self.s), self.v)
248 }
249
250 pub const fn v_const_wrap_ok<E>(self) -> Own<S, Result<V, E>> {
252 Own::new(self.s, Ok(self.v))
253 }
254 pub const fn v_const_wrap_some(self) -> Own<S, Option<V>> {
256 Own::new(self.s, Some(self.v))
257 }
258}