crb_agent/
address_ext.rs

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
124/// This implementation is useful for using with supervisors that can return
125/// addresses of spawned agents with assigned relations in a tuple.
126impl<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}