@@ -21,6 +21,7 @@ use smallvec::SmallVec;
21
21
22
22
use crate :: {
23
23
Buffer , CloneFromBuffer , OperationError , OrBroken , InspectInput , ManageInput ,
24
+ OperationResult , ForkTargetStorage ,
24
25
} ;
25
26
26
27
pub trait Buffered : Clone {
@@ -37,6 +38,12 @@ pub trait Buffered: Clone {
37
38
world : & mut World ,
38
39
) -> Result < Self :: Item , OperationError > ;
39
40
41
+ fn listen (
42
+ & self ,
43
+ listener : Entity ,
44
+ world : & mut World ,
45
+ ) -> OperationResult ;
46
+
40
47
fn as_input ( & self ) -> SmallVec < [ Entity ; 8 ] > ;
41
48
}
42
49
@@ -56,6 +63,20 @@ impl<T: 'static + Send + Sync> Buffered for Buffer<T> {
56
63
. pull_from_buffer :: < T > ( session)
57
64
}
58
65
66
+ fn listen (
67
+ & self ,
68
+ listener : Entity ,
69
+ world : & mut World ,
70
+ ) -> OperationResult {
71
+ let mut targets = world
72
+ . get_mut :: < ForkTargetStorage > ( self . source )
73
+ . or_broken ( ) ?;
74
+ targets. 0 . push ( listener) ;
75
+ targets. 0 . sort ( ) ;
76
+ targets. 0 . dedup ( ) ;
77
+ Ok ( ( ) )
78
+ }
79
+
59
80
fn as_input ( & self ) -> SmallVec < [ Entity ; 8 ] > {
60
81
SmallVec :: from_iter ( [ self . source ] )
61
82
}
@@ -81,6 +102,20 @@ impl<T: 'static + Send + Sync + Clone> Buffered for CloneFromBuffer<T> {
81
102
. clone_from_buffer ( session)
82
103
}
83
104
105
+ fn listen (
106
+ & self ,
107
+ listener : Entity ,
108
+ world : & mut World ,
109
+ ) -> OperationResult {
110
+ let mut targets = world
111
+ . get_mut :: < ForkTargetStorage > ( self . source )
112
+ . or_broken ( ) ?;
113
+ targets. 0 . push ( listener) ;
114
+ targets. 0 . sort ( ) ;
115
+ targets. 0 . dedup ( ) ;
116
+ Ok ( ( ) )
117
+ }
118
+
84
119
fn as_input ( & self ) -> SmallVec < [ Entity ; 8 ] > {
85
120
SmallVec :: from_iter ( [ self . source ] )
86
121
}
@@ -113,6 +148,16 @@ where
113
148
Ok ( ( t0, t1) )
114
149
}
115
150
151
+ fn listen (
152
+ & self ,
153
+ listener : Entity ,
154
+ world : & mut World ,
155
+ ) -> OperationResult {
156
+ self . 0 . listen ( listener, world) ?;
157
+ self . 1 . listen ( listener, world) ?;
158
+ Ok ( ( ) )
159
+ }
160
+
116
161
fn as_input ( & self ) -> SmallVec < [ Entity ; 8 ] > {
117
162
let mut inputs = SmallVec :: new ( ) ;
118
163
inputs. extend ( self . 0 . as_input ( ) ) ;
@@ -151,6 +196,17 @@ where
151
196
Ok ( ( t0, t1, t2) )
152
197
}
153
198
199
+ fn listen (
200
+ & self ,
201
+ listener : Entity ,
202
+ world : & mut World ,
203
+ ) -> OperationResult {
204
+ self . 0 . listen ( listener, world) ?;
205
+ self . 1 . listen ( listener, world) ?;
206
+ self . 2 . listen ( listener, world) ?;
207
+ Ok ( ( ) )
208
+ }
209
+
154
210
fn as_input ( & self ) -> SmallVec < [ Entity ; 8 ] > {
155
211
let mut inputs = SmallVec :: new ( ) ;
156
212
inputs. extend ( self . 0 . as_input ( ) ) ;
@@ -190,6 +246,17 @@ impl<T: Buffered, const N: usize> Buffered for [T; N] {
190
246
} ) . collect ( )
191
247
}
192
248
249
+ fn listen (
250
+ & self ,
251
+ listener : Entity ,
252
+ world : & mut World ,
253
+ ) -> OperationResult {
254
+ for buffer in self {
255
+ buffer. listen ( listener, world) ?;
256
+ }
257
+ Ok ( ( ) )
258
+ }
259
+
193
260
fn as_input ( & self ) -> SmallVec < [ Entity ; 8 ] > {
194
261
self . iter ( ) . flat_map ( |buffer| buffer. as_input ( ) ) . collect ( )
195
262
}
@@ -223,6 +290,17 @@ impl<T: Buffered, const N: usize> Buffered for SmallVec<[T; N]> {
223
290
} ) . collect ( )
224
291
}
225
292
293
+ fn listen (
294
+ & self ,
295
+ listener : Entity ,
296
+ world : & mut World ,
297
+ ) -> OperationResult {
298
+ for buffer in self {
299
+ buffer. listen ( listener, world) ?;
300
+ }
301
+ Ok ( ( ) )
302
+ }
303
+
226
304
fn as_input ( & self ) -> SmallVec < [ Entity ; 8 ] > {
227
305
self . iter ( ) . flat_map ( |buffer| buffer. as_input ( ) ) . collect ( )
228
306
}
0 commit comments