From aff1bfd247d474433fe60c1fb9c87c451603bd3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lera=20Elvo=C3=A9?= Date: Fri, 14 Feb 2025 15:16:42 +0300 Subject: [PATCH] add signal module --- data/scripts/types/signal.lua | 30 ++++++++++++++++++++++++++++++ data/scripts/util.lua | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 data/scripts/types/signal.lua diff --git a/data/scripts/types/signal.lua b/data/scripts/types/signal.lua new file mode 100644 index 0000000..ec3a520 --- /dev/null +++ b/data/scripts/types/signal.lua @@ -0,0 +1,30 @@ +local util = require "util" + +local Signal = {} + +Signal.__index = Signal + +function Signal:connect(f) + util.list_insert_once(self._connections, f) +end + +function Signal:disconnect(f) + util.list_remove_value(self._connections, f) +end + +function Signal:emit(...) + -- don't care about order + for _, v in pairs(self._connections) do + v(...) + end +end + +function Signal.new() + local s = { + _connections = {}, + } + + return setmetatable(s, Signal) +end + +return Signal \ No newline at end of file diff --git a/data/scripts/util.lua b/data/scripts/util.lua index 71f61d6..8329323 100644 --- a/data/scripts/util.lua +++ b/data/scripts/util.lua @@ -65,4 +65,36 @@ function util.merge(t1, t2, overwrite) return t3 end +---Finds the index of value in list t. If the value does not exist in the list, returns -1. +---@param t table +---@param value any +---@return integer +function util.list_find(t, value) + local idx = -1 + for i, v in ipairs(t) do + if v == value then + idx = i + break + end + end + return idx +end + +---Removes an element from a list, if it exists. Does nothing if the value doesn't exist. +---@param t table +---@param value any +function util.list_remove_value(t, value) + local idx = util.list_find(t, value) + if idx ~= -1 then + table.remove(t, idx) + end +end + +---Inserts value into the list only if it does not exist. +---@param t table +---@param value any +function util.list_insert_once(t, value) + if util.list_find(t, value) ~= -1 then return end + table.insert(t, value) +end return util \ No newline at end of file