Notifier

Struct Notifier 

Source
pub struct Notifier<N, C>
where N: Notification, C: Connection<Notification = N>,
{ /* private fields */ }
Expand description

A notifier is a notification broadcaster. It receives notifications from upstream parents and broadcasts those downstream to its children listeners. Symmetrically, it receives subscriptions from its downward listeners, compounds those internally and pushes upward the subscriptions resulting of the compounding, if any, to the parents.

§Enabled event types

A notifier has a set of enabled event type (see EventType). It only broadcasts notifications whose event type is enabled and drops the others. The same goes for subscriptions.

Each subscriber has a set of enabled event type. No two subscribers may have the same event type enabled. The union of the sets of all subscribers should match the set of the notifier, though this is not mandatory.

§Mutation policies

The notifier is built with some mutation policies defining how an processed listener mutation must be propagated to the parent.

§Architecture

§Internal structure

The notifier notably owns:

Collectors and subscribers form the scaffold. They are provided to the ctor, are immutable and share its lifespan. Both do materialize a connection to the notifier parents, collectors for incoming notifications and subscribers for outgoing subscriptions. They may usually be paired by index in their respective vector but this by no means is mandatory, opening a field for special edge cases.

The broadcasters are built in the ctor according to a provided count. They act as a pool of workers competing for the processing of an incoming notification.

The listeners are managed dynamically through registration/unregistration calls.

§External conformation

The notifier is designed so that many instances can be interconnected and form a DAG of notifiers.

However, the notifications path from the root all the way downstream to the final clients is forming a tree, not a DAG. This is because, for a given type of notification (see EventType), a notifier has at most a single parent provider.

The same is symmetrically true about subscriptions which travel upstream from clients to the root along a tree, meaning that, for a given type of subscription (see EventType), a notifier has at most a single subscriber, targeting a single parent.

§Special considerations

A notifier is built with a specific set of enabled event types. It is however possible to manually subscribe to a disabled scope and thus have a custom-made collector of the notifier receive notifications of this disabled scope, allowing some handling of the notification into the collector before it gets dropped by the notifier.

Implementations§

Source§

impl<N, C> Notifier<N, C>
where N: Notification, C: Connection<Notification = N>,

Source

pub fn new( name: &'static str, enabled_events: EventSwitches, collectors: Vec<DynCollector<N>>, subscribers: Vec<Arc<Subscriber>>, subscription_context: SubscriptionContext, broadcasters: usize, policies: MutationPolicies, ) -> Self

Source

pub fn with_sync( name: &'static str, enabled_events: EventSwitches, collectors: Vec<DynCollector<N>>, subscribers: Vec<Arc<Subscriber>>, subscription_context: SubscriptionContext, broadcasters: usize, policies: MutationPolicies, _sync: Option<Sender<()>>, ) -> Self

Source

pub fn subscription_context(&self) -> &SubscriptionContext

Source

pub fn enabled_events(&self) -> &EventSwitches

Source

pub fn start(self: Arc<Self>)

Source

pub fn register_new_listener( &self, connection: C, lifespan: ListenerLifespan, ) -> ListenerId

Source

pub fn try_renew_subscriptions(&self) -> Result<()>

Resend the compounded subscription state of the notifier to its subscribers (its parents).

The typical use case is a RPC client reconnecting to a server and resending the compounded subscriptions of its listeners.

Source

pub fn try_start_notify(&self, id: ListenerId, scope: Scope) -> Result<()>

Source

pub fn try_execute_subscribe_command( &self, id: ListenerId, scope: Scope, command: Command, ) -> Result<()>

Source

pub fn try_stop_notify(&self, id: ListenerId, scope: Scope) -> Result<()>

Source

pub fn unregister_listener(&self, id: ListenerId) -> Result<()>

Source

pub async fn join(&self) -> Result<()>

Trait Implementations§

Source§

impl<N, C> Debug for Notifier<N, C>
where N: Notification + Debug, C: Connection<Notification = N> + Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<N, C> Notify<N> for Notifier<N, C>
where N: Notification, C: Connection<Notification = N>,

Source§

fn notify(&self, notification: N) -> Result<()>

Source§

impl<N, C> SubscriptionManager for Notifier<N, C>
where N: Notification, C: Connection<Notification = N>,

Source§

fn start_notify<'life0, 'async_trait>( &'life0 self, id: ListenerId, scope: Scope, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Source§

fn stop_notify<'life0, 'async_trait>( &'life0 self, id: ListenerId, scope: Scope, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Source§

fn execute_subscribe_command<'life0, 'async_trait>( &'life0 self, id: ListenerId, scope: Scope, command: Command, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Auto Trait Implementations§

§

impl<N, C> Freeze for Notifier<N, C>

§

impl<N, C> !RefUnwindSafe for Notifier<N, C>

§

impl<N, C> Send for Notifier<N, C>

§

impl<N, C> Sync for Notifier<N, C>

§

impl<N, C> Unpin for Notifier<N, C>

§

impl<N, C> !UnwindSafe for Notifier<N, C>

Blanket Implementations§

§

impl<T> Any for T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Any for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Source§

fn type_name(&self) -> &'static str

Source§

impl<T> AnySync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Source§

impl<T> AsAny for T
where T: Any,

Source§

fn as_any(&self) -> &(dyn Any + 'static)

§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<S> CastArc for S
where S: CastFromSync + ?Sized,

Source§

fn cast<T>(self: Arc<S>) -> Result<Arc<T>, Arc<S>>
where T: 'static + ?Sized,

Casts an Arc for this trait into that for type T.
Source§

impl<S> CastBox for S
where S: CastFrom + ?Sized,

Source§

fn cast<T>(self: Box<S>) -> Result<Box<T>, Box<S>>
where T: 'static + ?Sized,

Casts a box to this trait into that of type T. If fails, returns the receiver.
Source§

impl<T> CastFrom for T
where T: Any + 'static,

Source§

fn ref_any(&self) -> &(dyn Any + 'static)

Returns a immutable reference to Any, which is backed by the type implementing this trait.
Source§

fn mut_any(&mut self) -> &mut (dyn Any + 'static)

Returns a mutable reference to Any, which is backed by the type implementing this trait.
Source§

fn box_any(self: Box<T>) -> Box<dyn Any>

Returns a Box of Any, which is backed by the type implementing this trait.
Source§

fn rc_any(self: Rc<T>) -> Rc<dyn Any>

Returns an Rc of Any, which is backed by the type implementing this trait.
Source§

impl<T> CastFromSync for T
where T: Sync + Send + 'static,

Source§

fn arc_any(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Source§

impl<S> CastMut for S
where S: CastFrom + ?Sized,

Source§

fn cast<T>(&mut self) -> Option<&mut T>
where T: 'static + ?Sized,

Casts a mutable reference to this trait into that of type T.
Source§

impl<S> CastRc for S
where S: CastFrom + ?Sized,

Source§

fn cast<T>(self: Rc<S>) -> Result<Rc<T>, Rc<S>>
where T: 'static + ?Sized,

Casts an Rc for this trait into that for type T.
Source§

impl<S> CastRef for S
where S: CastFrom + ?Sized,

Source§

fn cast<T>(&self) -> Option<&T>
where T: 'static + ?Sized,

Casts a reference to this trait into that of type T.
Source§

fn impls<T>(&self) -> bool
where T: 'static + ?Sized,

Tests if this trait object can be cast into T.
Source§

impl<T, U> ExactFrom<T> for U
where U: TryFrom<T>,

Source§

fn exact_from(value: T) -> U

Source§

impl<T, U> ExactInto<U> for T
where U: ExactFrom<T>,

Source§

fn exact_into(self) -> U

§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T, U> OverflowingInto<U> for T
where U: OverflowingFrom<T>,

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, U> RoundingInto<U> for T
where U: RoundingFrom<T>,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> SaturatingInto<U> for T
where U: SaturatingFrom<T>,

Source§

impl<T> ToDebugString for T
where T: Debug,

Source§

fn to_debug_string(&self) -> String

Returns the String produced by Ts Debug implementation.

§Examples
use malachite_base::strings::ToDebugString;

assert_eq!([1, 2, 3].to_debug_string(), "[1, 2, 3]");
assert_eq!(
    [vec![2, 3], vec![], vec![4]].to_debug_string(),
    "[[2, 3], [], [4]]"
);
assert_eq!(Some(5).to_debug_string(), "Some(5)");
§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T, U> WrappingInto<U> for T
where U: WrappingFrom<T>,

Source§

fn wrapping_into(self) -> U

Source§

impl<T> DebugAny for T
where T: Any + Debug,

Source§

impl<T> UnsafeAny for T
where T: Any,