Combinators implemented using Rust macros.
Probably a better way to do this is using functions and generics