From 00253e46b32a48aad6732e42bbd6509fb92f5a82 Mon Sep 17 00:00:00 2001
From: BenDol <dolb90@gmail.com>
Date: Wed, 4 Jun 2014 02:17:49 +1200
Subject: [PATCH] Added Queue class for event queuing (see CandyBot for
 examples of this).

---
 modules/corelib/classes/queue.lua | 76 +++++++++++++++++++++++++++++++
 modules/corelib/corelib.otmod     |  2 +
 2 files changed, 78 insertions(+)
 create mode 100644 modules/corelib/classes/queue.lua

diff --git a/modules/corelib/classes/queue.lua b/modules/corelib/classes/queue.lua
new file mode 100644
index 00000000..379181f2
--- /dev/null
+++ b/modules/corelib/classes/queue.lua
@@ -0,0 +1,76 @@
+--[[
+  @Authors: Ben Dol (BeniS)
+  @Details: Queue class for event queuing.
+]]
+
+Queue = {}
+Queue.__index = Queue
+
+Queue.__class = "Queue"
+
+Queue.new = function(callback)
+  que = {
+    queue = {},
+    callback = nil
+  }
+
+  que.callback = callback
+
+  setmetatable(que, Queue)
+  return que
+end
+
+-- gets/sets
+
+function Queue:getQueue()
+  return self.queue
+end
+
+function Queue:setQueue(queue)
+  self.queue = queue
+end
+
+function Queue:getCallback()
+  return self.callback
+end
+
+function Queue:setCallback(callback)
+  self.callback = callback
+end
+
+-- logic
+
+function Queue:add(item)
+  table.insert(self.queue, item)
+end
+
+function Queue:start()
+  local compiled = function() self:finished() end
+  for k,event in pairs(self.queue) do
+    print("Compiling " .. tostring(event:getId()))
+    local snip = compiled
+    compiled = function()
+      local realCallback = event:getCallback()
+      event:setCallback(function()
+        print("Event compiled callback called")
+        realCallback()
+        -- next queue item
+        snip()
+      end)
+      print("Event started from queue chain")
+      event:start()
+    end
+  end
+  -- Start the queue chain
+  print("Start compiled chain")
+  compiled()
+end
+
+function Queue:finished()
+  print("Queue:finished")
+  local done = function()
+    local callback = self:getCallback()
+    if callback then callback() end
+  end
+  done()
+end
\ No newline at end of file
diff --git a/modules/corelib/corelib.otmod b/modules/corelib/corelib.otmod
index 7a5bb377..58ba6f85 100644
--- a/modules/corelib/corelib.otmod
+++ b/modules/corelib/corelib.otmod
@@ -6,6 +6,8 @@ Module
   reloadable: false
 
   @onLoad: |
+    dofiles 'classes'
+
     dofile 'math'
     dofile 'string'
     dofile 'table'