diff options
Diffstat (limited to 'dhall_core/src/text.rs')
-rw-r--r-- | dhall_core/src/text.rs | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/dhall_core/src/text.rs b/dhall_core/src/text.rs index 9500f32..7c0e2b4 100644 --- a/dhall_core/src/text.rs +++ b/dhall_core/src/text.rs @@ -34,18 +34,28 @@ pub enum InterpolatedTextContents<SubExpr> { } impl<SubExpr> InterpolatedText<SubExpr> { - pub fn map<SubExpr2, F>(self, mut f: F) -> InterpolatedText<SubExpr2> + pub fn traverse<SubExpr2, E, F>( + self, + mut f: F, + ) -> Result<InterpolatedText<SubExpr2>, E> where - F: FnMut(SubExpr) -> SubExpr2, + F: FnMut(SubExpr) -> Result<SubExpr2, E>, { - InterpolatedText { + Ok(InterpolatedText { head: self.head.clone(), tail: self .tail .into_iter() - .map(|(e, s)| (f(e), s.clone())) - .collect(), - } + .map(|(e, s)| Ok((f(e)?, s.clone()))) + .collect::<Result<_, _>>()?, + }) + } + + pub fn map<SubExpr2, F>(self, mut f: F) -> InterpolatedText<SubExpr2> + where + F: FnMut(SubExpr) -> SubExpr2, + { + crate::trivial_result(self.traverse(|e| Ok(f(e)))) } pub fn as_ref(&self) -> InterpolatedText<&SubExpr> { |