diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 0967ef4..0000000 --- a/.eslintrc +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/README.md b/README.md index c2e1722..b555883 100644 --- a/README.md +++ b/README.md @@ -83,22 +83,19 @@ This repository is a **comprehensive collection** of TypeScript algorithms and d ### 🔍 Algorithms -#### 🔎 Search Algorithms - -- **[Binary Search](src/algorithms/search/binary-search/binary-search.ts)** - Efficient search in sorted arrays -- **[Linear Search](src/algorithms/search/linear-search/linear-search.ts)** - Simple sequential search - -#### 🔄 Sorting Algorithms - -- **[Quick Sort](src/algorithms/sort/quick/quick-sort.ts)** - Divide and conquer sorting algorithm -- **[Bubble Sort](src/algorithms/sort/bubble-sort/bubble-sort.ts)** - Simple comparison-based sort -- **[Bubble Sort Simple](src/algorithms/sort/bubble-sort/bubble-sort-simple.ts)** - Simplified bubble sort implementation +| Algorithm | Category | Description | Implementation | +| ---------------------- | -------- | ------------------------------------- | ------------------------------------------------------------------ | +| **Binary Search** | Search | Efficient search in sorted arrays | [View Code](src/algorithms/search/binary-search/binary-search.ts) | +| **Linear Search** | Search | Simple sequential search | [View Code](src/algorithms/search/linear-search/linear-search.ts) | +| **Quick Sort** | Sort | Divide and conquer sorting algorithm | [View Code](src/algorithms/sort/quick/quick-sort.ts) | +| **Bubble Sort** | Sort | Simple comparison-based sort | [View Code](src/algorithms/sort/bubble-sort/bubble-sort.ts) | +| **Bubble Sort Simple** | Sort | Simplified bubble sort implementation | [View Code](src/algorithms/sort/bubble-sort/bubble-sort-simple.ts) | ### 💻 Coding Challenges -#### 👉 Two Pointers - -- **[Pair Sum Sorted](src/code-challanges/two-pointers/pair-sum-sorted.ts)** - Find pairs in sorted array that sum to target +| Challenge | Category | Description | Implementation | +| ------------------- | ------------ | --------------------------------------------- | ---------------------------------------------------------------- | +| **Pair Sum Sorted** | Two Pointers | Find pairs in sorted array that sum to target | [View Code](src/code-challanges/two-pointers/pair-sum-sorted.ts) | ### 🛠️ Utilities diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..dcf177e --- /dev/null +++ b/biome.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.3.7/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": false, + "includes": [ + "**", + "!**/node_modules/**", + "!**/dist/**", + "!**/coverage/**", + "!**/*.config.js", + "!**/*.config.ts", + "!**/*.config.mts" + ] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2, + "lineEnding": "lf", + "lineWidth": 100 + }, + "assist": { "actions": { "source": { "organizeImports": "on" } } }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double", + "semicolons": "always", + "trailingCommas": "es5" + } + } +} diff --git a/package.json b/package.json index ca8b4f0..a80fc89 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,12 @@ "main": "dist/index.js", "scripts": { "build": "tsc", - "lint": "eslint ./src --ext .ts", - "prettier": "prettier \"**/*.+(json|ts)\"", - "format:check": "npm run prettier -- --check", - "format:fix": "npm run prettier -- --write", + "lint": "biome lint ./src", + "lint:fix": "biome lint --write ./src", + "format:check": "biome format --write=false ./src", + "format:fix": "biome format --write ./src", + "check": "biome check ./src", + "check:fix": "biome check --write ./src", "test": "jest" }, "keywords": [ @@ -22,8 +24,8 @@ "author": "Behzad Ali Mohammad Zad", "license": "MIT", "devDependencies": { + "@biomejs/biome": "^2.3.7", "@types/jest": "^30.0.0", - "eslint": "^9.39.1", "jest": "^30.2.0", "ts-jest": "^29.4.5", "typescript": "^5.9.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 73b4225..f0c1816 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,12 +5,12 @@ settings: excludeLinksFromLockfile: false devDependencies: + '@biomejs/biome': + specifier: ^2.3.7 + version: 2.3.7 '@types/jest': specifier: ^30.0.0 version: 30.0.0 - eslint: - specifier: ^9.39.1 - version: 9.39.1 jest: specifier: ^30.2.0 version: 30.2.0 @@ -342,128 +342,117 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@emnapi/core@1.7.1: - resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + /@biomejs/biome@2.3.7: + resolution: {integrity: sha512-CTbAS/jNAiUc6rcq94BrTB8z83O9+BsgWj2sBCQg9rD6Wkh2gjfR87usjx0Ncx0zGXP1NKgT7JNglay5Zfs9jw==} + engines: {node: '>=14.21.3'} + hasBin: true + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.3.7 + '@biomejs/cli-darwin-x64': 2.3.7 + '@biomejs/cli-linux-arm64': 2.3.7 + '@biomejs/cli-linux-arm64-musl': 2.3.7 + '@biomejs/cli-linux-x64': 2.3.7 + '@biomejs/cli-linux-x64-musl': 2.3.7 + '@biomejs/cli-win32-arm64': 2.3.7 + '@biomejs/cli-win32-x64': 2.3.7 + dev: true + + /@biomejs/cli-darwin-arm64@2.3.7: + resolution: {integrity: sha512-LirkamEwzIUULhXcf2D5b+NatXKeqhOwilM+5eRkbrnr6daKz9rsBL0kNZ16Hcy4b8RFq22SG4tcLwM+yx/wFA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] requiresBuild: true - dependencies: - '@emnapi/wasi-threads': 1.1.0 - tslib: 2.8.1 dev: true optional: true - /@emnapi/runtime@1.7.1: - resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + /@biomejs/cli-darwin-x64@2.3.7: + resolution: {integrity: sha512-Q4TO633kvrMQkKIV7wmf8HXwF0dhdTD9S458LGE24TYgBjSRbuhvio4D5eOQzirEYg6eqxfs53ga/rbdd8nBKg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] requiresBuild: true - dependencies: - tslib: 2.8.1 dev: true optional: true - /@emnapi/wasi-threads@1.1.0: - resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + /@biomejs/cli-linux-arm64-musl@2.3.7: + resolution: {integrity: sha512-/afy8lto4CB8scWfMdt+NoCZtatBUF62Tk3ilWH2w8ENd5spLhM77zKlFZEvsKJv9AFNHknMl03zO67CiklL2Q==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] requiresBuild: true - dependencies: - tslib: 2.8.1 dev: true optional: true - /@eslint-community/eslint-utils@4.9.0(eslint@9.39.1): - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 9.39.1 - eslint-visitor-keys: 3.4.3 + /@biomejs/cli-linux-arm64@2.3.7: + resolution: {integrity: sha512-inHOTdlstUBzgjDcx0ge71U4SVTbwAljmkfi3MC5WzsYCRhancqfeL+sa4Ke6v2ND53WIwCFD5hGsYExoI3EZQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@eslint-community/regexpp@4.12.2: - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + /@biomejs/cli-linux-x64-musl@2.3.7: + resolution: {integrity: sha512-CQUtgH1tIN6e5wiYSJqzSwJumHYolNtaj1dwZGCnZXm2PZU1jOJof9TsyiP3bXNDb+VOR7oo7ZvY01If0W3iFQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@eslint/config-array@0.21.1: - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - '@eslint/object-schema': 2.1.7 - debug: 4.4.3 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + /@biomejs/cli-linux-x64@2.3.7: + resolution: {integrity: sha512-fJMc3ZEuo/NaMYo5rvoWjdSS5/uVSW+HPRQujucpZqm2ZCq71b8MKJ9U4th9yrv2L5+5NjPF0nqqILCl8HY/fg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@eslint/config-helpers@0.4.2: - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - '@eslint/core': 0.17.0 + /@biomejs/cli-win32-arm64@2.3.7: + resolution: {integrity: sha512-aJAE8eCNyRpcfx2JJAtsPtISnELJ0H4xVVSwnxm13bzI8RwbXMyVtxy2r5DV1xT3WiSP+7LxORcApWw0LM8HiA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + requiresBuild: true dev: true + optional: true - /@eslint/core@0.17.0: - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - '@types/json-schema': 7.0.15 + /@biomejs/cli-win32-x64@2.3.7: + resolution: {integrity: sha512-pulzUshqv9Ed//MiE8MOUeeEkbkSHVDVY5Cz5wVAnH1DUqliCQG3j6s1POaITTFqFfo7AVIx2sWdKpx/GS+Nqw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + requiresBuild: true dev: true + optional: true - /@eslint/eslintrc@3.3.1: - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + /@emnapi/core@1.7.1: + resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + requiresBuild: true dependencies: - ajv: 6.12.6 - debug: 4.4.3 - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@eslint/js@9.39.1: - resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true - - /@eslint/object-schema@2.1.7: - resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 dev: true + optional: true - /@eslint/plugin-kit@0.4.1: - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + /@emnapi/runtime@1.7.1: + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + requiresBuild: true dependencies: - '@eslint/core': 0.17.0 - levn: 0.4.1 - dev: true - - /@humanfs/core@0.19.1: - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} + tslib: 2.8.1 dev: true + optional: true - /@humanfs/node@0.16.7: - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} - engines: {node: '>=18.18.0'} + /@emnapi/wasi-threads@1.1.0: + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + requiresBuild: true dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.4.3 - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true - - /@humanwhocodes/retry@0.4.3: - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} + tslib: 2.8.1 dev: true + optional: true /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -841,10 +830,6 @@ packages: '@babel/types': 7.28.5 dev: true - /@types/estree@1.0.8: - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - dev: true - /@types/istanbul-lib-coverage@2.0.6: resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} dev: true @@ -868,10 +853,6 @@ packages: pretty-format: 30.2.0 dev: true - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true - /@types/node@24.10.1: resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} dependencies: @@ -1050,29 +1031,6 @@ packages: dev: true optional: true - /acorn-jsx@5.3.2(acorn@8.15.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.15.0 - dev: true - - /acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - /ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -1121,10 +1079,6 @@ packages: sprintf-js: 1.0.3 dev: true - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - /babel-jest@30.2.0(@babel/core@7.28.5): resolution: {integrity: sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1363,10 +1317,6 @@ packages: optional: true dev: true - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -1414,116 +1364,12 @@ packages: engines: {node: '>=8'} dev: true - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - - /eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true - - /eslint@9.39.1: - resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) - '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.1 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.39.1 - '@eslint/plugin-kit': 0.4.1 - '@humanfs/node': 0.16.7 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3 - escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - transitivePeerDependencies: - - supports-color - dev: true - - /espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 4.2.1 - dev: true - /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true dev: true - /esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -1556,31 +1402,16 @@ packages: jest-util: 30.2.0 dev: true - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - /fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: bser: 2.1.1 dev: true - /file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - dependencies: - flat-cache: 4.0.1 - dev: true - /fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -1596,26 +1427,6 @@ packages: path-exists: 4.0.0 dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - dependencies: - flatted: 3.3.3 - keyv: 4.5.4 - dev: true - - /flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - dev: true - /foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -1656,13 +1467,6 @@ packages: engines: {node: '>=10'} dev: true - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - /glob@10.5.0: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} hasBin: true @@ -1687,11 +1491,6 @@ packages: path-is-absolute: 1.0.1 dev: true - /globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - dev: true - /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true @@ -1723,19 +1522,6 @@ packages: engines: {node: '>=10.17.0'} dev: true - /ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - dev: true - - /import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - /import-local@3.2.0: resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} @@ -1766,11 +1552,6 @@ packages: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -1781,13 +1562,6 @@ packages: engines: {node: '>=6'} dev: true - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -2281,60 +2055,27 @@ packages: esprima: 4.0.1 dev: true - /js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - /jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} hasBin: true dev: true - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true - /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true dev: true - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - dev: true - /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} dev: true - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true @@ -2346,21 +2087,10 @@ packages: p-locate: 4.1.0 dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - /lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - /lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} dev: true @@ -2478,18 +2208,6 @@ packages: mimic-fn: 2.1.0 dev: true - /optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - dev: true - /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -2511,13 +2229,6 @@ packages: p-limit: 2.3.0 dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -2527,13 +2238,6 @@ packages: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} dev: true - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -2593,11 +2297,6 @@ packages: find-up: 4.1.0 dev: true - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - /pretty-format@30.2.0: resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2607,11 +2306,6 @@ packages: react-is: 18.3.1 dev: true - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true - /pure-rand@7.0.1: resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} dev: true @@ -2632,11 +2326,6 @@ packages: resolve-from: 5.0.0 dev: true - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -2845,13 +2534,6 @@ packages: dev: true optional: true - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} @@ -2923,12 +2605,6 @@ packages: picocolors: 1.1.1 dev: true - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - dev: true - /v8-to-istanbul@9.3.0: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} @@ -2952,11 +2628,6 @@ packages: isexe: 2.0.0 dev: true - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - dev: true - /wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} dev: true diff --git a/src/algorithms/search/binary-search/binary-search.test.ts b/src/algorithms/search/binary-search/binary-search.test.ts index a4e088c..f3204db 100644 --- a/src/algorithms/search/binary-search/binary-search.test.ts +++ b/src/algorithms/search/binary-search/binary-search.test.ts @@ -36,4 +36,5 @@ describe("binarySearch", () => { expect(binarySearch(sortedArrayOfObjects, { key: 1, value: "" }, comparator)).toBe(0); expect(binarySearch(sortedArrayOfObjects, { key: 2, value: "" }, comparator)).toBe(1); expect(binarySearch(sortedArrayOfObjects, { key: 3, value: "" }, comparator)).toBe(2); - });}); + }); +}); diff --git a/src/algorithms/search/binary-search/binary-search.ts b/src/algorithms/search/binary-search/binary-search.ts index 93a02b7..a1ff4b7 100644 --- a/src/algorithms/search/binary-search/binary-search.ts +++ b/src/algorithms/search/binary-search/binary-search.ts @@ -1,4 +1,4 @@ -import { Comparator, ComparatorFunction } from "@/utils/comparator"; +import { Comparator, type ComparatorFunction } from "@/utils/comparator"; /** * Binary search is an efficient algorithm for finding an item from a sorted list of items. diff --git a/src/algorithms/search/linear-search/linear-search.ts b/src/algorithms/search/linear-search/linear-search.ts index 51633e1..cbc20b5 100644 --- a/src/algorithms/search/linear-search/linear-search.ts +++ b/src/algorithms/search/linear-search/linear-search.ts @@ -1,4 +1,4 @@ -import { Comparator, ComparatorFunction } from "@/utils/comparator"; +import { Comparator, type ComparatorFunction } from "@/utils/comparator"; /** * Linear search. diff --git a/src/algorithms/sort/bubble-sort/bubble-sort.ts b/src/algorithms/sort/bubble-sort/bubble-sort.ts index e04110d..b728d69 100644 --- a/src/algorithms/sort/bubble-sort/bubble-sort.ts +++ b/src/algorithms/sort/bubble-sort/bubble-sort.ts @@ -1,4 +1,4 @@ -import { Comparator, ComparatorFunction } from "@/utils"; +import { Comparator, type ComparatorFunction } from "@/utils"; /** * Sorts the given array using the bubble sort algorithm. diff --git a/src/algorithms/sort/quick/quick-sort.test.ts b/src/algorithms/sort/quick/quick-sort.test.ts index 6ea0df8..0547701 100644 --- a/src/algorithms/sort/quick/quick-sort.test.ts +++ b/src/algorithms/sort/quick/quick-sort.test.ts @@ -10,9 +10,7 @@ describe("quickSort", () => { }); it("sorts an array of numbers in ascending order", () => { - expect(quickSort([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5])).toEqual([ - 1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9, - ]); + expect(quickSort([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5])).toEqual([1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]); }); it("sorts an array of strings in alphabetical order", () => { @@ -26,8 +24,7 @@ describe("quickSort", () => { it("sorts an array of objects using a custom comparator", () => { const arr = [{ value: 3 }, { value: 1 }, { value: 4 }, { value: 2 }]; - const compareFn = (a: { value: number }, b: { value: number }) => - a.value - b.value; + const compareFn = (a: { value: number }, b: { value: number }) => a.value - b.value; expect(quickSort(arr, compareFn)).toEqual([ { value: 1 }, @@ -38,9 +35,7 @@ describe("quickSort", () => { }); it("sorts an array of negative numbers", () => { - expect(quickSort([-3, -1, -4, -1, -5, -9])).toEqual([ - -9, -5, -4, -3, -1, -1, - ]); + expect(quickSort([-3, -1, -4, -1, -5, -9])).toEqual([-9, -5, -4, -3, -1, -1]); }); it("sorts an array with a mix of positive and negative numbers", () => { diff --git a/src/algorithms/sort/quick/quick-sort.ts b/src/algorithms/sort/quick/quick-sort.ts index 97b02e2..e3b31c3 100644 --- a/src/algorithms/sort/quick/quick-sort.ts +++ b/src/algorithms/sort/quick/quick-sort.ts @@ -1,4 +1,4 @@ -import { Comparator, ComparatorFunction } from "@/utils"; +import { Comparator, type ComparatorFunction } from "@/utils"; /** * Sorts the given array using the quicksort algorithm. @@ -11,10 +11,7 @@ import { Comparator, ComparatorFunction } from "@/utils"; * @param compareFn - An optional comparison function to use for sorting. If not provided, the default comparison function will be used. * @returns The sorted array. */ -export function quickSort( - arr: Item[], - compareFn?: ComparatorFunction -): Item[] { +export function quickSort(arr: Item[], compareFn?: ComparatorFunction): Item[] { const comparator = new Comparator(compareFn); // Optimized version of QuickSort with in-place partitioning that maintains O(log n) space complexity. diff --git a/src/code-challanges/two-pointers/pair-sum-sorted.test.ts b/src/code-challanges/two-pointers/pair-sum-sorted.test.ts index a9ea3b4..573cd48 100644 --- a/src/code-challanges/two-pointers/pair-sum-sorted.test.ts +++ b/src/code-challanges/two-pointers/pair-sum-sorted.test.ts @@ -22,10 +22,7 @@ describe("pairSumSorted", () => { target: -5, expected: [0, 1], }, - ])( - "returns $expected for input $input and target $target", - ({ input, target, expected }) => { - expect(pairSumSorted(input, target)).toEqual(expected); - } - ); + ])("returns $expected for input $input and target $target", ({ input, target, expected }) => { + expect(pairSumSorted(input, target)).toEqual(expected); + }); }); diff --git a/src/data-structure/hash-table/hash-table.ts b/src/data-structure/hash-table/hash-table.ts index d3036e1..082347b 100644 --- a/src/data-structure/hash-table/hash-table.ts +++ b/src/data-structure/hash-table/hash-table.ts @@ -1,4 +1,4 @@ -import { Pair } from "@/types/pair"; +import type { Pair } from "@/types/pair"; import { Comparator } from "@/utils"; import { LinkedList } from "../linked-list/"; @@ -14,9 +14,7 @@ export class HashTable { constructor(size = 32) { // By default compares by value - const pairComparator = Comparator.comparing( - (pair: Pair) => pair.value - ); + const pairComparator = Comparator.comparing((pair: Pair) => pair.value); // Create hash table of certain size and fill each bucket with empty linked list. this.buckets = Array(size) .fill(null) @@ -124,15 +122,10 @@ export class HashTable { * @returns array of values. */ getValues(): Value[] { - return this.buckets.reduce( - (values: Value[], bucket: LinkedList>) => { - const bucketValues = bucket - .toArray() - .map((linkedListNode) => linkedListNode.value.value); - return values.concat(bucketValues as Value); - }, - [] - ); + return this.buckets.reduce((values: Value[], bucket: LinkedList>) => { + const bucketValues = bucket.toArray().map((linkedListNode) => linkedListNode.value.value); + return values.concat(bucketValues as Value); + }, []); } /** diff --git a/src/data-structure/heap/heap.ts b/src/data-structure/heap/heap.ts index c6a5fee..937629b 100644 --- a/src/data-structure/heap/heap.ts +++ b/src/data-structure/heap/heap.ts @@ -1,4 +1,4 @@ -import { Comparator, ComparatorFunction } from "@/utils"; +import { Comparator, type ComparatorFunction } from "@/utils"; /** * This class is a base class for Heap. diff --git a/src/data-structure/linked-list/linded-list.test.ts b/src/data-structure/linked-list/linded-list.test.ts index a5f9f2b..1ff45be 100644 --- a/src/data-structure/linked-list/linded-list.test.ts +++ b/src/data-structure/linked-list/linded-list.test.ts @@ -165,9 +165,7 @@ describe("LinkedList", () => { expect(node).toBeDefined(); expect(node?.value.value).toBe(2); expect(node?.value.key).toBe("test2"); - expect( - linkedList.find({ callback: (value) => value.key === "test5" }) - ).toBeNull(); + expect(linkedList.find({ callback: (value) => value.key === "test5" })).toBeNull(); }); it("finds node by means of custom compare function", () => { @@ -197,8 +195,7 @@ describe("LinkedList", () => { }); it("finds preferring callback over compare function", () => { - const greaterThan = (value: number, compareTo: number) => - value > compareTo ? 0 : 1; + const greaterThan = (value: number, compareTo: number) => (value > compareTo ? 0 : 1); const linkedList = new LinkedList(greaterThan); linkedList.fromArray([1, 2, 3, 4, 5]); diff --git a/src/data-structure/linked-list/linked-list-node.test.ts b/src/data-structure/linked-list/linked-list-node.test.ts index 1252413..63f6e2c 100644 --- a/src/data-structure/linked-list/linked-list-node.test.ts +++ b/src/data-structure/linked-list/linked-list-node.test.ts @@ -1,7 +1,7 @@ import { LinkedListNode } from "./linked-list-node"; type Item = { key: number; value: string }; -let item: Item = { key: 1, value: "test" }; +const item: Item = { key: 1, value: "test" }; describe("LinkedListNode", () => { it("creates list node with value", () => { @@ -39,8 +39,7 @@ describe("LinkedListNode", () => { it("converts node to string with custom stringifier", () => { const node = new LinkedListNode(item); - const toStringCallback = (item: Item) => - `value: ${item.value}, key: ${item.key}`; + const toStringCallback = (item: Item) => `value: ${item.value}, key: ${item.key}`; expect(node.toString(toStringCallback)).toBe("value: test, key: 1"); }); diff --git a/src/data-structure/linked-list/linked-list.ts b/src/data-structure/linked-list/linked-list.ts index e3d1995..251988c 100644 --- a/src/data-structure/linked-list/linked-list.ts +++ b/src/data-structure/linked-list/linked-list.ts @@ -1,4 +1,4 @@ -import { Comparator, ComparatorFunction } from "@/utils/comparator"; +import { Comparator, type ComparatorFunction } from "@/utils/comparator"; import { LinkedListNode } from "./linked-list-node"; /** @@ -201,7 +201,7 @@ export class LinkedList { let currentNode: LinkedListNode | null = this.head; while (currentNode) { // If callback is specified then try to find node by callback. - if (callback && callback(currentNode.value)) { + if (callback?.(currentNode.value)) { return currentNode; } @@ -224,7 +224,9 @@ export class LinkedList { * @returns LinkedList */ public fromArray(values: Item[]): LinkedList { - values.forEach((value) => this.append(value)); + for (const value of values) { + this.append(value); + } return this; } diff --git a/src/data-structure/priority-queue/max-priority-queue.test.ts b/src/data-structure/priority-queue/max-priority-queue.test.ts index aa8afb1..73a1943 100644 --- a/src/data-structure/priority-queue/max-priority-queue.test.ts +++ b/src/data-structure/priority-queue/max-priority-queue.test.ts @@ -1,6 +1,5 @@ import MaxPriorityQueue from "./max-priority-queue"; - describe("PriorityQueue", () => { it("creates default priority queue", () => { const priorityQueue = new MaxPriorityQueue(); diff --git a/src/data-structure/priority-queue/max-priority-queue.ts b/src/data-structure/priority-queue/max-priority-queue.ts index f16aa1f..6a8f357 100644 --- a/src/data-structure/priority-queue/max-priority-queue.ts +++ b/src/data-structure/priority-queue/max-priority-queue.ts @@ -29,11 +29,12 @@ export default class MaxPriorityQueue extends MaxHeap { * @returns - 0 | 1 | -1 */ private internalComparator(left: Item, right: Item): number { - if (this.queue.get(left) === this.queue.get(right)) { + const leftPriority = this.queue.get(left) ?? 0; + const rightPriority = this.queue.get(right) ?? 0; + if (leftPriority === rightPriority) { return 0; } - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return this.queue.get(left)! < this.queue.get(right)! ? -1 : 1; + return leftPriority < rightPriority ? -1 : 1; } /** diff --git a/src/data-structure/priority-queue/min-priority-queue.ts b/src/data-structure/priority-queue/min-priority-queue.ts index c19fd33..136809d 100644 --- a/src/data-structure/priority-queue/min-priority-queue.ts +++ b/src/data-structure/priority-queue/min-priority-queue.ts @@ -31,11 +31,12 @@ export default class MinPriorityQueue extends MinHeap { * @returns - 0 | 1 | -1 */ private internalComparator(left: Item, right: Item): number { - if (this.queue.get(left) === this.queue.get(right)) { + const leftPriority = this.queue.get(left) ?? 0; + const rightPriority = this.queue.get(right) ?? 0; + if (leftPriority === rightPriority) { return 0; } - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return this.queue.get(left)! < this.queue.get(right)! ? -1 : 1; + return leftPriority < rightPriority ? -1 : 1; } /** diff --git a/src/data-structure/queue/queue.test.ts b/src/data-structure/queue/queue.test.ts index bdd38dd..f0e2c6e 100644 --- a/src/data-structure/queue/queue.test.ts +++ b/src/data-structure/queue/queue.test.ts @@ -22,8 +22,7 @@ describe("Queue", () => { queue.enqueue({ value: "test1", key: "key1" }); queue.enqueue({ value: "test2", key: "key2" }); - const stringifier = (value: { key: string; value: string }) => - `${value.key}:${value.value}`; + const stringifier = (value: { key: string; value: string }) => `${value.key}:${value.value}`; expect(queue.toString(stringifier)).toBe("key1:test1,key2:test2"); expect(queue.dequeue()?.value).toBe("test1"); expect(queue.dequeue()?.value).toBe("test2"); diff --git a/src/data-structure/stack/index.ts b/src/data-structure/stack/index.ts index 4b2e565..dc9eefd 100644 --- a/src/data-structure/stack/index.ts +++ b/src/data-structure/stack/index.ts @@ -1 +1 @@ -export * from './stack' \ No newline at end of file +export * from "./stack"; diff --git a/src/data-structure/tree/binary-tree.ts b/src/data-structure/tree/binary-tree.ts index 978e422..fcde732 100644 --- a/src/data-structure/tree/binary-tree.ts +++ b/src/data-structure/tree/binary-tree.ts @@ -1,4 +1,4 @@ -import { Nullable } from "@/types"; +import type { Nullable } from "@/types"; /** * Represents a node in a binary tree data structure. diff --git a/src/data-structure/trie/trie-node.ts b/src/data-structure/trie/trie-node.ts index 608104d..4b24499 100644 --- a/src/data-structure/trie/trie-node.ts +++ b/src/data-structure/trie/trie-node.ts @@ -1,5 +1,5 @@ import { HashTable } from "@/data-structure/hash-table"; -import { Nullable } from "@/types"; +import type { Nullable } from "@/types"; /** * This class uses Map to implement children and diff --git a/src/data-structure/trie/trie.test.ts b/src/data-structure/trie/trie.test.ts index 18214f8..fd9ac7b 100644 --- a/src/data-structure/trie/trie.test.ts +++ b/src/data-structure/trie/trie.test.ts @@ -20,9 +20,7 @@ describe("Trie", () => { expect(trie.head.toString()).toBe("*:c"); expect(trie.head.getChild("c")?.toString()).toBe("c:a"); expect(trie.head.getChild("c")?.getChild("a")?.toString()).toBe("a:t,r"); - expect( - trie.head.getChild("c")?.getChild("a")?.getChild("t")?.toString() - ).toBe("t*"); + expect(trie.head.getChild("c")?.getChild("a")?.getChild("t")?.toString()).toBe("t*"); }); it("deletes words from trie", () => { diff --git a/src/data-structure/trie/trie.ts b/src/data-structure/trie/trie.ts index 59a4d7b..ef4c9e2 100644 --- a/src/data-structure/trie/trie.ts +++ b/src/data-structure/trie/trie.ts @@ -1,4 +1,4 @@ -import { Nullable } from "@/types"; +import type { Nullable } from "@/types"; import { isDefined } from "@/utils/is-defined"; import TrieNode from "./trie-node"; diff --git a/src/types/pair.ts b/src/types/pair.ts index 43ca1ef..f8da141 100644 --- a/src/types/pair.ts +++ b/src/types/pair.ts @@ -1,4 +1,4 @@ -import { Nullable } from "./nullable"; +import type { Nullable } from "./nullable"; export type Pair = { key: Nullable; diff --git a/src/utils/comparator.test.ts b/src/utils/comparator.test.ts index 95c42de..48074db 100644 --- a/src/utils/comparator.test.ts +++ b/src/utils/comparator.test.ts @@ -86,9 +86,7 @@ describe("Comparator", () => { }); it("compares two objects with custom comparator function", () => { - const productComparator = Comparator.comparing( - (product: Product) => product.price - ); + const productComparator = Comparator.comparing((product: Product) => product.price); const comparator = new Comparator(productComparator); expect(comparator.equal(product1, product2)).toBe(false); expect(comparator.greaterThan(product1, product2)).toBe(false); @@ -120,9 +118,7 @@ describe("Comparator", () => { }); it("compares objects using a nested property as key", () => { - const nestedComparator = Comparator.comparing( - (product: Product) => product.category.priority - ); + const nestedComparator = Comparator.comparing((product: Product) => product.category.priority); const comparator = new Comparator(nestedComparator); expect(comparator.equal(product1, product2)).toBe(false); expect(comparator.greaterThan(product1, product2)).toBe(false); @@ -131,9 +127,7 @@ describe("Comparator", () => { }); it("compares arrays using their length as key", () => { - const arrayLengthComparator = Comparator.comparing( - (arr: any[]) => arr.length - ); + const arrayLengthComparator = Comparator.comparing((arr: unknown[]) => arr.length); const comparator = new Comparator(arrayLengthComparator); expect(comparator.equal([1, 2], ["a", "b"])).toBe(true); diff --git a/src/utils/comparator.ts b/src/utils/comparator.ts index 9d209df..6f4a88c 100644 --- a/src/utils/comparator.ts +++ b/src/utils/comparator.ts @@ -9,10 +9,7 @@ * 1 if left is greater than right. * */ -export type ComparatorFunction = ( - left: Item, - right: Item -) => number | 1 | -1 | 0; +export type ComparatorFunction = (left: Item, right: Item) => number | 1 | -1 | 0; export class Comparator { private _comparator: ComparatorFunction;