1
Fork 0
mirror of https://github.com/RGBCube/cstree synced 2025-07-27 09:07:44 +00:00

add SyntaxText::fold_chunks #33

This commit is contained in:
Domenic Quirl 2022-02-20 09:34:41 +01:00
parent f9cae1fa5e
commit 2b084c6f82

View file

@ -156,6 +156,8 @@ impl<'n, 'i, I: Resolver + ?Sized, L: Language, D> SyntaxText<'n, 'i, I, L, D> {
/// If `f` returns `Err`, the error is propagated immediately. /// If `f` returns `Err`, the error is propagated immediately.
/// Otherwise, the result of the current call to `f` will be passed to the invocation of `f` on /// Otherwise, the result of the current call to `f` will be passed to the invocation of `f` on
/// the next token, producing a final value if `f` succeeds on all chunks. /// the next token, producing a final value if `f` succeeds on all chunks.
///
/// See also [`fold_chunks`](SyntaxText::fold_chunks) for folds that always succeed.
pub fn try_fold_chunks<T, F, E>(&self, init: T, mut f: F) -> Result<T, E> pub fn try_fold_chunks<T, F, E>(&self, init: T, mut f: F) -> Result<T, E>
where where
F: FnMut(T, &str) -> Result<T, E>, F: FnMut(T, &str) -> Result<T, E>,
@ -165,6 +167,25 @@ impl<'n, 'i, I: Resolver + ?Sized, L: Language, D> SyntaxText<'n, 'i, I, L, D> {
}) })
} }
/// Applies the given function to all text chunks (from [`SyntaxToken`]s) that are part of this
/// text, starting from the initial value `init`.
///
/// The result of the current call to `f` will be passed to the invocation of `f` on the next
/// token, producing a final value after `f` was called on all chunks.
///
/// See also [`try_fold_chunks`](SyntaxText::try_fold_chunks), which performs the same operation
/// for fallible functions `f`.
pub fn fold_chunks<T, F>(&self, init: T, mut f: F) -> T
where
F: FnMut(T, &str) -> T,
{
enum Void {}
match self.try_fold_chunks(init, |acc, chunk| Ok::<T, Void>(f(acc, chunk))) {
Ok(t) => t,
Err(void) => match void {},
}
}
/// Applies the given function to all text chunks that this text is comprised of, in order, /// Applies the given function to all text chunks that this text is comprised of, in order,
/// as long as `f` completes successfully. /// as long as `f` completes successfully.
/// ///