diff --git a/.editorconfig b/.editorconfig index f709510..7396604 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,15 +1,18 @@ # Editor configuration, see http://editorconfig.org -root = true -[*] -charset = utf-8 -end_of_line = lf -indent_style = space -indent_size = 2 -insert_final_newline = true -trim_trailing_whitespace = true -[*.md] + +root=true # represents the top-level EditorConfig configuration file + +[*] # means applicable to all files +charset = utf-8 #Set the file character set to utf-8 +indent_style = space #Indent style (tab | space) +indent_size = 2 # indent size +end_of_line = lf # Control line break type (lf | cr | crlf) +trim_trailing_whitespace = true # Remove any whitespace characters at the beginning of the line +insert_final_newline = true #Always insert a new line at the end of the file + +[*.md] # Indicates that only md files apply the following rules max_line_length = off trim_trailing_whitespace = false -[*.yml] + [*.{yml,yaml}] indent_size = 2 diff --git a/CHANGELOG.md b/CHANGELOG.md index 182e92e..eea0a8b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ All notable changes to this project will be documented in this file. - [Semantic Versioning](https://semver.org/spec/v2.0.0.html) - [`auto-changelog`](https://github.com/CookPete/auto-changelog) -## [v1.38.6](https://github.com/zrwusa/data-structure-typed/compare/v1.35.0...main) (upcoming) +## [v1.38.8](https://github.com/zrwusa/data-structure-typed/compare/v1.35.0...main) (upcoming) ### Changes diff --git a/README.md b/README.md index b6a6055..fe1284f 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ import { ```html - + ``` ```js diff --git a/package-lock.json b/package-lock.json index a984c7f..33961d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "data-structure-typed", - "version": "1.38.6", + "version": "1.38.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "data-structure-typed", - "version": "1.38.6", + "version": "1.38.8", "license": "MIT", "devDependencies": { "@types/benchmark": "^2.1.3", @@ -15,17 +15,17 @@ "@typescript-eslint/eslint-plugin": "^6.7.4", "@typescript-eslint/parser": "^6.7.4", "auto-changelog": "^2.4.0", - "avl-tree-typed": "^1.38.5", + "avl-tree-typed": "^1.38.7", "benchmark": "^2.1.4", - "binary-tree-typed": "^1.38.5", - "bst-typed": "^1.38.5", + "binary-tree-typed": "^1.38.7", + "bst-typed": "^1.38.7", "dependency-cruiser": "^14.1.0", "eslint": "^8.50.0", "eslint-config-prettier": "^9.0.0", "eslint-import-resolver-alias": "^1.1.2", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.28.1", - "heap-typed": "^1.38.5", + "heap-typed": "^1.38.7", "istanbul-badges-readme": "^1.8.5", "jest": "^29.7.0", "prettier": "^3.0.3", @@ -2728,12 +2728,12 @@ } }, "node_modules/avl-tree-typed": { - "version": "1.38.5", - "resolved": "https://registry.npmjs.org/avl-tree-typed/-/avl-tree-typed-1.38.5.tgz", - "integrity": "sha512-rwVkzj8+N57YPCurFn+kmtxEd9xvE8QqYlOAkibRsEScN8E2z7cHkVlT0mxc26Q8HfLUvkqJjvEcwoLaHqYxzw==", + "version": "1.38.7", + "resolved": "https://registry.npmjs.org/avl-tree-typed/-/avl-tree-typed-1.38.7.tgz", + "integrity": "sha512-B5lOJoYI/8Y+WUI+atnN8FtKwjOZk6X91O55Qu8p6nauduOZlJvx0HtN3mmTKk0bYNqEHDNK5iyHD60Rwqx5Hw==", "dev": true, "dependencies": { - "data-structure-typed": "^1.38.4" + "data-structure-typed": "^1.38.7" } }, "node_modules/babel-jest": { @@ -2927,12 +2927,12 @@ } }, "node_modules/binary-tree-typed": { - "version": "1.38.5", - "resolved": "https://registry.npmjs.org/binary-tree-typed/-/binary-tree-typed-1.38.5.tgz", - "integrity": "sha512-ksluya1YOjzQWMJzCNWnkjw/iinYvYMQhZYLwcdhwuiSy7nlDJpSxil3dh3sc3ffZDjCDi+FtTe2TOlOKBNzHQ==", + "version": "1.38.7", + "resolved": "https://registry.npmjs.org/binary-tree-typed/-/binary-tree-typed-1.38.7.tgz", + "integrity": "sha512-Z/xh9iEg0r7WNUzRAPa/yPHJJpc3s0jgC8bioiKgoIU67wxV8Mbn5WbuF+m2oXXpYyaM4qhC+AGU43OkHss7rQ==", "dev": true, "dependencies": { - "data-structure-typed": "^1.38.4" + "data-structure-typed": "^1.38.7" } }, "node_modules/brace-expansion": { @@ -3011,12 +3011,12 @@ } }, "node_modules/bst-typed": { - "version": "1.38.5", - "resolved": "https://registry.npmjs.org/bst-typed/-/bst-typed-1.38.5.tgz", - "integrity": "sha512-JrfBhfqx9VFFQ/EMjG+CHCnEoJdrR3BZ0AGCpT2y6NbBWOdjuLghorVnvy85kiEpU06xSQewhqf3cWNz0pSrPA==", + "version": "1.38.7", + "resolved": "https://registry.npmjs.org/bst-typed/-/bst-typed-1.38.7.tgz", + "integrity": "sha512-jo8owKRnKPOAbdqR6SmvWjF2yceqN/3j736xujDum4Uh8devBLguV7m49HUv7pfkKAx8uwuuE+6b0dPQaxR4vA==", "dev": true, "dependencies": { - "data-structure-typed": "^1.38.4" + "data-structure-typed": "^1.38.7" } }, "node_modules/buffer-from": { @@ -3413,9 +3413,9 @@ } }, "node_modules/data-structure-typed": { - "version": "1.38.4", - "resolved": "https://registry.npmjs.org/data-structure-typed/-/data-structure-typed-1.38.4.tgz", - "integrity": "sha512-Yt9yjrx3Cm030z3o/6hr+AG0n+ZpWd+YpG2YiwxNwOT+hTZ6PYWt9MI+UVpiJSW/1Mrr0gchLlipU1r7l+UI/w==", + "version": "1.38.7", + "resolved": "https://registry.npmjs.org/data-structure-typed/-/data-structure-typed-1.38.7.tgz", + "integrity": "sha512-YPV3hlUFTAG93+LoW8eaMv+KS4s9PF5MfpvvUkZybuR7WxqLtamCXWE1o3TRKkYFa9MEguxcq5ZaniCdeLg8Mw==", "dev": true }, "node_modules/debug": { @@ -4771,12 +4771,12 @@ } }, "node_modules/heap-typed": { - "version": "1.38.5", - "resolved": "https://registry.npmjs.org/heap-typed/-/heap-typed-1.38.5.tgz", - "integrity": "sha512-C9LQZScfnHGbhxL6wnUJEGwfg2oqdY10a0An3t/1pSVGEN91tmZzQS10BfYf5plQgF2fYNhZJbSkiuanUA0TgQ==", + "version": "1.38.7", + "resolved": "https://registry.npmjs.org/heap-typed/-/heap-typed-1.38.7.tgz", + "integrity": "sha512-9ASCFfeKkN8iPFqgRUskah+a3RAxG4f+sbTVE8xRv4xwHpPLfwGo7gbJLkiJ5fkV+0PRN/ZXUkQPT5cI0XcbZQ==", "dev": true, "dependencies": { - "data-structure-typed": "^1.38.4" + "data-structure-typed": "^1.38.7" } }, "node_modules/html-escaper": { diff --git a/package.json b/package.json index 2d15880..de686d2 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,11 @@ { "name": "data-structure-typed", - "version": "1.38.6", + "version": "1.38.8", "description": "Data Structures of Javascript & TypeScript. Binary Tree, BST, Graph, Heap, Priority Queue, Linked List, Queue, Deque, Stack, AVL Tree, Tree Multiset, Trie, Directed Graph, Undirected Graph, Singly Linked List, Doubly Linked List, Max Heap, Max Priority Queue, Min Heap, Min Priority Queue.", "main": "dist/cjs/index.js", "module": "dist/mjs/index.js", "types": "dist/mjs/index.d.ts", - "umd:main": "dist/umd/index.global.js", + "umd:main": "dist/umd/data-structure-typed.min.js", "exports": { ".": { "import": "./dist/mjs/index.js", @@ -24,7 +24,6 @@ "lint:test": "eslint --fix 'test/**/*.{js,ts}'", "lint": "npm run lint:src && npm run lint:test", "format:src": "prettier --write 'src/**/*.{js,ts}'", - "format:specific": "prettier --write 'src/data-structures/binary-tree/bst.ts'", "format:test": "prettier --write 'test/**/*.{js,ts}'", "format": "npm run format:src && npm run format:test", "fix:src": "npm run lint:src && npm run format:src", @@ -62,17 +61,17 @@ "@typescript-eslint/eslint-plugin": "^6.7.4", "@typescript-eslint/parser": "^6.7.4", "auto-changelog": "^2.4.0", - "avl-tree-typed": "^1.38.5", + "avl-tree-typed": "^1.38.7", "benchmark": "^2.1.4", - "binary-tree-typed": "^1.38.5", - "bst-typed": "^1.38.5", + "binary-tree-typed": "^1.38.7", + "bst-typed": "^1.38.7", "dependency-cruiser": "^14.1.0", "eslint": "^8.50.0", "eslint-config-prettier": "^9.0.0", "eslint-import-resolver-alias": "^1.1.2", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.28.1", - "heap-typed": "^1.38.5", + "heap-typed": "^1.38.7", "istanbul-badges-readme": "^1.8.5", "jest": "^29.7.0", "prettier": "^3.0.3", diff --git a/src/data-structures/binary-tree/avl-tree.ts b/src/data-structures/binary-tree/avl-tree.ts index b22c120..f9bcdfd 100644 --- a/src/data-structures/binary-tree/avl-tree.ts +++ b/src/data-structures/binary-tree/avl-tree.ts @@ -19,7 +19,9 @@ export class AVLTreeNode = AVLTreeNodeNeste } } -export class AVLTree = AVLTreeNode> extends BST implements IBinaryTree { +export class AVLTree = AVLTreeNode>> + extends BST + implements IBinaryTree { /** * This is a constructor function for an AVL tree data structure in TypeScript. * @param {AVLTreeOptions} [options] - The `options` parameter is an optional object that can be passed to the diff --git a/src/data-structures/binary-tree/binary-tree.ts b/src/data-structures/binary-tree/binary-tree.ts index 0c897b3..fe72d9a 100644 --- a/src/data-structures/binary-tree/binary-tree.ts +++ b/src/data-structures/binary-tree/binary-tree.ts @@ -115,7 +115,7 @@ export class BinaryTreeNode = BinaryTree * Represents a binary tree data structure. * @template N - The type of the binary tree's nodes. */ -export class BinaryTree = BinaryTreeNode> implements IBinaryTree { +export class BinaryTree = BinaryTreeNode>> implements IBinaryTree { /** * Creates a new instance of BinaryTree. * @param {BinaryTreeOptions} [options] - The options for the binary tree. @@ -930,10 +930,6 @@ export class BinaryTree = BinaryTreeNode * @param callback - The `callback` parameter is a function that will be called for each node in the * breadth-first search. It takes a node of type `N` as its argument and returns a value of type * `BFSCallbackReturn`. The default value for this parameter is `this._defaultCallbackByKey - * @param {boolean} [withLevel=false] - The `withLevel` parameter is a boolean flag that determines - * whether to include the level of each node in the callback function. If `withLevel` is set - * to `true`, the level of each node will be passed as an argument to the callback function. If - * `withLevel` is * @param {N | null} beginRoot - The `beginRoot` parameter is the starting node for the breadth-first * search. It determines from which node the search will begin. If `beginRoot` is `null`, the search * will not be performed and an empty array will be returned. @@ -943,7 +939,6 @@ export class BinaryTree = BinaryTreeNode */ bfs = BFSCallback>( callback: C = this._defaultCallbackByKey as C, - withLevel: boolean = false, beginRoot: N | null = this.root, iterationType = this.iterationType ): ReturnType[] { @@ -951,9 +946,67 @@ export class BinaryTree = BinaryTreeNode const ans: BFSCallbackReturn[] = []; + if (iterationType === IterationType.RECURSIVE) { + const queue = new Queue([beginRoot]); + + function traverse(level: number) { + if (queue.size === 0) return; + + const current = queue.shift()!; + ans.push(callback(current)); + + if (current.left) queue.push(current.left); + if (current.right) queue.push(current.right); + + traverse(level + 1); + } + + traverse(0); + } else { + const queue = new Queue([beginRoot]); + while (queue.size > 0) { + const levelSize = queue.size; + + for (let i = 0; i < levelSize; i++) { + const current = queue.shift()!; + ans.push(callback(current)); + + if (current.left) queue.push(current.left); + if (current.right) queue.push(current.right); + } + + } + } + return ans; + } + + /** + * The `listLevels` function takes a binary tree node and a callback function, and returns an array + * of arrays representing the levels of the tree. + * @param {C} callback - The `callback` parameter is a function that will be called on each node in + * the tree. It takes a node as input and returns a value. The return type of the callback function + * is determined by the generic type `C`. + * @param {N | null} beginRoot - The `beginRoot` parameter represents the starting node of the binary tree + * traversal. It can be any node in the binary tree. If no node is provided, the traversal will start + * from the root node of the binary tree. + * @param iterationType - The `iterationType` parameter determines whether the tree traversal is done + * recursively or iteratively. It can have two possible values: + * @returns The function `listLevels` returns an array of arrays, where each inner array represents a + * level in a binary tree. Each inner array contains the return type of the provided callback + * function `C` applied to the nodes at that level. + */ + listLevels = BFSCallback>( + callback: C = this._defaultCallbackByKey as C, + beginRoot: N | null = this.root, + iterationType = this.iterationType + ): ReturnType[][] { + if (!beginRoot) return []; + const levelsNodes: ReturnType[][] = []; + if (iterationType === IterationType.RECURSIVE) { const _recursive = (node: N, level: number) => { - callback && ans.push(callback(node, withLevel ? level : undefined)); + if (!levelsNodes[level]) levelsNodes[level] = []; + levelsNodes[level].push(callback(node)); if (node.left) _recursive(node.left, level + 1); if (node.right) _recursive(node.right, level + 1); }; @@ -966,12 +1019,14 @@ export class BinaryTree = BinaryTreeNode const head = stack.pop()!; const [node, level] = head; - callback && ans.push(callback(node, withLevel ? level : undefined)); + if (!levelsNodes[level]) levelsNodes[level] = []; + levelsNodes[level].push(callback(node)); if (node.right) stack.push([node.right, level + 1]); if (node.left) stack.push([node.left, level + 1]); } } - return ans; + + return levelsNodes; } /** diff --git a/src/data-structures/binary-tree/bst.ts b/src/data-structures/binary-tree/bst.ts index 9c2a22d..446279c 100644 --- a/src/data-structures/binary-tree/bst.ts +++ b/src/data-structures/binary-tree/bst.ts @@ -24,7 +24,7 @@ export class BSTNode = BSTNodeNested> extend } } -export class BST = BSTNode> extends BinaryTree implements IBinaryTree { +export class BST = BSTNode>> extends BinaryTree implements IBinaryTree { /** * The constructor function initializes a binary search tree object with an optional comparator * function. diff --git a/src/data-structures/binary-tree/rb-tree.ts b/src/data-structures/binary-tree/rb-tree.ts index b8ef6db..16b9751 100644 --- a/src/data-structures/binary-tree/rb-tree.ts +++ b/src/data-structures/binary-tree/rb-tree.ts @@ -2,10 +2,7 @@ import {BinaryTreeNodeKey, RBColor, RBTreeNodeNested, RBTreeOptions} from '../.. import {IBinaryTree} from '../../interfaces'; import {BST, BSTNode} from './bst'; -export class RBTreeNode = RBTreeNodeNested> extends BSTNode< - V, - N -> { +export class RBTreeNode = RBTreeNodeNested> extends BSTNode { constructor(key: BinaryTreeNodeKey, val?: V) { super(key, val); this._color = RBColor.RED; @@ -22,7 +19,7 @@ export class RBTreeNode = RBTreeNodeNested = RBTreeNode> extends BST implements IBinaryTree { +export class RBTree = RBTreeNode>> extends BST implements IBinaryTree { constructor(options?: RBTreeOptions) { super(options); } diff --git a/src/data-structures/binary-tree/tree-multiset.ts b/src/data-structures/binary-tree/tree-multiset.ts index 3cc76f4..f07d298 100644 --- a/src/data-structures/binary-tree/tree-multiset.ts +++ b/src/data-structures/binary-tree/tree-multiset.ts @@ -35,7 +35,7 @@ export class TreeMultisetNode< /** * The only distinction between a TreeMultiset and a AVLTree lies in the ability of the former to store duplicate nodes through the utilization of counters. */ -export class TreeMultiset = TreeMultisetNode> +export class TreeMultiset = TreeMultisetNode>> extends AVLTree implements IBinaryTree { /** @@ -191,10 +191,7 @@ export class TreeMultiset = TreeMultis * each key or node. * @returns The function `addMany` returns an array of `N`, `null`, or `undefined` values. */ - override addMany( - keysOrNodes: (BinaryTreeNodeKey | null)[] | (N | null)[], - data?: V[] - ): (N | null | undefined)[] { + override addMany(keysOrNodes: (BinaryTreeNodeKey | null)[] | (N | null)[], data?: V[]): (N | null | undefined)[] { const inserted: (N | null | undefined)[] = []; for (let i = 0; i < keysOrNodes.length; i++) { diff --git a/test/integration/bst.test.ts b/test/integration/bst.test.ts index a482a37..35a6061 100644 --- a/test/integration/bst.test.ts +++ b/test/integration/bst.test.ts @@ -183,7 +183,7 @@ describe('Individual package BST operations test', () => { }); it('should perform various operations on a Binary Search Tree with object values', () => { - const objBST = new BST>(); + const objBST = new BST<{ key: number; keyA: number }>(); expect(objBST).toBeInstanceOf(BST); objBST.add(11, {key: 11, keyA: 11}); objBST.add(3, {key: 3, keyA: 3}); diff --git a/test/integration/index.html b/test/integration/index.html index 0fab945..8c85112 100644 --- a/test/integration/index.html +++ b/test/integration/index.html @@ -3,7 +3,7 @@ CDN Test - +
diff --git a/test/unit/data-structures/binary-tree/avl-tree.test.ts b/test/unit/data-structures/binary-tree/avl-tree.test.ts index 01c0e16..5c99c38 100644 --- a/test/unit/data-structures/binary-tree/avl-tree.test.ts +++ b/test/unit/data-structures/binary-tree/avl-tree.test.ts @@ -110,7 +110,7 @@ describe('AVL Tree Test', () => { }); describe('AVLTree APIs test', () => { - const avl = new AVLTree<{id: number; text: string}>(); + const avl = new AVLTree<{ id: number; text: string }>(); beforeEach(() => { avl.clear(); }); @@ -123,7 +123,7 @@ describe('AVLTree APIs test', () => { avl.add(node3); avl.add(node3, {id: 3, text: 'text33'}); - const bfsRes = avl.bfs(node => node.key, false); + const bfsRes = avl.bfs(node => node.key); expect(bfsRes[0]).toBe(2); }); }); diff --git a/test/unit/data-structures/binary-tree/binary-tree.test.ts b/test/unit/data-structures/binary-tree/binary-tree.test.ts index 49d87d8..0e9ce66 100644 --- a/test/unit/data-structures/binary-tree/binary-tree.test.ts +++ b/test/unit/data-structures/binary-tree/binary-tree.test.ts @@ -1,4 +1,8 @@ -import {AVLTree, AVLTreeNode, BinaryTree, BinaryTreeNode} from '../../../../src'; +import {AVLTree, AVLTreeNode, BinaryTree, BinaryTreeNode, IterationType} from '../../../../src'; +import {isDebugTest} from "../../../config"; + +const isDebug = isDebugTest; +// const isDebug = true; describe('BinaryTreeNode', () => { it('should create an instance of BinaryTreeNode', () => { @@ -196,7 +200,7 @@ describe('BinaryTree Morris Traversal', () => { }); describe('BinaryTree APIs test', () => { - const avl = new AVLTree<{id: number; text: string}>(); + const avl = new AVLTree<{ id: number; text: string }>(); beforeEach(() => { avl.clear(); }); @@ -213,3 +217,20 @@ describe('BinaryTree APIs test', () => { expect(bfsRes[0]?.key).toBe(2); }); }); + +describe('BinaryTree traversals', () => { + const tree = new BinaryTree(); + + const arr = [35, 20, 40, 15, 29, null, 50, null, 16, 28, 30, 45, 55]; + tree.refill(arr); + expect(tree.dfs(node => node.key, 'pre')).toEqual([35, 20, 15, 16, 29, 28, 30, 40, 50, 45, 55]); + expect(tree.dfs(node => node.key, 'in')).toEqual([15, 16, 20, 28, 29, 30, 35, 40, 45, 50, 55]); + expect(tree.dfs(node => node.key, 'post')).toEqual([16, 15, 28, 30, 29, 20, 45, 55, 50, 40, 35]); + expect(tree.bfs(node => node.key, tree.root, IterationType.RECURSIVE)).toEqual([35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55]); + expect(tree.bfs(node => node.key, tree.root, IterationType.ITERATIVE)).toEqual([35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55]); + + const levels = tree.listLevels(node => node.key); + expect(levels).toEqual([[35], [20, 40], [15, 29, 50], [16, 28, 30, 45, 55]]); + isDebug && console.log(levels); + +}) diff --git a/test/unit/data-structures/binary-tree/bst.test.ts b/test/unit/data-structures/binary-tree/bst.test.ts index 872223f..7b0441c 100644 --- a/test/unit/data-structures/binary-tree/bst.test.ts +++ b/test/unit/data-structures/binary-tree/bst.test.ts @@ -189,7 +189,7 @@ describe('BST operations test', () => { }); it('should perform various operations on a Binary Search Tree with object values', () => { - const objBST = new BST<{key: number; keyA: number}>(); + const objBST = new BST<{ key: number; keyA: number }>(); expect(objBST).toBeInstanceOf(BST); objBST.add(11, {key: 11, keyA: 11}); objBST.add(3, {key: 3, keyA: 3}); @@ -260,7 +260,7 @@ describe('BST operations test', () => { objBST.perfectlyBalance(); expect(objBST.isPerfectlyBalanced()).toBe(true); - const bfsNodesAfterBalanced: BSTNode<{key: number; keyA: number}>[] = []; + const bfsNodesAfterBalanced: BSTNode<{ key: number; keyA: number }>[] = []; objBST.bfs(node => bfsNodesAfterBalanced.push(node)); expect(bfsNodesAfterBalanced[0].key).toBe(8); expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16); @@ -385,7 +385,7 @@ describe('BST operations test', () => { expect(bfsIDs[1]).toBe(12); expect(bfsIDs[2]).toBe(16); - const bfsNodes: BSTNode<{key: number; keyA: number}>[] = []; + const bfsNodes: BSTNode<{ key: number; keyA: number }>[] = []; objBST.bfs(node => bfsNodes.push(node)); expect(bfsNodes[0].key).toBe(2); expect(bfsNodes[1].key).toBe(12); @@ -435,13 +435,7 @@ describe('BST Performance test', function () { bst.addMany(nodes); isDebug && console.log('---add', performance.now() - start); const startL = performance.now(); - const arr: number[][] = []; - bst.bfs((node, level) => { - if (level !== undefined) { - if (!arr[level]) arr[level] = []; - arr[level].push(node.key); - } - }, true); + const arr: number[][] = bst.listLevels((node) => node.key); isDebug && console.log('---listLevels', arr); isDebug && console.log('---listLevels', performance.now() - startL); }); diff --git a/test/unit/data-structures/binary-tree/overall.test.ts b/test/unit/data-structures/binary-tree/overall.test.ts index e4301b1..04dff37 100644 --- a/test/unit/data-structures/binary-tree/overall.test.ts +++ b/test/unit/data-structures/binary-tree/overall.test.ts @@ -1,4 +1,4 @@ -import {AVLTree, BST, BSTNode} from '../../../../src'; +import {AVLTree, BST} from '../../../../src'; describe('Overall BinaryTree Test', () => { it('should perform various operations on BinaryTree', () => { @@ -6,30 +6,30 @@ describe('Overall BinaryTree Test', () => { bst.add(11); bst.add(3); bst.addMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5], undefined, false); - bst.size === 16; // true - expect(bst.size).toBe(16); // true - bst.has(6); // true - expect(bst.has(6)).toBe(true); // true - bst.getHeight(6) === 2; // true - bst.getHeight() === 5; // true - bst.getDepth(6) === 3; // true - expect(bst.getHeight(6)).toBe(2); // true - expect(bst.getHeight()).toBe(5); // true - expect(bst.getDepth(6)).toBe(3); // true + bst.size === 16; // true + expect(bst.size).toBe(16); // true + bst.has(6); // true + expect(bst.has(6)).toBe(true); // true + bst.getHeight(6) === 2; // true + bst.getHeight() === 5; // true + bst.getDepth(6) === 3; // true + expect(bst.getHeight(6)).toBe(2); // true + expect(bst.getHeight()).toBe(5); // true + expect(bst.getDepth(6)).toBe(3); // true const leftMost = bst.getLeftMost(); - leftMost?.key === 1; // true + leftMost?.key === 1; // true expect(leftMost?.key).toBe(1); bst.delete(6); - bst.get(6); // null + bst.get(6); // null expect(bst.get(6)).toBeNull(); - bst.isAVLBalanced(); // true or false + bst.isAVLBalanced(); // true or false expect(bst.isAVLBalanced()).toBe(true); const bfsIDs: number[] = []; bst.bfs(node => bfsIDs.push(node.key)); - bfsIDs[0] === 11; // true + bfsIDs[0] === 11; // true expect(bfsIDs[0]).toBe(11); - const objBST = new BST<{key: number; keyA: number}>(); + const objBST = new BST<{ key: number; keyA: number }>(); objBST.add(11, {key: 11, keyA: 11}); objBST.add(3, {key: 3, keyA: 3}); @@ -57,10 +57,10 @@ describe('Overall BinaryTree Test', () => { const avlTree = new AVLTree(); avlTree.addMany([11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5]); - avlTree.isAVLBalanced(); // true - expect(avlTree.isAVLBalanced()).toBe(true); // true + avlTree.isAVLBalanced(); // true + expect(avlTree.isAVLBalanced()).toBe(true); // true avlTree.delete(10); - avlTree.isAVLBalanced(); // true - expect(avlTree.isAVLBalanced()).toBe(true); // true + avlTree.isAVLBalanced(); // true + expect(avlTree.isAVLBalanced()).toBe(true); // true }); }); diff --git a/test/unit/data-structures/binary-tree/tree-multiset.test.ts b/test/unit/data-structures/binary-tree/tree-multiset.test.ts index 795ce47..5e25bde 100644 --- a/test/unit/data-structures/binary-tree/tree-multiset.test.ts +++ b/test/unit/data-structures/binary-tree/tree-multiset.test.ts @@ -206,7 +206,7 @@ describe('TreeMultiset operations test', () => { }); it('should perform various operations on a Binary Search Tree with object values', () => { - const objTreeMultiset = new TreeMultiset<{key: number; keyA: number}>(); + const objTreeMultiset = new TreeMultiset<{ key: number; keyA: number }>(); expect(objTreeMultiset).toBeInstanceOf(TreeMultiset); objTreeMultiset.add(11, {key: 11, keyA: 11}); objTreeMultiset.add(3, {key: 3, keyA: 3}); @@ -481,7 +481,7 @@ describe('TreeMultiset Performance test', function () { } isDebug && console.log('---add', performance.now() - start); const startL = performance.now(); - treeMS.lesserOrGreaterTraverse((node: TreeMultisetNode) => (node.count += 1), CP.lt, inputSize / 2); + treeMS.lesserOrGreaterTraverse((node) => (node.count += 1), CP.lt, inputSize / 2); isDebug && console.log('---lesserOrGreaterTraverse', performance.now() - startL); }); }); diff --git a/test/unit/data-structures/heap/heap.test.ts b/test/unit/data-structures/heap/heap.test.ts index 8745402..14c54cf 100644 --- a/test/unit/data-structures/heap/heap.test.ts +++ b/test/unit/data-structures/heap/heap.test.ts @@ -22,7 +22,7 @@ describe('Heap Operation Test', () => { }); it('should object heap work well', function () { - const minHeap = new MinHeap<{a: string; key: number}>((a, b) => a.key - b.key); + const minHeap = new MinHeap<{ a: string; key: number }>((a, b) => a.key - b.key); minHeap.add({key: 1, a: 'a1'}); minHeap.add({key: 6, a: 'a6'}); minHeap.add({key: 2, a: 'a2'}); @@ -37,7 +37,7 @@ describe('Heap Operation Test', () => { i++; } - const maxHeap = new MaxHeap<{key: number; a: string}>((a, b) => b.key - a.key); + const maxHeap = new MaxHeap<{ key: number; a: string }>((a, b) => b.key - a.key); maxHeap.add({key: 1, a: 'a1'}); maxHeap.add({key: 6, a: 'a6'}); maxHeap.add({key: 5, a: 'a5'}); diff --git a/test/unit/data-structures/linked-list/doubly-linked-list.test.ts b/test/unit/data-structures/linked-list/doubly-linked-list.test.ts index eab2ad5..0838337 100644 --- a/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +++ b/test/unit/data-structures/linked-list/doubly-linked-list.test.ts @@ -3,7 +3,7 @@ import {bigO, magnitude} from '../../../utils'; describe('DoublyLinkedList Operation Test', () => { let list: DoublyLinkedList; - let objectList: DoublyLinkedList<{keyA: number}>; + let objectList: DoublyLinkedList<{ keyA: number }>; beforeEach(() => { list = new DoublyLinkedList(); diff --git a/test/unit/data-structures/linked-list/singly-linked-list.test.ts b/test/unit/data-structures/linked-list/singly-linked-list.test.ts index 74a3de8..092b2e6 100644 --- a/test/unit/data-structures/linked-list/singly-linked-list.test.ts +++ b/test/unit/data-structures/linked-list/singly-linked-list.test.ts @@ -3,10 +3,10 @@ import {bigO, magnitude} from '../../../utils'; describe('SinglyLinkedList Operation Test', () => { let list: SinglyLinkedList; - let objectList: SinglyLinkedList<{keyA: number}>; + let objectList: SinglyLinkedList<{ keyA: number }>; beforeEach(() => { list = new SinglyLinkedList(); - objectList = new SinglyLinkedList<{keyA: number}>(); + objectList = new SinglyLinkedList<{ keyA: number }>(); }); describe('push', () => { diff --git a/test/unit/data-structures/priority-queue/max-priority-queue.test.ts b/test/unit/data-structures/priority-queue/max-priority-queue.test.ts index f8a63bc..f389309 100644 --- a/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +++ b/test/unit/data-structures/priority-queue/max-priority-queue.test.ts @@ -17,7 +17,7 @@ describe('MaxPriorityQueue Operation Test', () => { }); it('should add elements and maintain heap property in a object MaxPriorityQueue', () => { - const priorityQueue = new MaxPriorityQueue<{keyA: number}>((a, b) => b.keyA - a.keyA); + const priorityQueue = new MaxPriorityQueue<{ keyA: number }>((a, b) => b.keyA - a.keyA); priorityQueue.refill([{keyA: 5}, {keyA: 3}, {keyA: 1}]); priorityQueue.add({keyA: 7}); @@ -64,7 +64,7 @@ describe('MaxPriorityQueue Operation Test', () => { it('should correctly heapify an object array', () => { const nodes = [{keyA: 5}, {keyA: 3}, {keyA: 7}, {keyA: 1}]; - const maxPQ = MaxPriorityQueue.heapify<{keyA: number}>(nodes, (a, b) => b.keyA - a.keyA); + const maxPQ = MaxPriorityQueue.heapify<{ keyA: number }>(nodes, (a, b) => b.keyA - a.keyA); expect(maxPQ.poll()?.keyA).toBe(7); expect(maxPQ.poll()?.keyA).toBe(5); diff --git a/test/utils/big-o.ts b/test/utils/big-o.ts index 43d7eca..cc9fc86 100644 --- a/test/utils/big-o.ts +++ b/test/utils/big-o.ts @@ -26,7 +26,7 @@ export const bigO = { function findPotentialN(input: any): number { let longestArray: any[] = []; - let mostProperties: {[key: string]: any} = {}; + let mostProperties: { [key: string]: any } = {}; function recurse(obj: any) { if (Array.isArray(obj)) { diff --git a/tsup.config.js b/tsup.config.js index dd1aa90..fe37d02 100644 --- a/tsup.config.js +++ b/tsup.config.js @@ -1,11 +1,18 @@ export default [{ - entry: ['src/index.ts'], + entryPoints: { + "data-structure-typed": "src/index.ts" + }, format: ["iife"], clean: true, sourcemap: true, minify: true, - outDir: 'dist/umd', - globalName: 'dataStructureTyped', + outDir: "dist/umd", + globalName: "dataStructureTyped", platform: "browser", - bundle: true + bundle: true, + outExtension() { + return { + js: `.min.js`, + } + }, }];