1#![allow(dead_code)]
2pub mod pair;
3pub mod id_map;
4pub mod deser;
5
6pub use id_map::*;
7pub use pair::*;
8
9use std::ops::{Deref, DerefMut};
10use field_collex::{Collexetable, FieldCollex, FieldValue};
11use field_collex::collex::*;
12use span_core::Span;
13
14pub(crate) fn insert<K,E,V>(id_map: &mut IdMap<K,V>, elem: E) -> Pair<K,E>
15where
16 K: Id,
17 E: Collexetable<V>,
18 V: FieldValue,
19{
20 Pair(
21 id_map.insert(elem.collexate()),
22 elem
23 )
24}
25
26pub(crate) fn extend_from_vec<K,E,V>(id_map: &mut IdMap<K,V>, vec: Vec<E>) -> Vec<Pair<K,E>>
27where
28 K: Id,
29 E: Collexetable<V>,
30 V: FieldValue,
31{
32 let mut other: Vec<Pair<K,E>> = Vec::new();
33 vec.into_iter().for_each(|e|
34 {
35 other.push(insert(id_map, e))
36 }
37 );
38
39 other
40}
41
42#[derive(Debug, Clone)]
43#[derive(serde::Serialize)]
44#[serde(transparent)]
45pub struct OrdIdMap<K,O,T>
46where
47 K: Id,
48 O: Collexetable<T>,
49 T: FieldValue,
50{
51 #[serde(skip)]
52 pub id_map: IdMap<K,T>,
53 pub collex: FieldCollex<Pair<K,O>,T>
54}
55
56impl<K,E,V> Deref for OrdIdMap<K,E,V>
57where
58 K: Id,
59 E: Collexetable<V>,
60 V: FieldValue,
61{
62 type Target = FieldCollex<Pair<K,E>,V>;
63 fn deref(&self) -> &Self::Target {
64 &self.collex
65 }
66}
67
68impl<K,E,V> DerefMut for OrdIdMap<K,E,V>
69where
70 K: Id,
71 E: Collexetable<V>,
72 V: FieldValue,
73{
74 fn deref_mut(&mut self) -> &mut Self::Target {
75 &mut self.collex
76 }
77}
78
79
80impl<K, E, V> OrdIdMap<K, E, V>
81where
82 K: Id,
83 E: Collexetable<V>,
84 V: FieldValue,
85{
86 pub fn new(span: Span<V>, unit: V) -> Result<Self, NewFieldCollexError<V>> {
87 Ok(Self{
88 id_map: IdMap::with_id(),
89 collex: FieldCollex::new(span, unit)?,
90 })
91 }
92
93 pub fn with_capacity(
94 span: Span<V>,
95 unit: V,
96 capacity: usize,
97 ) -> Result<Self, WithCapacityFieldCollexError<V>>
98 {
99 Ok(Self{
100 id_map: IdMap::with_id_capacity(capacity),
101 collex: FieldCollex::with_capacity(span, unit, capacity)?,
102 })
103 }
104
105 pub fn with_elements(
106 span: Span<V>,
107 unit: V,
108 vec: Vec<E>,
109 ) -> Result<Self, WithElementsFieldCollexError<V>>
110 {
111 let mut id_map = IdMap::with_id();
112 let other = extend_from_vec(&mut id_map, vec);
113
114 Ok(Self{
115 id_map,
116 collex: FieldCollex::with_elements(span, unit, other)?,
117 })
118 }
119
120 pub fn extend(&mut self, vec: Vec<E>) {
121 let other = extend_from_vec(&mut self.id_map, vec);
122 self.collex.extend(other)
123 }
124
125 pub fn try_extend(&mut self, vec: Vec<E>) -> TryExtendResult<Pair<K, E>> {
126 let other = extend_from_vec(&mut self.id_map, vec);
127 self.collex.try_extend(other)
128 }
129
130 pub fn insert(&mut self, elem: E) -> Result<K, InsertFieldCollexError<E>> {
131 use InsertFieldCollexError::*;
132 let obj = insert(&mut self.id_map, elem);
133 let id = obj.0;
134 self.collex.insert(obj)
135 .map(|_| id)
136 .map_err(|err|
137 {
138 self.id_map.remove(id);
139 match err {
140 OutOfSpan(o) => { OutOfSpan(o.1) }
141 AlreadyExist(o) => { AlreadyExist(o.1) }
142 }
143 }
144 )
145 }
146
147 pub fn remove(&mut self, id: K) -> Option<E> {
148 let v = self.id_map.remove(id)?;
149
150 Some(self.collex
151 .remove(v)
152 .unwrap()
153 .1)
154 }
155
156 pub fn modify<F,R>(&mut self, id: K, f: F) -> Result<R, ModifyFieldCollexError<(R,E)>>
157 where
158 F: Fn(&mut E) -> R,
159 {
160 use ModifyFieldCollexError::*;
161 let v = self.id_map.get(id).ok_or(CannotFind)?;
162 let (r,new_v) =
163 self.collex
164 .modify(*v,|e| (f(e),e.collexate()) )
165 .map_err(|err|
166 err.map(|e| (e.0.0, e.1.1))
167 )?;
168 *self.id_map.get_mut(id).unwrap() = new_v;
169 Ok(r)
170 }
171
172 pub fn try_modify<F,R>(&mut self, id: K, f: F) -> Result<R, ModifyFieldCollexError<R>>
173 where
174 F: Fn(&mut E) -> R,
175 {
176 use ModifyFieldCollexError::*;
177 let v = self.id_map.get(id).ok_or(CannotFind)?;
178 let (r,new_v) =
179 self.collex
180 .try_modify(*v, |e| (f(e),e.collexate()) )
181 .map_err(|err|
182 err.map(|e| e.0)
183 )?;
184 *self.id_map.get_mut(id).unwrap() = new_v;
185 Ok(r)
186 }
187
188 pub fn get_with_id(&self, id: K) -> Option<&E> {
189 let v = self.id_map.get(id)?;
190 self.collex.get(*v).map(|v| &v.1)
191 }
192
193 pub fn into_raw_parts(self) -> (IdMap<K,V>, FieldCollex<Pair<K,E>,V>) {
194 (self.id_map,self.collex)
195 }
196
197 pub fn from_raw_parts(id_map: IdMap<K,V>, collex: FieldCollex<Pair<K,E>,V>) -> Self {
198 Self {
199 id_map, collex
200 }
201 }
202}
203
204