I have attached the currenty version of ByteStringParser. Note that unlike parsec, it is fully backtracking -- you do *not* need to put 'try' everywhere you want backtracking. This might be considered a bug -- but for non-lazy bytestrings, there is almost no additional overhead.
The most interesting combinator is pTakeWhile -- because it returns a substring of the original string. The substring points to the same data as the original string -- so there are no data copies involved.
Unfortunately, pTakeWhile is only useful if you are taking a string that can be matched by a predicate that looks at one character at a time (like takeWhile).
The next thing to do is to figure out how to create some combinators that allow you to do more complicated matches but still retain the zero-copy behaviour. For example, something like pTakeWhile that takes a regular expression instead of a boolean test. This shouldn't be to hard -- I just didn't need anything that fancy for what I was doing :)