parseCPV :: Atto.Parser CPV
parseCPV = do
  _                              <- Atto.string "./"
  category                       <- Atto.takeWhile (/= '/')
  _                              <- Atto.char '/'
  -- TODO: this should be greedy
  package                        <- Atto.takeWhile (/= '-')
  _                              <- Atto.char '-'
  version                        <- Atto.takeByteString

  return $ CPV category package version
parseCPV :: Atto.Parser CPV
parseCPV = do
  _                              <- Atto.string "./"
  category                       <- Atto.takeWhile (/= '/')
  _                              <- Atto.char '/'
  -- TODO: this should be greedy
  package                        <- Atto.takeWhile (/= '-')
  _                              <- Atto.char '-'
  version                        <- Atto.takeByteString

  return $ CPV category package version
parseCPV = do
  _                              <- Atto.string "./"
  category                       <- Atto.takeWhile (/= '/')
  _                              <- Atto.char '/'
  -- TODO: this should be greedy
  package                        <- Atto.takeWhile (/= '-')
  _                              <- Atto.char '-'
  version                        <- Atto.takeByteString

  return $ CPV category package version