<> <> DIRECTORY Asserting, Rope; Graphs: CEDAR DEFINITIONS = BEGIN ROPE: TYPE = Rope.ROPE; Vertex: TYPE = REF VertexRep; VertexRep: TYPE = RECORD [ rep: REF ANY, type: VertexType, other: Asserting.Assertions _ NIL ]; VertexType: TYPE = REF VertexTypeRep; VertexTypeRep: TYPE = RECORD [ data: REF ANY _ NIL, Expand: ExpandProc, GetLabel: GetLabelProc _ NIL, LabelEdges: LabelEdgesProc _ NIL, CrossLabeledEdge: CrossLabeledEdgeProc _ NIL, GetIndexedNeighbor: GetIndexedNeighborProc _ NIL, GetNeighborCount: NeighborCountProc _ NIL, other: Asserting.Assertions _ NIL ]; Label: TYPE = ROPE _ NIL; unlabeled: Label = NIL; ExpandProc: TYPE = PROC [vertex: Vertex, consume: EdgeConsumer]; EdgeConsumer: TYPE = RECORD [ proc: EdgeConsumerProc, data: REF ANY _ NIL]; EdgeConsumerProc: TYPE = PROC [edge: Edge, data: REF ANY]; Edge: TYPE = RECORD [label: Label, otherSide: Vertex]; GetLabelProc: TYPE = PROC [vertex: Vertex] RETURNS [label: Label]; LabelEdgesProc: TYPE = PROC [vertex: Vertex, consume: LabelConsumer]; LabelConsumer: TYPE = RECORD [ proc: LabelConsumerProc, data: REF ANY _ NIL]; LabelConsumerProc: TYPE = PROC [edgeLabel: Label, data: REF ANY]; CrossLabeledEdgeProc: TYPE = PROC [vertex: Vertex, edgeLabel: Label] RETURNS [neighbor: Vertex]; GetIndexedNeighborProc: TYPE = PROC [vertex: Vertex, index: INT--origin 1--] RETURNS [neighbor: Vertex]; NeighborCountProc: TYPE = PROC [vertex: Vertex] RETURNS [neighborCount: INT]; NewVertexType: PROC [VertexTypeRep] RETURNS [vt: VertexType]; <> Proc: TYPE = PROC ANY RETURNS ANY; AddOtherProc: PROC [vt: VertexType, key: ATOM, proc: Proc]; GetOtherProc: PROC [vt: VertexType, key: ATOM] RETURNS [proc: Proc]; END.