diff --git a/implementations/rust/preserves/src/value/repr.rs b/implementations/rust/preserves/src/value/repr.rs index ddf44be..b49a57c 100644 --- a/implementations/rust/preserves/src/value/repr.rs +++ b/implementations/rust/preserves/src/value/repr.rs @@ -51,6 +51,17 @@ pub trait NestedValue: Sized + Debug + Clone + Eq + Hash + Ord { { Ok(M::wrap(self.annotations().copy_via(f)?, self.value().copy_via(f)?)) } + + fn foreach_embedded(&self, f: &mut F) -> Result<(), Err> + where + F: FnMut(&D) -> Result<(), Err> + { + match &self.annotations().0 { + None => (), + Some(vs) => for v in vs { v.foreach_embedded(f)? }, + } + self.value().foreach_embedded(f) + } } /// The `Value`s from the specification. @@ -796,6 +807,29 @@ impl, D: Embeddable> Value { Value::Embedded(d) => f(d)?, }) } + + pub fn foreach_embedded(&self, f: &mut F) -> Result<(), Err> + where + F: FnMut(&D) -> Result<(), Err> + { + match self { + Value::Boolean(_) | + Value::Float(_) | + Value::Double(_) | + Value::SignedInteger(_) | + Value::String(_) | + Value::ByteString(_) | + Value::Symbol(_) => Ok(()), + Value::Record(r) => Ok(for v in r.fields_vec() { v.foreach_embedded(f)? }), + Value::Sequence(vs) => Ok(for v in vs { v.foreach_embedded(f)? }), + Value::Set(vs) => Ok(for v in vs { v.foreach_embedded(f)? }), + Value::Dictionary(d) => Ok(for (k, v) in d { + k.foreach_embedded(f)?; + v.foreach_embedded(f)?; + }), + Value::Embedded(d) => f(d), + } + } } impl, D: Embeddable> Index for Value {