<> <> DIRECTORY Graphs, Rope; GraphsImpl: CEDAR PROGRAM IMPORTS Rope EXPORTS Graphs = BEGIN OPEN Graphs; NewVertexType: PUBLIC PROC [vtr: VertexTypeRep] RETURNS [vt: VertexType] = { vt _ NEW [VertexTypeRep _ vtr]; IF vt.GetLabel = NIL THEN vt.GetLabel _ GetNoLabel; IF vt.LabelEdges = NIL THEN vt.LabelEdges _ LabelEdgesFromExpand; IF vt.CrossLabeledEdge = NIL THEN vt.CrossLabeledEdge _ CrossLabeledEdgeFromExpand; IF vt.GetIndexedNeighbor = NIL THEN vt.GetIndexedNeighbor _ GetIndexedNeighborFromExpand; IF vt.GetNeighborCount = NIL THEN vt.GetNeighborCount _ GetNeighborCountFromLabels; }; GetNoLabel: PROC [vertex: Vertex] RETURNS [label: Label] = {label _ unlabeled}; LabelEdgesFromExpand: PROC [vertex: Vertex, consume: LabelConsumer] = { PerEdge: PROC [edge: Edge, data: REF ANY] = {consume.proc[edge.label, consume.data]}; TRUSTED {vertex.type.Expand[vertex, [PerEdge]]}}; Abort: ERROR = CODE; CrossLabeledEdgeFromExpand: PROC [vertex: Vertex, edgeLabel: Label] RETURNS [neighbor: Vertex] = { PerEdge: PROC [edge: Edge, data: REF ANY] = { IF edge.label.Equal[edgeLabel] THEN {neighbor _ edge.otherSide; Abort}; }; neighbor _ NIL; TRUSTED {vertex.type.Expand[vertex, [PerEdge] !Abort => CONTINUE]}; }; GetIndexedNeighborFromExpand: PROC [vertex: Vertex, index: INT--origin 1--] RETURNS [neighbor: Vertex] = { i: INT _ 0; PerEdge: PROC [edge: Edge, data: REF ANY] = { i _ i + 1; IF index = i THEN {neighbor _ edge.otherSide; Abort}; }; neighbor _ NIL; TRUSTED {vertex.type.Expand[vertex, [PerEdge] !Abort => CONTINUE]}; }; GetNeighborCountFromLabels: PROC [vertex: Vertex] RETURNS [neighborCount: INT] = { PerLabel: PROC [edgeLabel: Label, data: REF ANY] = { neighborCount _ neighborCount + 1; }; neighborCount _ 0; TRUSTED {vertex.type.LabelEdges[vertex, [PerLabel] !Abort => CONTINUE]}; }; Setup: PROC = BEGIN END; Setup[]; END.