transduce: Zero-Copy Isomorphic Parsing
Your code should look like what it parses.
See this example from lib.rs:
let parser = exact >> verbatim << exact;
let input = b"(*)";
assert_eq!;
// Or, equivalently:
assert_eq!;
This does exactly what it looks like it does.
Equivalently,
assert_eq!
Pretty-printed errors
The parse method automatically locates the error (even for user-defined parsers) and prints out gorgeous, colored Rust-style errors:
.parse_or_panic;
...| Error while parsing:
1 | ???
| ^ Unparsed input remains after parsing what should have been everything
.parse_or_panic;
...| Error while parsing:
1 | ???
| ^ Reached end of input but expected an item
.parse_or_panic
...| Error while parsing:
1 | ???
| ^ Expected 33 but found 63
Thanks
Huge shoutout to UPenn's CIS 194 and Haskell's higher-order parsing libraries I learned in 194.
Future improvements
Removing boxed closures once this feature is stabilized.
Already works with the feature-gate enabled: just enable the nightly feature on this crate.
I haven't benchmarked yet, but when the name of a type fills almost the entire screen and encodes a needless abstraction with runtime cost, it's gotta go on moral principle.