satisfyMany :: (Char -> Bool) -> Parser String
satisfyMany p = do e <- eof
                   if e then return []
                     else do c <- peek
                             if not $ p c then return []
                               else compose
  where compose = do d <- item; r <- satisfyMany p; return $ d:r
satisfyMany :: (Char -> Bool) -> Parser String
satisfyMany p = do e <- eof
                   if e then return []
                     else do c <- peek
                             if not $ p c then return []
                               else compose
  where compose = do d <- item; r <- satisfyMany p; return $ d:r
satisfyMany p = do e <- eof
                   if e then return []
                     else do c <- peek
                             if not $ p c then return []
                               else compose
  where compose = do d <- item; r <- satisfyMany p; return $ d:r