PageRenderTime 28ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/set.lua

http://github.com/JakobOvrum/LuaIRC
Lua | 56 lines | 44 code | 11 blank | 1 comment | 6 complexity | 1dcba32f71dfefd439b4a3c1d9a8fd4b MD5 | raw file
  1. local select = require "socket".select
  2. local setmetatable = setmetatable
  3. local insert = table.insert
  4. local remove = table.remove
  5. local ipairs = ipairs
  6. local error = error
  7. module "irc.set"
  8. local set = {}
  9. set.__index = set
  10. function new(t)
  11. t.connections = {}
  12. t.sockets = {}
  13. return setmetatable(t, set)
  14. end
  15. function set:add(connection)
  16. local socket = connection.socket
  17. insert(self.sockets, socket)
  18. self.connections[socket] = connection
  19. insert(self.connections, connection)
  20. end
  21. function set:remove(connection)
  22. local socket = connection.socket
  23. self.connections[socket] = nil
  24. for k, s in ipairs(self.sockets) do
  25. if socket == s then
  26. remove(self.sockets, k)
  27. remove(self.connections, k)
  28. break
  29. end
  30. end
  31. end
  32. function set:select()
  33. local read, write, err = select(self.sockets, nil, self.timeout)
  34. if read then
  35. for k, socket in ipairs(read) do
  36. read[k] = self.connections[socket]
  37. end
  38. end
  39. return read, err
  40. end
  41. -- Select - but if it times out, it returns all connections.
  42. function set:poll()
  43. local read, err = self:select()
  44. return err == "timeout" and self.connections or read
  45. end