# lua_async
This project aims to provide an API similar to the Node.js Event loop - for Lua, fully written in Lua itself. It is tested with Lua 5.1 and Lua 5.3.3, but should probably work with any Lua 5.x.
Note that the goal is not to clone the Node Event loop exactly.
-This is already fully usable, but some features are missing (Events, EventTargets, some Promise methods) and will be implemented in the near future.
+This is already fully usable, but some features are missing (especially some Promise methods) and will be implemented in the near future.
It also provides a few useful extra methods as well as basic scheduling.
## Current features
--- /dev/null
+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
Promise = setmetatable({}, {
__call = function(_, resolver)
- local promise = {
+ local promise = setmetatable({
state = "pending",
__children = {},
- }
-
- setmetatable(promise, {__index = PromisePrototype})
+ }, {__index = PromisePrototype})
if resolver then
resolver(