A fast little combinational parsing library
```rust use neure::*;
pub fn main() -> Result<(), Box
ctx.try_cap(0, digit)?;
assert_eq!(ctx.spans(0), Some(&vec![Span { beg: 0, len: 4 }]));
Ok(())
} ```
regex
```rust use ::regex::Regex; use neure::*;
threadlocal! { static REGEX: Regex = Regex::new(r"^([a-z0-9.+-]+)@([\da-z.-]+).([a-z.]{2,6})$").unwrap(); }
pub fn main() -> Result<(), Box
let test_cases = [
"plainaddress",
"#@%^%#$@#$@#.com",
"@example.com",
"joe smith <email@example.com>",
"”(),:;<>[ ]@example.com",
"much.”more unusual”@example.com",
"very.unusual.”@”.unusual.com@example.com",
"email@example.com",
"firstname.lastname@example.com",
"email@subdomain.example.com",
];
// Size = 100000, Cost time 0.068436 with test 100000 times: 0.0000006843599999999999 --> 300000
measure(100000, 100000, || {
let mut count = 0;
test_cases.iter().for_each(|test| {
ctx.reset_with(*test);
parser(&mut ctx).is_ok().then(|| count += 1);
});
count
});
// Size = 100000, Cost time 0.1784131 with test 100000 times: 0.000001784131 --> 300000
measure(100000, 100000, || {
let mut count = 0;
test_cases.iter().for_each(|test| {
REGEX
.try_with(|regex| {
regex.captures(test).is_some().then(|| count += 1);
})
.unwrap();
});
count
});
Ok(())
}
pub fn measure(n: usize, size: usize, mut f: impl FnMut() -> i32) { use std::time::Instant;
let start = Instant::now();
let mut sum = 0;
for _ in 0..n {
sum += f();
}
let time = start.elapsed();
println!(
"Size = {size}, Cost time {} with test {} times: {} --> {}",
time.as_secs_f64(),
n,
time.as_secs_f64() / n as f64,
sum,
);
} ```
MPL-2.0