foreach_embedded

This commit is contained in:
Tony Garnock-Jones 2021-07-05 16:09:31 +02:00
parent e9b5b3549c
commit 7c8a5c61ca
1 changed files with 34 additions and 0 deletions

View File

@ -51,6 +51,17 @@ pub trait NestedValue<D: Embeddable>: Sized + Debug + Clone + Eq + Hash + Ord {
{
Ok(M::wrap(self.annotations().copy_via(f)?, self.value().copy_via(f)?))
}
fn foreach_embedded<F, Err>(&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<N: NestedValue<D>, D: Embeddable> Value<N, D> {
Value::Embedded(d) => f(d)?,
})
}
pub fn foreach_embedded<F, Err>(&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<N: NestedValue<D>, D: Embeddable> Index<usize> for Value<N, D> {