aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2018-05-18 14:57:39 +0100
committerMatthew Wild <mwild1@gmail.com>2018-05-18 14:57:39 +0100
commit13eab871ba348646048623cadde95a5bffc39a82 (patch)
treea30bb2196b4adc5730ed1c82ac7818114e2fdee0
parentd280d2a6b67c71a6d2e995eba35d3a6441e41432 (diff)
downloadprosody-13eab871ba348646048623cadde95a5bffc39a82.tar.gz
prosody-13eab871ba348646048623cadde95a5bffc39a82.zip
util.iterators: Add join() method and tests
-rw-r--r--spec/util_events_spec.lua21
-rw-r--r--util/iterators.lua46
2 files changed, 67 insertions, 0 deletions
diff --git a/spec/util_events_spec.lua b/spec/util_events_spec.lua
index fee60f8f..e8bce737 100644
--- a/spec/util_events_spec.lua
+++ b/spec/util_events_spec.lua
@@ -208,5 +208,26 @@ describe("util.events", function ()
assert.spy(h).was_called(2);
end);
end);
+
+ describe("chaining", function ()
+ local e2;
+ before_each(function ()
+ e2 = events.new(e);
+ h2 = spy.new(function () end);
+ end);
+ it("should fire parent handlers when an event is fired", function ()
+ e.add_handler("myevent", h);
+ e2.add_handler("myevent", h2);
+ e2.fire_event("myevent", "abc");
+ assert.spy(h).was_called(1);
+ assert.spy(h).was_called.with("abc");
+ assert.spy(h2).was_called(1);
+ assert.spy(h2).was_called.with("abc");
+ end);
+ it("should handle changes in the parent's handlers", function ()
+ end);
+ it("should fire wrappers in child and parent", function ()
+ end);
+ end);
end);
end);
diff --git a/util/iterators.lua b/util/iterators.lua
index a152e7be..5d16d8c1 100644
--- a/util/iterators.lua
+++ b/util/iterators.lua
@@ -14,6 +14,11 @@ local t_insert = table.insert;
local select, next = select, next;
local unpack = table.unpack or unpack; --luacheck: ignore 113 143
local pack = table.pack or function (...) return { n = select("#", ...), ... }; end -- luacheck: ignore 143
+local type = type;
+local table, setmetatable = table, setmetatable;
+
+local _ENV = nil;
+--luacheck: std none
-- Reverse an iterator
function it.reverse(f, s, var)
@@ -184,4 +189,45 @@ function it.to_table(f, s, var)
return t;
end
+local function _join_iter(j_s, j_var)
+ local iterators, current_idx = j_s[1], j_s[2];
+ local f, s, var = unpack(iterators[current_idx], 1, 3);
+ if j_var ~= nil then
+ var = j_var;
+ end
+ local ret = pack(f(s, var));
+ local var1 = ret[1];
+ if var1 == nil then
+ -- End of this iterator, advance to next
+ if current_idx == #iterators then
+ -- No more iterators, return nil
+ return;
+ end
+ j_s[2] = current_idx + 1;
+ return _join_iter(j_s);
+ end
+ return unpack(ret, 1, ret.n);
+end
+local join_methods = {};
+local join_mt = {
+ __index = join_methods;
+ __call = function (t, s, var) --luacheck: ignore 212/t
+ return _join_iter(s, var);
+ end;
+};
+
+function join_methods:append(f, s, var)
+ table.insert(self, { f, s, var });
+ return self, { self, 1 };
+end
+
+function join_methods:prepend(f, s, var)
+ table.insert(self, { f, s, var }, 1);
+ return self, { self, 1 };
+end
+
+function it.join(f, s, var)
+ return setmetatable({ {f, s, var} }, join_mt);
+end
+
return it;