-- Remove values from array when predicate is true. (1.01)
-- @see foUKZx
function remove_if(a, pred)
local n = #a
local k = 1
-- Find first matching.
while k <= n and not pred(a[k]) do
k = k + 1
end
-- Copy non-matching.
local last = k-1
for k = k+1, n do
if not pred(a[k]) then
last = last + 1
a[last] = a[k]
end
end
-- Clear empty.
for k = last+1, n do
a[k] = nil
end
assert(#a == last)
end
-- Testing.
local a = {11,22,33,44,55}
print('a:size:'..#a)
for k, v in ipairs(a) do
print('a:'..k, v)
end
-- Remove even.
remove_if(a, function (v) return v%2 == 0 end)
print('b:size:'..#a)
for k, v in ipairs(a) do
print('b:'..k, v)
end
-- Remove odd.
remove_if(a, function (v) return v%2 == 1 end)
print('c:size:'..#a)
for k, v in ipairs(a) do
print('c:'..k, v)
end
LS0gUmVtb3ZlIHZhbHVlcyBmcm9tIGFycmF5IHdoZW4gcHJlZGljYXRlIGlzIHRydWUuICgxLjAxKQotLSBAc2VlIGZvVUtaeAoKZnVuY3Rpb24gcmVtb3ZlX2lmKGEsIHByZWQpCiAgICBsb2NhbCBuID0gI2EKICAgIGxvY2FsIGsgPSAxCiAgICAtLSBGaW5kIGZpcnN0IG1hdGNoaW5nLgogICAgd2hpbGUgayA8PSBuIGFuZCBub3QgcHJlZChhW2tdKSBkbwogICAgICAgIGsgPSBrICsgMQogICAgZW5kCiAgICAtLSBDb3B5IG5vbi1tYXRjaGluZy4KICAgIGxvY2FsIGxhc3QgPSBrLTEKICAgIGZvciBrID0gaysxLCBuIGRvCiAgICAgICAgaWYgbm90IHByZWQoYVtrXSkgdGhlbgogICAgICAgICAgICBsYXN0ID0gbGFzdCArIDEKICAgICAgICAgICAgYVtsYXN0XSA9IGFba10KICAgICAgICBlbmQKICAgIGVuZAogICAgLS0gQ2xlYXIgZW1wdHkuCiAgICBmb3IgayA9IGxhc3QrMSwgbiBkbwogICAgICAgIGFba10gPSBuaWwKICAgIGVuZAogICAgYXNzZXJ0KCNhID09IGxhc3QpCmVuZAoKLS0gVGVzdGluZy4KCmxvY2FsIGEgPSB7MTEsMjIsMzMsNDQsNTV9CnByaW50KCdhOnNpemU6Jy4uI2EpCmZvciBrLCB2IGluIGlwYWlycyhhKSBkbwogICAgcHJpbnQoJ2E6Jy4uaywgdikKZW5kCgotLSBSZW1vdmUgZXZlbi4KcmVtb3ZlX2lmKGEsIGZ1bmN0aW9uICh2KSByZXR1cm4gdiUyID09IDAgZW5kKQpwcmludCgnYjpzaXplOicuLiNhKQpmb3IgaywgdiBpbiBpcGFpcnMoYSkgZG8KICAgIHByaW50KCdiOicuLmssIHYpCmVuZAoKLS0gUmVtb3ZlIG9kZC4KcmVtb3ZlX2lmKGEsIGZ1bmN0aW9uICh2KSByZXR1cm4gdiUyID09IDEgZW5kKQpwcmludCgnYzpzaXplOicuLiNhKQpmb3IgaywgdiBpbiBpcGFpcnMoYSkgZG8KICAgIHByaW50KCdjOicuLmssIHYpCmVuZA==