<> <> DIRECTORY Asserting, Rope; Graphs: CEDAR DEFINITIONS = { <> <> <> <> ROPE: TYPE = Rope.ROPE; Error: ERROR [code: ErrorCode, msg: ROPE _ NIL]; ErrorCode: TYPE = { Cant--someone asked for an operation not supported by this graph/vertex/edge--, BadArgs--the usual-- }; ErrorCodeName: READONLY ARRAY ErrorCode OF ROPE; Label: TYPE = ROPE _ NIL; unlabeled: Label = NIL; Vertex: TYPE = RECORD [rep: REF ANY, class: VertexClass]; nullVertex: Vertex = [NIL, NIL]; DeleteVertex: VertexDeleter; VertexDeleter: TYPE = PROC [vertex: Vertex]; <> EqualVertices: VertexEqualityTester; VertexEqualityTester: TYPE = PROC [Vertex, Vertex] RETURNS [BOOL]; HashVertex: VertexHasher; VertexHasher: TYPE = PROC [Vertex] RETURNS [CARDINAL]; <> GetVertexOther: VertexGetOtherProc; VertexGetOtherProc: TYPE = PROC [Vertex] RETURNS [Asserting.Assertions]; ChangeVertexOther: VertexChangeOtherProc; VertexChangeOtherProc: TYPE = PROC [Vertex, PROC [Asserting.Assertions] RETURNS [Asserting.Assertions]]; GetVertexLabel: VertexGetLabelProc; VertexGetLabelProc: TYPE = PROC [vertex: Vertex] RETURNS [label: Label]; Expand: ExpandProc; ExpandProc: TYPE = PROC [vertex: Vertex, Consume: EdgeConsumer, filter: DirectionFilter _ allDirections]; EdgeConsumer: TYPE = PROC [edge: Edge, direction: Direction, otherSide: Vertex]; EnumerateForLabels: LabelEnumerator; EnumerateForLabelsFromExpand: LabelEnumerator; LabelEnumerator: TYPE = PROC [vertex: Vertex, Consume: LabelConsumer, filter: DirectionFilter _ allDirections]; LabelConsumer: TYPE = PROC [direction: Direction, edgeLabel, vertexLabel: Label]; GetNeighbor: NeighborGetter; GetNeighborFromExpand: NeighborGetter; NeighborGetter: TYPE = PROC [vertex: Vertex, filter: DirectionFilter _ allDirections, edgeLabel, vertexLabel: Label _ unlabeled, index: Index _ noIndex, goal: Vertex _ nullVertex] RETURNS [edge: Edge, neighbor: Vertex]; <> Index: TYPE = INT--origin 1--; noIndex: INT = FIRST[INT]; GetNeighborCount: NeighborCountProc; GetNeighborCountFromLabels: NeighborCountProc; GetNeighborCountFromExpand: NeighborCountProc; NeighborCountProc: TYPE = PROC [vertex: Vertex, filter: DirectionFilter _ allDirections] RETURNS [neighborCount: INT]; AddEdge: EdgeAdder; EdgeAdder: TYPE = PROC [v1, v2: Vertex, direction: Direction, label: Label, other: Asserting.Assertions] RETURNS [edge: Edge]; VertexClass: TYPE = REF VertexClassPrivate; VertexClassPrivate: TYPE = RECORD [ data: REF ANY _ NIL, Delete: VertexDeleter, Equal: VertexEqualityTester, Hash: VertexHasher, GetOther: VertexGetOtherProc _ NIL, ChangeOther: VertexChangeOtherProc, GetLabel: VertexGetLabelProc _ NIL--means unlabelled--, Expand: ExpandProc, EnumerateForLabels: LabelEnumerator _ NIL, GetNeighbor: NeighborGetter _ NIL, GetNeighborCount: NeighborCountProc _ NIL, AddEdge: EdgeAdder, other: Asserting.Assertions _ NIL ]; NewVertexClass: PROC [vtp: VertexClassPrivate] RETURNS [vt: VertexClass]; <> DirectionFilter: TYPE = ARRAY Direction OF BOOL; allDirections: DirectionFilter = ALL[TRUE]; Only: ARRAY Direction OF DirectionFilter = [ Undirected: [TRUE, FALSE, FALSE], Incoming: [FALSE, TRUE, FALSE], Outgoing: [FALSE, FALSE, TRUE]]; AllBut: ARRAY Direction OF DirectionFilter = [ Undirected: [FALSE, TRUE, TRUE], Incoming: [TRUE, FALSE, TRUE], Outgoing: [TRUE, TRUE, FALSE]]; Direction: TYPE = {Undirected, Incoming, Outgoing}; DirectedDirection: TYPE = Direction[Incoming .. Outgoing]; ReverseDirection: ARRAY Direction OF Direction = [Undirected, Outgoing, Incoming]; Edge: TYPE = RECORD [rep: REF ANY, class: EdgeClass]; nullEdge: Edge = [NIL, NIL]; dullEdge: READONLY Edge; DeleteEdge: EdgeDeleter; EdgeDeleter: TYPE = PROC [Edge]; <> GetEdgeLabel: EdgeGetLabelProc; EdgeGetLabelProc: TYPE = PROC [Edge] RETURNS [Label]; GetEdgeOther: EdgeGetOtherProc; EdgeGetOtherProc: TYPE = PROC [Edge] RETURNS [Asserting.Assertions]; ChangeEdgeOther: EdgeChangeOtherProc; EdgeChangeOtherProc: TYPE = PROC [Edge, PROC [Asserting.Assertions] RETURNS [Asserting.Assertions]]; EdgeClass: TYPE = REF EdgeClassPrivate; EdgeClassPrivate: TYPE = RECORD [ Delete: EdgeDeleter, GetLabel: EdgeGetLabelProc _ NIL--means unlabeled--, GetOther: EdgeGetOtherProc _ NIL, ChangeOther: EdgeChangeOtherProc ]; NewEdgeClass: PROC [ecp: EdgeClassPrivate] RETURNS [ec: EdgeClass]; Graph: TYPE = RECORD [rep: REF ANY, class: GraphClass]; GetGraphOther: GraphOtherGetter; GraphOtherGetter: TYPE = PROC [Graph] RETURNS [Asserting.Assertions]; ChangeGraphOther: GraphOtherChanger; GraphOtherChanger: TYPE = PROC [Graph, PROC [Asserting.Assertions] RETURNS [Asserting.Assertions]]; EnumerateVertices: GraphEnumerator; GraphEnumerator: TYPE = PROC [graph: Graph, Consume: PROC [Vertex]]; DestroyGraph: GraphDestroyer; GraphDestroyer: TYPE = PROC [graph: Graph]; GraphClass: TYPE = REF GraphClassPrivate; GraphClassPrivate: TYPE = RECORD [ GetOther: GraphOtherGetter _ NIL, ChangeOther: GraphOtherChanger, EnumerateVertices: GraphEnumerator, Destroy: GraphDestroyer _ NIL--NIL means just drop it on the floor-- ]; NewGraphClass: PROC [gp: GraphClassPrivate] RETURNS [g: GraphClass]; <> Proc: TYPE = PROC ANY RETURNS ANY; AssertOtherProc: PROC [key: ATOM, proc: Proc, inAdditionTo: Asserting.Assertions _ NIL] RETURNS [allTogetherNow: Asserting.Assertions]; GetOtherProc: PROC [key: ATOM, from: Asserting.Assertions] RETURNS [proc: Proc]; }.