lk.Outlet
:dump (links)
-- 'inlet' accessor metamethod local lib = {type = 'lk.Outlet'} lib.__index = lib lk.Outlet = lib
local doSend setmetatable(lib, { -- lk.Outlet(node) -- Create a new outlet and insert it into -- node. __call = function(lib, node, name, opts) local self = { name = name, node = node, opts = opts or {}, -- Connection information links = {}, -- Connection inlets inlets = {}, }
function self.send(...) doSend(self, ...) end
return setmetatable(self, lib) end})
function doSend(self, ...) for _,inlet in ipairs(self.inlets) do inlet.receive(...) end end
self.opts = opts end
local default_receive = lk.Inlet.receive -- TODO: performance compile new 'instance.send' method by -- generating lua code and evaluating the code with upvalues. for _, inl in ipairs(self.inlets) do if inl == inlet then return end end local conn = {type = 'Basic'} self.links[inlet:url()] = conn table.insert(self.inlets, inlet)
local msg = self.opts.connect if msg then local receive = inlet.receive if receive ~= default_receive then if type(msg) == 'function' then msg = msg() end receive(msg, conn) end end end
for i, inlet in ipairs(self.inlets) do if inlet:url() == target_url then table.remove(self.inlets, i) local link_def = self.links[target_url] if link_def then local msg = self.opts.disconnect if msg ~= nil then local receive = inlet.receive if receive ~= default_receive then if type(msg) == 'function' then msg = msg() end
receive(msg) end end self.links[target_url] = nil end end
end end
-- This is called on object removal. for target_url, _ in pairs(self.links) do -- It is OK to set self.links[target_url] to nil during this -- traversal. self:disconnect(target_url) end end
local function dumpLinks(self, changed_link) local links if changed_link then -- return a copy links = {} for k, v in pairs(self.links) do links[k] = v end
for k, v in pairs(changed_link) do if v == false then links[k] = false end end
else links = self.links end return links end