1use crate::prelude::*;
3
4#[diagnostic::on_unimplemented(
10 message = "Cannot take the view of `{Self}`",
11 label = "no implementation for `{Self}@`"
12)]
13pub trait View {
14 type ViewTy;
15 #[logic]
16 #[intrinsic("view")]
17 fn view(self) -> Self::ViewTy;
18}
19
20pub use crate::base_macros::DeepModel;
21
22pub trait DeepModel {
27 type DeepModelTy;
28 #[logic]
29 fn deep_model(self) -> Self::DeepModelTy;
30}
31
32impl<T: DeepModel + ?Sized> DeepModel for &T {
33 type DeepModelTy = T::DeepModelTy;
34 #[logic(open, inline)]
35 fn deep_model(self) -> Self::DeepModelTy {
36 (*self).deep_model()
37 }
38}
39
40impl<T: DeepModel + ?Sized> DeepModel for &mut T {
41 type DeepModelTy = T::DeepModelTy;
42 #[logic(open, inline)]
43 fn deep_model(self) -> Self::DeepModelTy {
44 (*self).deep_model()
45 }
46}
47
48impl DeepModel for bool {
49 type DeepModelTy = bool;
50
51 #[logic(open, inline)]
52 fn deep_model(self) -> Self::DeepModelTy {
53 self
54 }
55}
56
57impl DeepModel for Int {
58 type DeepModelTy = Int;
59
60 #[logic(open, inline)]
61 fn deep_model(self) -> Self::DeepModelTy {
62 self
63 }
64}
65
66impl DeepModel for core::cmp::Ordering {
67 type DeepModelTy = core::cmp::Ordering;
68
69 #[logic(open, inline)]
70 fn deep_model(self) -> Self::DeepModelTy {
71 self
72 }
73}