munge/
internal.rs
1use core::mem::ManuallyDrop;
2
3use crate::Destructure;
4
5pub trait Destructuring {}
6
7pub trait DestructuringFor<T>: Destructuring {
8 type Destructurer: Destructurer<Inner = T>;
9}
10
11pub trait Destructurer {
12 type Inner: Destructure;
13
14 fn new(inner: Self::Inner) -> Self;
15
16 fn inner(&self) -> &Self::Inner;
17
18 fn inner_mut(&mut self) -> &mut Self::Inner;
19}
20
21pub trait Test<'a> {
22 type Test;
23}
24
25pub struct Borrow<T>(T);
26
27impl<T: Destructure> Destructurer for Borrow<T> {
28 type Inner = T;
29
30 fn new(inner: T) -> Self {
31 Self(inner)
32 }
33
34 fn inner(&self) -> &Self::Inner {
35 &self.0
36 }
37
38 fn inner_mut(&mut self) -> &mut Self::Inner {
39 &mut self.0
40 }
41}
42
43impl<'a, T: 'a + Destructure> Test<'a> for Borrow<T> {
44 type Test = &'a T::Underlying;
45}
46
47pub struct Move<T>(ManuallyDrop<T>);
48
49impl<T: Destructure> Destructurer for Move<T> {
50 type Inner = T;
51
52 fn new(inner: T) -> Self {
53 Self(ManuallyDrop::new(inner))
54 }
55
56 fn inner(&self) -> &Self::Inner {
57 &self.0
58 }
59
60 fn inner_mut(&mut self) -> &mut Self::Inner {
61 &mut self.0
62 }
63}
64
65impl<'a, T: 'a + Destructure> Test<'a> for Move<T>
66where
67 T::Underlying: Sized,
68{
69 type Test = T::Underlying;
70}