<> <> DIRECTORY Asserting, Rope; Graphs: CEDAR DEFINITIONS = { <> <> <> ROPE: TYPE = Rope.ROPE; Cant: ERROR; <> Graph: TYPE = REF GraphPrivate; GraphPrivate: TYPE = RECORD [ rep: REF ANY, class: GraphClass, other: Asserting.Assertions _ NIL ]; Vertex: TYPE = REF VertexPrivate; VertexPrivate: TYPE = RECORD [ rep: REF ANY, class: VertexClass, other: Asserting.Assertions _ NIL ]; VertexConsumer: TYPE = RECORD [ proc: VertexConsumerProc, data: REF ANY _ NIL]; VertexConsumerProc: TYPE = PROC [vertex: Vertex, data: REF ANY _ NIL]; EnumerateVertices: EnumerateVerticesProc; EnumerateVerticesProc: TYPE = PROC [graph: Graph, consume: VertexConsumer]; DestroyGraph: GraphDestroyer; GraphDestroyer: TYPE = PROC [graph: Graph]; DestroyVertex: VertexConsumerProc; <> Expand: ExpandProc; ExpandProc: TYPE = PROC [vertex: Vertex, consume: EdgeConsumer, filter: EdgeFilter _ all]; EdgeConsumer: TYPE = RECORD [ proc: EdgeConsumerProc, data: REF ANY _ NIL]; EdgeConsumerProc: TYPE = PROC [edge: Edge, data: REF ANY _ NIL]; Edge: TYPE = RECORD [direction: Direction, label: Label, otherSide: Vertex]; Direction: TYPE = {Undirected, Incoming, Outgoing}; DirectedDirection: TYPE = Direction[Incoming .. Outgoing]; EdgeFilter: TYPE = ARRAY DirectedDirection OF BOOL; <> all: EdgeFilter = ALL[TRUE]; incoming: EdgeFilter = [Incoming: TRUE, Outgoing: FALSE]; outgoing: EdgeFilter = [Incoming: FALSE, Outgoing: TRUE]; GetLabel: GetLabelProc; GetLabelProc: TYPE = PROC [vertex: Vertex] RETURNS [label: Label]; Label: TYPE = ROPE _ NIL; unlabeled: Label = NIL; EnumerateForLabels: LabelEnumerator; LabelEnumerator: TYPE = PROC [vertex: Vertex, consume: LabelConsumer, edgeFilter: EdgeFilter _ all]; LabelConsumer: TYPE = RECORD [ proc: LabelConsumerProc, data: REF ANY _ NIL]; LabelConsumerProc: TYPE = PROC [direction: Direction, edgeLabel, vertexLabel: Label, data: REF ANY]; GetNeighbor: NeighborGetter; NeighborGetter: TYPE = PROC [vertex: Vertex, index: INT--origin 1-- _ noIndex, edgeLabel, vertexLabel: Label _ unlabeled, filter: EdgeFilter _ all] RETURNS [neighbor: Vertex]; <> noIndex: INT = FIRST[INT]; GetNeighborCount: NeighborCountProc; NeighborCountProc: TYPE = PROC [vertex: Vertex, filter: EdgeFilter _ all] RETURNS [neighborCount: INT]; GraphClass: TYPE = REF GraphClassPrivate; GraphClassPrivate: TYPE = RECORD [ EnumerateVertices: EnumerateVerticesProc, Destroy: GraphDestroyer ]; VertexClass: TYPE = REF VertexClassPrivate; VertexClassPrivate: TYPE = RECORD [ data: REF ANY _ NIL, Destroy: VertexConsumerProc, Expand: ExpandProc, GetLabel: GetLabelProc _ NIL, EnumerateForLabels: LabelEnumerator _ NIL, GetNeighbor: NeighborGetter _ NIL, GetNeighborCount: NeighborCountProc _ NIL, other: Asserting.Assertions _ NIL ]; 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]; NewVertexClass: PROC [vtp: VertexClassPrivate] RETURNS [vt: VertexClass]; <> <<>> NewGraphClass: PROC [gp: GraphClassPrivate] RETURNS [g: GraphClass]; <> }.