pub struct Stash<B: Behavior> { /* private fields */ }Expand description
FIFO message holding for an infallible inner fold.
Releasing one command may replay several retained mailbox inputs in one
transition. Because behavior::Actions has no rollback effect, a
fallible inner fold could reject after earlier replayed inputs had already
produced unreturnable actions. Such an inner behavior is therefore not a
valid Stash composition:
ⓘ
struct Fallible;
impl behavior::Protocol for Fallible { type Addr = behavior::MailAddr; type Msg = (); }
impl behavior::Behavior for Fallible {
type Protocol = Self;
type Event = behavior::User<behavior::MailAddr, ()>;
type Sends = Vec<behavior::Never>;
type Ph = behavior::Never;
type Error = u8;
type Birth = behavior::NoBirths;
fn transition(&mut self, _: behavior::ActiveTurn, _: Self::Event) -> behavior::BehaviorActed<Self> {
Err(1)
}
}
fn route(_: &()) -> behavior_actors::StashRoute { behavior_actors::StashRoute::Release }
fn requires_behavior<B: behavior::Behavior>(_: &B) {}
requires_behavior(&behavior_actors::Stash::new(Fallible, |_, message| route(message)));Implementations§
Source§impl<B: Behavior<Ph = Never>> Stash<B>
impl<B: Behavior<Ph = Never>> Stash<B>
Sourcepub fn new(inner: B, route: fn(&B, &BehaviorMessage<B>) -> StashRoute) -> Self
pub fn new(inner: B, route: fn(&B, &BehaviorMessage<B>) -> StashRoute) -> Self
Wrap inner with route, a pure decision over the actual inner state and message.
Stashed messages retain FIFO order and ownership until a later
StashRoute::Release. Each replay borrows the state returned by the
preceding inner transition; the route must perform no effect.
Construction performs no transition or runtime
operation.
pub fn held(&self) -> usize
Trait Implementations§
Source§impl<B, A, Sends, Br> Behavior for Stash<B>
impl<B, A, Sends, Br> Behavior for Stash<B>
Source§type Protocol = <B as Behavior>::Protocol
type Protocol = <B as Behavior>::Protocol
Stable public communication identity owned by this actor template. Read more
type Event = <B as Behavior>::Event
type Sends = Sends
type Ph = Never
type Error = <B as Behavior>::Error
type Birth = Br
Source§fn init(
&mut self,
_: InitializationTurn,
) -> Result<Actions<A, Never, Sends, Br>, Self::Error>
fn init( &mut self, _: InitializationTurn, ) -> Result<Actions<A, Never, Sends, Br>, Self::Error>
Produce initialization actions before the first event is accepted. Read more
Source§fn transition(
&mut self,
_: ActiveTurn,
event: B::Event,
) -> Result<Actions<A, Never, Sends, Br>, Self::Error>
fn transition( &mut self, _: ActiveTurn, event: B::Event, ) -> Result<Actions<A, Never, Sends, Br>, Self::Error>
Fold exactly one event into explicit actions and the next behavior. Read more
Source§fn layer<L>(self, layer: L) -> <L as BehaviorLayer<Self>>::Outputwhere
Self: Sized,
L: BehaviorLayer<Self>,
fn layer<L>(self, layer: L) -> <L as BehaviorLayer<Self>>::Outputwhere
Self: Sized,
L: BehaviorLayer<Self>,
Apply one statically dispatched construction layer. Read more
Source§impl<B> BehaviorBase for Stash<B>
impl<B> BehaviorBase for Stash<B>
Source§impl<B: Behavior<Ph = Never>> StashStatus for Stash<B>
impl<B: Behavior<Ph = Never>> StashStatus for Stash<B>
fn stashed_messages(&self) -> usize
Auto Trait Implementations§
impl<B> Freeze for Stash<B>where
B: Freeze,
impl<B> RefUnwindSafe for Stash<B>where
B: RefUnwindSafe,
<<B as Behavior>::Protocol as Protocol>::Addr: RefUnwindSafe,
<<B as Behavior>::Protocol as Protocol>::Msg: RefUnwindSafe,
impl<B> Send for Stash<B>
impl<B> Sync for Stash<B>
impl<B> Unpin for Stash<B>
impl<B> UnsafeUnpin for Stash<B>where
B: UnsafeUnpin,
impl<B> UnwindSafe for Stash<B>where
B: UnwindSafe,
<<B as Behavior>::Protocol as Protocol>::Addr: UnwindSafe,
<<B as Behavior>::Protocol as Protocol>::Msg: UnwindSafe,
Blanket Implementations§
Source§impl<B> Activate for Bwhere
B: Behavior,
impl<B> Activate for Bwhere
B: Behavior,
Source§fn initialize(self) -> Result<Initialized<Self>, Self::Error>
fn initialize(self) -> Result<Initialized<Self>, Self::Error>
Consume this definition, perform its one initialization fold, and
return the active behavior together with the ordered initialization
effects. Read more
Source§impl<B> BeginShutdownPhases for B
impl<B> BeginShutdownPhases for B
type Output = ChildShutdownPhases<B, <<<B as Behavior>::Birth as BirthMode>::Child as ChildOccurrenceProduct<AvailableChildren>>::Product, NoPhases>
fn begin_shutdown_phases(self) -> <B as BeginShutdownPhases>::Output
Source§impl<Node> BirthNodeAppend<Never> for Nodewhere
Node: NonEmptyBirthNode,
impl<Node> BirthNodeAppend<Never> for Nodewhere
Node: NonEmptyBirthNode,
Source§type Output = Node
type Output = Node
Closed child algebra containing the complete prefix followed by the
complete appended tail.
Source§fn append_prefix(self) -> <Node as BirthNodeAppend<Never>>::Output
fn append_prefix(self) -> <Node as BirthNodeAppend<Never>>::Output
Inject one child from the existing prefix without changing its
structural occurrence.
Source§fn append_tail(tail: Never) -> <Node as BirthNodeAppend<Never>>::Output
fn append_tail(tail: Never) -> <Node as BirthNodeAppend<Never>>::Output
Inject one child from the appended tail after every prefix occurrence.
Source§fn append_creations<A>(
prefix: Creations<CreateChild<A, Self>>,
tail: Creations<CreateChild<A, Tail>>,
) -> Creations<CreateChild<A, Self::Output>>where
A: Address,
fn append_creations<A>(
prefix: Creations<CreateChild<A, Self>>,
tail: Creations<CreateChild<A, Tail>>,
) -> Creations<CreateChild<A, Self::Output>>where
A: Address,
Preserve and concatenate two ordered creation batches.
Source§impl<Child, Tail> BirthNodeAppend<Tail> for Childwhere
Child: Behavior,
Tail: NonEmptyBirthNode,
impl<Child, Tail> BirthNodeAppend<Tail> for Childwhere
Child: Behavior,
Tail: NonEmptyBirthNode,
Source§type Output = ChildChoice<Child, Tail>
type Output = ChildChoice<Child, Tail>
Closed child algebra containing the complete prefix followed by the
complete appended tail.
Source§fn append_prefix(self) -> <Child as BirthNodeAppend<Tail>>::Output
fn append_prefix(self) -> <Child as BirthNodeAppend<Tail>>::Output
Inject one child from the existing prefix without changing its
structural occurrence.
Source§fn append_tail(tail: Tail) -> <Child as BirthNodeAppend<Tail>>::Output
fn append_tail(tail: Tail) -> <Child as BirthNodeAppend<Tail>>::Output
Inject one child from the appended tail after every prefix occurrence.
Source§fn append_creations<A>(
prefix: Creations<CreateChild<A, Self>>,
tail: Creations<CreateChild<A, Tail>>,
) -> Creations<CreateChild<A, Self::Output>>where
A: Address,
fn append_creations<A>(
prefix: Creations<CreateChild<A, Self>>,
tail: Creations<CreateChild<A, Tail>>,
) -> Creations<CreateChild<A, Self::Output>>where
A: Address,
Preserve and concatenate two ordered creation batches.
Source§impl<B> BirthProtocols for B
impl<B> BirthProtocols for B
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<Node, Shape> ChildOccurrenceProduct<Shape> for Nodewhere
Node: ChildOccurrenceProductAt<ChildHead, Shape>,
Shape: ChildOccurrenceShape,
impl<Node, Shape> ChildOccurrenceProduct<Shape> for Nodewhere
Node: ChildOccurrenceProductAt<ChildHead, Shape>,
Shape: ChildOccurrenceShape,
Source§impl<A, Child, Host> DispatchBirth<A, Host> for Child
impl<A, Child, Host> DispatchBirth<A, Host> for Child
Source§fn dispatch_birth(
self,
id: CreationId,
route: <A as Address>::Nonce,
kind: CreationKind,
host: &mut Host,
) -> impl Future<Output = ItemSettlement<RoutedCreation<A, Child>, <Child as ChildCreationProduct<A, ChildHead>>::Result, CreationRejection, Never>> + Send
fn dispatch_birth( self, id: CreationId, route: <A as Address>::Nonce, kind: CreationKind, host: &mut Host, ) -> impl Future<Output = ItemSettlement<RoutedCreation<A, Child>, <Child as ChildCreationProduct<A, ChildHead>>::Result, CreationRejection, Never>> + Send
Select exactly one concrete child host while preserving creation data
in every non-accepted settlement.