1use crate::{ComposedEvent, Delivery, InjectEvent, Inside, Protocol};
4use core::future::Future;
5
6pub trait SendInterpreter: Send {
8 type Error;
9}
10
11pub trait InterpretSends<Interpreter: SendInterpreter, RootEvent, Path>: Sized + Send {
19 fn interpret(
27 self,
28 interpreter: &mut Interpreter,
29 ) -> impl Future<Output = Result<(), Interpreter::Error>> + Send;
30}
31
32pub trait InterpretRequest<Request, RootEvent, Path>: SendInterpreter {
34 fn interpret_request(
44 &mut self,
45 request: Request,
46 ) -> impl Future<Output = Result<(), Self::Error>> + Send;
47}
48
49pub trait InterpretDelivery<P: Protocol>: SendInterpreter {
55 fn interpret_delivery(
61 &mut self,
62 delivery: Delivery<P>,
63 ) -> impl Future<Output = Result<(), Self::Error>> + Send;
64}
65
66pub enum Own {}
68
69pub trait SendInput<Input, Path> {
79 fn emit(&mut self, input: Input);
80}
81
82pub trait SendEffects: Sized {
87 fn empty() -> Self;
88 fn append(&mut self, other: Self);
89
90 #[must_use]
91 fn combine(mut self, other: Self) -> Self {
92 self.append(other);
93 self
94 }
95
96 fn send<Input, Path>(&mut self, input: Input)
98 where
99 Self: SendInput<Input, Path>,
100 {
101 <Self as SendInput<Input, Path>>::emit(self, input);
102 }
103
104 #[must_use]
106 fn sending<Input, Path>(input: Input) -> Self
107 where
108 Self: SendInput<Input, Path>,
109 {
110 let mut sends = Self::empty();
111 sends.send(input);
112 sends
113 }
114}
115
116pub trait SendsFor<Event>: SendEffects {}
140
141pub enum NoReturnToEmitter {}
143
144pub struct ReturnsToEmitter<Input, Path>(core::marker::PhantomData<fn(Input, Path)>);
147
148pub trait ReturnToEmitterFor<Event> {}
150
151impl<Event> ReturnToEmitterFor<Event> for NoReturnToEmitter {}
152
153impl<Event, Input, Path> ReturnToEmitterFor<Event> for ReturnsToEmitter<Input, Path> where
154 Event: InjectEvent<Input, Path>
155{
156}
157
158pub trait InterpreterRequest {
163 type ReturnToEmitter;
164}
165
166#[derive(Debug, Clone, Copy, PartialEq, Eq)]
171pub struct NoSends;
172
173impl SendEffects for NoSends {
174 fn empty() -> Self {
175 Self
176 }
177
178 fn append(&mut self, _: Self) {}
179}
180
181impl<Event> SendsFor<Event> for NoSends {}
182
183impl<Interpreter: SendInterpreter, RootEvent, Path> InterpretSends<Interpreter, RootEvent, Path>
184 for NoSends
185{
186 fn interpret(
187 self,
188 _: &mut Interpreter,
189 ) -> impl Future<Output = Result<(), Interpreter::Error>> + Send {
190 async { Ok(()) }
191 }
192}
193
194#[derive(Debug, Clone, Copy, PartialEq, Eq)]
210pub struct SendLayer<Owned, Inner> {
211 pub owned: Owned,
212 pub inner: Inner,
213}
214
215impl<Owned, Inner> SendLayer<Owned, Inner> {
216 #[must_use]
217 pub const fn new(owned: Owned, inner: Inner) -> Self {
218 Self { owned, inner }
219 }
220}
221
222impl<Owned: SendEffects, Inner: SendEffects> SendEffects for SendLayer<Owned, Inner> {
223 fn empty() -> Self {
224 Self::new(Owned::empty(), Inner::empty())
225 }
226
227 fn append(&mut self, other: Self) {
228 self.owned.append(other.owned);
229 self.inner.append(other.inner);
230 }
231}
232
233impl<Event, OwnedEffects, InnerEffects> SendsFor<Event> for SendLayer<OwnedEffects, InnerEffects>
234where
235 Event: ComposedEvent,
236 OwnedEffects: SendsFor<Event>,
237 InnerEffects: SendsFor<Event::Inner>,
238{
239}
240
241impl<Input, Path, Owned, Inner> SendInput<Input, Path> for SendLayer<Owned, Inner>
242where
243 Owned: SendInput<Input, Path>,
244{
245 fn emit(&mut self, input: Input) {
246 self.owned.emit(input);
247 }
248}
249
250impl<Interpreter, RootEvent, Path, Owned, Inner> InterpretSends<Interpreter, RootEvent, Path>
251 for SendLayer<Owned, Inner>
252where
253 Interpreter: SendInterpreter,
254 Interpreter: Send,
255 Owned: InterpretSends<Interpreter, RootEvent, Path> + Send,
256 Inner: InterpretSends<Interpreter, RootEvent, Inside<Path>> + Send,
257{
258 fn interpret(
259 self,
260 interpreter: &mut Interpreter,
261 ) -> impl Future<Output = Result<(), Interpreter::Error>> + Send {
262 async move {
263 <Inner as InterpretSends<Interpreter, RootEvent, Inside<Path>>>::interpret(
266 self.inner,
267 interpreter,
268 )
269 .await?;
270 <Owned as InterpretSends<Interpreter, RootEvent, Path>>::interpret(
271 self.owned,
272 interpreter,
273 )
274 .await
275 }
276 }
277}
278
279impl<T> SendEffects for Vec<T> {
280 fn empty() -> Self {
281 Vec::new()
282 }
283
284 fn append(&mut self, mut other: Self) {
285 Vec::append(self, &mut other);
286 }
287}
288
289impl<Event, T> SendsFor<Event> for Vec<T> {}
290
291impl<Interpreter, RootEvent, Path, P> InterpretSends<Interpreter, RootEvent, Path>
292 for Vec<Delivery<P>>
293where
294 Interpreter: InterpretDelivery<P>,
295 Interpreter: Send,
296 P: Protocol,
297 Delivery<P>: Send,
298{
299 fn interpret(
300 self,
301 interpreter: &mut Interpreter,
302 ) -> impl Future<Output = Result<(), Interpreter::Error>> + Send {
303 async move {
304 for delivery in self {
305 interpreter.interpret_delivery(delivery).await?;
306 }
307 Ok(())
308 }
309 }
310}
311
312impl<Interpreter: SendInterpreter, RootEvent, Path> InterpretSends<Interpreter, RootEvent, Path>
313 for Vec<crate::Never>
314{
315 fn interpret(
316 self,
317 _: &mut Interpreter,
318 ) -> impl Future<Output = Result<(), Interpreter::Error>> + Send {
319 async move {
320 for never in self {
321 match never {}
322 }
323 Ok(())
324 }
325 }
326}
327
328impl<T> SendInput<T, Own> for Vec<T> {
329 fn emit(&mut self, input: T) {
330 self.push(input);
331 }
332}
333
334#[derive(Debug, Clone, PartialEq, Eq)]
341pub struct InterpreterRequests<M> {
342 requests: Vec<M>,
343}
344
345impl<M> InterpreterRequests<M> {
346 #[must_use]
347 pub fn new(requests: Vec<M>) -> Self {
348 Self { requests }
349 }
350 #[must_use]
351 pub fn one(request: M) -> Self {
352 Self::new(vec![request])
353 }
354 #[must_use]
355 pub fn as_slice(&self) -> &[M] {
356 &self.requests
357 }
358 pub fn iter(&self) -> core::slice::Iter<'_, M> {
359 self.requests.iter()
360 }
361 #[must_use]
362 pub fn len(&self) -> usize {
363 self.requests.len()
364 }
365 #[must_use]
366 pub fn is_empty(&self) -> bool {
367 self.requests.is_empty()
368 }
369 pub fn extend(&mut self, requests: impl IntoIterator<Item = M>) {
370 self.requests.extend(requests);
371 }
372 #[must_use]
373 pub fn into_requests(self) -> Vec<M> {
374 self.requests
375 }
376}
377
378impl<M> core::ops::Index<usize> for InterpreterRequests<M> {
379 type Output = M;
380 fn index(&self, index: usize) -> &Self::Output {
381 &self.requests[index]
382 }
383}
384
385impl<M> IntoIterator for InterpreterRequests<M> {
386 type Item = M;
387 type IntoIter = std::vec::IntoIter<M>;
388 fn into_iter(self) -> Self::IntoIter {
389 self.requests.into_iter()
390 }
391}
392
393impl<'a, M> IntoIterator for &'a InterpreterRequests<M> {
394 type Item = &'a M;
395 type IntoIter = core::slice::Iter<'a, M>;
396 fn into_iter(self) -> Self::IntoIter {
397 self.requests.iter()
398 }
399}
400
401impl<M> SendEffects for InterpreterRequests<M> {
402 fn empty() -> Self {
403 Self::new(Vec::new())
404 }
405 fn append(&mut self, mut other: Self) {
406 self.requests.append(&mut other.requests);
407 }
408}
409
410impl<Event, M> SendsFor<Event> for InterpreterRequests<M>
411where
412 M: InterpreterRequest,
413 M::ReturnToEmitter: ReturnToEmitterFor<Event>,
414{
415}
416
417impl<M> SendInput<M, Own> for InterpreterRequests<M> {
418 fn emit(&mut self, input: M) {
419 self.requests.push(input);
420 }
421}
422
423impl<Interpreter, RootEvent, Path, Request> InterpretSends<Interpreter, RootEvent, Path>
424 for InterpreterRequests<Request>
425where
426 Interpreter: InterpretRequest<Request, RootEvent, Path>,
427 Interpreter: Send,
428 Request: Send,
429{
430 fn interpret(
431 self,
432 interpreter: &mut Interpreter,
433 ) -> impl Future<Output = Result<(), Interpreter::Error>> + Send {
434 async move {
435 for request in self {
436 <Interpreter as InterpretRequest<Request, RootEvent, Path>>::interpret_request(
437 interpreter,
438 request,
439 )
440 .await?;
441 }
442 Ok(())
443 }
444 }
445}
446
447#[cfg(test)]
448mod tests {
449 use super::*;
450
451 #[test]
452 fn send_accumulation_obeys_identity_and_associativity() {
453 let values = vec![1, 2];
454 assert_eq!(Vec::new().combine(values.clone()), values);
455 assert_eq!(values.clone().combine(Vec::new()), values);
456
457 let left = vec![1].combine(vec![2]).combine(vec![3]);
458 let right = vec![1].combine(vec![2].combine(vec![3]));
459 assert_eq!(left, right);
460 }
461
462 #[test]
463 fn vector_and_service_lanes_emit_and_iterate_in_order() {
464 assert!(<Vec<u8> as SendEffects>::empty().is_empty());
465 let mut vector = Vec::new();
466 <Vec<u8> as SendInput<u8, Own>>::emit(&mut vector, 1);
467 assert_eq!(vector, [1]);
468
469 let mut services = InterpreterRequests::one(2);
470 services.extend([4, 5]);
471 <InterpreterRequests<u8> as SendInput<u8, Own>>::emit(&mut services, 3);
472 assert!(!services.is_empty());
473 assert_eq!(services.as_slice(), [2, 4, 5, 3]);
474 assert_eq!(
475 (&services).into_iter().copied().collect::<Vec<_>>(),
476 [2, 4, 5, 3]
477 );
478 assert_eq!(services.into_iter().collect::<Vec<_>>(), [2, 4, 5, 3]);
479
480 let requests = InterpreterRequests::new(vec![4, 5]).into_requests();
481 assert_eq!(requests, [4, 5]);
482 }
483
484 struct Returning;
485
486 impl InterpreterRequest for Returning {
487 type ReturnToEmitter = ReturnsToEmitter<u8, crate::Here>;
488 }
489
490 fn lawful<Event, Effects: SendsFor<Event>>() {}
491
492 #[test]
493 fn local_return_proofs_compose_through_exact_event_layers() {
494 type Inner = crate::EventLayer<u8, crate::User<crate::MailAddr, ()>>;
495 type Outer = crate::EventLayer<(), Inner>;
496
497 lawful::<Inner, InterpreterRequests<Returning>>();
498 lawful::<Outer, SendLayer<NoSends, InterpreterRequests<Returning>>>();
499 }
500
501 #[test]
502 fn send_layer_emits_into_its_designated_owned_lane() {
503 let mut effects = SendLayer::new(Vec::<u8>::new(), Vec::<u16>::new());
504 <SendLayer<Vec<u8>, Vec<u16>> as SendInput<u8, Own>>::emit(&mut effects, 7);
505 assert_eq!(effects.owned, [7]);
506 assert!(effects.inner.is_empty());
507 }
508
509 #[derive(Debug, PartialEq, Eq)]
510 enum Seen {
511 Inner(u8),
512 Outer(u16),
513 }
514
515 struct Trace(Vec<Seen>);
516
517 type TraceEvent =
518 crate::EventLayer<u16, crate::EventLayer<u8, crate::User<crate::MailAddr, ()>>>;
519
520 impl SendInterpreter for Trace {
521 type Error = core::convert::Infallible;
522 }
523
524 impl InterpretRequest<u8, TraceEvent, crate::Inside<crate::Here>> for Trace {
525 fn interpret_request(
526 &mut self,
527 request: u8,
528 ) -> impl Future<Output = Result<(), Self::Error>> + Send {
529 async move {
530 self.0.push(Seen::Inner(request));
531 Ok(())
532 }
533 }
534 }
535
536 impl InterpretRequest<u16, TraceEvent, crate::Here> for Trace {
537 fn interpret_request(
538 &mut self,
539 request: u16,
540 ) -> impl Future<Output = Result<(), Self::Error>> + Send {
541 async move {
542 self.0.push(Seen::Outer(request));
543 Ok(())
544 }
545 }
546 }
547
548 #[tokio::test]
549 async fn structural_interpretation_visits_every_lane_inner_to_outer() {
550 let effects = SendLayer::new(
551 InterpreterRequests::new(vec![3_u16, 5]),
552 SendLayer::new(InterpreterRequests::one(2_u8), NoSends),
553 );
554 let mut trace = Trace(Vec::new());
555
556 <_ as InterpretSends<_, TraceEvent, crate::Here>>::interpret(effects, &mut trace)
557 .await
558 .unwrap();
559
560 assert_eq!(trace.0, [Seen::Inner(2), Seen::Outer(3), Seen::Outer(5)]);
561 }
562}