feat: add from_fn and from_fn_with_ctx

This commit is contained in:
PoiScript 2024-03-26 17:17:25 +08:00
parent 42c47fa5b6
commit e12e89d401
No known key found for this signature in database
GPG key ID: 22C2B1249D99985E
3 changed files with 85 additions and 27 deletions

View file

@ -6,4 +6,4 @@ mod traverse;
pub use event::{Container, Event};
pub use html::{HtmlEscape, HtmlExport};
pub use traverse::{TraversalContext, Traverser};
pub use traverse::{from_fn, from_fn_with_ctx, FromFn, FromFnWithCtx, TraversalContext, Traverser};

View file

@ -223,3 +223,64 @@ pub trait Traverser {
};
}
}
pub struct FromFn<F: FnMut(Event)>(F);
impl<F: FnMut(Event)> Traverser for FromFn<F> {
fn event(&mut self, event: Event, _: &mut TraversalContext) {
(self.0)(event)
}
}
pub struct FromFnWithCtx<F: FnMut(Event, &mut TraversalContext)>(F);
impl<F: FnMut(Event, &mut TraversalContext)> Traverser for FromFnWithCtx<F> {
fn event(&mut self, event: Event, ctx: &mut TraversalContext) {
(self.0)(event, ctx)
}
}
/// A helper for creating traverser
///
/// ```rust
/// use orgize::{
/// export::{from_fn, Container, Event, Traverser},
/// Org,
/// };
///
/// let mut count = 0;
/// let mut handler = from_fn(|event| {
/// if matches!(event, Event::Enter(Container::Headline(_))) {
/// count += 1;
/// }
/// });
/// Org::parse("* 1\n** 2\n*** 3\n****4").traverse(&mut handler);
/// assert_eq!(count, 3);
/// ```
pub fn from_fn<F: FnMut(Event)>(f: F) -> FromFn<F> {
FromFn(f)
}
/// A helper for creating traverser
///
/// ```rust
/// use orgize::{
/// export::{from_fn_with_ctx, Container, Event, Traverser},
/// Org,
/// };
///
/// let mut count = 0;
/// let mut handler = from_fn_with_ctx(|event, ctx| {
/// if let Event::Enter(Container::Headline(hdl)) = event {
/// count += 1;
/// if &hdl.title_raw() == "cow" {
/// ctx.stop();
/// }
/// }
/// });
/// Org::parse("* 1\n* cow\n* 3").traverse(&mut handler);
/// assert_eq!(count, 2);
/// ```
pub fn from_fn_with_ctx<F: FnMut(Event, &mut TraversalContext)>(f: F) -> FromFnWithCtx<F> {
FromFnWithCtx(f)
}