aboutsummaryrefslogtreecommitdiff
path: root/events.lua
diff options
context:
space:
mode:
authorElias Fleckenstein <eliasfleckenstein@web.de>2021-08-06 23:19:34 +0200
committerElias Fleckenstein <eliasfleckenstein@web.de>2021-08-06 23:19:34 +0200
commitfa58e719d5fb5515e00f765f79fe920e4cb996fe (patch)
treec8b68ede8df3945da298b3347f2c6833b01e457e /events.lua
parent2615778348a16ac83b7afd9e86f08feda98da1df (diff)
downloadlua_async-fa58e719d5fb5515e00f765f79fe920e4cb996fe.tar.xz
Add Event and EventTarget
Diffstat (limited to 'events.lua')
-rw-r--r--events.lua61
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