Some combinators could be expressed in terms of others
E.g. h_whitespace(p)
could obviously be defined as h_sequence(h_many(wschar), p)
wrapped in an appropriate action, saving a lot of code. I suspect there are other examples.
Is there a particular reason for eschewing such layering or should there be a refactoring pass across the API at some point?