freya_core/
layers.rs

1use std::{
2    self,
3    ops::{
4        Deref,
5        DerefMut,
6    },
7};
8
9use freya_native_core::NodeId;
10use rustc_hash::FxHashMap;
11
12#[derive(Default, Clone, Debug, PartialEq)]
13pub struct Layers(FxHashMap<i16, Vec<NodeId>>);
14
15impl Layers {
16    /// Insert the given [NodeId] in the given layer. Will create an entry for the layer if missing.
17    pub fn insert_node_in_layer(&mut self, node_id: NodeId, layer_n: i16) {
18        let layer = self.0.entry(layer_n).or_default();
19        if layer.contains(&node_id) {
20            return;
21        }
22        layer.push(node_id);
23    }
24
25    /// Remove the [NodeId] from the given layer. Will remove the entry of the layer if it becomes empty.
26    pub fn remove_node_from_layer(&mut self, node_id: NodeId, layer_n: i16) {
27        let layer = self.0.get_mut(&layer_n).unwrap();
28        layer.retain(|id| *id != node_id);
29
30        if layer.is_empty() {
31            self.0.remove(&layer_n);
32        }
33    }
34}
35
36impl Deref for Layers {
37    type Target = FxHashMap<i16, Vec<NodeId>>;
38
39    fn deref(&self) -> &Self::Target {
40        &self.0
41    }
42}
43
44impl DerefMut for Layers {
45    fn deref_mut(&mut self) -> &mut Self::Target {
46        &mut self.0
47    }
48}