Advertisement
SigmaBoy456

Lua DSA Dict/Arr/LL Event #387

Feb 24th, 2025
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.17 KB | None | 0 0
  1. local ArrayEvent = {}
  2. local DictEvent = {}
  3. local LinkedListEvent = {}
  4. local BindEvent = Instance.new('BindableEvent')
  5. ArrayEvent.__index = ArrayEvent
  6. DictEvent.__index = DictEvent
  7. LinkedListEvent.__index = LinkedListEvent
  8. local Node = {}
  9. Node.__index = Node
  10. function Node.new(signal)
  11.     return setmetatable({Listener = signal}, Node)
  12. end
  13. -- ArrayEvent
  14. function ArrayEvent.new()
  15.     return setmetatable({}, ArrayEvent)
  16. end
  17.  
  18. function ArrayEvent:Connect(signal)
  19.     local NewNode = Node.new(signal)
  20.     table.insert(self, NewNode)
  21. end
  22.  
  23. function ArrayEvent:Disconnect(index)
  24.     if self[index] and self[index].Listener then
  25.         table.remove(self, index)
  26.         --self[index] = nil (Optional)
  27.     else
  28.         error("That Index Does not Exist")
  29.     end
  30. end
  31.  
  32. function ArrayEvent:FireAll(...)
  33.     for i, v in ipairs(self) do
  34.         if v.Listener then v.Listener(...) end
  35.     end
  36. end
  37.  
  38. function ArrayEvent:Fire(index, ...)
  39.     if self[index] and self[index].Listener then
  40.         self[index].Listener(...)
  41.     else
  42.         error("That Index Does Not Exist")
  43.     end
  44. end
  45.  
  46. -- DictEvent
  47. function DictEvent.new()
  48.     return setmetatable({}, DictEvent)
  49. end
  50.  
  51. function DictEvent:Connect(indexname, signal)
  52.     if not self[indexname] then
  53.         local NewNode = Node.new(signal)
  54.         self[indexname] = NewNode
  55.     else
  56.         error("That Key Already Exist Dict Does Not Allow Dupe")
  57.     end
  58. end
  59.  
  60. function DictEvent:Disconnect(indexname)
  61.     if self[indexname] and self[indexname].Listener then
  62.         --self[indexname] = nil (Optional)
  63.         table.remove(self, table.find(self[indexname]))
  64.     else
  65.         error("That Key Does not Exist")
  66.     end
  67. end
  68.  
  69. function DictEvent:FireAll(...)
  70.     for i, v in pairs(self) do
  71.         if v.Listener then v.Listener(...) end
  72.     end
  73. end
  74.  
  75. function DictEvent:Fire(indexname, ...)
  76.     if self[indexname] and self[indexname].Listener then
  77.         self[indexname].Listener(...)
  78.     else
  79.         error("That Key Does not Exist")
  80.     end
  81. end
  82.  
  83. -- LinkedListEvent
  84. function LinkedListEvent.new()
  85.     return setmetatable({Next = nil}, LinkedListEvent)
  86. end
  87.  
  88. function LinkedListEvent:Connect(signal)
  89.     local NewNode = Node.new(signal)
  90.     if not self.Next then
  91.         self.Next = NewNode
  92.     else
  93.         local current = self.Next
  94.         while current.Next do
  95.             current = current.Next
  96.         end
  97.         current.Next = NewNode
  98.     end
  99. end
  100.  
  101.  
  102. function LinkedListEvent:Disconnect(pos)
  103.     local c = 1
  104.     local current = self.Next
  105.     local prev = nil
  106.  
  107.     if not current or pos < 1 then
  108.         return
  109.     end
  110.  
  111.     if pos == 1 then
  112.         self.Next = current.Next
  113.         return
  114.     end
  115.  
  116.     while c < pos and current do
  117.         prev = current
  118.         current = current.Next
  119.         c = c + 1
  120.     end
  121.     if not current then
  122.         return
  123.     end
  124.     prev.Next = current.Next
  125. end
  126.  
  127.  
  128. function LinkedListEvent:FireAll(...)
  129.     local current = self.Next
  130.     while current do
  131.         if current.Listener then current.Listener(...) end
  132.         current = current.Next
  133.     end
  134. end
  135.  
  136. function LinkedListEvent:Fire(pos, ...)
  137.     local current = self.Next
  138.     if pos == 1 then
  139.         if current.Listener then
  140.             current.Listener(...)
  141.         else
  142.             error("This Pos does not Contain Listener")
  143.         end
  144.     else
  145.         local c = 1
  146.         while c < pos and current do
  147.             current = current.Next
  148.             c = c + 1
  149.         end
  150.         if current.Listener then
  151.             current.Listener(...)
  152.         else
  153.             error("This Pos does not contain Listener")
  154.         end
  155.     end
  156. end
  157.  
  158. local ll1 = LinkedListEvent.new()
  159. -- LinkedList Test Case
  160. ll1:Connect(function(msg)
  161.     print("ll1 : ", msg)
  162. end)
  163.  
  164. ll1:Connect(function(msg)
  165.     print("ll2 :", msg)
  166. end)
  167.  
  168. ll1:Fire(1, "Hello World")
  169. ll1:Disconnect(1)
  170. print("After Removed ll1:")
  171. ll1:FireAll("Hello World")
  172. -- ArrayEvent TestCase
  173. local arr1 = ArrayEvent.new()
  174. arr1:Connect(function(msg)
  175.     print("arr1 : ", msg)
  176. end)
  177.  
  178. arr1:Connect(function(msg)
  179.     print("arr2 : ", msg)
  180. end)
  181.  
  182. arr1:Fire(1, "Hello World")
  183. arr1:Fire(2, "Hello World")
  184. arr1:Disconnect(1)
  185. print("After Removed arr1")
  186. arr1:Fire(1, "Hello World") -- Test if error Print are working
  187. -- Now arr2 Print instead of arr1
  188. local dict1 = DictEvent.new()
  189. dict1:Connect("Sigma", function(msg)
  190.     print("Dict1 : ", msg)
  191. end)
  192.  
  193. --dict1:Connect("Sigma", function(msg)print()end) -- Test if Error Raise are working
  194. dict1:Connect("Skibid", function(msg)
  195.     print("Dict2: ", msg)
  196. end)
  197.  
  198. dict1:Fire("Sigma", "Hello Directly From Sigma")
  199. dict1:FireAll("Hello World Dict")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement