1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
//! Pure behavior folds from one typed event to explicit transition actions.
use crate;
use crate;
use crateUserEvent;
/// Reusable zero-state protocol identity for messages `M` addressed by `A`.
///
/// This value has no runtime operations. It lets an actor template publish its
/// communication signature independently of the concrete state/fold type that
/// currently implements that signature.
>);
/// The statically known address and message signature of an actor protocol.
///
/// This signature is deliberately independent of [`Behavior`]'s transition
/// algebra. A [`Recipient`](crate::Recipient) or [`Delivery`](crate::Delivery)
/// needs to prove only which address namespace and message type it names; it
/// must not recursively prove the destination's sends, births, phases, or
/// transition implementation. That separation permits closed static actor
/// topologies in which a root sends to an actor whose reply path returns to the
/// same root.
/// The only successful effect shape admitted by a [`Behavior`] implementation.
pub type BehaviorActed<B> = ;
/// Address namespace projected from a behavior's stable public protocol.
pub type BehaviorAddr<B> = Addr;
/// Public message algebra projected from a behavior's stable protocol.
pub type BehaviorMessage<B> = Msg;
/// Capability for defining one initialization fold.
///
/// The constructor is private, so callers cannot pass a fabricated turn to
/// [`Behavior::init`]. The public [`initialize`] composition port can issue a
/// turn more than once for the same mutable definition. A wrapper or runtime
/// using that port must enforce its own initialization order; the consuming
/// `Activate::initialize` path in `behavior-actors` enforces one call for its
/// owned definition.
/// Capability for defining one active mailbox fold.
///
/// Values are issued only by the lifecycle and wrapper-composition boundaries.
/// A composed pure behavior. `Event` is the complete accepted input algebra;
/// the separately declared [`Protocol`] is stable public destination identity,
/// and every successful transition returns the declared [`Actions`] value.
///
/// The public protocol must exactly match the address and user-message lane:
///
/// ```compile_fail
/// struct Wrong;
/// impl behavior::Protocol for Wrong {
/// type Addr = behavior::MailAddr;
/// type Msg = String;
/// }
/// struct Counter;
/// impl behavior::Protocol for Counter {
/// type Addr = behavior::MailAddr;
/// type Msg = u8;
/// }
/// impl behavior::Behavior for Counter {
/// type Protocol = Wrong;
/// type Event = behavior::User<behavior::MailAddr, u8>;
/// type Sends = Vec<behavior::Never>;
/// type Ph = behavior::Never;
/// type Error = behavior::Never;
/// type Birth = behavior::NoBirths;
/// fn transition(&mut self, _: behavior::ActiveTurn, _: Self::Event) -> behavior::BehaviorActed<Self> {
/// Ok(behavior::Actions::cont())
/// }
/// }
/// ```
/// Complete static logical-host requirement of one composed behavior.
///
/// The product is derived from the behavior's concrete sends algebra and from
/// every behavior reachable through its transitive birth algebra. Only
/// intentional logical [`Delivery`](crate::Delivery) lanes and interpreter
/// requests with logical recipients contribute a protocol. Exact established
/// recipients and creator-local children and inputs do not. Repeated protocol
/// occurrences are retained in the existing structural birth-protocol
/// product; this trait performs no normalization or runtime lookup.
///
/// A generic application owner can consume `LogicalHosts` recursively and
/// require its own concrete `Hosts<P>` proof for every element. The product is
/// evidence only: it creates no actor space and does not alter [`Actions`].
/// Static construction from one concrete behavior to another.
///
/// This is Bombay's generic consumer contract for Tower-like behavior
/// composition. `Output` remains a fully concrete [`Behavior`], so its public
/// protocol, complete event sum, named send product, birth algebra,
/// initialization fold, phase, error, and next-behavior decision all remain
/// available through ordinary associated types. A layer value performs no
/// send, creation, initialization, transition, or runtime lookup; it only owns
/// the information needed to construct its output.
///
/// The output remains in the input behavior's address namespace. It may
/// preserve or deliberately adapt the public protocol, event, sends, births,
/// phase, and error only as documented by the concrete output behavior. This
/// trait does not assert that an arbitrary closure is topology-transparent;
/// that semantic law belongs to the concrete transformation and its tests.
///
/// Closures implement this contract directly, allowing existing concrete
/// wrapper constructors to compose without a parallel catalogue of marker or
/// configuration-only `*Layer` types:
///
/// ```
/// struct Inner;
/// impl behavior::Protocol for Inner { type Addr = behavior::MailAddr; type Msg = (); }
/// impl behavior::Behavior for Inner {
/// type Protocol = Self;
/// type Event = behavior::User<behavior::MailAddr, ()>;
/// type Sends = Vec<behavior::Never>;
/// type Ph = behavior::Never;
/// type Error = behavior::Never;
/// type Birth = behavior::NoBirths;
/// fn transition(&mut self, _: behavior::ActiveTurn, _: Self::Event)
/// -> behavior::BehaviorActed<Self> { Ok(behavior::Actions::cont()) }
/// }
///
/// fn apply<B, L>(behavior: B, layer: L) -> L::Output
/// where
/// B: behavior::Behavior,
/// L: behavior::BehaviorLayer<B>,
/// {
/// behavior::BehaviorLayer::layer(&layer, behavior)
/// }
///
/// let _: Inner = apply(Inner, core::convert::identity::<Inner>);
/// ```
/// Static projection from a composed behavior to its authored base behavior.
///
/// Wrappers preserve this associated type, so inspection never depends on
/// wrapper nesting depth or a positional path.
/// Initialize an inner behavior owned by a semantic composition.
///
/// This is Bombay's derived, canonical boundary for wrapper composition; it is
/// not an additional actor-model operation. It invokes the inner initialization
/// fold once per call and returns its complete typed action value without
/// inspecting or transforming it. Callers own the once-per-definition
/// lifecycle rule. It does not execute a runtime turn,
/// interpret effects, or provide an alternate actor executor; top-level runtime
/// transitions remain the responsibility of the runtime's machine adapter.
///
/// # Errors
///
/// Returns the inner behavior's controlled transition failure unchanged.
/// Fold one event through an inner behavior owned by a semantic wrapper.
///
/// This invokes the inner deterministic fold exactly once and returns its
/// complete typed action value without interpreting it. The port can be
/// invoked before initialization; a wrapper or runtime must enforce the
/// order required by its lifecycle contract.
///
/// # Errors
///
/// Returns the inner behavior's controlled transition failure unchanged.