]> git.lizzy.rs Git - lua_async.git/blobdiff - events.lua
Add Event and EventTarget
[lua_async.git] / events.lua
diff --git a/events.lua b/events.lua
new file mode 100644 (file)
index 0000000..ee723e8
--- /dev/null
@@ -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