Skip to content

Commit 9ba94ab

Browse files
committed
feat: allow to pass a keyExtractor in order to have use a custom id for an Edge. Handy for vertices with n edges
1 parent aa7db02 commit 9ba94ab

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

src/data-structures/Graph/GraphEdge.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
11
import { GraphVertex } from './GraphVertex';
2+
export type EdgeKeyExtractor<T> = (edge: T) => string | number;
23

34
export class GraphEdge<TVertex, TEdge> {
4-
constructor(public startVertex: GraphVertex<TVertex, TEdge>, public endVertex: GraphVertex<TVertex, TEdge>, public value: TEdge) {}
5+
constructor(
6+
public startVertex: GraphVertex<TVertex, TEdge>,
7+
public endVertex: GraphVertex<TVertex, TEdge>,
8+
public value: TEdge,
9+
private keyExtractor?: EdgeKeyExtractor<GraphEdge<TVertex, TEdge>>
10+
) {}
511

612
getKey() {
7-
const startVertexKey = this.startVertex.getKey();
8-
const endVertexKey = this.endVertex.getKey();
13+
if (!this.keyExtractor) {
14+
const startVertexKey = this.startVertex.getKey();
15+
const endVertexKey = this.endVertex.getKey();
916

10-
return `${startVertexKey}_${endVertexKey}`;
17+
return `${startVertexKey}_${endVertexKey}`;
18+
} else {
19+
return this.keyExtractor(this);
20+
}
1121
}
1222

1323
reverse() {

src/examples/index.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Graph, LinkedList, GraphEdge, GraphVertex, VertexKeyExtractor } from '../index';
2+
import { EdgeKeyExtractor } from '../data-structures';
23
interface User {
34
age: number;
45
}
@@ -18,24 +19,29 @@ enum LinkKind {
1819
Parent = 'parent'
1920
}
2021
interface UserLink {
22+
id: string;
2123
kind: LinkKind;
2224
}
2325
const keyExtractor: VertexKeyExtractor<User> = user => user.age;
26+
const edgeKeyExtractor: EdgeKeyExtractor<GraphEdge<User, UserLink>> = edge => edge.value.id;
27+
2428
const graph = new Graph<User, UserLink>(true);
2529
const vertex1 = new GraphVertex<User, UserLink>({ age: 10 }, keyExtractor);
2630
const vertex2 = new GraphVertex<User, UserLink>({ age: 22 }, keyExtractor);
27-
const edge = new GraphEdge<User, UserLink>(vertex1, vertex2, { kind: LinkKind.Friend });
31+
const edge = new GraphEdge<User, UserLink>(vertex1, vertex2, { id: '1', kind: LinkKind.Friend }, edgeKeyExtractor);
2832

2933
const vertex3 = new GraphVertex<User, UserLink>({ age: 30 }, keyExtractor);
3034
const vertex4 = new GraphVertex<User, UserLink>({ age: 35 }, keyExtractor);
31-
const edge2 = new GraphEdge<User, UserLink>(vertex3, vertex4, { kind: LinkKind.Parent });
35+
const edge2 = new GraphEdge<User, UserLink>(vertex3, vertex4, { id: '2', kind: LinkKind.Parent }, edgeKeyExtractor);
36+
const edge3 = new GraphEdge<User, UserLink>(vertex3, vertex4, { id: '3', kind: LinkKind.Parent }, edgeKeyExtractor);
3237

3338
graph
3439
.addVertex(vertex1)
3540
.addVertex(vertex2)
3641
.addEdge(edge)
3742
.addVertex(vertex3)
3843
.addVertex(vertex4)
39-
.addEdge(edge2);
44+
.addEdge(edge2)
45+
.addEdge(edge3);
4046
console.log('grah vertices =>', graph.getAllVertices());
4147
console.log('grah edges =>', graph.getAllEdges());

0 commit comments

Comments
 (0)