import { NodeData } from './types'; type Edge = { score: number; // eslint-disable-next-line no-use-before-define node: GraphNodeInterface; }; export interface GraphNodeInterface { data: NodeData; edges: ReadonlyArray>; addEdge(node: GraphNodeInterface, score: number): void; removeEdge(node: GraphNodeInterface): GraphNodeInterface | null; getEdges(): ReadonlyArray>; isEdge(node: GraphNodeInterface): boolean; } export default class GraphNode implements GraphNodeInterface { data: NodeData; edges: ReadonlyArray>; constructor(data: NodeData) { this.data = data; this.edges = []; } addEdge(node: GraphNodeInterface, score: number) { this.edges = [...this.edges, { node, score }]; } removeEdge(node: GraphNodeInterface): GraphNodeInterface | null { if (this.isEdge(node)) { const index = this.edges.map((edge) => edge.node).indexOf(node); const edgesCopy = [...this.edges]; edgesCopy.splice(index, 1); this.edges = edgesCopy; return node; } return null; } getEdges(): ReadonlyArray> { return this.edges; } isEdge(node: GraphNodeInterface): boolean { return this.edges.map((edge) => edge.node).includes(node); } }