From fa58e719d5fb5515e00f765f79fe920e4cb996fe Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Fri, 6 Aug 2021 23:19:34 +0200 Subject: Add Event and EventTarget --- events.lua | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 events.lua (limited to 'events.lua') diff --git a/events.lua b/events.lua new file mode 100644 index 0000000..ee723e8 --- /dev/null +++ b/events.lua @@ -0,0 +1,61 @@ +local EventPrototype = {} + +function EventPrototype:preventDefault() + self.defaultPrevented = true +end + +function Event(type, data) + return setmetatable({ + type = type, + data = data, + defaultPrevented = false, + timeStamp = os.clock(), + }, {__index = EventPrototype}) +end + +local EventTargetPrototype = {} + +function EventTargetPrototype:dispatchEvent(event) + event.target = self + + local callback = self["on" + event.type] + + if callback then + callback(event) + end + + local listeners = self.__eventListeners[type] + + if listeners then + for i, callback in ipairs(listeners) do + callback(event) + end + end + + return not event.defaultPrevented +end + +function EventTargetPrototype:addEventListener(type, callback) + local listeners = self.__eventListeners[type] or {} + table.insert(listeners, callback) + self.__eventListeners[type] = listeners +end + +function EventTargetPrototype:removeEventListener(type, callback) + local listeners = self.__eventListeners[type] + + if listeners then + for k, v in pairs(listeners) do + if v == callback then + table.remove(listeners, k) + break + end + end + end +end + +function EventTarget() + return setmetatable({ + __eventListeners = {}, + }, {__index = EventTargetPrototype}) +end -- cgit v1.2.3