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}