Skip to content

Commit 7bab077

Browse files
Replace lodash and only use cloneDeep
1 parent 7d96c68 commit 7bab077

File tree

4 files changed

+72
-26
lines changed

4 files changed

+72
-26
lines changed

changelog.md

+7
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
# Version 0.3.1
2+
3+
## Improvements
4+
5+
- reduce package size significantly using lodash only for cloneDeep
6+
7+
18
# Version 0.3.0
29

310
## New Features

package-lock.json

+17-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+6-4
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@
3434
"ts-jest": "^27.0.2",
3535
"tslint": "^6.1.3",
3636
"tslint-config-prettier": "^1.18.0",
37-
"typescript": "^4.3.2"
37+
"typescript": "^4.3.2",
38+
"@types/lodash": "^4.14.170",
39+
"lodash": "^4.17.21"
3840
},
3941
"jest": {
4042
"transform": {
@@ -51,8 +53,8 @@
5153
]
5254
},
5355
"dependencies": {
54-
"@tgillespie/hash-data-structures": "^1.1.0",
55-
"@types/lodash": "^4.14.170",
56-
"lodash": "^4.17.21"
56+
"@tgillespie/hash-data-structures": "^1.2.0",
57+
"lodash.clonedeep": "^4.5.0",
58+
"lodash.uniq": "^4.5.0"
5759
}
5860
}

src/models/Graph/Graph.ts

+42-17
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { Vertex, vertexCompareTo, vertexEqual } from '../Vertex/Vertex/Vertex';
22
import { Edge, edgeEqual } from '../Edge';
3-
import * as _ from 'lodash';
3+
import * as cloneDeep from 'lodash.clonedeep';
44
import { AdjacencyMatrix } from '../Matrix/AdjacencyMatrix';
55
import { VertexNotFoundError } from '../../Errors';
66
import { AdjacencyList } from '../AdjacencyList/AdjacencyList';
77
import { TarjanStronglyConnectedComponentsAlgorithm } from './algorithms';
88
import { MutableHashMap } from '@tgillespie/hash-data-structures';
9+
import {MutableHashSet} from "@tgillespie/hash-data-structures/lib/lib/mutable-hash-set/mutable-hash-set";
910

1011
export class Graph<V extends Vertex, E extends Edge<V>> {
1112
// Redundant information storage for performance
@@ -28,9 +29,15 @@ export class Graph<V extends Vertex, E extends Edge<V>> {
2829
}
2930

3031
addVertex(...vertex: V[]): Graph<V, E> {
31-
const uniqueVertices = _.uniqWith(vertex, vertexEqual);
32-
const filteredVertices = _.differenceWith(uniqueVertices, this._listOfVertices, vertexEqual);
33-
filteredVertices.forEach((singleVertex) => {
32+
const uniqueVertices = new MutableHashSet<V>();
33+
const setOfGraphVertices = new MutableHashSet<V>();
34+
35+
vertex.forEach(x => uniqueVertices.add(x));
36+
this._listOfVertices.forEach(x => setOfGraphVertices.add(x));
37+
38+
const filteredVertices = uniqueVertices.difference(setOfGraphVertices).toArray();
39+
40+
filteredVertices.forEach((singleVertex) => {
3441
this._listOfVertices.push(singleVertex);
3542
this._adjacencyList.initVertex(singleVertex);
3643
});
@@ -39,8 +46,13 @@ export class Graph<V extends Vertex, E extends Edge<V>> {
3946
}
4047

4148
deleteVertex(...vertex: V[]): Graph<V, E> {
42-
const uniqueVertices = _.uniqWith(vertex, vertexEqual);
43-
const filteredVertices = _.intersectionWith(uniqueVertices, this._listOfVertices, vertexEqual);
49+
const uniqueVertices = new MutableHashSet<V>();
50+
const setOfGraphVertices = new MutableHashSet<V>();
51+
52+
vertex.forEach(x => uniqueVertices.add(x));
53+
this._listOfVertices.forEach(x => setOfGraphVertices.add(x));
54+
55+
const filteredVertices = uniqueVertices.intersection(setOfGraphVertices).toArray();
4456
filteredVertices.forEach((singleVertex) => {
4557
this._listOfVertices = this._listOfVertices.filter((x) => !x.equals(singleVertex));
4658
this._listOfEdges = this._listOfEdges.filter(
@@ -56,8 +68,13 @@ export class Graph<V extends Vertex, E extends Edge<V>> {
5668
}
5769

5870
addEdge(...edge: E[]): Graph<V, E> {
59-
const uniqueEdges = _.uniqWith(edge, edgeEqual);
60-
const filteredEdges = _.differenceWith(uniqueEdges, this._listOfEdges, edgeEqual);
71+
const uniqueEdges = new MutableHashSet<E>();
72+
const setOfGraphEdges = new MutableHashSet<E>();
73+
74+
edge.forEach(x => uniqueEdges.add(x));
75+
this._listOfEdges.forEach(x => setOfGraphEdges.add(x));
76+
77+
const filteredEdges = uniqueEdges.difference(setOfGraphEdges).toArray();
6178

6279
if (!this.addUnknownVerticesInEdges)
6380
filteredEdges.forEach((singleEdge) => this.validateEdgeVerticesAreContainedInGraph(singleEdge));
@@ -78,8 +95,13 @@ export class Graph<V extends Vertex, E extends Edge<V>> {
7895
}
7996

8097
deleteEdge(...edge: E[]): Graph<V, E> {
81-
const uniqueEdges = _.uniqWith(edge, edgeEqual);
82-
const filteredEdges = _.intersectionWith(uniqueEdges, this._listOfEdges, edgeEqual);
98+
const uniqueEdges = new MutableHashSet<E>();
99+
const setOfGraphEdges = new MutableHashSet<E>();
100+
101+
edge.forEach(x => uniqueEdges.add(x));
102+
this._listOfEdges.forEach(x => setOfGraphEdges.add(x));
103+
104+
const filteredEdges = uniqueEdges.intersection(setOfGraphEdges).toArray();
83105
filteredEdges.forEach((singleEdge) => {
84106
this._listOfEdges = this._listOfEdges.filter((x) => !x.equals(singleEdge));
85107

@@ -117,7 +139,10 @@ export class Graph<V extends Vertex, E extends Edge<V>> {
117139
});
118140
}
119141

120-
return _.uniqWith(result, vertexEqual);
142+
const resultSet = new MutableHashSet<V>();
143+
result.forEach(x => resultSet.add(x));
144+
145+
return resultSet.toArray();
121146
}
122147

123148
getEdges(vertexA: V, vertexB: V): E[] {
@@ -179,7 +204,7 @@ export class Graph<V extends Vertex, E extends Edge<V>> {
179204
let takenEdge = null;
180205
let previousVertex = null;
181206

182-
while (![...visited.values()].every(_.identity)) {
207+
while (![...visited.values()].every(x => x)) {
183208
currentVertex = stack.pop();
184209
if (currentVertex === undefined) {
185210
takenEdge = null;
@@ -238,23 +263,23 @@ export class Graph<V extends Vertex, E extends Edge<V>> {
238263
}
239264

240265
copy(): this {
241-
return _.cloneDeep(this);
266+
return cloneDeep(this);
242267
}
243268

244269
getListOfEdges(): E[] {
245-
return _.cloneDeep(this._listOfEdges);
270+
return cloneDeep(this._listOfEdges);
246271
}
247272

248273
getListOfVertices(): V[] {
249-
return _.cloneDeep(this._listOfVertices);
274+
return cloneDeep(this._listOfVertices);
250275
}
251276

252277
getAdjacencyMatrix(): AdjacencyMatrix<V> {
253-
return _.cloneDeep(this._adjacencyMatrix);
278+
return cloneDeep(this._adjacencyMatrix);
254279
}
255280

256281
getAdjacencyList(): AdjacencyList<V> {
257-
return _.cloneDeep(this._adjacencyList);
282+
return cloneDeep(this._adjacencyList);
258283
}
259284

260285
get addUnknownVerticesInEdges(): boolean {

0 commit comments

Comments
 (0)