From 8c3d66a7b1d9a741f98d0165da2c4ce3e6d91e14 Mon Sep 17 00:00:00 2001 From: Ryan Ward Date: Sun, 25 Dec 2022 21:14:34 -0500 Subject: [PATCH] Added Unconnect to connections. Allows fastmode connections to be removed --- docs/changes.md | 1 + init.lua | 12 +++- tests/test.lua | 165 +++++++++++++++++++++++++++++------------------- 3 files changed, 111 insertions(+), 67 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 0b23bd5..314a545 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -83,6 +83,7 @@ multi:mainloop() Added --- +- `multi:newConnection():Unconnect(conn_link)` Fastmode previously didn't have the ability to be unconnected to. This method works with both fastmode and non fastmode. `fastMode` will be made the default in v16.0.0 (This is a breaking change for those using the Destroy method, use this time to migrate to using `Unconnect()`) - `thread.chain(...)` allows you to chain `thread.hold(FUNCTIONs)` together ```lua while true do diff --git a/init.lua b/init.lua index 5a57539..643cac3 100644 --- a/init.lua +++ b/init.lua @@ -244,6 +244,14 @@ function multi:newConnection(protect,func,kill) return call_funcs end + function c:Unconnect(conn) + if conn.fast then + table.remove(fast,conn.ind) + elseif conn.Destroy then + conn:Destroy() + end + end + function c:fastMode() if find_optimization then return self end function self:Fire(...) @@ -252,8 +260,8 @@ function multi:newConnection(protect,func,kill) end end function self:Connect(func) - table.insert(fast,func) - local temp = {} + table.insert(fast, func) + local temp = {fast = true, ind = #fast} setmetatable(temp,{ __call=function(s,...) return self:Connect(...) diff --git a/tests/test.lua b/tests/test.lua index f64791b..b4dddf4 100644 --- a/tests/test.lua +++ b/tests/test.lua @@ -5,7 +5,42 @@ multi:getOptimizationConnection()(function(msg) print(msg) end) --- local conn1, conn2, conn3 = multi:newConnection(), multi:newConnection(), multi:newConnection() +local conn1, conn2, conn3 = multi:newConnection(), multi:newConnection():fastMode(), multi:newConnection() + +local link = conn1(function() + print("Conn1, first") +end) + +local link2 = conn1(function() + print("Conn1, second") +end) + +local link3 = conn1(function() + print("Conn1, third") +end) + +local link4 = conn2(function() + print("Conn2, first") +end) + +local link5 = conn2(function() + print("Conn2, second") +end) + +local link6 = conn2(function() + print("Conn2, third") +end) + +print("All conns\n-------------") +conn1:Fire() +conn2:Fire() + +conn1:Unconnect(link3) +conn2:Unconnect(link6) +print("All conns Edit\n---------------------") +conn1:Fire() +conn2:Fire() + -- thread:newThread(function() -- print("Awaiting status") -- thread.hold(conn1 + (conn2 * conn3)) @@ -25,74 +60,74 @@ end) -- conn3:Fire() -- end) -local conn = multi:newSystemThreadedConnection("conn"):init() +-- local conn = multi:newSystemThreadedConnection("conn"):init() -multi:newSystemThread("Thread_Test_1", function() - local multi, thread = require("multi"):init() - local conn = GLOBAL["conn"]:init() - local console = THREAD.getConsole() - conn(function(a,b,c) - console.print(THREAD:getName().." was triggered!",a,b,c) - end) - multi:mainloop() -end) +-- multi:newSystemThread("Thread_Test_1", function() +-- local multi, thread = require("multi"):init() +-- local conn = GLOBAL["conn"]:init() +-- local console = THREAD.getConsole() +-- conn(function(a,b,c) +-- console.print(THREAD:getName().." was triggered!",a,b,c) +-- end) +-- multi:mainloop() +-- end) -multi:newSystemThread("Thread_Test_2", function() - local multi, thread = require("multi"):init() - local conn = GLOBAL["conn"]:init() - local console = THREAD.getConsole() - conn(function(a,b,c) - console.print(THREAD:getName().." was triggered!",a,b,c) - end) - multi:newAlarm(2):OnRing(function() - console.print("Fire 2!!!") - conn:Fire(4,5,6) - THREAD.kill() - end) +-- multi:newSystemThread("Thread_Test_2", function() +-- local multi, thread = require("multi"):init() +-- local conn = GLOBAL["conn"]:init() +-- local console = THREAD.getConsole() +-- conn(function(a,b,c) +-- console.print(THREAD:getName().." was triggered!",a,b,c) +-- end) +-- multi:newAlarm(2):OnRing(function() +-- console.print("Fire 2!!!") +-- conn:Fire(4,5,6) +-- THREAD.kill() +-- end) - multi:mainloop() -end) -local console = THREAD.getConsole() -conn(function(a,b,c) - console.print("Mainloop conn got triggered!",a,b,c) -end) +-- multi:mainloop() +-- end) +-- local console = THREAD.getConsole() +-- conn(function(a,b,c) +-- console.print("Mainloop conn got triggered!",a,b,c) +-- end) -alarm = multi:newAlarm(1) -alarm:OnRing(function() - console.print("Fire 1!!!") - conn:Fire(1,2,3) -end) +-- alarm = multi:newAlarm(1) +-- alarm:OnRing(function() +-- console.print("Fire 1!!!") +-- conn:Fire(1,2,3) +-- end) -alarm = multi:newAlarm(3):OnRing(function() - multi:newSystemThread("Thread_Test_3",function() - local multi, thread = require("multi"):init() - local conn = GLOBAL["conn"]:init() - local console = THREAD.getConsole() - conn(function(a,b,c) - console.print(THREAD:getName().." was triggered!",a,b,c) - end) - multi:newAlarm(4):OnRing(function() - console.print("Fire 3!!!") - conn:Fire(7,8,9) - end) - multi:mainloop() - end) -end) +-- alarm = multi:newAlarm(3):OnRing(function() +-- multi:newSystemThread("Thread_Test_3",function() +-- local multi, thread = require("multi"):init() +-- local conn = GLOBAL["conn"]:init() +-- local console = THREAD.getConsole() +-- conn(function(a,b,c) +-- console.print(THREAD:getName().." was triggered!",a,b,c) +-- end) +-- multi:newAlarm(4):OnRing(function() +-- console.print("Fire 3!!!") +-- conn:Fire(7,8,9) +-- end) +-- multi:mainloop() +-- end) +-- end) -multi:newSystemThread("Thread_Test_4",function() - local multi, thread = require("multi"):init() - local conn = GLOBAL["conn"]:init() - local conn2 = multi:newConnection() - local console = THREAD.getConsole() - multi:newAlarm(2):OnRing(function() - conn2:Fire() - end) - multi:newThread(function() - console.print("Conn Test!") - thread.hold(conn + conn2) - console.print("It held!") - end) - multi:mainloop() -end) +-- multi:newSystemThread("Thread_Test_4",function() +-- local multi, thread = require("multi"):init() +-- local conn = GLOBAL["conn"]:init() +-- local conn2 = multi:newConnection() +-- local console = THREAD.getConsole() +-- multi:newAlarm(2):OnRing(function() +-- conn2:Fire() +-- end) +-- multi:newThread(function() +-- console.print("Conn Test!") +-- thread.hold(conn + conn2) +-- console.print("It held!") +-- end) +-- multi:mainloop() +-- end) -multi:mainloop() \ No newline at end of file +-- multi:mainloop() \ No newline at end of file