1use crate::address::Address;
2use crate::agent::Agent;
3use crate::context::Context;
4use crate::message::event::OnEvent;
5use crb_send::Recipient;
6use std::sync::Arc;
7
8pub type UniAddress<T> = Arc<T>;
9
10pub trait ToAddress<A: Agent> {
11 fn to_address(&self) -> Address<A>;
12}
13
14impl<A: Agent> ToAddress<A> for Address<A> {
15 fn to_address(&self) -> Address<A> {
16 self.clone()
17 }
18}
19
20impl<A: Agent> ToAddress<A> for Context<A> {
21 fn to_address(&self) -> Address<A> {
22 self.address().clone()
23 }
24}
25
26impl<A: Agent, T: ToAddress<A>> ToAddress<A> for &T {
27 fn to_address(&self) -> Address<A> {
28 (**self).to_address().clone()
29 }
30}
31
32impl<A: Agent, T: ToAddress<A>> ToAddress<A> for &mut T {
33 fn to_address(&self) -> Address<A> {
34 (**self).to_address().clone()
35 }
36}
37
38impl<A: Agent, T: ToAddress<A>, X> ToAddress<A> for (T, X) {
39 fn to_address(&self) -> Address<A> {
40 self.0.to_address()
41 }
42}
43
44impl<A: Agent, X> From<(Address<A>, X)> for Address<A> {
45 fn from((address, _): (Address<A>, X)) -> Address<A> {
46 address
47 }
48}
49
50pub trait ToRecipient<M> {
51 fn to_recipient(&self) -> Recipient<M>;
52}
53
54impl<A, M> ToRecipient<M> for Address<A>
55where
56 A: OnEvent<M>,
57 M: Send + 'static,
58{
59 fn to_recipient(&self) -> Recipient<M> {
60 self.recipient()
61 }
62}
63
64impl<A, M> ToRecipient<M> for Context<A>
65where
66 A: OnEvent<M>,
67 M: Send + 'static,
68{
69 fn to_recipient(&self) -> Recipient<M> {
70 self.address().recipient()
71 }
72}
73
74impl<T, M> ToRecipient<M> for &T
75where
76 T: ToRecipient<M>,
77 M: Send + 'static,
78{
79 fn to_recipient(&self) -> Recipient<M> {
80 (**self).to_recipient()
81 }
82}
83
84impl<T, M> ToRecipient<M> for &mut T
85where
86 T: ToRecipient<M>,
87 M: Send + 'static,
88{
89 fn to_recipient(&self) -> Recipient<M> {
90 (**self).to_recipient()
91 }
92}
93
94pub trait Equip<A: Agent> {
95 fn equip<E>(self) -> E
96 where
97 E: From<Address<A>>;
98}
99
100impl<A> Equip<A> for Address<A>
101where
102 A: Agent,
103{
104 fn equip<E>(self) -> E
105 where
106 E: From<Address<A>>,
107 {
108 E::from(self)
109 }
110}
111
112impl<A> Equip<A> for &Context<A>
113where
114 A: Agent,
115{
116 fn equip<E>(self) -> E
117 where
118 E: From<Address<A>>,
119 {
120 self.to_address().into()
121 }
122}
123
124impl<A, X> Equip<A> for (Address<A>, X)
127where
128 A: Agent,
129{
130 fn equip<E>(self) -> E
131 where
132 E: From<Address<A>>,
133 {
134 E::from(self.0)
135 }
136}