From de7494ee4ef0e76b12ade67f9e2c6a7d3fc13bdb Mon Sep 17 00:00:00 2001 From: Trevor Redfern Date: Thu, 20 May 2021 07:36:06 -0400 Subject: [PATCH] added count routine --- docs/moonpie.tables.rst | 12 ++++++++++++ moonpie/tables/count.lua | 14 ++++++++++++++ moonpie/tables/count_spec.lua | 19 +++++++++++++++++++ moonpie/tables/init.lua | 1 + moonpie/tables/init_spec.lua | 1 + 5 files changed, 47 insertions(+) create mode 100644 moonpie/tables/count.lua create mode 100644 moonpie/tables/count_spec.lua diff --git a/docs/moonpie.tables.rst b/docs/moonpie.tables.rst index d552be7..697cf5b 100644 --- a/docs/moonpie.tables.rst +++ b/docs/moonpie.tables.rst @@ -3,6 +3,18 @@ moonpie.tables The tables utilities provides various mini-functions for helpful operations. +tables.count(set, func) + Returns the count of items that match the comparison function passed in. + +.. code-block:: lua + + local set = { 1, 2, 3, 4, 5, 6 } + local compare = function(v) return v % 2 == 0 end + + print(tables.count(set, compare)) + -- 3 + + tables.deepCompare(tbl1, tbl2, ignoreMT) Tests the values in the the 2 tables to see if they look the same without having to be the same table instance. diff --git a/moonpie/tables/count.lua b/moonpie/tables/count.lua new file mode 100644 index 0000000..f5b399d --- /dev/null +++ b/moonpie/tables/count.lua @@ -0,0 +1,14 @@ +-- Copyright (c) 2021 Trevor Redfern +-- +-- This software is released under the MIT License. +-- https://opensource.org/licenses/MIT + +return function(set, func) + if func == nil then return #set end + + local c = 0 + for _, v in ipairs(set) do + if func(v) then c = c + 1 end + end + return c +end \ No newline at end of file diff --git a/moonpie/tables/count_spec.lua b/moonpie/tables/count_spec.lua new file mode 100644 index 0000000..6e47de0 --- /dev/null +++ b/moonpie/tables/count_spec.lua @@ -0,0 +1,19 @@ +-- Copyright (c) 2021 Trevor Redfern +-- +-- This software is released under the MIT License. +-- https://opensource.org/licenses/MIT + +describe("moonpie.tables.count", function() + local count = require "moonpie.tables.count" + + it("returns the number of items matching a function", function() + local set = { 1, 2, 3, 4, 5, 6 } + + assert.equals(3, count(set, function(i) return i % 2 == 0 end)) + end) + + it("just returns the number of items if no function provided", function() + local set = { 1, 2, 3, 4, 5, 6 } + assert.equals(6, count(set)) + end) +end) \ No newline at end of file diff --git a/moonpie/tables/init.lua b/moonpie/tables/init.lua index 69d56ea..49ae10a 100644 --- a/moonpie/tables/init.lua +++ b/moonpie/tables/init.lua @@ -9,6 +9,7 @@ return { assign = require "moonpie.tables.assign", concatArray = require "moonpie.tables.concat_array", copyKeys = require "moonpie.tables.copy_keys", + count = require "moonpie.tables.count", countBy = require "moonpie.tables.count_by", countKeys = require "moonpie.tables.count_keys", deepCompare = require "moonpie.tables.deep_compare", diff --git a/moonpie/tables/init_spec.lua b/moonpie/tables/init_spec.lua index 46af15d..f707192 100644 --- a/moonpie/tables/init_spec.lua +++ b/moonpie/tables/init_spec.lua @@ -24,6 +24,7 @@ describe("moonpie.tables", function() assert.is_function(tables.assign) assert.is_function(tables.concatArray) assert.is_function(tables.copyKeys) + assert.is_function(tables.count) assert.is_function(tables.countBy) assert.is_function(tables.countKeys) assert.is_function(tables.deepCompare)