diff --git a/bench/static_analysis/LuauPolyfillMap.lua b/bench/static_analysis/LuauPolyfillMap.lua index d6e86015..fc6b20e8 100644 --- a/bench/static_analysis/LuauPolyfillMap.lua +++ b/bench/static_analysis/LuauPolyfillMap.lua @@ -4,6 +4,35 @@ local Array = {} local Object = {} local Map = {} +local None = newproxy(true) + +type Comparable = (any, any) -> number +local defaultSort = function(a: any, b: any): boolean + return type(a) .. tostring(a) < type(b) .. tostring(b) +end + +function Array.sort(array: Array, compare: Comparable?) + -- wrapperCompare interprets compare return value to be compatible with Lua's table.sort + local wrappedCompare = defaultSort + if compare ~= nil and compare ~= None then + if typeof(compare :: any) ~= "function" then + error("invalid argument to Array.sort: compareFunction must be a function") + end + wrappedCompare = function(a, b) + local result = compare(a, b) + if typeof(result) ~= "number" then + -- deviation: throw an error because + -- it's not clearly defined what is + -- the behavior when the compare function + -- does not return a number + error(("invalid result from compare function, expected number but got %s"):format(typeof(result))) + end + return result < 0 + end + end + table.sort(array, wrappedCompare) + return array +end type Array = { [number]: T } type callbackFn = (element: V, key: K, map: Map) -> () @@ -945,4 +974,17 @@ end) -- #endregion [Describe] "Map" +-- #region [Describe] "coerceToMap" +it("returns the same object if instance of Map", function() + local map = Map.new() + assert(coerceToMap(map) == map) + + map = Map.new({}) + assert(coerceToMap(map) == map) + + map = Map.new({ { AN_ITEM, "foo" } }) + assert(coerceToMap(map) == map) +end) +-- #endregion [Describe] "coerceToMap" + -- #endregion Tests to verify it works as expected