import { Iterator } from 'joshkaposh-iterator'; import { Direction, EdgeType } from '../graph'; import { Visitable } from './traversal'; import { Prettify } from 'joshkaposh-iterator/src/util'; export * from './traversal'; export * from './reversed'; export * from './visitor'; export * from './dfsvisit'; export type GraphBase = { NodeId: NodeId; EdgeId: EdgeId; NodeWeight: NodeWeight; EdgeWeight: EdgeWeight; } & EdgeType export type NodeId> = G['NodeId']; export type EdgeId> = G['EdgeId']; export type NodeWeight> = G['NodeWeight']; export type EdgeWeight> = G['EdgeWeight']; export interface NodeIndexable { to_node_index(id: Id): number; from_node_index(ix: number): Id } export interface EdgeIndexable { to_edge_index(id: Id): number; from_edge_index(ix: number): Id; } export interface NodeCount extends NodeIndexable { node_count(): number; node_bound(): number; } export interface EdgeCount extends EdgeIndexable { edge_count(): number; edge_bound(): number; } export interface EdgeRef { source(): NodeId; target(): NodeId; weight(): E; id(): EdgeId; toString(): string; } export function EdgeRef(id: EdgeId, source: NodeId, target: NodeId, weight: E): EdgeRef { return { id() { return id }, weight() { return weight }, source() { return source }, target() { return target }, toString() { let str = 'Edge {\n'; str += ` id: ${id} \n` str += ` source: ${source} \n` str += ` target: ${target} \n` str += ` weight: ${weight} \n` str += '}' return str } } } export interface NodeRef { id(): NodeId; weight(): N; toString(): string; } export function NodeRef(id: NodeId, weight: N): NodeRef { return { id() { return id }, weight() { return weight }, toString() { let str = 'Node {\n'; str += ` id: ${id} \n` str += ` weight: ${weight} \n` str += '}' return str } } } export type GraphRef = GraphBase & IntoNodeReferences & IntoNeighborsDirected & IntoEdgesDirected & IntoEdgeReferences & NodeCount & EdgeCount & Visitable export interface IntoEdgeReferences extends GraphBase { edge_references(): Iterator> } export interface IntoEdges extends IntoEdgeReferences { edges(vertex: NodeId): Iterator> } export interface IntoEdgesDirected extends IntoEdges { edges_directed(vertex: NodeId, dir: Direction): Iterator> } export interface IntoNodeIdentifiers extends GraphBase { node_identifiers(): Iterator } export interface IntoNodeReferences extends IntoNodeIdentifiers { node_references(): Iterator> } export interface IntoNeighbors extends GraphBase { neighbors(vertex: NodeId): Iterator } export interface IntoNeighborsDirected extends IntoNeighbors { neighbors_directed(vertex: NodeId, dir: Direction): Iterator } export type GraphImpl = Prettify & IntoNeighborsDirected & IntoEdgesDirected & IntoNodeReferences & IntoEdgeReferences >