typescript-generic-datastructures
Advanced tools
| # TypeScript Data Structures | ||
| import { GraphVertex } from './GraphVertex'; | ||
| export declare type EdgeKeyExtractor<T> = (edge: T) => string | number; | ||
| export declare class GraphEdge<TVertex, TEdge> { | ||
@@ -6,6 +7,7 @@ startVertex: GraphVertex<TVertex, TEdge>; | ||
| value: TEdge; | ||
| constructor(startVertex: GraphVertex<TVertex, TEdge>, endVertex: GraphVertex<TVertex, TEdge>, value: TEdge); | ||
| getKey(): string; | ||
| private keyExtractor?; | ||
| constructor(startVertex: GraphVertex<TVertex, TEdge>, endVertex: GraphVertex<TVertex, TEdge>, value: TEdge, keyExtractor?: EdgeKeyExtractor<GraphEdge<TVertex, TEdge>> | undefined); | ||
| getKey(): string | number; | ||
| reverse(): this; | ||
| toString(): string; | ||
| toString(): string | number; | ||
| } |
@@ -1,2 +0,2 @@ | ||
| !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports["typescript-generic-datastructures"]=t():e["typescript-generic-datastructures"]=t()}(this,(function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}r.r(t);var u=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];n(this,e),this.isDirected=t,a(this,"vertices",void 0),a(this,"edges",void 0),this.vertices={},this.edges={}}var t,r,u;return t=e,(r=[{key:"addVertex",value:function(e){return this.vertices[e.getKey()]=e,this}},{key:"getVertexByKey",value:function(e){return this.vertices[e]}},{key:"getNeighbors",value:function(e){return e.getNeighbors()}},{key:"getAllVertices",value:function(){return Object.values(this.vertices)}},{key:"getAllEdges",value:function(){return Object.values(this.edges)}},{key:"addEdge",value:function(e){var t=this.getVertexByKey(e.startVertex.getKey()),r=this.getVertexByKey(e.endVertex.getKey());if(t||(this.addVertex(e.startVertex),t=this.getVertexByKey(e.startVertex.getKey())),r||(this.addVertex(e.endVertex),r=this.getVertexByKey(e.endVertex.getKey())),this.edges[e.getKey()])throw new Error("Edge has already been added before");return this.edges[e.getKey()]=e,this.isDirected?t.addEdge(e):(t.addEdge(e),r.addEdge(e)),this}},{key:"deleteEdge",value:function(e){if(!this.edges[e.getKey()])throw new Error("Edge not found in graph");delete this.edges[e.getKey()];var t=this.getVertexByKey(e.startVertex.getKey()),r=this.getVertexByKey(e.endVertex.getKey());t.deleteEdge(e),r.deleteEdge(e)}},{key:"findEdge",value:function(e,t){var r=this.getVertexByKey(e.getKey());return r?r.findEdge(t):null}},{key:"reverse",value:function(){var e=this;return this.getAllEdges().forEach((function(t){e.deleteEdge(t),t.reverse(),e.addEdge(t)})),this}},{key:"getVerticesIndices",value:function(){var e={};return this.getAllVertices().forEach((function(t,r){e[t.getKey()]=r})),e}},{key:"getAdjacencyMatrix",value:function(){var e=this,t=this.getAllVertices(),r=this.getVerticesIndices(),n=Array(t.length).fill(null).map((function(){return Array(t.length).fill(1/0)}));return t.forEach((function(t,i){t.getNeighbors().forEach((function(a){var u,o=r[a.getKey()];n[i][o]=null===(u=e.findEdge(t,a))||void 0===u?void 0:u.value}))})),n}},{key:"toString",value:function(){return Object.keys(this.vertices).toString()}}])&&i(t.prototype,r),u&&i(t,u),e}();function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var l=function(){function e(t,r,n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.startVertex=t,this.endVertex=r,this.value=n}var t,r,n;return t=e,(r=[{key:"getKey",value:function(){var e=this.startVertex.getKey(),t=this.endVertex.getKey();return"".concat(e,"_").concat(t)}},{key:"reverse",value:function(){var e=this.startVertex;return this.startVertex=this.endVertex,this.endVertex=e,this}},{key:"toString",value:function(){return this.getKey()}}])&&o(t.prototype,r),n&&o(t,n),e}();function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var f=function(){function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;s(this,e),h(this,"value",void 0),h(this,"next",void 0),this.value=t,this.next=r}var t,r,n;return t=e,(r=[{key:"toString",value:function(e){return e?e(this.value):"".concat(this.value)}}])&&c(t.prototype,r),n&&c(t,n),e}();function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var v=function(){function e(t){var r,n,i,a=t.compareFunction,u=t.keyExtractor;if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),i=void 0,(n="compare")in(r=this)?Object.defineProperty(r,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):r[n]=i,a)this.compare=a;else{if(!u)throw new Error("Either compareFunction or keyExtractor parameter should be defined");this.compare=e.defaultCompareFunction(u)}}var t,r,n;return t=e,n=[{key:"defaultCompareFunction",value:function(e){return function(t,r){var n=e(t),i=e(r);return n===i?0:n<i?-1:1}}}],(r=[{key:"equal",value:function(e,t){return 0===this.compare(e,t)}},{key:"lessThan",value:function(e,t){return this.compare(e,t)<0}},{key:"greaterThan",value:function(e,t){return this.compare(e,t)>0}},{key:"lessThanOrEqual",value:function(e,t){return this.lessThan(e,t)||this.equal(e,t)}},{key:"greaterThanOrEqual",value:function(e,t){return this.greaterThan(e,t)||this.equal(e,t)}},{key:"reverse",value:function(){var e=this.compare;this.compare=function(t,r){return e(r,t)}}}])&&d(t.prototype,r),n&&d(t,n),e}();function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function g(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var p=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),g(this,"head",void 0),g(this,"tail",void 0),g(this,"compare",void 0),this.head=null,this.tail=null,this.compare=new v(t)}var t,r,n;return t=e,(r=[{key:"prepend",value:function(e){var t=new f(e,this.head);return this.head=t,this.tail||(this.tail=t),this}},{key:"append",value:function(e){var t,r=new f(e);return this.head?((null===(t=this.tail)||void 0===t?void 0:t.next)&&(this.tail.next=r),this.tail=r,this):(this.head=r,this.tail=r,this)}},{key:"delete",value:function(e){if(!this.head)return null;for(var t=null;this.head&&this.compare.equal(this.head.value,e);)t=this.head,this.head=this.head.next;var r=this.head;if(null!==r)for(;r.next;)this.compare.equal(r.next.value,e)?(t=r.next,r.next=r.next.next):r=r.next;return this.tail&&this.compare.equal(this.tail.value,e)&&(this.tail=r),t}},{key:"find",value:function(e){var t=e.value,r=void 0===t?void 0:t,n=e.callback,i=void 0===n?void 0:n;if(!this.head)return null;for(var a=this.head;a;){if(i&&i(a.value))return a;if(void 0!==r&&this.compare.equal(a.value,r))return a;a=a.next}return null}},{key:"deleteTail",value:function(){var e=this.tail;if(this.head===this.tail)return this.head=null,this.tail=null,e;for(var t=this.head;null===(r=t)||void 0===r?void 0:r.next;){var r;t.next.next?t=t.next:t.next=null}return this.tail=t,e}},{key:"deleteHead",value:function(){if(!this.head)return null;var e=this.head;return this.head.next?this.head=this.head.next:(this.head=null,this.tail=null),e}},{key:"fromArray",value:function(e){var t=this;return e.forEach((function(e){return t.append(e)})),this}},{key:"toArray",value:function(){for(var e=[],t=this.head;t;)e.push(t),t=t.next;return e}},{key:"toString",value:function(e){return this.toArray().map((function(t){return t.toString(e)})).toString()}},{key:"reverse",value:function(){for(var e=this.head,t=null,r=null;e;)r=e.next,e.next=t,t=e,e=r;return this.tail=this.head,this.head=t,this}}])&&y(t.prototype,r),n&&y(t,n),e}();function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function x(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var k=function(){function e(t,r){if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.keyExtractor=r,x(this,"value",void 0),x(this,"edges",void 0),void 0===t)throw new Error("Graph vertex must have a value");this.value=t,this.edges=new p({compareFunction:function(e,t){return e.getKey()===t.getKey()?0:e.getKey()<t.getKey()?-1:1}})}var t,r,n;return t=e,(r=[{key:"addEdge",value:function(e){return this.edges.append(e),this}},{key:"deleteEdge",value:function(e){this.edges.delete(e)}},{key:"getNeighbors",value:function(){var e=this;return this.edges.toArray().map((function(t){return t.value.startVertex===e?t.value.endVertex:t.value.startVertex}))}},{key:"getEdges",value:function(){return this.edges.toArray().map((function(e){return e.value}))}},{key:"getDegree",value:function(){return this.edges.toArray().length}},{key:"hasEdge",value:function(e){return!!this.edges.find({callback:function(t){return t===e}})}},{key:"hasNeighbor",value:function(e){return!!this.edges.find({callback:function(t){return t.startVertex===e||t.endVertex===e}})}},{key:"findEdge",value:function(e){var t=this.edges.find({callback:function(t){return t.startVertex===e||t.endVertex===e}});return t?t.value:null}},{key:"getKey",value:function(){return this.keyExtractor(this.value)}},{key:"deleteAllEdges",value:function(){var e=this;return this.getEdges().forEach((function(t){return e.deleteEdge(t)})),this}},{key:"toString",value:function(e){return e?e(this.value):"".concat(this.value)}}])&&b(t.prototype,r),n&&b(t,n),e}();r.d(t,"Graph",(function(){return u})),r.d(t,"GraphEdge",(function(){return l})),r.d(t,"GraphVertex",(function(){return k})),r.d(t,"LinkedList",(function(){return p})),r.d(t,"LinkedListNode",(function(){return f}))}])})); | ||
| !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports["typescript-generic-datastructures"]=t():e["typescript-generic-datastructures"]=t()}(this,(function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}r.r(t);var u=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];n(this,e),this.isDirected=t,a(this,"vertices",void 0),a(this,"edges",void 0),this.vertices={},this.edges={}}var t,r,u;return t=e,(r=[{key:"addVertex",value:function(e){return this.vertices[e.getKey()]=e,this}},{key:"getVertexByKey",value:function(e){return this.vertices[e]}},{key:"getNeighbors",value:function(e){return e.getNeighbors()}},{key:"getAllVertices",value:function(){return Object.values(this.vertices)}},{key:"getAllEdges",value:function(){return Object.values(this.edges)}},{key:"addEdge",value:function(e){var t=this.getVertexByKey(e.startVertex.getKey()),r=this.getVertexByKey(e.endVertex.getKey());if(t||(this.addVertex(e.startVertex),t=this.getVertexByKey(e.startVertex.getKey())),r||(this.addVertex(e.endVertex),r=this.getVertexByKey(e.endVertex.getKey())),this.edges[e.getKey()])throw new Error("Edge has already been added before");return this.edges[e.getKey()]=e,this.isDirected?t.addEdge(e):(t.addEdge(e),r.addEdge(e)),this}},{key:"deleteEdge",value:function(e){if(!this.edges[e.getKey()])throw new Error("Edge not found in graph");delete this.edges[e.getKey()];var t=this.getVertexByKey(e.startVertex.getKey()),r=this.getVertexByKey(e.endVertex.getKey());t.deleteEdge(e),r.deleteEdge(e)}},{key:"findEdge",value:function(e,t){var r=this.getVertexByKey(e.getKey());return r?r.findEdge(t):null}},{key:"reverse",value:function(){var e=this;return this.getAllEdges().forEach((function(t){e.deleteEdge(t),t.reverse(),e.addEdge(t)})),this}},{key:"getVerticesIndices",value:function(){var e={};return this.getAllVertices().forEach((function(t,r){e[t.getKey()]=r})),e}},{key:"getAdjacencyMatrix",value:function(){var e=this,t=this.getAllVertices(),r=this.getVerticesIndices(),n=Array(t.length).fill(null).map((function(){return Array(t.length).fill(1/0)}));return t.forEach((function(t,i){t.getNeighbors().forEach((function(a){var u,o=r[a.getKey()];n[i][o]=null===(u=e.findEdge(t,a))||void 0===u?void 0:u.value}))})),n}},{key:"toString",value:function(){return Object.keys(this.vertices).toString()}}])&&i(t.prototype,r),u&&i(t,u),e}();function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var l=function(){function e(t,r,n,i){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.startVertex=t,this.endVertex=r,this.value=n,this.keyExtractor=i}var t,r,n;return t=e,(r=[{key:"getKey",value:function(){if(this.keyExtractor)return this.keyExtractor(this);var e=this.startVertex.getKey(),t=this.endVertex.getKey();return"".concat(e,"_").concat(t)}},{key:"reverse",value:function(){var e=this.startVertex;return this.startVertex=this.endVertex,this.endVertex=e,this}},{key:"toString",value:function(){return this.getKey()}}])&&o(t.prototype,r),n&&o(t,n),e}();function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function c(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function h(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var f=function(){function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;s(this,e),h(this,"value",void 0),h(this,"next",void 0),this.value=t,this.next=r}var t,r,n;return t=e,(r=[{key:"toString",value:function(e){return e?e(this.value):"".concat(this.value)}}])&&c(t.prototype,r),n&&c(t,n),e}();function d(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var v=function(){function e(t){var r,n,i,a=t.compareFunction,u=t.keyExtractor;if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),i=void 0,(n="compare")in(r=this)?Object.defineProperty(r,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):r[n]=i,a)this.compare=a;else{if(!u)throw new Error("Either compareFunction or keyExtractor parameter should be defined");this.compare=e.defaultCompareFunction(u)}}var t,r,n;return t=e,n=[{key:"defaultCompareFunction",value:function(e){return function(t,r){var n=e(t),i=e(r);return n===i?0:n<i?-1:1}}}],(r=[{key:"equal",value:function(e,t){return 0===this.compare(e,t)}},{key:"lessThan",value:function(e,t){return this.compare(e,t)<0}},{key:"greaterThan",value:function(e,t){return this.compare(e,t)>0}},{key:"lessThanOrEqual",value:function(e,t){return this.lessThan(e,t)||this.equal(e,t)}},{key:"greaterThanOrEqual",value:function(e,t){return this.greaterThan(e,t)||this.equal(e,t)}},{key:"reverse",value:function(){var e=this.compare;this.compare=function(t,r){return e(r,t)}}}])&&d(t.prototype,r),n&&d(t,n),e}();function y(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function g(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var p=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),g(this,"head",void 0),g(this,"tail",void 0),g(this,"compare",void 0),this.head=null,this.tail=null,this.compare=new v(t)}var t,r,n;return t=e,(r=[{key:"prepend",value:function(e){var t=new f(e,this.head);return this.head=t,this.tail||(this.tail=t),this}},{key:"append",value:function(e){var t,r=new f(e);return this.head?((null===(t=this.tail)||void 0===t?void 0:t.next)&&(this.tail.next=r),this.tail=r,this):(this.head=r,this.tail=r,this)}},{key:"delete",value:function(e){if(!this.head)return null;for(var t=null;this.head&&this.compare.equal(this.head.value,e);)t=this.head,this.head=this.head.next;var r=this.head;if(null!==r)for(;r.next;)this.compare.equal(r.next.value,e)?(t=r.next,r.next=r.next.next):r=r.next;return this.tail&&this.compare.equal(this.tail.value,e)&&(this.tail=r),t}},{key:"find",value:function(e){var t=e.value,r=void 0===t?void 0:t,n=e.callback,i=void 0===n?void 0:n;if(!this.head)return null;for(var a=this.head;a;){if(i&&i(a.value))return a;if(void 0!==r&&this.compare.equal(a.value,r))return a;a=a.next}return null}},{key:"deleteTail",value:function(){var e=this.tail;if(this.head===this.tail)return this.head=null,this.tail=null,e;for(var t=this.head;null===(r=t)||void 0===r?void 0:r.next;){var r;t.next.next?t=t.next:t.next=null}return this.tail=t,e}},{key:"deleteHead",value:function(){if(!this.head)return null;var e=this.head;return this.head.next?this.head=this.head.next:(this.head=null,this.tail=null),e}},{key:"fromArray",value:function(e){var t=this;return e.forEach((function(e){return t.append(e)})),this}},{key:"toArray",value:function(){for(var e=[],t=this.head;t;)e.push(t),t=t.next;return e}},{key:"toString",value:function(e){return this.toArray().map((function(t){return t.toString(e)})).toString()}},{key:"reverse",value:function(){for(var e=this.head,t=null,r=null;e;)r=e.next,e.next=t,t=e,e=r;return this.tail=this.head,this.head=t,this}}])&&y(t.prototype,r),n&&y(t,n),e}();function b(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function x(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var k=function(){function e(t,r){if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.keyExtractor=r,x(this,"value",void 0),x(this,"edges",void 0),void 0===t)throw new Error("Graph vertex must have a value");this.value=t,this.edges=new p({compareFunction:function(e,t){return e.getKey()===t.getKey()?0:e.getKey()<t.getKey()?-1:1}})}var t,r,n;return t=e,(r=[{key:"addEdge",value:function(e){return this.edges.append(e),this}},{key:"deleteEdge",value:function(e){this.edges.delete(e)}},{key:"getNeighbors",value:function(){var e=this;return this.edges.toArray().map((function(t){return t.value.startVertex===e?t.value.endVertex:t.value.startVertex}))}},{key:"getEdges",value:function(){return this.edges.toArray().map((function(e){return e.value}))}},{key:"getDegree",value:function(){return this.edges.toArray().length}},{key:"hasEdge",value:function(e){return!!this.edges.find({callback:function(t){return t===e}})}},{key:"hasNeighbor",value:function(e){return!!this.edges.find({callback:function(t){return t.startVertex===e||t.endVertex===e}})}},{key:"findEdge",value:function(e){var t=this.edges.find({callback:function(t){return t.startVertex===e||t.endVertex===e}});return t?t.value:null}},{key:"getKey",value:function(){return this.keyExtractor(this.value)}},{key:"deleteAllEdges",value:function(){var e=this;return this.getEdges().forEach((function(t){return e.deleteEdge(t)})),this}},{key:"toString",value:function(e){return e?e(this.value):"".concat(this.value)}}])&&b(t.prototype,r),n&&b(t,n),e}();r.d(t,"Graph",(function(){return u})),r.d(t,"GraphEdge",(function(){return l})),r.d(t,"GraphVertex",(function(){return k})),r.d(t,"LinkedList",(function(){return p})),r.d(t,"LinkedListNode",(function(){return f}))}])})); | ||
| //# sourceMappingURL=typescript-generic-datastructures.map |
@@ -1,1 +0,1 @@ | ||
| {"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","startVertexKey","endVertexKey","tmp","LinkedListNode","next","callback","Comparator","compareFunction","keyExtractor","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';\n\nexport class GraphEdge<TVertex, TEdge> {\n constructor(public startVertex: GraphVertex<TVertex, TEdge>, public endVertex: GraphVertex<TVertex, TEdge>, public value: TEdge) {}\n\n getKey() {\n const startVertexKey = this.startVertex.getKey();\n const endVertexKey = this.endVertex.getKey();\n\n return `${startVertexKey}_${endVertexKey}`;\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":""} | ||
| {"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":""} |
+2
-1
| { | ||
| "name": "typescript-generic-datastructures", | ||
| "version": "1.2.3", | ||
| "version": "1.3.0", | ||
| "description": "", | ||
| "repository": "emyann/typescript-generic-datastructures", | ||
| "main": "./dist/typescript-generic-datastructures.js", | ||
@@ -6,0 +7,0 @@ "types": "./dist/types/index.d.ts", |
No README
QualityPackage does not have a README. This may indicate a failed publish or a low quality package.
Found 1 instance in 1 package
No repository
Supply chain riskPackage does not have a linked source code repository. Without this field, a package will have no reference to the location of the source code use to generate the package.
Found 1 instance in 1 package
45302
1.49%15
7.14%149
1.36%0
-100%3
Infinity%