1use crate::{operation::AtomicOperation, traits::*};
4
5use std::collections::HashMap;
6
7pub struct Nested<T: EsEntity> {
8 entities: HashMap<<<T as EsEntity>::Event as EsEvent>::EntityId, T>,
9 new_entities: Vec<<T as EsEntity>::New>,
10}
11
12impl<T: EsEntity> Default for Nested<T> {
13 fn default() -> Self {
14 Self {
15 entities: HashMap::new(),
16 new_entities: Vec::new(),
17 }
18 }
19}
20
21impl<T: EsEntity> Nested<T> {
22 pub fn add_new(&mut self, new: <T as EsEntity>::New) -> &<T as EsEntity>::New {
23 let len = self.new_entities.len();
24 self.new_entities.push(new);
25 &self.new_entities[len]
26 }
27
28 pub fn len_new(&self) -> usize {
29 self.new_entities.len()
30 }
31
32 pub fn find_new<P>(&self, predicate: P) -> Option<&<T as EsEntity>::New>
33 where
34 P: FnMut(&&<T as EsEntity>::New) -> bool,
35 {
36 self.new_entities.iter().find(predicate)
37 }
38
39 pub fn find_map_new<B, F>(&self, f: F) -> Option<B>
40 where
41 F: FnMut(&<T as EsEntity>::New) -> Option<B>,
42 {
43 self.new_entities.iter().find_map(f)
44 }
45
46 pub fn new_entities_mut(&mut self) -> &mut Vec<<T as EsEntity>::New> {
47 &mut self.new_entities
48 }
49
50 pub fn get_persisted(&self, id: &<<T as EsEntity>::Event as EsEvent>::EntityId) -> Option<&T> {
51 self.entities.get(id)
52 }
53
54 pub fn get_persisted_mut(
55 &mut self,
56 id: &<<T as EsEntity>::Event as EsEvent>::EntityId,
57 ) -> Option<&mut T> {
58 self.entities.get_mut(id)
59 }
60
61 pub fn find_persisted<P>(&self, predicate: P) -> Option<&T>
62 where
63 P: FnMut(&&T) -> bool,
64 {
65 self.entities.values().find(predicate)
66 }
67
68 pub fn find_map_persisted<B, F>(&self, f: F) -> Option<B>
69 where
70 F: FnMut(&T) -> Option<B>,
71 {
72 self.entities.values().find_map(f)
73 }
74
75 pub fn find_persisted_mut<P>(&mut self, predicate: P) -> Option<&mut T>
76 where
77 P: FnMut(&&mut T) -> bool,
78 {
79 self.entities.values_mut().find(predicate)
80 }
81
82 pub fn len_persisted(&self) -> usize {
83 self.entities.len()
84 }
85
86 pub fn iter_persisted(
87 &self,
88 ) -> std::collections::hash_map::Values<'_, <<T as EsEntity>::Event as EsEvent>::EntityId, T>
89 {
90 self.entities.values()
91 }
92
93 pub fn iter_persisted_mut(
94 &mut self,
95 ) -> std::collections::hash_map::ValuesMut<'_, <<T as EsEntity>::Event as EsEvent>::EntityId, T>
96 {
97 self.entities.values_mut()
98 }
99
100 pub fn load(&mut self, entities: impl IntoIterator<Item = T>) {
101 self.entities.extend(
102 entities
103 .into_iter()
104 .map(|entity| (entity.events().entity_id.clone(), entity)),
105 );
106 }
107}
108
109pub trait PopulateNested<ID>: EsRepo {
110 fn populate_in_op<OP, P>(
111 op: &mut OP,
112 lookup: std::collections::HashMap<ID, &mut P>,
113 ) -> impl Future<Output = Result<(), <Self as EsRepo>::Err>> + Send
114 where
115 OP: AtomicOperation,
116 P: Parent<<Self as EsRepo>::Entity>;
117}
118
119pub trait Parent<T: EsEntity>: Send {
123 fn new_children_mut(&mut self) -> &mut Vec<<T as EsEntity>::New>;
125 fn iter_persisted_children_mut(
127 &mut self,
128 ) -> std::collections::hash_map::ValuesMut<'_, <<T as EsEntity>::Event as EsEvent>::EntityId, T>;
129 fn inject_children(&mut self, entities: impl IntoIterator<Item = T>);
131}