-- ================ -- Private helpers -- ================ local setmetatable = setmetatable local Node = require("Graph/Node") -- Internal class constructor local class = function(...) local klass = {} klass.__index = klass klass.__call = function(_,...) return klass:new(...) end function klass:new(...) local instance = setmetatable({}, klass) klass.__init(instance, ...) return instance end return setmetatable(klass,{__call = klass.__call}) end local Graph = class() Graph.__tostring = function(g) return ("Graph") end function Graph:__init(vertices, edges) self.vertices = vertices self.edges = edges self.nodes = {} for _,e in pairs(edges) do if self.nodes[e.p1.id] == nil then self.nodes[e.p1.id] = Node(e.p1.id) end if self.nodes[e.p2.id] == nil then self.nodes[e.p2.id] = Node(e.p2.id) end self.nodes[e.p1.id]:link(self.nodes[e.p2.id]) self.nodes[e.p2.id]:link(self.nodes[e.p1.id]) end for _,v in pairs(vertices) do if self.nodes[v.id] == nil then self.nodes[v.id] = Node(v.id) end end end function Graph:contains_vertex(v) if self.vertices[v.id] then return true end return false end function Graph:append_vertex(v) assert(v.id ~= nil, "vertex not configured") assert(self.vertices[v.id] == nil, "vertex already existing") self.vertices[v.id] = v self.nodes[v.id] = Node(v.id) end function Graph:contains_edge(e) for _,edge in pairs(self.edges) do if e == edge then return true end end return false end function Graph:append_edge(e) for _,edge in pairs(self.edges) do assert(e ~= edge, "Edge already existing") end table.insert(self.edges, e) self.nodes[e.p1.id]:link(self.nodes[e.p2.id]) self.nodes[e.p2.id]:link(self.nodes[e.p1.id]) end return Graph