diff --git a/package-lock.json b/package-lock.json index 0c22d3d..19fcff7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "data-structure-typed", - "version": "1.18.0", + "version": "1.18.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "data-structure-typed", - "version": "1.18.0", + "version": "1.18.6", "license": "MIT", "devDependencies": { "@types/jest": "^29.5.3", @@ -15,7 +15,7 @@ "jest": "^29.6.2", "ts-jest": "^29.1.1", "typedoc": "^0.24.8", - "typescript": "^5.1.6" + "typescript": "^5.1.5" } }, "node_modules/@ampproject/remapping": { @@ -690,16 +690,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.2.tgz", - "integrity": "sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.3.tgz", + "integrity": "sha512-ukZbHAdDH4ktZIOKvWs1juAXhiVAdvCyM8zv4S/7Ii3vJSDvMW5k+wOVGMQmHLHUFw3Ko63ZQNy7NI6PSlsD5w==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "slash": "^3.0.0" }, "engines": { @@ -756,37 +756,37 @@ "dev": true }, "node_modules/@jest/core": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.2.tgz", - "integrity": "sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.3.tgz", + "integrity": "sha512-skV1XrfNxfagmjRUrk2FyN5/2YwIzdWVVBa/orUfbLvQUANXxERq2pTvY0I+FinWHjDKB2HRmpveUiph4X0TJw==", "dev": true, "dependencies": { - "@jest/console": "^29.6.2", - "@jest/reporters": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/console": "^29.6.3", + "@jest/reporters": "^29.6.3", + "@jest/test-result": "^29.6.3", + "@jest/transform": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.5.0", - "jest-config": "^29.6.2", - "jest-haste-map": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-resolve-dependencies": "^29.6.2", - "jest-runner": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", - "jest-watcher": "^29.6.2", + "jest-changed-files": "^29.6.3", + "jest-config": "^29.6.3", + "jest-haste-map": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.6.3", + "jest-resolve-dependencies": "^29.6.3", + "jest-runner": "^29.6.3", + "jest-runtime": "^29.6.3", + "jest-snapshot": "^29.6.3", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "jest-watcher": "^29.6.3", "micromatch": "^4.0.4", - "pretty-format": "^29.6.2", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -873,88 +873,88 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.2.tgz", - "integrity": "sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.3.tgz", + "integrity": "sha512-u/u3cCztYCfgBiGHsamqP5x+XvucftOGPbf5RJQxfpeC1y4AL8pCjKvPDA3oCmdhZYPgk5AE0VOD/flweR69WA==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/fake-timers": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.2" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.2.tgz", - "integrity": "sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.3.tgz", + "integrity": "sha512-Ic08XbI2jlg6rECy+CGwk/8NDa6VE7UmIG6++9OTPAMnQmNGY28hu69Nf629CWv6T7YMODLbONxDFKdmQeI9FA==", "dev": true, "dependencies": { - "expect": "^29.6.2", - "jest-snapshot": "^29.6.2" + "expect": "^29.6.3", + "jest-snapshot": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.2.tgz", - "integrity": "sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.3.tgz", + "integrity": "sha512-nvOEW4YoqRKD9HBJ9OJ6przvIvP9qilp5nAn1462P5ZlL/MM9SgPEZFyjTGPfs7QkocdUsJa6KjHhyRn4ueItA==", "dev": true, "dependencies": { - "jest-get-type": "^29.4.3" + "jest-get-type": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.2.tgz", - "integrity": "sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.3.tgz", + "integrity": "sha512-pa1wmqvbj6eX0nMvOM2VDAWvJOI5A/Mk3l8O7n7EsAh71sMZblaKO9iT4GjIj0LwwK3CP/Jp1ypEV0x3m89RvA==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.2", - "jest-mock": "^29.6.2", - "jest-util": "^29.6.2" + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.2.tgz", - "integrity": "sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.3.tgz", + "integrity": "sha512-RB+uI+CZMHntzlnOPlll5x/jgRff3LEPl/td/jzMXiIgR0iIhKq9qm1HLU+EC52NuoVy/1swit/sDGjVn4bc6A==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.2", - "@jest/expect": "^29.6.2", - "@jest/types": "^29.6.1", - "jest-mock": "^29.6.2" + "@jest/environment": "^29.6.3", + "@jest/expect": "^29.6.3", + "@jest/types": "^29.6.3", + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.2.tgz", - "integrity": "sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.3.tgz", + "integrity": "sha512-kGz59zMi0GkVjD2CJeYWG9k6cvj7eBqt9aDAqo2rcCLRTYlvQ62Gu/n+tOmJMBHGjzeijjuCENjzTyYBgrtLUw==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/console": "^29.6.3", + "@jest/test-result": "^29.6.3", + "@jest/transform": "^29.6.3", + "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", @@ -963,13 +963,13 @@ "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", - "jest-worker": "^29.6.2", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.3", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1100,9 +1100,9 @@ } }, "node_modules/@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.27.8" @@ -1112,9 +1112,9 @@ } }, "node_modules/@jest/source-map": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", - "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", @@ -1126,13 +1126,13 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.2.tgz", - "integrity": "sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.3.tgz", + "integrity": "sha512-k7ZZaNvOSMBHPZYiy0kuiaFoyansR5QnTwDux1EjK3kD5iWpRVyJIJ0RAIV39SThafchuW59vra7F8mdy5Hfgw==", "dev": true, "dependencies": { - "@jest/console": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/console": "^29.6.3", + "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -1141,14 +1141,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz", - "integrity": "sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.3.tgz", + "integrity": "sha512-/SmijaAU2TY9ComFGIYa6Z+fmKqQMnqs2Nmwb0P/Z/tROdZ7M0iruES1EaaU9PBf8o9uED5xzaJ3YPFEIcDgAg==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.2", + "@jest/test-result": "^29.6.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", + "jest-haste-map": "^29.6.3", "slash": "^3.0.0" }, "engines": { @@ -1156,22 +1156,22 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.2.tgz", - "integrity": "sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.3.tgz", + "integrity": "sha512-dPIc3DsvMZ/S8ut4L2ViCj265mKO0owB0wfzBv2oGzL9pQ+iRvJewHqLBmsGb7XFb5UotWIEtvY5A/lnylaIoQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.2", + "jest-haste-map": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.6.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1231,12 +1231,12 @@ "dev": true }, "node_modules/@jest/types": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", - "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.0", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -1453,9 +1453,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.3", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz", - "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", + "version": "29.5.4", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.4.tgz", + "integrity": "sha512-PhglGmhWeD46FYOVLt3X7TiWjzwuVGW9wG/4qocPevXMjCmrIc5b6db9WjeGE4QYVpUAWMDv3v0IiBwObY289A==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -1463,9 +1463,9 @@ } }, "node_modules/@types/node": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz", - "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==", + "version": "20.5.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.3.tgz", + "integrity": "sha512-ITI7rbWczR8a/S6qjAW7DMqxqFMjjTo61qZVWJ1ubPvbIQsL5D/TvwjYEalM8Kthpe3hTzOGrF2TGbAu2uyqeA==", "dev": true }, "node_modules/@types/stack-utils": { @@ -1621,15 +1621,15 @@ } }, "node_modules/babel-jest": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.2.tgz", - "integrity": "sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.3.tgz", + "integrity": "sha512-1Ne93zZZEy5XmTa4Q+W5+zxBrDpExX8E3iy+xJJ+24ewlfo/T3qHfQJCzi/MMVFmBQDNxtRR/Gfd2dwb/0yrQw==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.2", + "@jest/transform": "^29.6.3", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.5.0", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -1706,10 +1706,35 @@ "node": ">=8" } }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/babel-plugin-jest-hoist": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", - "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", @@ -1745,12 +1770,12 @@ } }, "node_modules/babel-preset-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", - "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "dependencies": { - "babel-plugin-jest-hoist": "^29.5.0", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { @@ -2192,9 +2217,9 @@ } }, "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2207,9 +2232,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.496", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.496.tgz", - "integrity": "sha512-qeXC3Zbykq44RCrBa4kr8v/dWzYJA8rAwpyh9Qd+NKWoJfjG5vvJqy9XOJ9H4P/lqulZBCgUWAYi+FeK5AuJ8g==", + "version": "1.4.499", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.499.tgz", + "integrity": "sha512-0NmjlYBLKVHva4GABWAaHuPJolnDuL0AhV3h1hES6rcLCWEIbRL6/8TghfsVwkx6TEroQVdliX7+aLysUpKvjw==", "dev": true }, "node_modules/emittery": { @@ -2325,17 +2350,16 @@ } }, "node_modules/expect": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.2.tgz", - "integrity": "sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.3.tgz", + "integrity": "sha512-x1vY4LlEMWUYVZQrFi4ZANXFwqYbJ/JNQspLVvzhW2BNY28aNcXMQH6imBbt+RBf5sVRTodYHXtSP/TLEU0Dxw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.2", - "@types/node": "*", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2" + "@jest/expect-utils": "^29.6.3", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2426,9 +2450,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -2765,28 +2789,19 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", + "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==", "dev": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "semver": "^7.5.4" }, "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": ">=10" } }, "node_modules/istanbul-lib-report": { @@ -2849,15 +2864,15 @@ } }, "node_modules/jest": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.2.tgz", - "integrity": "sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.3.tgz", + "integrity": "sha512-alueLuoPCDNHFcFGmgETR4KpQ+0ff3qVaiJwxQM4B5sC0CvXcgg4PEi7xrDkxuItDmdz/FVc7SSit4KEu8GRvw==", "dev": true, "dependencies": { - "@jest/core": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/core": "^29.6.3", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.6.2" + "jest-cli": "^29.6.3" }, "bin": { "jest": "bin/jest.js" @@ -2875,12 +2890,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", - "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", + "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", "dev": true, "dependencies": { "execa": "^5.0.0", + "jest-util": "^29.6.3", "p-limit": "^3.1.0" }, "engines": { @@ -2888,28 +2904,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.2.tgz", - "integrity": "sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.3.tgz", + "integrity": "sha512-p0R5YqZEMnOpHqHLWRSjm2z/0p6RNsrNE/GRRT3eli8QGOAozj6Ys/3Tv+Ej+IfltJoSPwcQ6/hOCRkNlxLLCw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.2", - "@jest/expect": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/environment": "^29.6.3", + "@jest/expect": "^29.6.3", + "@jest/test-result": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.2", - "jest-matcher-utils": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", + "jest-each": "^29.6.3", + "jest-matcher-utils": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-runtime": "^29.6.3", + "jest-snapshot": "^29.6.3", + "jest-util": "^29.6.3", "p-limit": "^3.1.0", - "pretty-format": "^29.6.2", + "pretty-format": "^29.6.3", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -2968,21 +2984,21 @@ "dev": true }, "node_modules/jest-cli": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.2.tgz", - "integrity": "sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.3.tgz", + "integrity": "sha512-KuPdXUPXQIf0t6DvmG8MV4QyhcjR1a6ruKl3YL7aGn/AQ8JkROwFkWzEpDIpt11Qy188dHbRm8WjwMsV/4nmnQ==", "dev": true, "dependencies": { - "@jest/core": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/core": "^29.6.3", + "@jest/test-result": "^29.6.3", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", + "jest-config": "^29.6.3", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "prompts": "^2.0.1", "yargs": "^17.3.1" }, @@ -3051,31 +3067,31 @@ "dev": true }, "node_modules/jest-config": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.2.tgz", - "integrity": "sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.3.tgz", + "integrity": "sha512-nb9bOq2aEqogbyL4F9mLkAeQGAgNt7Uz6U59YtQDIxFPiL7Ejgq0YIrp78oyEHD6H4CIV/k7mFrK7eFDzUJ69w==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.2", - "@jest/types": "^29.6.1", - "babel-jest": "^29.6.2", + "@jest/test-sequencer": "^29.6.3", + "@jest/types": "^29.6.3", + "babel-jest": "^29.6.3", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.2", - "jest-environment-node": "^29.6.2", - "jest-get-type": "^29.4.3", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-runner": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", + "jest-circus": "^29.6.3", + "jest-environment-node": "^29.6.3", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.6.3", + "jest-runner": "^29.6.3", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.2", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -3187,15 +3203,15 @@ } }, "node_modules/jest-diff": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.2.tgz", - "integrity": "sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.3.tgz", + "integrity": "sha512-3sw+AdWnwH9sSNohMRKA7JiYUJSRr/WS6+sEFfBuhxU5V5GlEVKfvUn8JuMHE0wqKowemR1C2aHy8VtXbaV8dQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3251,9 +3267,9 @@ "dev": true }, "node_modules/jest-docblock": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", - "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", + "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -3263,16 +3279,16 @@ } }, "node_modules/jest-each": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.2.tgz", - "integrity": "sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", + "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "jest-util": "^29.6.2", - "pretty-format": "^29.6.2" + "jest-get-type": "^29.6.3", + "jest-util": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3328,46 +3344,46 @@ "dev": true }, "node_modules/jest-environment-node": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.2.tgz", - "integrity": "sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.3.tgz", + "integrity": "sha512-PKl7upfPJXMYbWpD+60o4HP86KvFO2c9dZ+Zr6wUzsG5xcPx/65o3ArNgHW5M0RFvLYdW4/aieR4JSooD0a2ew==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.2", - "@jest/fake-timers": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/environment": "^29.6.3", + "@jest/fake-timers": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.2", - "jest-util": "^29.6.2" + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.2.tgz", - "integrity": "sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.3.tgz", + "integrity": "sha512-GecR5YavfjkhOytEFHAeI6aWWG3f/cOKNB1YJvj/B76xAmeVjy4zJUYobGF030cRmKaO1FBw3V8CZZ6KVh9ZSw==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.2", - "jest-worker": "^29.6.2", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.3", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -3379,28 +3395,28 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz", - "integrity": "sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", + "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", "dev": true, "dependencies": { - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz", - "integrity": "sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.3.tgz", + "integrity": "sha512-6ZrMYINZdwduSt5Xu18/n49O1IgXdjsfG7NEZaQws9k69eTKWKcVbJBw/MZsjOZe2sSyJFmuzh8042XWwl54Zg==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.2", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" + "jest-diff": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3456,18 +3472,18 @@ "dev": true }, "node_modules/jest-message-util": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.2.tgz", - "integrity": "sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", + "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.2", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -3525,14 +3541,14 @@ "dev": true }, "node_modules/jest-mock": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.2.tgz", - "integrity": "sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", + "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.2" + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3556,26 +3572,26 @@ } }, "node_modules/jest-regex-util": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", - "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.2.tgz", - "integrity": "sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.3.tgz", + "integrity": "sha512-WMXwxhvzDeA/J+9jz1i8ZKGmbw/n+s988EiUvRI4egM+eTn31Hb5v10Re3slG3/qxntkBt2/6GkQVDGu6Bwyhw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", + "jest-haste-map": "^29.6.3", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -3585,13 +3601,13 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz", - "integrity": "sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.3.tgz", + "integrity": "sha512-iah5nhSPTwtUV7yzpTc9xGg8gP3Ch2VNsuFMsKoCkNCrQSbFtx5KRPemmPJ32AUhTSDqJXB6djPN6zAaUGV53g==", "dev": true, "dependencies": { - "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.6.2" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3647,30 +3663,30 @@ "dev": true }, "node_modules/jest-runner": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.2.tgz", - "integrity": "sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.3.tgz", + "integrity": "sha512-E4zsMhQnjhirFPhDTJgoLMWUrVCDij/KGzWlbslDHGuO8Hl2pVUfOiygMzVZtZq+BzmlqwEr7LYmW+WFLlmX8w==", "dev": true, "dependencies": { - "@jest/console": "^29.6.2", - "@jest/environment": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/console": "^29.6.3", + "@jest/environment": "^29.6.3", + "@jest/test-result": "^29.6.3", + "@jest/transform": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.6.2", - "jest-haste-map": "^29.6.2", - "jest-leak-detector": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-resolve": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-util": "^29.6.2", - "jest-watcher": "^29.6.2", - "jest-worker": "^29.6.2", + "jest-docblock": "^29.6.3", + "jest-environment-node": "^29.6.3", + "jest-haste-map": "^29.6.3", + "jest-leak-detector": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-resolve": "^29.6.3", + "jest-runtime": "^29.6.3", + "jest-util": "^29.6.3", + "jest-watcher": "^29.6.3", + "jest-worker": "^29.6.3", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -3728,31 +3744,31 @@ "dev": true }, "node_modules/jest-runtime": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.2.tgz", - "integrity": "sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.3.tgz", + "integrity": "sha512-VM0Z3a9xaqizGpEKwCOIhImkrINYzxgwk8oQAvrmAiXX8LNrJrRjyva30RkuRY0ETAotHLlUcd2moviCA1hgsQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.2", - "@jest/fake-timers": "^29.6.2", - "@jest/globals": "^29.6.2", - "@jest/source-map": "^29.6.0", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/environment": "^29.6.3", + "@jest/fake-timers": "^29.6.3", + "@jest/globals": "^29.6.3", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.6.3", + "@jest/transform": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-mock": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", + "jest-haste-map": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.6.3", + "jest-snapshot": "^29.6.3", + "jest-util": "^29.6.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -3852,9 +3868,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.2.tgz", - "integrity": "sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.3.tgz", + "integrity": "sha512-66Iu7H1ojiveQMGFnKecHIZPPPBjZwfQEnF6wxqpxGf57sV3YSUtAb5/sTKM5TPa3OndyxZp1wxHFbmgVhc53w==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -3862,20 +3878,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/expect-utils": "^29.6.3", + "@jest/transform": "^29.6.3", + "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.2", + "expect": "^29.6.3", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.2", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", + "jest-diff": "^29.6.3", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.2", + "pretty-format": "^29.6.3", "semver": "^7.5.3" }, "engines": { @@ -3932,12 +3948,12 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.2.tgz", - "integrity": "sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", + "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -3998,17 +4014,17 @@ "dev": true }, "node_modules/jest-validate": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.2.tgz", - "integrity": "sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", + "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.2" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4076,18 +4092,18 @@ "dev": true }, "node_modules/jest-watcher": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.2.tgz", - "integrity": "sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.3.tgz", + "integrity": "sha512-NgpFjZ2U2MKusjidbi4Oiu7tfs+nrgdIxIEVROvH1cFmOei9Uj25lwkMsakqLnH/s0nEcvxO1ck77FiRlcnpZg==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/test-result": "^29.6.3", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.2", + "jest-util": "^29.6.3", "string-length": "^4.0.1" }, "engines": { @@ -4144,13 +4160,13 @@ "dev": true }, "node_modules/jest-worker": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.2.tgz", - "integrity": "sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.3.tgz", + "integrity": "sha512-wacANXecZ/GbQakpf2CClrqrlwsYYDSXFd4fIGdL+dXpM2GWoJ+6bhQ7vR3TKi3+gkSfBkjy1/khH/WrYS4Q6g==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.2", + "jest-util": "^29.6.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -4636,12 +4652,12 @@ } }, "node_modules/pretty-format": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", - "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", + "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.0", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -5393,9 +5409,9 @@ } }, "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.5.tgz", + "integrity": "sha512-FOH+WN/DQjUvN6WgW+c4Ml3yi0PH+a/8q+kNIfRehv1wLhWONedw85iu+vQ39Wp49IzTJEsZ2lyLXpBF7mkF1g==", "dev": true, "bin": { "tsc": "bin/tsc", diff --git a/package.json b/package.json index cd7ce0f..58deca1 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,6 @@ "jest": "^29.6.2", "ts-jest": "^29.1.1", "typedoc": "^0.24.8", - "typescript": "^5.1.6" + "typescript": "^5.1.5" } } diff --git a/src/data-structures/binary-tree/abstract-binary-tree.ts b/src/data-structures/binary-tree/abstract-binary-tree.ts index ebb5cdc..4622d58 100644 --- a/src/data-structures/binary-tree/abstract-binary-tree.ts +++ b/src/data-structures/binary-tree/abstract-binary-tree.ts @@ -9,8 +9,8 @@ import {trampoline} from '../../utils'; import type { AbstractRecursiveBinaryTreeNode, - AbstractResultByProperty, - AbstractResultsByProperty, + AbstractBinaryTreeNodeProperty, + AbstractBinaryTreeNodeProperties, BinaryTreeDeletedResult, BinaryTreeNodeId, BinaryTreeNodePropertyName, @@ -19,10 +19,9 @@ import type { NodeOrPropertyName } from '../types'; import {AbstractBinaryTreeOptions, FamilyPosition, LoopType} from '../types'; -import {IBinaryTree, IBinaryTreeNode} from '../interfaces'; +import {IAbstractBinaryTree, IAbstractBinaryTreeNode} from '../interfaces'; - -export abstract class AbstractBinaryTreeNode = AbstractRecursiveBinaryTreeNode> implements IBinaryTreeNode { +export abstract class AbstractBinaryTreeNode = AbstractRecursiveBinaryTreeNode> implements IAbstractBinaryTreeNode { constructor(id: BinaryTreeNodeId, val: T, count?: number) { this._id = id; @@ -118,11 +117,11 @@ export abstract class AbstractBinaryTreeNode = AbstractBinaryTreeNode> implements IBinaryTree { - +export abstract class AbstractBinaryTree = AbstractBinaryTreeNode> implements IAbstractBinaryTree { /** * The protected constructor initializes the options for an abstract binary tree. @@ -238,7 +236,7 @@ export abstract class AbstractBinaryTree { @@ -951,9 +949,9 @@ export abstract class AbstractBinaryTree`. + * @returns an object of type `AbstractBinaryTreeNodeProperties`. */ - BFS(nodeOrPropertyName ?: NodeOrPropertyName): AbstractResultsByProperty { + BFS(nodeOrPropertyName ?: NodeOrPropertyName): AbstractBinaryTreeNodeProperties { nodeOrPropertyName = nodeOrPropertyName ?? 'id'; this._resetResults(); const queue: Array = [this.root]; @@ -990,9 +988,9 @@ export abstract class AbstractBinaryTree`. + * @returns an object of type `AbstractBinaryTreeNodeProperties`. */ - DFS(pattern ?: 'in' | 'pre' | 'post', nodeOrPropertyName ?: NodeOrPropertyName): AbstractResultsByProperty { + DFS(pattern ?: 'in' | 'pre' | 'post', nodeOrPropertyName ?: NodeOrPropertyName): AbstractBinaryTreeNodeProperties { pattern = pattern ?? 'in'; nodeOrPropertyName = nodeOrPropertyName ?? 'id'; this._resetResults(); @@ -1037,7 +1035,7 @@ export abstract class AbstractBinaryTree { + DFSIterative(pattern ?: 'in' | 'pre' | 'post', nodeOrPropertyName ?: NodeOrPropertyName): AbstractBinaryTreeNodeProperties { pattern = pattern || 'in'; nodeOrPropertyName = nodeOrPropertyName || 'id'; this._resetResults(); @@ -1099,9 +1097,9 @@ export abstract class AbstractBinaryTree`. + * @returns The function `levelIterative` returns an object of type `AbstractBinaryTreeNodeProperties`. */ - levelIterative(node: N | null, nodeOrPropertyName ?: NodeOrPropertyName): AbstractResultsByProperty { + levelIterative(node: N | null, nodeOrPropertyName ?: NodeOrPropertyName): AbstractBinaryTreeNodeProperties { nodeOrPropertyName = nodeOrPropertyName || 'id'; node = node || this.root; if (!node) return []; @@ -1142,14 +1140,14 @@ export abstract class AbstractBinaryTree` objects. + * @returns The function `listLevels` returns a 2D array of `AbstractBinaryTreeNodeProperty` objects. */ - listLevels(node: N | null, nodeOrPropertyName?: NodeOrPropertyName): AbstractResultByProperty[][] { + listLevels(node: N | null, nodeOrPropertyName?: NodeOrPropertyName): AbstractBinaryTreeNodeProperty[][] { nodeOrPropertyName = nodeOrPropertyName || 'id'; node = node || this.root; if (!node) return []; - const levelsNodes: AbstractResultByProperty[][] = []; + const levelsNodes: AbstractBinaryTreeNodeProperty[][] = []; const collectByProperty = (node: N, level: number) => { switch (nodeOrPropertyName) { @@ -1236,9 +1234,9 @@ export abstract class AbstractBinaryTree`. + * @returns The function `morris` returns an object of type `AbstractBinaryTreeNodeProperties`. */ - morris(pattern?: 'in' | 'pre' | 'post', nodeOrPropertyName?: NodeOrPropertyName): AbstractResultsByProperty { + morris(pattern?: 'in' | 'pre' | 'post', nodeOrPropertyName?: NodeOrPropertyName): AbstractBinaryTreeNodeProperties { if (this.root === null) return []; pattern = pattern || 'in'; @@ -1467,9 +1465,9 @@ export abstract class AbstractBinaryTree`. + * @returns The method returns an object of type `AbstractBinaryTreeNodeProperties`. */ - protected _getResultByPropertyName(nodeOrPropertyName ?: NodeOrPropertyName): AbstractResultsByProperty { + protected _getResultByPropertyName(nodeOrPropertyName ?: NodeOrPropertyName): AbstractBinaryTreeNodeProperties { nodeOrPropertyName = nodeOrPropertyName ?? 'id'; switch (nodeOrPropertyName) { diff --git a/src/data-structures/binary-tree/avl-tree.ts b/src/data-structures/binary-tree/avl-tree.ts index 9a11f9e..78ccbab 100644 --- a/src/data-structures/binary-tree/avl-tree.ts +++ b/src/data-structures/binary-tree/avl-tree.ts @@ -7,18 +7,18 @@ */ import {BST, BSTNode} from './bst'; import type {AVLTreeOptions, BinaryTreeDeletedResult, BinaryTreeNodeId, RecursiveAVLTreeNode} from '../types'; -import {IBinaryTreeNode} from '../interfaces'; +import {IAVLTree, IAVLTreeNode} from '../interfaces'; -export class AVLTreeNode = RecursiveAVLTreeNode> extends BSTNode implements IBinaryTreeNode { +export class AVLTreeNode = RecursiveAVLTreeNode> extends BSTNode implements IAVLTreeNode { } -export class AVLTree = AVLTreeNode> extends BST { +export class AVLTree = AVLTreeNode> extends BST implements IAVLTree { constructor(options?: AVLTreeOptions) { super(options); } - override _createNode(id: BinaryTreeNodeId, val: N['val'], count?: number): N { + override createNode(id: BinaryTreeNodeId, val: N['val'], count?: number): N { const node = new AVLTreeNode(id, val, count); return node as N; } diff --git a/src/data-structures/binary-tree/binary-tree.ts b/src/data-structures/binary-tree/binary-tree.ts index 63cb8c2..c43b357 100644 --- a/src/data-structures/binary-tree/binary-tree.ts +++ b/src/data-structures/binary-tree/binary-tree.ts @@ -8,13 +8,13 @@ import type {BinaryTreeNodeId, RecursiveBinaryTreeNode} from '../types'; import {BinaryTreeOptions} from '../types'; -import {IBinaryTree, IBinaryTreeNode} from '../interfaces'; +import {IAbstractBinaryTree, IAbstractBinaryTreeNode} from '../interfaces'; import {AbstractBinaryTree, AbstractBinaryTreeNode} from './abstract-binary-tree'; - +import {IBinaryTree, IBinaryTreeNode} from '../interfaces/binary-tree'; export class BinaryTreeNode = RecursiveBinaryTreeNode> extends AbstractBinaryTreeNode implements IBinaryTreeNode { - _createNode(id: BinaryTreeNodeId, val: T | null, count?: number): FAMILY | null { + createNode(id: BinaryTreeNodeId, val: T | null, count?: number): FAMILY | null { return val !== null ? new BinaryTreeNode(id, val, count) as FAMILY : null; } @@ -43,7 +43,7 @@ export class BinaryTree = BinaryTreeNode> * of occurrences of the value in the binary tree node. If not provided, the default value is `undefined`. * @returns a BinaryTreeNode object if the value is not null, otherwise it returns null. */ - _createNode(id: BinaryTreeNodeId, val: N['val'] | null, count?: number): N | null { + createNode(id: BinaryTreeNodeId, val: N['val'] | null, count?: number): N | null { const node = new BinaryTreeNode(id, val, count); return node as N | null; } diff --git a/src/data-structures/binary-tree/bst.ts b/src/data-structures/binary-tree/bst.ts index 1cd8366..5f5d78d 100644 --- a/src/data-structures/binary-tree/bst.ts +++ b/src/data-structures/binary-tree/bst.ts @@ -8,13 +8,13 @@ import type {BinaryTreeNodeId, BinaryTreeNodePropertyName, BSTComparator, RecursiveBSTNode} from '../types'; import {BinaryTreeDeletedResult, BSTOptions, CP, FamilyPosition, LoopType} from '../types'; import {BinaryTree, BinaryTreeNode} from './binary-tree'; -import {IBinaryTree, IBinaryTreeNode} from '../interfaces'; +import {IAbstractBinaryTree, IAbstractBinaryTreeNode, IBST, IBSTNode} from '../interfaces'; -export class BSTNode = RecursiveBSTNode> extends BinaryTreeNode implements IBinaryTreeNode { +export class BSTNode = RecursiveBSTNode> extends BinaryTreeNode implements IBSTNode { } -export class BST = BSTNode> extends BinaryTree implements IBinaryTree { +export class BST = BSTNode> extends BinaryTree implements IBST { /** * The constructor function accepts an optional options object and sets the comparator property if provided. * @param [options] - An optional object that can contain the following properties: @@ -29,7 +29,7 @@ export class BST = BSTNode> extends Binar } } - override _createNode(id: BinaryTreeNodeId, val: N['val'] | null, count?: number): N | null { + override createNode(id: BinaryTreeNodeId, val: N['val'] | null, count?: number): N | null { const node = val !== null ? new BSTNode(id, val, count) : null; return node as N; } @@ -48,7 +48,7 @@ export class BST = BSTNode> extends Binar */ override add(id: BinaryTreeNodeId, val: N['val'] | null, count: number = 1): N | null { let inserted: N | null = null; - const newNode = this._createNode(id, val, count); + const newNode = this.createNode(id, val, count); if (this.root === null) { this._setRoot(newNode); this._setSize(this.size + 1); @@ -133,7 +133,7 @@ export class BST = BSTNode> extends Binar * greater than, it returns the ID of the leftmost node. Otherwise, it also returns the ID of the rightmost node. If * there are no nodes in */ - lastKey() { + lastKey(): BinaryTreeNodeId { if (this._compare(0, 1) === CP.lt) return this.getRightMost()?.id ?? 0; else if (this._compare(0, 1) === CP.gt) return this.getLeftMost()?.id ?? 0; else return this.getRightMost()?.id ?? 0; diff --git a/src/data-structures/binary-tree/rb-tree.ts b/src/data-structures/binary-tree/rb-tree.ts index f021b64..93cc75c 100644 --- a/src/data-structures/binary-tree/rb-tree.ts +++ b/src/data-structures/binary-tree/rb-tree.ts @@ -1,9 +1,10 @@ -import {BinaryTree, BinaryTreeNode} from './binary-tree'; -import {IBinaryTree, IBinaryTreeNode} from '../interfaces'; +import {BinaryTreeNode} from './binary-tree'; import {RBColor, RBTreeOptions} from '../types'; +import {IRBTree, IRBTreeNode} from '../interfaces/rb-tree'; +import {BST} from './bst'; -class RBNode> extends BinaryTreeNode implements IBinaryTreeNode { +export class RBTreeNode> extends BinaryTreeNode implements IRBTreeNode { // override createNode(id: BinaryTreeNodeId, val: T | null, count?: number): RBNode | null { // return val !== null ? new RBNode(id, val, count) : null; // } @@ -58,12 +59,12 @@ class RBNode> extends BinaryTreeNode> extends BinaryTree implements IBinaryTree { +export class RBTree> extends BST implements IRBTree { constructor(options?: RBTreeOptions) { super(options); } - // override _createNode(id: BinaryTreeNodeId, val: N | null, count?: number): RBNode | null { + // override createNode(id: BinaryTreeNodeId, val: N | null, count?: number): RBNode | null { // return val !== null ? new RBNode(id, val, count) : null; // } diff --git a/src/data-structures/binary-tree/tree-multiset.ts b/src/data-structures/binary-tree/tree-multiset.ts index 833c082..35b8fa0 100644 --- a/src/data-structures/binary-tree/tree-multiset.ts +++ b/src/data-structures/binary-tree/tree-multiset.ts @@ -7,16 +7,16 @@ */ import {BST, BSTNode} from './bst'; import type {BinaryTreeNodeId, RecursiveTreeMultiSetNode, TreeMultiSetOptions} from '../types'; -import {IBinaryTree, IBinaryTreeNode} from '../interfaces'; +import {IAbstractBinaryTree, IAbstractBinaryTreeNode, IBST, IBSTNode} from '../interfaces'; -export class TreeMultiSetNode = RecursiveTreeMultiSetNode> extends BSTNode implements IBinaryTreeNode { +export class TreeMultiSetNode = RecursiveTreeMultiSetNode> extends BSTNode implements IBSTNode { } /** * The only distinction between a TreeMultiSet and a BST lies in the ability of the former to store duplicate nodes through the utilization of counters. */ -export class TreeMultiSet = BSTNode> extends BST implements IBinaryTree { +export class TreeMultiSet = BSTNode> extends BST implements IBST { constructor(options?: TreeMultiSetOptions) { super({...options, isDuplicatedVal: true}); } @@ -30,7 +30,7 @@ export class TreeMultiSet = BSTNode> exte * occurrences of the value in the binary search tree node. If not provided, the count will default to 1. * @returns A new instance of the BSTNode class with the specified id, value, and count (if provided). */ - override _createNode(id: BinaryTreeNodeId, val: N['val'], count?: number): N { + override createNode(id: BinaryTreeNodeId, val: N['val'], count?: number): N { const node = new TreeMultiSetNode(id, val, count); return node as N; } diff --git a/src/data-structures/graph/abstract-graph.ts b/src/data-structures/graph/abstract-graph.ts index c202a1a..261df3c 100644 --- a/src/data-structures/graph/abstract-graph.ts +++ b/src/data-structures/graph/abstract-graph.ts @@ -8,7 +8,7 @@ import {arrayRemove, uuidV4} from '../../utils'; import {PriorityQueue} from '../priority-queue'; import type {DijkstraResult, VertexId} from '../types'; -import {IGraph} from '../interfaces'; +import {IAbstractGraph} from '../interfaces'; export abstract class AbstractVertex { @@ -43,7 +43,7 @@ export abstract class AbstractVertex { // * @param id // * @param val // */ - // abstract _createVertex(id: VertexId, val?: T): AbstractVertex; + // abstract createVertex(id: VertexId, val?: T): AbstractVertex; } export abstract class AbstractEdge { @@ -88,7 +88,7 @@ export abstract class AbstractEdge { // * @param weight // * @param val // */ - // abstract _createEdge(srcOrV1: VertexId | string, destOrV2: VertexId | string, weight?: number, val?: E): E; + // abstract createEdge(srcOrV1: VertexId | string, destOrV2: VertexId | string, weight?: number, val?: E): E; protected _setHashCode(v: string) { this._hashCode = v; @@ -96,7 +96,7 @@ export abstract class AbstractEdge { } // Connected Component === Largest Connected Sub-Graph -export abstract class AbstractGraph, E extends AbstractEdge> implements IGraph { +export abstract class AbstractGraph, E extends AbstractEdge> implements IAbstractGraph { private _vertices: Map = new Map(); get vertices(): Map { @@ -109,7 +109,7 @@ export abstract class AbstractGraph, E extends Abs * @param id * @param val */ - abstract _createVertex(id: VertexId, val?: V): V; + abstract createVertex(id: VertexId, val?: V): V; /** * In TypeScript, a subclass inherits the interface implementation of its parent class, without needing to implement the same interface again in the subclass. This behavior differs from Java's approach. In Java, if a parent class implements an interface, the subclass needs to explicitly implement the same interface, even if the parent class has already implemented it. @@ -119,13 +119,11 @@ export abstract class AbstractGraph, E extends Abs * @param weight * @param val */ - abstract _createEdge(srcOrV1: VertexId | string, destOrV2: VertexId | string, weight?: number, val?: E): E; - - abstract removeEdgeBetween(srcOrId: V | VertexId, destOrId: V | VertexId): E | null; + abstract createEdge(srcOrV1: VertexId | string, destOrV2: VertexId | string, weight?: number, val?: E): E; abstract removeEdge(edge: E): E | null; - _getVertex(vertexOrId: VertexId | V): V | null { + protected _getVertex(vertexOrId: VertexId | V): V | null { const vertexId = this._getVertexId(vertexOrId); return this._vertices.get(vertexId) || null; } @@ -134,7 +132,7 @@ export abstract class AbstractGraph, E extends Abs return this._vertices.get(vertexId) || null; } - _getVertexId(vertexOrId: V | VertexId): VertexId { + protected _getVertexId(vertexOrId: V | VertexId): VertexId { return vertexOrId instanceof AbstractVertex ? vertexOrId.id : vertexOrId; } @@ -151,7 +149,7 @@ export abstract class AbstractGraph, E extends Abs abstract getEdge(srcOrId: V | VertexId, destOrId: V | VertexId): E | null; createAddVertex(id: VertexId, val?: V['val']): boolean { - const newVertex = this._createVertex(id, val); + const newVertex = this.createVertex(id, val); return this.addVertex(newVertex); } @@ -213,7 +211,7 @@ export abstract class AbstractGraph, E extends Abs createAddEdge(src: V | VertexId, dest: V | VertexId, weight: number, val: E['val']): boolean { if (src instanceof AbstractVertex) src = src.id; if (dest instanceof AbstractVertex) dest = dest.id; - const newEdge = this._createEdge(src, dest, weight, val); + const newEdge = this.createEdge(src, dest, weight, val); return this.addEdge(newEdge); } diff --git a/src/data-structures/graph/directed-graph.ts b/src/data-structures/graph/directed-graph.ts index bebbecc..005f33c 100644 --- a/src/data-structures/graph/directed-graph.ts +++ b/src/data-structures/graph/directed-graph.ts @@ -8,7 +8,7 @@ import {arrayRemove} from '../../utils'; import {AbstractEdge, AbstractGraph, AbstractVertex} from './abstract-graph'; import type {TopologicalStatus, VertexId} from '../types'; -import {IDirectedGraph} from '../interfaces'; +import {IDirectedGraph, IAbstractGraph} from '../interfaces'; export class DirectedVertex extends AbstractVertex { /** @@ -22,7 +22,7 @@ export class DirectedVertex extends AbstractVertex { super(id, val); } - // _createVertex(id: VertexId, val?: T): DirectedVertex { + // createVertex(id: VertexId, val?: T): DirectedVertex { // return new DirectedVertex(id, val); // } } @@ -67,7 +67,7 @@ export class DirectedEdge extends AbstractEdge { this._dest = v; } - // _createEdge(src: VertexId, dest: VertexId, weight?: number, val?: T): DirectedEdge { + // createEdge(src: VertexId, dest: VertexId, weight?: number, val?: T): DirectedEdge { // if (weight === undefined || weight === null) weight = 1; // return new DirectedEdge(src, dest, weight, val); // } @@ -98,7 +98,7 @@ export class DirectedGraph = DirectedVertex, E ext * @param id * @param val */ - _createVertex(id: VertexId, val?: V['val']): V { + createVertex(id: VertexId, val?: V['val']): V { return new DirectedVertex(id, val ?? id) as V; } @@ -110,7 +110,7 @@ export class DirectedGraph = DirectedVertex, E ext * @param weight * @param val */ - _createEdge(src: VertexId, dest: VertexId, weight?: number, val?: E['val']): E { + createEdge(src: VertexId, dest: VertexId, weight?: number, val?: E['val']): E { return new DirectedEdge(src, dest, weight ?? 1, val) as E; } @@ -186,7 +186,7 @@ export class DirectedGraph = DirectedVertex, E ext * @returns The function `removeEdgeBetween` returns the removed edge (`E`) if it exists, or `null` if * the edge does not exist. */ - removeEdgeBetween(srcOrId: V | VertexId, destOrId: V | VertexId): E | null { + removeEdgeSrcToDest(srcOrId: V | VertexId, destOrId: V | VertexId): E | null { const src: V | null = this._getVertex(srcOrId); const dest: V | null = this._getVertex(destOrId); @@ -197,14 +197,6 @@ export class DirectedGraph = DirectedVertex, E ext const srcOutEdges = this._outEdgeMap.get(src); if (srcOutEdges) { - /** - * The removeEdge function removes an edge from a graph and returns the removed edge, or null if the edge was not - * found. - * @param {E} edge - The `edge` parameter represents the edge that you want to remove from the graph. It should be an - * object that has `src` and `dest` properties, which represent the source and destination vertices of the edge, - * respectively. - * @returns The method `removeEdge` returns the removed edge (`E`) if it exists, or `null` if the edge does not exist. - */ arrayRemove(srcOutEdges, (edge: E) => edge.dest === dest.id); } @@ -244,14 +236,25 @@ export class DirectedGraph = DirectedVertex, E ext } /** - * The function removeAllEdges removes all edges between two vertices. - * @param {VertexId | V} src - The `src` parameter can be either a `VertexId` or a `V`. - * @param {VertexId | V} dest - The `dest` parameter represents the destination vertex of an edge. It - * can be either a `VertexId` or a `V`. - * @returns An empty array of DirectedEdge objects is being returned. + * The function removes all edges between two vertices and returns the removed edges. + * @param {VertexId | V} v1 - The parameter `v1` represents either a `VertexId` or a `V` object. It is used to identify + * the first vertex in the graph. + * @param {VertexId | V} v2 - The parameter `v2` represents either a `VertexId` or a `V`. It is used to identify the + * second vertex involved in the edges that need to be removed. + * @returns The function `removeEdgesBetween` returns an array of removed edges (`E[]`). */ - removeAllEdges(src: VertexId | V, dest: VertexId | V): E[] { - return []; + removeEdgesBetween(v1: VertexId | V, v2: VertexId | V): E[] { + const removed: E[] = []; + + if (v1 && v2) { + const v1ToV2 = this.removeEdgeSrcToDest(v1, v2); + const v2ToV1 = this.removeEdgeSrcToDest(v2, v1); + + v1ToV2 && removed.push(v1ToV2); + v2ToV1 && removed.push(v2ToV1); + } + + return removed; } /** diff --git a/src/data-structures/graph/undirected-graph.ts b/src/data-structures/graph/undirected-graph.ts index a556550..2930738 100644 --- a/src/data-structures/graph/undirected-graph.ts +++ b/src/data-structures/graph/undirected-graph.ts @@ -8,6 +8,7 @@ import {arrayRemove} from '../../utils'; import {AbstractEdge, AbstractGraph, AbstractVertex} from './abstract-graph'; import type {VertexId} from '../types'; +import {IUNDirectedGraph} from '../interfaces'; export class UndirectedVertex extends AbstractVertex { /** @@ -20,10 +21,6 @@ export class UndirectedVertex extends AbstractVertex { constructor(id: VertexId, val?: T) { super(id, val); } - - // _createVertex(id: VertexId, val?: T): T { - // return new T(id, val); - // } } export class UndirectedEdge extends AbstractEdge { @@ -51,14 +48,9 @@ export class UndirectedEdge extends AbstractEdge { set vertices(v: [VertexId, VertexId]) { this._vertices = v; } - - // _createEdge(src: VertexId, dest: VertexId, weight?: number, val?: T): T { - // if (weight === undefined || weight === null) weight = 1; - // return new UndirectedEdge(src, dest, weight, val); - // } } -export class UndirectedGraph = UndirectedVertex, E extends UndirectedEdge = UndirectedEdge> extends AbstractGraph { +export class UndirectedGraph = UndirectedVertex, E extends UndirectedEdge = UndirectedEdge> extends AbstractGraph implements IUNDirectedGraph{ constructor() { super(); @@ -77,13 +69,13 @@ export class UndirectedGraph = UndirectedVertex, * @param id * @param val */ - _createVertex(id: VertexId, val?: V['val']): V { + override createVertex(id: VertexId, val?: V['val']): V { return new UndirectedVertex(id, val ?? id) as V; } /** - * The function _createEdge creates an undirected edge between two vertices with an optional weight and value. + * The function createEdge creates an undirected edge between two vertices with an optional weight and value. * @param {VertexId} v1 - The parameter `v1` represents the first vertex of the edge. It is of type `VertexId`, which * could be a unique identifier or label for the vertex. * @param {VertexId} v2 - The parameter `v2` represents the second vertex of the edge. It is of type `VertexId`, which @@ -94,7 +86,7 @@ export class UndirectedGraph = UndirectedVertex, * is used to store additional information or data associated with the edge. * @returns an instance of the UndirectedEdge class, casted as type E. */ - _createEdge(v1: VertexId, v2: VertexId, weight?: number, val?: E['val']): E { + override createEdge(v1: VertexId, v2: VertexId, weight?: number, val?: E['val']): E { return new UndirectedEdge(v1, v2, weight ?? 1, val) as E; } @@ -230,19 +222,6 @@ export class UndirectedGraph = UndirectedVertex, return [...edgeSet]; } - /** - * The function "getEdgesOf" returns an array of undirected edges connected to a given vertex or vertex ID. - * @param {V | VertexId} vertexOrId - The parameter `vertexOrId` can be either an - * `V` object or a `VertexId`. - * @returns The function `getEdgesOf` returns an array of `E` objects. - */ - getEdgesOf(vertexOrId: V | VertexId): E[] { - const vertex = this._getVertex(vertexOrId); - if (!vertex) { - return []; - } - return this._edges.get(vertex) || []; - } /** * The function `getNeighbors` returns an array of neighboring vertices of a given vertex in an undirected graph. @@ -254,7 +233,7 @@ export class UndirectedGraph = UndirectedVertex, const neighbors: V[] = []; const vertex = this._getVertex(vertexOrId); if (vertex) { - const neighborEdges = this.getEdgesOf(vertex); + const neighborEdges = this.edgesOf(vertex); for (const edge of neighborEdges) { const neighbor = this._getVertex(edge.vertices.filter(e => e !== vertex.id)[0]); if (neighbor) { diff --git a/src/data-structures/interfaces/abstract-binary-tree.ts b/src/data-structures/interfaces/abstract-binary-tree.ts new file mode 100644 index 0000000..33fba8e --- /dev/null +++ b/src/data-structures/interfaces/abstract-binary-tree.ts @@ -0,0 +1,238 @@ +import { + AbstractBinaryTreeNodeProperty, + AbstractBinaryTreeNodeProperties, + BinaryTreeDeletedResult, + BinaryTreeNodeId, + BinaryTreeNodePropertyName, + DFSOrderPattern, + FamilyPosition, + LoopType, + NodeOrPropertyName +} from '../types'; +import {AbstractBinaryTreeNode} from '../binary-tree'; + +export interface IAbstractBinaryTreeNode> { + + createNode(id: BinaryTreeNodeId, val: T | null, count?: number): FAMILY | null; + + + get id(): BinaryTreeNodeId + + set id(v: BinaryTreeNodeId) + + + get val(): T + + set val(v: T) + + + get left(): FAMILY | null | undefined + + set left(v: FAMILY | null | undefined) + + + get right(): FAMILY | null | undefined + + set right(v: FAMILY | null | undefined) + + + get parent(): FAMILY | null | undefined + + set parent(v: FAMILY | null | undefined) + + + get familyPosition(): FamilyPosition + + set familyPosition(v: FamilyPosition) + + + get count(): number + + set count(v: number) + + + get height(): number + + set height(v: number) + + swapLocation(swapNode: FAMILY): FAMILY + + clone(): FAMILY | null; +} + +export interface IAbstractBinaryTree> { + createNode(id: BinaryTreeNodeId, val: N['val'] | null, count?: number): N | null + + get loopType(): LoopType + get visitedId(): BinaryTreeNodeId[] + get visitedVal(): Array + get visitedNode(): N[] + get visitedCount(): number[] + get visitedLeftSum(): number[] + get autoIncrementId(): boolean + get maxId(): number + get isDuplicatedVal(): boolean + get root(): N | null + get size(): number + get count(): number + + clear(): void + + isEmpty(): boolean + + add(id: BinaryTreeNodeId, val?: N['val'], count?: number): N | null | undefined + + addTo(newNode: N | null, parent: N): N | null | undefined + + addMany(data: N[] | Array): (N | null | undefined)[] + + fill(data: N[] | Array): boolean + + remove(id: BinaryTreeNodeId, ignoreCount?: boolean): BinaryTreeDeletedResult[] + + getDepth(node: N): number + + getHeight(beginRoot?: N | null): number + + getMinHeight(beginRoot?: N | null): number + + isBalanced(beginRoot?: N | null): boolean + + getNodes(nodeProperty: BinaryTreeNodeId | N, propertyName ?: BinaryTreeNodePropertyName, onlyOne ?: boolean): N[] + + has(nodeProperty: BinaryTreeNodeId | N, propertyName ?: BinaryTreeNodePropertyName): boolean + + get(nodeProperty: BinaryTreeNodeId | N, propertyName ?: BinaryTreeNodePropertyName): N | null + + getPathToRoot(node: N): N[] + + getLeftMost(): N | null; + + getLeftMost(node: N): N; + + getLeftMost(node?: N | null): N | null + + getRightMost(): N | null; + + getRightMost(node: N): N; + + getRightMost(node?: N | null): N | null + + isBST(node?: N | null): boolean + + getSubTreeSizeAndCount(subTreeRoot: N | null | undefined): [number, number] + + // --- start additional methods --- + + subTreeSum(subTreeRoot: N, propertyName ?: BinaryTreeNodePropertyName): number + + subTreeAdd(subTreeRoot: N, delta: number, propertyName ?: BinaryTreeNodePropertyName): boolean + + BFS(): BinaryTreeNodeId[]; + + BFS(nodeOrPropertyName: 'id'): BinaryTreeNodeId[]; + + BFS(nodeOrPropertyName: 'val'): N['val'][]; + + BFS(nodeOrPropertyName: 'node'): N[]; + + BFS(nodeOrPropertyName: 'count'): number[]; + + BFS(nodeOrPropertyName ?: NodeOrPropertyName): AbstractBinaryTreeNodeProperties + + DFS(): BinaryTreeNodeId[]; + + DFS(pattern?: DFSOrderPattern, nodeOrPropertyName?: 'id'): BinaryTreeNodeId[]; + + DFS(pattern?: DFSOrderPattern, nodeOrPropertyName?: 'val'): N[]; + + DFS(pattern?: DFSOrderPattern, nodeOrPropertyName?: 'node'): N[]; + + DFS(pattern?: DFSOrderPattern, nodeOrPropertyName?: 'count'): number[]; + + DFS(pattern ?: 'in' | 'pre' | 'post', nodeOrPropertyName ?: NodeOrPropertyName): AbstractBinaryTreeNodeProperties + + DFSIterative(): BinaryTreeNodeId[]; + + DFSIterative(pattern?: DFSOrderPattern, nodeOrPropertyName?: 'id'): BinaryTreeNodeId[]; + + DFSIterative(pattern?: DFSOrderPattern, nodeOrPropertyName?: 'val'): N[]; + + DFSIterative(pattern?: DFSOrderPattern, nodeOrPropertyName?: 'node'): N[]; + + DFSIterative(pattern?: DFSOrderPattern, nodeOrPropertyName?: 'count'): number[]; + + DFSIterative(pattern ?: 'in' | 'pre' | 'post', nodeOrPropertyName ?: NodeOrPropertyName): AbstractBinaryTreeNodeProperties + + levelIterative(node: N | null): BinaryTreeNodeId[]; + + levelIterative(node: N | null, nodeOrPropertyName?: 'id'): BinaryTreeNodeId[]; + + levelIterative(node: N | null, nodeOrPropertyName?: 'val'): N['val'][]; + + levelIterative(node: N | null, nodeOrPropertyName?: 'node'): N[]; + + levelIterative(node: N | null, nodeOrPropertyName?: 'count'): number[]; + + levelIterative(node: N | null, nodeOrPropertyName ?: NodeOrPropertyName): AbstractBinaryTreeNodeProperties + + listLevels(node: N | null): BinaryTreeNodeId[][]; + + listLevels(node: N | null, nodeOrPropertyName?: 'id'): BinaryTreeNodeId[][]; + + listLevels(node: N | null, nodeOrPropertyName?: 'val'): N['val'][][]; + + listLevels(node: N | null, nodeOrPropertyName?: 'node'): N[][]; + + listLevels(node: N | null, nodeOrPropertyName?: 'count'): number[][]; + + listLevels(node: N | null, nodeOrPropertyName?: NodeOrPropertyName): AbstractBinaryTreeNodeProperty[][] + + getPredecessor(node: N): N + + morris(): BinaryTreeNodeId[]; + + morris(pattern?: DFSOrderPattern, nodeOrPropertyName?: 'id'): BinaryTreeNodeId[]; + + morris(pattern?: DFSOrderPattern, nodeOrPropertyName?: 'val'): N[]; + + morris(pattern?: DFSOrderPattern, nodeOrPropertyName?: 'node'): N[]; + + morris(pattern?: DFSOrderPattern, nodeOrPropertyName?: 'count'): number[]; + + morris(pattern?: 'in' | 'pre' | 'post', nodeOrPropertyName?: NodeOrPropertyName): AbstractBinaryTreeNodeProperties + + // _setLoopType(value: LoopType): void + // + // _setVisitedId(value: BinaryTreeNodeId[]): void + // + // _setVisitedVal(value: Array): void + // + // _setVisitedNode(value: N[]): void + // + // setVisitedCount(value: number[]): void + // + // _setVisitedLeftSum(value: number[]): void + // + // _setAutoIncrementId(value: boolean): void + // + // _setMaxId(value: number): void + // + // _setIsDuplicatedVal(value: boolean): void + // + // _setRoot(v: N | null): void + // + // _setSize(v: number): void + // + // _setCount(v: number): void + // + // _resetResults(): void + + // _pushByPropertyNameStopOrNot(cur: N, result: (N | null | undefined)[], nodeProperty: BinaryTreeNodeId | N, propertyName ?: BinaryTreeNodePropertyName, onlyOne ?: boolean): void + // + // _accumulatedByPropertyName(node: N, nodeOrPropertyName ?: NodeOrPropertyName): void + // + // _getResultByPropertyName(nodeOrPropertyName ?: NodeOrPropertyName): AbstractBinaryTreeNodeProperties + + // --- end additional methods --- +} \ No newline at end of file diff --git a/src/data-structures/interfaces/abstract-graph.ts b/src/data-structures/interfaces/abstract-graph.ts index 644a840..71eb9d3 100644 --- a/src/data-structures/interfaces/abstract-graph.ts +++ b/src/data-structures/interfaces/abstract-graph.ts @@ -1,12 +1,12 @@ import {VertexId} from '../types'; -export interface IGraph { +export interface IAbstractGraph { hasVertex(vertexOrId: V | VertexId): boolean; - _getVertex(vertexOrId: VertexId | V): V | null; + // _getVertex(vertexOrId: VertexId | V): V | null; - _getVertexId(vertexOrId: V | VertexId): VertexId; + // _getVertexId(vertexOrId: V | VertexId): VertexId; createAddVertex(id: VertexId, val?: V): boolean; @@ -30,8 +30,6 @@ export interface IGraph { addEdge(edge: E): boolean; - removeEdgeBetween(src: V | VertexId, dest: V | VertexId): E | null; - removeEdge(edge: E): E | null; setEdgeWeight(srcOrId: V | VertexId, destOrId: V | VertexId, weight: number): boolean; diff --git a/src/data-structures/interfaces/avl-tree.ts b/src/data-structures/interfaces/avl-tree.ts index 693da49..709d410 100644 --- a/src/data-structures/interfaces/avl-tree.ts +++ b/src/data-structures/interfaces/avl-tree.ts @@ -1 +1,28 @@ -export {} \ No newline at end of file +import {AVLTreeNode} from '../binary-tree'; +import {IBST, IBSTNode} from './bst'; +import {BinaryTreeDeletedResult, BinaryTreeNodeId} from '../types'; + +export interface IAVLTreeNode> extends IBSTNode { + +} + +export interface IAVLTree> extends IBST { + + add(id: BinaryTreeNodeId, val: N['val'] | null, count?: number): N | null + + remove(id: BinaryTreeNodeId, isUpdateAllLeftSum?: boolean): BinaryTreeDeletedResult[] + + balanceFactor(node: N): number + + updateHeight(node: N): void + + balancePath(node: N): void + + balanceLL(A: N): void + + balanceLR(A: N): void + + balanceRR(A: N): void + + balanceRL(A: N): void +} \ No newline at end of file diff --git a/src/data-structures/interfaces/binary-tree.ts b/src/data-structures/interfaces/binary-tree.ts index c3c7e82..0ca7ff2 100644 --- a/src/data-structures/interfaces/binary-tree.ts +++ b/src/data-structures/interfaces/binary-tree.ts @@ -1,55 +1,8 @@ -import {BinaryTreeNodeId, FamilyPosition} from '../types'; +import {BinaryTreeNode} from '../binary-tree'; +import {IAbstractBinaryTree, IAbstractBinaryTreeNode} from './abstract-binary-tree'; -export interface IBinaryTreeNode> { - _createNode(id: BinaryTreeNodeId, val: T | null, count?: number): FAMILY | null; - - - get id(): BinaryTreeNodeId - - set id(v: BinaryTreeNodeId) - - - get val(): T - - set val(v: T) - - - get left(): FAMILY | null | undefined - - set left(v: FAMILY | null | undefined) - - - get right(): FAMILY | null | undefined - - set right(v: FAMILY | null | undefined) - - - get parent(): FAMILY | null | undefined - - set parent(v: FAMILY | null | undefined) - - - get familyPosition(): FamilyPosition - - set familyPosition(v: FamilyPosition) - - - get count(): number - - set count(v: number) - - - get height(): number - - set height(v: number) - - _createNode(id: BinaryTreeNodeId, val: T | null, count?: number): FAMILY | null - - swapLocation(swapNode: FAMILY): FAMILY - - clone(): FAMILY | null; +export interface IBinaryTreeNode> extends IAbstractBinaryTreeNode { } -export interface IBinaryTree> { - _createNode(id: BinaryTreeNodeId, val: N['val'] | null, count?: number): N | null +export interface IBinaryTree> extends IAbstractBinaryTree { } \ No newline at end of file diff --git a/src/data-structures/interfaces/bst.ts b/src/data-structures/interfaces/bst.ts index 693da49..bd0f125 100644 --- a/src/data-structures/interfaces/bst.ts +++ b/src/data-structures/interfaces/bst.ts @@ -1 +1,33 @@ -export {} \ No newline at end of file +import {BSTNode} from '../binary-tree'; +import {IBinaryTree, IBinaryTreeNode} from './binary-tree'; +import {BinaryTreeDeletedResult, BinaryTreeNodeId, BinaryTreeNodePropertyName, BSTComparator, CP} from '../types'; + +export interface IBSTNode> extends IBinaryTreeNode { + +} + +export interface IBST> extends IBinaryTree { + createNode(id: BinaryTreeNodeId, val: N['val'] | null, count?: number): N | null + + add(id: BinaryTreeNodeId, val: N['val'] | null, count: number): N | null + + get(nodeProperty: BinaryTreeNodeId | N, propertyName ?: BinaryTreeNodePropertyName): N | null + + lastKey(): BinaryTreeNodeId + + remove(id: BinaryTreeNodeId, ignoreCount?: boolean): BinaryTreeDeletedResult[] + + getNodes(nodeProperty: BinaryTreeNodeId | N, propertyName ?: BinaryTreeNodePropertyName, onlyOne ?: boolean): N[] + + // --- start additional functions + + lesserSum(id: BinaryTreeNodeId, propertyName ?: BinaryTreeNodePropertyName): number + + allGreaterNodesAdd(node: N, delta: number, propertyName ?: BinaryTreeNodePropertyName): boolean + + balance(): boolean + + isAVLBalanced(): boolean + + // --- end additional functions +} \ No newline at end of file diff --git a/src/data-structures/interfaces/directed-graph.ts b/src/data-structures/interfaces/directed-graph.ts index 87399c6..23e0336 100644 --- a/src/data-structures/interfaces/directed-graph.ts +++ b/src/data-structures/interfaces/directed-graph.ts @@ -1,6 +1,7 @@ import {VertexId} from '../types'; +import {IAbstractGraph} from './abstract-graph'; -export interface IDirectedGraph { +export interface IDirectedGraph extends IAbstractGraph { incomingEdgesOf(vertex: V): E[]; outgoingEdgesOf(vertex: V): E[]; @@ -12,4 +13,8 @@ export interface IDirectedGraph { getEdgeSrc(e: E): V | null; getEdgeDest(e: E): V | null; + + removeEdgeSrcToDest(srcOrId: V | VertexId, destOrId: V | VertexId): E | null; + + removeEdgesBetween(v1: V | VertexId, v2: V | VertexId): E[]; } \ No newline at end of file diff --git a/src/data-structures/interfaces/index.ts b/src/data-structures/interfaces/index.ts index cf54b0e..9508d43 100644 --- a/src/data-structures/interfaces/index.ts +++ b/src/data-structures/interfaces/index.ts @@ -1,4 +1,4 @@ -export * from './binary-tree'; +export * from './abstract-binary-tree'; export * from './bst'; export * from './avl-tree'; export * from './segment-tree'; diff --git a/src/data-structures/interfaces/rb-tree.ts b/src/data-structures/interfaces/rb-tree.ts new file mode 100644 index 0000000..82e641a --- /dev/null +++ b/src/data-structures/interfaces/rb-tree.ts @@ -0,0 +1,11 @@ +import {RBTreeNode} from '../binary-tree'; +import {IBST, IBSTNode} from './bst'; + +export interface IRBTreeNode> extends IBSTNode { + +} + +export interface IRBTree> extends IBST { + + +} \ No newline at end of file diff --git a/src/data-structures/interfaces/undirected-graph.ts b/src/data-structures/interfaces/undirected-graph.ts index 181f593..fdbcb76 100644 --- a/src/data-structures/interfaces/undirected-graph.ts +++ b/src/data-structures/interfaces/undirected-graph.ts @@ -1,3 +1,6 @@ -export interface IUNDirectedGraph { +import {VertexId} from '../types'; +import {IAbstractGraph} from './abstract-graph'; +export interface IUNDirectedGraph extends IAbstractGraph{ + removeEdgeBetween(v1: V | VertexId, v2: V | VertexId): E | null; } \ No newline at end of file diff --git a/src/data-structures/types/abstract-binary-tree.ts b/src/data-structures/types/abstract-binary-tree.ts index 894bd2d..854f6d9 100644 --- a/src/data-structures/types/abstract-binary-tree.ts +++ b/src/data-structures/types/abstract-binary-tree.ts @@ -17,12 +17,12 @@ export type DFSOrderPattern = 'in' | 'pre' | 'post'; export type BinaryTreeNodeId = number; export type BinaryTreeDeletedResult = { deleted: N | null | undefined, needBalanced: N | null }; -export type AbstractResultByProperty> = +export type AbstractBinaryTreeNodeProperty> = N['val'] | N | number | BinaryTreeNodeId; -export type AbstractResultsByProperty> = AbstractResultByProperty[]; +export type AbstractBinaryTreeNodeProperties> = AbstractBinaryTreeNodeProperty[]; export type AbstractRecursiveBinaryTreeNode = AbstractBinaryTreeNode>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> export type AbstractBinaryTreeOptions = { loopType?: LoopType, diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 5e9445b..6e2e71f 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -75,4 +75,67 @@ export const trampolineAsync = (fn: TrlAsyncFn) => { }, {cont} ) -} \ No newline at end of file +} + +// export class AutoPruneMap extends Map { +// +// private _proxySet: Set; +// get proxySet(): Set { +// return this._proxySet; +// } +// +// set proxySet(value: Set) { +// this._proxySet = value; +// } +// +// private _isEmptyArrayAllowed: boolean; +// +// get isEmptyArrayAllowed(): boolean { +// return this._isEmptyArrayAllowed; +// } +// +// set isEmptyArrayAllowed(value: boolean) { +// this._isEmptyArrayAllowed = value; +// } +// +// constructor(isEmptyArrayAllowed: boolean = false) { +// super(); +// this._isEmptyArrayAllowed = isEmptyArrayAllowed; +// this._proxySet = new Set(); +// } +// +// set(key: K, value: V): this { +// if (Array.isArray(value) && !this.proxySet.has(value)) { +// if(!this.isEmptyArrayAllowed && value.length === 0) return this; +// value = this.createArrayProxy(value, key); +// if (!this.proxySet.has(value)) this.proxySet.add(value); +// } +// super.set(key, value); +// return this; +// } +// +// private createArrayProxy(array: V & any[], key: K) { +// const that = this; +// const proxyHandler: ProxyHandler = { +// set(target: any, property: PropertyKey, value: any): boolean { +// const result = Reflect.set(target, property, value); +// that.checkAndDeleteEmptyArray(key); +// return result; +// }, +// deleteProperty(target: any, property: PropertyKey): boolean { +// const result = Reflect.deleteProperty(target, property); +// that.checkAndDeleteEmptyArray(key); +// return result; +// }, +// } +// return new Proxy(array, proxyHandler); +// } +// +// private checkAndDeleteEmptyArray(key: K): void { +// const value = this.get(key); +// +// if (Array.isArray(value) && value.length === 0) { +// super.delete(key); +// } +// } +// } \ No newline at end of file diff --git a/tests/unit/data-structures/graph/directed-graph.test.ts b/tests/unit/data-structures/graph/directed-graph.test.ts index dffc6ef..7d7bd7a 100644 --- a/tests/unit/data-structures/graph/directed-graph.test.ts +++ b/tests/unit/data-structures/graph/directed-graph.test.ts @@ -100,11 +100,11 @@ class MyEdge extends DirectedEdge { } class MyDirectedGraph, E extends MyEdge> extends DirectedGraph { - _createVertex(id: VertexId, val: V['val']): V { + createVertex(id: VertexId, val: V['val']): V { return new MyVertex(id, val) as V; } - _createEdge(src: VertexId, dest: VertexId, weight?: number, val?: E['val']): E { + createEdge(src: VertexId, dest: VertexId, weight?: number, val?: E['val']): E { return new MyEdge(src, dest, weight ?? 1, val) as E; } } @@ -171,7 +171,7 @@ describe('Inherit from DirectedGraph and perform operations', () => { myGraph.addVertex(new MyVertex(2, 'data2')); myGraph.addEdge(new MyEdge(1, 2, 10, 'edge-data1-2')); - const removedEdge = myGraph.removeEdgeBetween(1, 2); + const removedEdge = myGraph.removeEdgeSrcToDest(1, 2); const edgeAfterRemoval = myGraph.getEdge(1, 2); expect(removedEdge).toBeInstanceOf(MyEdge); @@ -246,7 +246,7 @@ describe('Inherit from DirectedGraph and perform operations test2.', () => { expect(myGraph.getEdge(2, 1)).toBeTruthy(); expect(myGraph.getEdge(1, '100')).toBeFalsy(); - myGraph.removeEdgeBetween(1, 2); + myGraph.removeEdgeSrcToDest(1, 2); expect(myGraph.getEdge(1, 2)).toBeFalsy(); myGraph.addEdge(new MyEdge(3, 1, 3, 'edge-data-3-1'));