fork(1) download
  1. -- Remove values from array when predicate is true. (1.01)
  2. -- @see foUKZx
  3.  
  4. function remove_if(a, pred)
  5. local n = #a
  6. local k = 1
  7. -- Find first matching.
  8. while k <= n and not pred(a[k]) do
  9. k = k + 1
  10. end
  11. -- Copy non-matching.
  12. local last = k-1
  13. for k = k+1, n do
  14. if not pred(a[k]) then
  15. last = last + 1
  16. a[last] = a[k]
  17. end
  18. end
  19. -- Clear empty.
  20. for k = last+1, n do
  21. a[k] = nil
  22. end
  23. assert(#a == last)
  24. end
  25.  
  26. -- Testing.
  27.  
  28. local a = {11,22,33,44,55}
  29. print('a:size:'..#a)
  30. for k, v in ipairs(a) do
  31. print('a:'..k, v)
  32. end
  33.  
  34. -- Remove even.
  35. remove_if(a, function (v) return v%2 == 0 end)
  36. print('b:size:'..#a)
  37. for k, v in ipairs(a) do
  38. print('b:'..k, v)
  39. end
  40.  
  41. -- Remove odd.
  42. remove_if(a, function (v) return v%2 == 1 end)
  43. print('c:size:'..#a)
  44. for k, v in ipairs(a) do
  45. print('c:'..k, v)
  46. end
Success #stdin #stdout 0.01s 5404KB
stdin
Standard input is empty
stdout
a:size:5
a:1	11
a:2	22
a:3	33
a:4	44
a:5	55
b:size:3
b:1	11
b:2	33
b:3	55
c:size:0