diff options
author | Elias Fleckenstein <eliasfleckenstein@web.de> | 2021-08-06 23:19:34 +0200 |
---|---|---|
committer | Elias Fleckenstein <eliasfleckenstein@web.de> | 2021-08-06 23:19:34 +0200 |
commit | fa58e719d5fb5515e00f765f79fe920e4cb996fe (patch) | |
tree | c8b68ede8df3945da298b3347f2c6833b01e457e /events.lua | |
parent | 2615778348a16ac83b7afd9e86f08feda98da1df (diff) | |
download | lua_async-fa58e719d5fb5515e00f765f79fe920e4cb996fe.tar.xz |
Add Event and EventTarget
Diffstat (limited to 'events.lua')
-rw-r--r-- | events.lua | 61 |
1 files changed, 61 insertions, 0 deletions
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 |