UNPKG

typescript-generic-datastructures

Version:
1 lines 28.1 kB
{"version":3,"sources":["webpack://typescript-generic-datastructures/webpack/universalModuleDefinition","webpack://typescript-generic-datastructures/webpack/bootstrap","webpack://typescript-generic-datastructures/./src/data-structures/Graph/Graph.ts","webpack://typescript-generic-datastructures/./src/data-structures/Graph/GraphEdge.ts","webpack://typescript-generic-datastructures/./src/data-structures/LinkedList/LinkedListNode.ts","webpack://typescript-generic-datastructures/./src/utilities/Comparator.ts","webpack://typescript-generic-datastructures/./src/data-structures/LinkedList/LinkedList.ts","webpack://typescript-generic-datastructures/./src/data-structures/Graph/GraphVertex.ts","webpack://typescript-generic-datastructures/./src/index.ts"],"names":["root","factory","exports","module","define","amd","this","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Graph","isDirected","vertices","edges","newVertex","getKey","vertexKey","vertex","getNeighbors","values","edge","startVertex","getVertexByKey","endVertex","addVertex","Error","addEdge","deleteEdge","findEdge","getAllEdges","forEach","reverse","verticesIndices","getAllVertices","index","getVerticesIndices","adjacencyMatrix","Array","length","fill","map","Infinity","vertexIndex","neighbor","neighborIndex","keys","toString","GraphEdge","keyExtractor","startVertexKey","endVertexKey","tmp","LinkedListNode","next","callback","Comparator","compareFunction","compare","defaultCompareFunction","a","b","valueA","valueB","lessThan","equal","greaterThan","compareOriginal","LinkedList","comparatorOptions","head","tail","newNode","deletedNode","currentNode","undefined","deletedTail","deletedHead","append","nodes","push","toArray","node","currNode","prevNode","nextNode","GraphVertex","edgeA","edgeB","linkedListNode","requiredEdge","find","getEdges"],"mappings":"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","file":"typescript-generic-datastructures.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"typescript-generic-datastructures\"] = factory();\n\telse\n\t\troot[\"typescript-generic-datastructures\"] = factory();\n})(this, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","import { GraphVertex } from './GraphVertex';\nimport { GraphEdge } from './GraphEdge';\n\nexport class Graph<TVertex, TEdge> {\n vertices: Record<string | number, GraphVertex<TVertex, TEdge>>;\n edges: Record<string, GraphEdge<TVertex, TEdge>>;\n constructor(public isDirected = false) {\n this.vertices = {};\n this.edges = {};\n }\n\n addVertex(newVertex: GraphVertex<TVertex, TEdge>) {\n this.vertices[newVertex.getKey()] = newVertex;\n\n return this;\n }\n\n getVertexByKey(vertexKey: string | number) {\n return this.vertices[vertexKey];\n }\n\n getNeighbors(vertex: GraphVertex<TVertex, TEdge>) {\n return vertex.getNeighbors();\n }\n\n getAllVertices() {\n return Object.values(this.vertices);\n }\n\n getAllEdges() {\n return Object.values(this.edges);\n }\n\n addEdge(edge: GraphEdge<TVertex, TEdge>) {\n // Try to find and end start vertices.\n let startVertex = this.getVertexByKey(edge.startVertex.getKey());\n let endVertex = this.getVertexByKey(edge.endVertex.getKey());\n\n // Insert start vertex if it wasn't inserted.\n if (!startVertex) {\n this.addVertex(edge.startVertex);\n startVertex = this.getVertexByKey(edge.startVertex.getKey());\n }\n\n // Insert end vertex if it wasn't inserted.\n if (!endVertex) {\n this.addVertex(edge.endVertex);\n endVertex = this.getVertexByKey(edge.endVertex.getKey());\n }\n\n // Check if edge has been already added.\n if (this.edges[edge.getKey()]) {\n throw new Error('Edge has already been added before');\n } else {\n this.edges[edge.getKey()] = edge;\n }\n\n // Add edge to the vertices.\n if (this.isDirected) {\n // If graph IS directed then add the edge only to start vertex.\n startVertex.addEdge(edge);\n } else {\n // If graph ISN'T directed then add the edge to both vertices.\n startVertex.addEdge(edge);\n endVertex.addEdge(edge);\n }\n\n return this;\n }\n\n deleteEdge(edge: GraphEdge<TVertex, TEdge>) {\n // Delete edge from the list of edges.\n if (this.edges[edge.getKey()]) {\n delete this.edges[edge.getKey()];\n } else {\n throw new Error('Edge not found in graph');\n }\n\n // Try to find and end start vertices and delete edge from them.\n const startVertex = this.getVertexByKey(edge.startVertex.getKey());\n const endVertex = this.getVertexByKey(edge.endVertex.getKey());\n\n startVertex.deleteEdge(edge);\n endVertex.deleteEdge(edge);\n }\n\n findEdge(startVertex: GraphVertex<TVertex, TEdge>, endVertex: GraphVertex<TVertex, TEdge>) {\n const vertex = this.getVertexByKey(startVertex.getKey());\n\n if (!vertex) {\n return null;\n }\n\n return vertex.findEdge(endVertex);\n }\n\n // getEdgeValue() {\n // return this.getAllEdges().reduce((weight, graphEdge) => {\n // return weight + graphEdge.weight;\n // }, 0);\n // }\n\n reverse() {\n this.getAllEdges().forEach(edge => {\n // Delete straight edge from graph and from vertices.\n this.deleteEdge(edge);\n\n // Reverse the edge.\n edge.reverse();\n\n // Add reversed edge back to the graph and its vertices.\n this.addEdge(edge);\n });\n\n return this;\n }\n\n getVerticesIndices() {\n const verticesIndices: Record<string | number, number> = {};\n this.getAllVertices().forEach((vertex, index) => {\n verticesIndices[vertex.getKey()] = index;\n });\n\n return verticesIndices;\n }\n\n getAdjacencyMatrix() {\n const vertices = this.getAllVertices();\n const verticesIndices = this.getVerticesIndices();\n\n // Init matrix with infinities meaning that there is no ways of\n // getting from one vertex to another yet.\n const adjacencyMatrix = Array(vertices.length)\n .fill(null)\n .map(() => {\n return Array(vertices.length).fill(Infinity);\n });\n\n // Fill the columns.\n vertices.forEach((vertex, vertexIndex) => {\n vertex.getNeighbors().forEach(neighbor => {\n const neighborIndex = verticesIndices[neighbor.getKey()];\n adjacencyMatrix[vertexIndex][neighborIndex] = this.findEdge(vertex, neighbor)?.value;\n });\n });\n\n return adjacencyMatrix;\n }\n\n toString() {\n return Object.keys(this.vertices).toString();\n }\n}\n","import { GraphVertex } from './GraphVertex';\nexport type EdgeKeyExtractor<T> = (edge: T) => string | number;\n\nexport class GraphEdge<TVertex, TEdge> {\n constructor(\n public startVertex: GraphVertex<TVertex, TEdge>,\n public endVertex: GraphVertex<TVertex, TEdge>,\n public value: TEdge,\n private keyExtractor?: EdgeKeyExtractor<GraphEdge<TVertex, TEdge>>\n ) {}\n\n getKey() {\n if (!this.keyExtractor) {\n const startVertexKey = this.startVertex.getKey();\n const endVertexKey = this.endVertex.getKey();\n\n return `${startVertexKey}_${endVertexKey}`;\n } else {\n return this.keyExtractor(this);\n }\n }\n\n reverse() {\n const tmp = this.startVertex;\n this.startVertex = this.endVertex;\n this.endVertex = tmp;\n\n return this;\n }\n\n toString() {\n return this.getKey();\n }\n}\n","import { ToStringCallback } from '../../utilities/types';\n\nexport class LinkedListNode<T> {\n value: T;\n next: LinkedListNode<T> | null;\n constructor(value: T, next: LinkedListNode<T> | null = null) {\n this.value = value;\n this.next = next;\n }\n\n toString(callback: ToStringCallback<T>) {\n return callback ? callback(this.value) : `${this.value}`;\n }\n}\n","export type CompareFunction<T> = (a: T, b: T) => 0 | 1 | -1;\nexport type ComparatorKeyExtractor<T> = (a: T) => any;\nexport interface ComparatorOptions<T> {\n compareFunction?: CompareFunction<T>;\n keyExtractor?: ComparatorKeyExtractor<T>;\n}\nexport class Comparator<T> {\n compare: CompareFunction<T>;\n constructor({ compareFunction, keyExtractor }: ComparatorOptions<T>) {\n if (compareFunction) {\n this.compare = compareFunction;\n } else if (keyExtractor) {\n this.compare = Comparator.defaultCompareFunction<T>(keyExtractor);\n } else {\n throw new Error('Either compareFunction or keyExtractor parameter should be defined');\n }\n }\n\n static defaultCompareFunction<T>(keyExtractor: ComparatorKeyExtractor<T>) {\n return (a: T, b: T) => {\n const valueA = keyExtractor(a);\n const valueB = keyExtractor(b);\n if (valueA === valueB) {\n return 0;\n }\n\n return valueA < valueB ? -1 : 1;\n };\n }\n\n equal(a: T, b: T) {\n return this.compare(a, b) === 0;\n }\n\n lessThan(a: T, b: T) {\n return this.compare(a, b) < 0;\n }\n\n greaterThan(a: T, b: T) {\n return this.compare(a, b) > 0;\n }\n\n lessThanOrEqual(a: T, b: T) {\n return this.lessThan(a, b) || this.equal(a, b);\n }\n\n greaterThanOrEqual(a: T, b: T) {\n return this.greaterThan(a, b) || this.equal(a, b);\n }\n\n reverse() {\n const compareOriginal = this.compare;\n this.compare = (a: T, b: T) => compareOriginal(b, a);\n }\n}\n","import { LinkedListNode } from './LinkedListNode';\nimport { Comparator, ComparatorOptions } from '../../utilities/Comparator';\nimport { ToStringCallback } from '../../utilities/types';\n\nexport class LinkedList<T> {\n head: LinkedListNode<T> | null;\n tail: LinkedListNode<T> | null;\n compare: Comparator<T>;\n constructor(comparatorOptions: ComparatorOptions<T>) {\n this.head = null;\n this.tail = null;\n this.compare = new Comparator(comparatorOptions);\n }\n\n prepend(value: T) {\n // Make new node to be a head.\n const newNode = new LinkedListNode(value, this.head);\n this.head = newNode;\n\n // If there is no tail yet let's make new node a tail.\n if (!this.tail) {\n this.tail = newNode;\n }\n\n return this;\n }\n\n append(value: T) {\n const newNode = new LinkedListNode(value);\n\n // If there is no head yet let's make new node a head.\n if (!this.head) {\n this.head = newNode;\n this.tail = newNode;\n\n return this;\n }\n\n // Attach new node to the end of linked list.\n if (this.tail?.next) {\n this.tail.next = newNode;\n }\n\n this.tail = newNode;\n\n return this;\n }\n\n delete(value: T) {\n if (!this.head) {\n return null;\n }\n\n let deletedNode = null;\n\n // If the head must be deleted then make next node that is differ\n // from the head to be a new head.\n while (this.head && this.compare.equal(this.head.value, value)) {\n deletedNode = this.head;\n this.head = this.head.next;\n }\n\n let currentNode = this.head;\n\n if (currentNode !== null) {\n // If next node must be deleted then make next node to be a next next one.\n while (currentNode.next) {\n if (this.compare.equal(currentNode.next.value, value)) {\n deletedNode = currentNode.next;\n currentNode.next = currentNode.next.next;\n } else {\n currentNode = currentNode.next;\n }\n }\n }\n\n // Check if tail must be deleted.\n if (this.tail && this.compare.equal(this.tail.value, value)) {\n this.tail = currentNode;\n }\n\n return deletedNode;\n }\n\n find({ value = undefined, callback = undefined }: { value?: T; callback?: (value: T) => any }) {\n if (!this.head) {\n return null;\n }\n\n let currentNode: LinkedListNode<T> | null = this.head;\n\n while (currentNode) {\n // If callback is specified then try to find node by callback.\n if (callback && callback(currentNode.value)) {\n return currentNode;\n }\n\n // If value is specified then try to compare by value..\n if (value !== undefined && this.compare.equal(currentNode.value, value)) {\n return currentNode;\n }\n\n currentNode = currentNode.next;\n }\n\n return null;\n }\n\n deleteTail() {\n const deletedTail = this.tail;\n\n if (this.head === this.tail) {\n // There is only one node in linked list.\n this.head = null;\n this.tail = null;\n\n return deletedTail;\n }\n\n // If there are many nodes in linked list...\n\n // Rewind to the last node and delete \"next\" link for the node before the last one.\n let currentNode = this.head;\n while (currentNode?.next) {\n if (!currentNode.next.next) {\n currentNode.next = null;\n } else {\n currentNode = currentNode.next;\n }\n }\n\n this.tail = currentNode;\n\n return deletedTail;\n }\n\n deleteHead() {\n if (!this.head) {\n return null;\n }\n\n const deletedHead = this.head;\n\n if (this.head.next) {\n this.head = this.head.next;\n } else {\n this.head = null;\n this.tail = null;\n }\n\n return deletedHead;\n }\n\n fromArray(values: T[]) {\n values.forEach(value => this.append(value));\n\n return this;\n }\n\n toArray() {\n const nodes: LinkedListNode<T>[] = [];\n\n let currentNode = this.head;\n while (currentNode) {\n nodes.push(currentNode);\n currentNode = currentNode.next;\n }\n\n return nodes;\n }\n\n toString(callback: ToStringCallback<T>) {\n return this.toArray()\n .map(node => node.toString(callback))\n .toString();\n }\n\n reverse() {\n let currNode = this.head;\n let prevNode = null;\n let nextNode = null;\n\n while (currNode) {\n // Store next node.\n nextNode = currNode.next;\n\n // Change next node of the current node so it would link to previous node.\n currNode.next = prevNode;\n\n // Move prevNode and currNode nodes one step forward.\n prevNode = currNode;\n currNode = nextNode;\n }\n\n // Reset head and tail.\n this.tail = this.head;\n this.head = prevNode;\n\n return this;\n }\n}\n","import { LinkedList } from '../LinkedList/LinkedList';\nimport { CompareFunction } from '../../utilities/Comparator';\nimport { GraphEdge } from './GraphEdge';\nimport { LinkedListNode } from '../LinkedList/LinkedListNode';\n\nexport type VertexKeyExtractor<T> = (vertex: T) => string | number;\n\nexport class GraphVertex<TVertex, TEdge> {\n value: TVertex;\n edges: LinkedList<GraphEdge<TVertex, TEdge>>;\n constructor(value: TVertex, public keyExtractor: VertexKeyExtractor<TVertex>) {\n if (value === undefined) {\n throw new Error('Graph vertex must have a value');\n }\n\n const edgeComparator: CompareFunction<GraphEdge<TVertex, TEdge>> = (edgeA, edgeB) => {\n if (edgeA.getKey() === edgeB.getKey()) {\n return 0;\n }\n\n return edgeA.getKey() < edgeB.getKey() ? -1 : 1;\n };\n\n // Normally you would store string value like vertex name.\n // But generally it may be any object as well\n this.value = value;\n this.edges = new LinkedList({ compareFunction: edgeComparator });\n }\n\n addEdge(edge: GraphEdge<TVertex, TEdge>) {\n this.edges.append(edge);\n\n return this;\n }\n\n deleteEdge(edge: GraphEdge<TVertex, TEdge>) {\n this.edges.delete(edge);\n }\n\n getNeighbors(): GraphVertex<TVertex, TEdge>[] {\n const edges = this.edges.toArray();\n\n const neighborsConverter = (node: LinkedListNode<GraphEdge<TVertex, TEdge>>) => {\n return node.value.startVertex === this ? node.value.endVertex : node.value.startVertex;\n };\n\n // Return either start or end vertex.\n // For undirected graphs it is possible that current vertex will be the end one.\n return edges.map(neighborsConverter);\n }\n\n getEdges() {\n return this.edges.toArray().map(linkedListNode => linkedListNode.value);\n }\n\n getDegree() {\n return this.edges.toArray().length;\n }\n\n hasEdge(requiredEdge: GraphEdge<TVertex, TEdge>) {\n const edgeNode = this.edges.find({\n callback: edge => edge === requiredEdge\n });\n\n return !!edgeNode;\n }\n\n hasNeighbor(vertex: GraphVertex<TVertex, TEdge>) {\n const vertexNode = this.edges.find({\n callback: edge => edge.startVertex === vertex || edge.endVertex === vertex\n });\n\n return !!vertexNode;\n }\n\n findEdge(vertex: GraphVertex<TVertex, TEdge>) {\n const edgeFinder = (edge: GraphEdge<TVertex, TEdge>) => {\n return edge.startVertex === vertex || edge.endVertex === vertex;\n };\n\n const edge = this.edges.find({ callback: edgeFinder });\n\n return edge ? edge.value : null;\n }\n\n getKey() {\n return this.keyExtractor(this.value);\n }\n\n deleteAllEdges() {\n this.getEdges().forEach(edge => this.deleteEdge(edge));\n\n return this;\n }\n\n toString(callback: (value: TVertex) => string) {\n return callback ? callback(this.value) : `${this.value}`;\n }\n}\n","export * from './data-structures';\n"],"sourceRoot":""}