aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--spec/util_array_spec.lua19
-rw-r--r--util/array.lua34
2 files changed, 53 insertions, 0 deletions
diff --git a/spec/util_array_spec.lua b/spec/util_array_spec.lua
index 1d9da947..ff049d0e 100644
--- a/spec/util_array_spec.lua
+++ b/spec/util_array_spec.lua
@@ -148,6 +148,25 @@ describe("util.array", function ()
end);
end);
+ describe("slice", function ()
+ it("works", function ()
+ local a = array({ "a", "b", "c" });
+ assert.equal(array.slice(a, 1, 2), array{ "a", "b" });
+ assert.equal(array.slice(a, 1, 3), array{ "a", "b", "c" });
+ assert.equal(array.slice(a, 2, 3), array{ "b", "c" });
+ assert.equal(array.slice(a, 2), array{ "b", "c" });
+ assert.equal(array.slice(a, -4), array{ "a", "b", "c" });
+ assert.equal(array.slice(a, -3), array{ "a", "b", "c" });
+ assert.equal(array.slice(a, -2), array{ "b", "c" });
+ assert.equal(array.slice(a, -1), array{ "c" });
+ end);
+
+ it("can mutate", function ()
+ local a = array({ "a", "b", "c" });
+ assert.equal(a:slice(-1), array{"c"});
+ assert.equal(a, array{"c"});
+ end);
+ end);
end);
-- TODO The various array.foo(array ina, array outa) functions
diff --git a/util/array.lua b/util/array.lua
index 6e5c8383..c33a5ef1 100644
--- a/util/array.lua
+++ b/util/array.lua
@@ -114,6 +114,40 @@ function array_base.filter(outa, ina, func)
return outa;
end
+function array_base.slice(outa, ina, i, j)
+ if j == nil then
+ j = -1;
+ end
+ if j < 0 then
+ j = #ina + (j+1);
+ end
+ if i < 0 then
+ i = #ina + (i+1);
+ end
+ if i < 1 then
+ i = 1;
+ end
+ if j > #ina then
+ j = #ina;
+ end
+ if i > j then
+ for idx = 1, #outa do
+ outa[idx] = nil;
+ end
+ return outa;
+ end
+
+ for idx = 1, 1+j-i do
+ outa[idx] = ina[i+(idx-1)];
+ end
+ if ina == outa then
+ for idx = 2+j-i, #outa do
+ outa[idx] = nil;
+ end
+ end
+ return outa;
+end
+
function array_base.sort(outa, ina, ...)
if ina ~= outa then
outa:append(ina);