destructure

This commit is contained in:
Aiden McClelland
2025-08-27 10:46:47 -06:00
parent d2f38ef5f7
commit 5b23a1eac6
3 changed files with 75 additions and 4 deletions

View File

@@ -15,7 +15,7 @@ mod subscriber;
mod test;
pub use imbl_value::Value;
pub use model::{HasModel, Model, ModelExt};
pub use model::{DestructureMut, HasModel, Model, ModelExt};
pub use patch::{DiffPatch, Dump, Revision};
pub use patch_db_macro::HasModel;
pub use store::{MutateResult, PatchDb, Store, TypedPatchDb};

View File

@@ -1,4 +1,4 @@
use imbl_value::Value;
use imbl_value::{InternedString, Value};
pub trait HasModel: Sized {
type Model: Model<Self>;
@@ -78,9 +78,24 @@ pub trait ModelExt<T>: Model<T> {
) -> &'a mut Self::Model<U> {
Self::Model::<U>::value_as_mut(f(<Self as sealed::ModelMarker>::as_value_mut(self)))
}
fn children_mut<'a>(
&'a mut self,
) -> impl IntoIterator<Item = (&'a InternedString, &'a mut Value)> + Send + Sync {
ModelExt::<T>::as_value_mut(self)
.as_object_mut()
.into_iter()
.flat_map(|o| o.iter_mut().map(|(k, v)| (&*k, v)))
}
}
impl<T, M: Model<T>> ModelExt<T> for M {}
pub trait DestructureMut {
type Destructured<'a>
where
Self: 'a;
fn destructure_mut<'a>(&'a mut self) -> Self::Destructured<'a>;
}
#[cfg(test)]
mod test {
use std::marker::PhantomData;