From c906f38949cc8ea277246483b12a730e92e3e5d7 Mon Sep 17 00:00:00 2001 From: RDW Date: Mon, 19 Feb 2024 04:22:46 +0100 Subject: [PATCH] Runtime: Add a new table.invert standard library extension Mostly useful for Lua enums. Low cost, moderate benefit = OK to add, I guess. --- Runtime/Extensions/tablex.lua | 11 +++++++++++ Tests/BDD/table-library.spec.lua | 14 ++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/Runtime/Extensions/tablex.lua b/Runtime/Extensions/tablex.lua index 85ef4a1a7..5b6637cca 100644 --- a/Runtime/Extensions/tablex.lua +++ b/Runtime/Extensions/tablex.lua @@ -66,5 +66,16 @@ function table.reverse(tableToReverse) return reversedTable end +function table.invert(tableToInvert) + validation.validateTable(tableToInvert, "tableToInvert") + + local invertedTable = {} + for key, value in pairs(tableToInvert) do + invertedTable[value] = key + end + + return invertedTable +end + table.clear = require("table.clear") table.new = require("table.new") diff --git a/Tests/BDD/table-library.spec.lua b/Tests/BDD/table-library.spec.lua index 8ce6b9698..61f000fd5 100644 --- a/Tests/BDD/table-library.spec.lua +++ b/Tests/BDD/table-library.spec.lua @@ -139,4 +139,18 @@ describe("table", function() assertEquals(table.reverse(input), expectedOutput) end) end) + + describe("invert", function() + it("should throw if a non-table value was passed", function() + assertThrows(function() + table.invert(42) + end, "Expected argument tableToInvert to be a table value, but received a number value instead") + end) + + it("should return a copy of the table with the keys and values swapped", function() + local input = { "A", "B", "C" } + local expectedOutput = { A = 1, B = 2, C = 3 } + assertEquals(table.invert(input), expectedOutput) + end) + end) end)