windows-reactor 0.100.0

Declarative Windows UI library for Rust
Documentation
use std::cmp::Reverse;

use super::*;

impl<R: NativeRuntime> Pump<R> {
    pub(super) fn prepare_component_effects(&self, changes: &ComponentChanges) {
        let cleanup = changes
            .retired
            .iter()
            .chain(changes.composed.iter())
            .copied()
            .filter(|token| !changes.reserved.contains(token))
            .collect::<HashSet<_>>();
        let retired = changes.retired.iter().copied().collect::<HashSet<_>>();
        let mut ordered = cleanup
            .into_iter()
            .map(|token| {
                let node = self.tree.component_node(token.scope()).unwrap();
                (Reverse(self.tree.depth(node)), node, token)
            })
            .collect::<Vec<_>>();
        ordered.sort_unstable_by(|left, right| (&left.0, &left.1).cmp(&(&right.0, &right.1)));
        for (_, _, token) in ordered {
            if retired.contains(&token) {
                self.components.cleanup_effects(token);
            } else {
                self.components.prepare_effects(token);
            }
        }
    }

    pub(super) fn commit_component_effects(&self, changes: &ComponentChanges) {
        let retired = changes.retired.iter().copied().collect::<HashSet<_>>();
        let setup = changes
            .reserved
            .iter()
            .chain(changes.composed.iter())
            .copied()
            .filter(|token| !retired.contains(token))
            .collect::<HashSet<_>>();
        let mut ordered = setup
            .into_iter()
            .map(|token| {
                let node = self.tree.component_node(token.scope()).unwrap();
                (self.tree.depth(node), node, token)
            })
            .collect::<Vec<_>>();
        ordered.sort_unstable_by(|left, right| (&left.0, &left.1).cmp(&(&right.0, &right.1)));
        for (_, _, token) in ordered {
            self.components.commit_effects(token);
        }
    }

    pub(super) fn finalize_component_changes(&mut self, changes: &ComponentChanges) {
        let retired = changes.retired.iter().copied().collect::<HashSet<_>>();
        for token in changes.reserved.iter().copied() {
            if !retired.contains(&token) {
                self.components.publish(token);
            }
        }
        for (token, dependencies) in &changes.context_reads {
            if !retired.contains(token) {
                self.components
                    .set_context_dependencies(*token, dependencies.clone());
            }
        }
        for token in changes.retired.iter().copied() {
            self.components.remove(token);
        }
    }

    pub(super) fn remove_reservations(
        components: &mut ComponentStore,
        reserved: &[ComponentToken],
    ) {
        for token in reserved.iter().rev().copied() {
            components.remove(token);
        }
    }
}