UNPKG

football-scoreboard

Version:

A live football World Cup scoreboard library.

164 lines (114 loc) 5.36 kB
# Live Football World Cup Scoreboard Welcome to the **Live Football World Cup Scoreboard** library! This library allows you to track ongoing football matches, update scores, finish matches, and get a summary of all matches in progress, ordered according to specific criteria. ## Table of Contents - [Features](#features) - [Installation](#installation) - [Usage](#usage) - [Starting a Match](#starting-a-match) - [Updating a Score](#updating-a-score) - [Finishing a Match](#finishing-a-match) - [Getting the Summary](#getting-the-summary) - [Running Tests](#running-tests) - [Assumptions](#assumptions) - [Design Decisions](#design-decisions) - [Project Structure](#project-structure) - [Dependencies](#dependencies) - [Contributing](#contributing) - [License](#license) ## Features - **Start a New Match**: Begin tracking a new football match with specified home and away teams. - **Update Scores**: Update the scores of an ongoing match with absolute values. - **Finish Matches**: Conclude an ongoing match, removing it from the scoreboard. - **Get Summary**: Retrieve a summary of all matches in progress, ordered by total score and recency. ## Installation You can install the package from npm: ```bash npm install football-scoreboard ``` Ensure you have [Node.js](https://nodejs.org/en/) installed on your system. Clone the repository and install the dependencies: ```bash git clone https://github.com/yourusername/scoreboard.git cd scoreboard npm install ``` ## Usage This library is designed to be simple and straightforward to use in any Node.js project. ### Starting a Match To start tracking a new match: ```typescript import { Scoreboard } from './src/scoreboard'; const scoreboard = new Scoreboard(); scoreboard.startMatch('Mexico', 'Canada'); ``` ### Updating a Score To update the score of an ongoing match: ```typescript scoreboard.updateScore('Mexico', 'Canada', 0, 5); ``` The scores are absolute and correspond to the home and away teams, respectively. ### Finishing a Match To finish a match and remove it from the scoreboard: ```typescript scoreboard.finishMatch('Mexico', 'Canada'); ``` ### Getting the Summary To get a summary of all matches in progress: ```typescript const summary = scoreboard.getSummary(); console.log(summary); ``` The summary will list matches ordered by their total score (descending). Matches with the same total score are ordered by the most recently started match. **Example Output:** ``` 1. Uruguay 6 - Italy 6 2. Spain 10 - Brazil 2 3. Mexico 0 - Canada 5 4. Argentina 3 - Australia 1 5. Germany 2 - France 2 ``` ## Running Tests The project uses [Vitest](https://vitest.dev/) for testing. To run the test suite: ```bash npm run test ``` Ensure all tests pass before using the library in production. ## Assumptions - **Unique Team Names**: Each team is uniquely identified by its name. Duplicate team names are not allowed. - **Case Insensitivity**: Team names are case-insensitive and trimmed of leading/trailing whitespace. - **Team Participation**: A team cannot participate in more than one match simultaneously. - **Valid Scores**: Scores are non-negative integers. - **Team Order**: When updating scores or finishing matches, team names must be provided in the same order as when the match was started (home team first, away team second). ## Design Decisions - **In-Memory Data Structures**: Used `Map`, `Array`, and `Set` to store matches, sorted matches, and active teams for efficient data management. - **Normalization of Team Names**: Team names are normalized (trimmed and converted to lowercase) to ensure consistency in comparisons. - **Order-Independent Match Key**: The match key is generated based on normalized team names to prevent duplicate matches and ensure consistency. - **Binary Search for Insertion**: A binary search algorithm (`findInsertionIndex`) is used to efficiently insert matches into the sorted array based on total score and start time. - **Error Handling**: Clear and descriptive error messages are provided for invalid operations, enhancing usability and debugging. ## Project Structure ``` ├── src │ ├── constants.ts // Error messages and constants │ ├── match.ts // Match class definition │ ├── scoreboard.ts // Scoreboard class definition ├── tests │ ├── match.test.ts // Tests for Match class │ ├── scoreboard.test.ts // Tests for Scoreboard class ├── package.json // Project configuration and scripts ├── tsconfig.json // TypeScript configuration └── README.md // Project documentation ``` ## Dependencies - **Node.js**: Runtime environment for executing JavaScript code. - **TypeScript**: For static type checking and improved code quality. - **Vitest**: A fast unit test framework for running tests. ## Contributing Contributions are welcome! Please follow these steps: 1. Fork the repository. 2. Create a new branch with a descriptive name. 3. Make your changes, ensuring code quality and passing tests. 4. Submit a pull request with a detailed description of your changes. ## License This project is licensed under the ISC License. --- **Note**: This library is a simplified implementation intended for educational purposes and may not cover all real-world scenarios.