satisfy :: (Char -> Bool) -> Parser Char
satisfy p = do failOnEOF; c <- peek
               if p c then item else fail "Predicate not satisfied"
satisfy :: (Char -> Bool) -> Parser Char
satisfy p = do failOnEOF; c <- peek
               if p c then item else fail "Predicate not satisfied"
satisfy p = do failOnEOF; c <- peek
               if p c then item else fail "Predicate not satisfied"