1use std::ops::{Deref, DerefMut};
2use std::sync::Arc;
3
4pub struct Splittable<R, W> {
5 r: R,
6 w: W,
7}
8
9impl<R, W> Splittable<R, W> {
10 pub fn new(r: R, w: W) -> Self {
11 Self {
12 r,
13 w,
14 }
15 }
16
17 pub fn split(self) -> (RHalf<R, W>, WHalf<R, W>) {
18 let key = Arc::new(0);
19 (
20 RHalf::new(self.r, key.clone()),
21 WHalf::new(self.w, key),
22 )
23 }
24
25 pub fn get_r(&self) -> &R {
26 &self.r
27 }
28
29 pub fn get_w(&self) -> &W {
30 &self.w
31 }
32
33 pub fn get_r_mut(&mut self) -> &mut R {
34 &mut self.r
35 }
36
37 pub fn get_w_mut(&mut self) -> &mut W {
38 &mut self.w
39 }
40}
41
42impl <R, W> Deref for Splittable<R, W> {
43 type Target = R;
44 fn deref(&self) -> &Self::Target {
45 &self.r
46 }
47}
48
49impl <R, W> DerefMut for Splittable<R, W> {
50 fn deref_mut(&mut self) -> &mut Self::Target {
51 &mut self.r
52 }
53}
54
55pub struct RHalf<R, W> {
56 k: Arc<u8>,
57 r: R,
58 _p: std::marker::PhantomData<W>,
59}
60
61impl<R, W> RHalf<R, W> {
62 pub(crate) fn new(r: R, k: Arc<u8>) -> Self {
63 Self {
64 k,
65 r,
66 _p: Default::default(),
67 }
68 }
69
70 pub fn is_pair_of(&self, w: &WHalf<R, W>) -> bool {
71 Arc::ptr_eq(&self.k, &w.k)
72 }
73
74 pub fn unsplit(self, w: WHalf<R, W>) -> Splittable<R, W> {
75 if !self.is_pair_of(&w) {
76 panic!("not a pair");
77 }
78
79 Splittable::new(self.r, w.w)
80 }
81}
82
83impl<R, W> Deref for RHalf<R, W> {
84 type Target = R;
85 fn deref(&self) -> &Self::Target {
86 &self.r
87 }
88}
89
90impl<R, W> DerefMut for RHalf<R, W> {
91 fn deref_mut(&mut self) -> &mut Self::Target {
92 &mut self.r
93 }
94}
95
96pub struct WHalf<R, W> {
97 k: Arc<u8>,
98 w: W,
99 _p: std::marker::PhantomData<R>,
100}
101
102impl<R, W> WHalf<R, W> {
103 pub(crate) fn new(w: W, k: Arc<u8>) -> Self {
104 Self {
105 k,
106 w,
107 _p: Default::default(),
108 }
109 }
110
111 pub fn is_pair_of(&self, r: &RHalf<R, W>) -> bool {
112 r.is_pair_of(self)
113 }
114
115 pub fn unsplit(self, r: RHalf<R, W>) -> Splittable<R, W> {
116 r.unsplit(self)
117 }
118}
119
120impl<R, W> DerefMut for WHalf<R, W> {
121 fn deref_mut(&mut self) -> &mut Self::Target {
122 &mut self.w
123 }
124}
125
126impl<R, W> Deref for WHalf<R, W> {
127 type Target = W;
128 fn deref(&self) -> &Self::Target {
129 &self.w
130 }
131}
132
133#[cfg(test)]
134mod Test {
135 #[test]
136 fn test() {
137 pub struct TestRead {
138
139 }
140
141 pub struct TestWrite {
142
143 }
144
145 let s1 = super::Splittable::new(TestRead{}, TestWrite{});
146 let (r1, w1) = s1.split();
147 let s2 = super::Splittable::new(TestRead{}, TestWrite{});
148 let (r2, w2) = s2.split();
149 assert!(r1.is_pair_of(&w1));
150 assert!(w1.is_pair_of(&r1));
151 assert!(r2.is_pair_of(&w2));
152 assert!(w2.is_pair_of(&r2));
153 assert!(!w1.is_pair_of(&r2));
154 assert!(!w2.is_pair_of(&r1));
155
156 let s1 = r1.unsplit(w1);
157 let s2 = r2.unsplit(w2);
158 }
159}