Skip to main content

open_timeline_core/reduced/
entities.rs

1// SPDX-License-Identifier: MIT
2
3//!
4//! Collection of reduced entities
5//!
6
7use crate::{IsReducedCollection, IsReducedType, Name, OpenTimelineId, ReducedEntity};
8use serde::{Deserialize, Serialize};
9use std::collections::BTreeSet;
10
11/// Container for a set of [`ReducedEntity`]s
12#[rustfmt::skip]
13#[derive(derive_more::IntoIterator, Serialize, Deserialize, Default, PartialEq, Eq, Debug, Clone, PartialOrd, Ord, Hash)]
14#[into_iterator(owned, ref, ref_mut)]
15pub struct ReducedEntities(BTreeSet<ReducedEntity>);
16
17impl IsReducedCollection for ReducedEntities {
18    type Item = ReducedEntity;
19
20    fn collection(&self) -> &BTreeSet<<Self as IsReducedCollection>::Item> {
21        &self.0
22    }
23
24    fn collection_mut(&mut self) -> &mut BTreeSet<<Self as IsReducedCollection>::Item> {
25        &mut self.0
26    }
27}
28
29// TODO: these are nearly the same as those for ReducedTimelines
30impl FromIterator<ReducedEntity> for ReducedEntities {
31    fn from_iter<T: IntoIterator<Item = ReducedEntity>>(iter: T) -> Self {
32        ReducedEntities(iter.into_iter().collect())
33    }
34}
35
36impl ReducedEntities {
37    /// Create a new `ReducedEntities`
38    pub fn new() -> Self {
39        ReducedEntities(BTreeSet::new())
40    }
41
42    pub fn ordered_by_name(&self) -> Vec<ReducedEntity> {
43        let mut sorted: Vec<_> = self.0.clone().into_iter().collect();
44        sorted.sort_by(|a, b| a.name().as_str().cmp(b.name().as_str()));
45        sorted
46    }
47
48    pub fn ordered_by_id(&self) -> Vec<ReducedEntity> {
49        let mut sorted: Vec<_> = self.0.clone().into_iter().collect();
50        sorted.sort_by_key(|a| a.id());
51        sorted
52    }
53
54    pub fn ids(&self) -> BTreeSet<OpenTimelineId> {
55        self.0.clone().into_iter().map(|e| e.id()).collect()
56    }
57
58    pub fn names(&self) -> BTreeSet<Name> {
59        self.0
60            .clone()
61            .into_iter()
62            .map(|e| e.name().to_owned())
63            .collect()
64    }
65}