diff --git a/01.workspace/heave/src/imp/catalog_for_each_mut.rs b/01.workspace/heave/src/imp/catalog_for_each_mut.rs new file mode 100644 index 0000000..e0eb48c --- /dev/null +++ b/01.workspace/heave/src/imp/catalog_for_each_mut.rs @@ -0,0 +1,23 @@ +use crate::*; + +impl Catalog { + pub fn for_each_mut(&self, predicate: F) -> Result<(), FailedTo> + where + T: EAV, + F: Fn(&mut T) -> (), + { + self.on_items(|items| { + for entity in items.values_mut() { + let original_item = + T::try_from(entity.clone()).map_err(|_| FailedTo::ConvertEntity)?; + let mut item = T::try_from(entity.clone()).map_err(|_| FailedTo::ConvertEntity)?; + predicate(&mut item); + if item != original_item { + *entity = T::try_into(item).map_err(|_| FailedTo::ConvertObject)?; + entity.state = EntityState::Updated; + } + } + Ok(()) + }) + } +} diff --git a/01.workspace/heave/src/imp/mod.rs b/01.workspace/heave/src/imp/mod.rs index 9c43247..b3bf8bf 100644 --- a/01.workspace/heave/src/imp/mod.rs +++ b/01.workspace/heave/src/imp/mod.rs @@ -2,6 +2,7 @@ pub mod bool_try_from_value; pub mod catalog_contains_key; pub mod catalog_delete; pub mod catalog_for_each; +pub mod catalog_for_each_mut; pub mod catalog_get; pub mod catalog_get_by; pub mod catalog_init;