commit 932b0768b27feb96cd160fdeb8c4adb6b0b89114 Author: rhpidfyre Date: Mon Jul 14 15:06:53 2025 -0400 init commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7dc65bd --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +tests/results.* \ No newline at end of file diff --git a/luau/src.luau b/luau/src.luau new file mode 100644 index 0000000..db7ac69 --- /dev/null +++ b/luau/src.luau @@ -0,0 +1,89 @@ +--!strict +--!optimize 2 + +local Array = {} +Array.__index = Array + +type constructor = { inner: {T} } +export type Array = typeof(setmetatable({} :: constructor, Array)) + +type FnCall = (T, number, Array) -> R + +function Array.new(from: {T}?): Array + return setmetatable({ inner = from or {} }, Array) +end + +function Array:table(): {T} + return self.inner +end + +function Array:pop(): T? + return table.remove(self.inner, #self.inner) +end + +function Array:concat(sep: string?, i: number?, j: number?): string + return table.concat(self.inner, sep, i, j) +end + +function Array:clone(): Array + return Array.new(table.clone(self.inner)) +end + +function Array:len(): number + return #self.inner +end + +function Array:get(index: I): T? + return self.inner[index] +end + +function Array:push(...: T): () + for _, val: T in {...} do + table.insert(self.inner, val) + end +end + +function Array:foreach(callbackFn: FnCall): Array + for ind: number, val: T in self.inner do + callbackFn(val, ind, self) + end + return self +end + +function Array:map(callbackFn: FnCall): Array + local n: {M} = {} + for ind: number, val: T in self.inner do + table.insert(n, callbackFn(val, ind, self)) + end + return Array.new(n) +end + +function Array:filter(callbackFn: FnCall): Array + local n: {T} = {} + for ind: number, val: T in self.inner do + if callbackFn(val, ind, self) then + table.insert(n, val) + end + end + return Array.new(n) +end + +function Array:binary_search(x: T): T? + local size = #self.inner + if size == 0 then return nil end + local base = 1 + + while base < size do + size -= bit32.rshift(base + size, 1) + end + + return nil +end + +function Array:debug_display(): string + return self:map(function(val: T, ind: number) + return ind .. ": " .. tostring(val) .. (ind ~= self:len() and ", " or "") + end):concat() +end + +return Array \ No newline at end of file diff --git a/tests/luau/map_filter.luau b/tests/luau/map_filter.luau new file mode 100644 index 0000000..a708dc4 --- /dev/null +++ b/tests/luau/map_filter.luau @@ -0,0 +1,21 @@ +--!strict + +local Array = require("../../luau/src") + +local numbers = Array.new() +for i = 1, 100 do + numbers:push(i) +end +print(numbers:debug_display(), "\nlength=", numbers:len()) + +local start = os.clock() + +numbers:map(function(n: number) + return tostring(n) +end):foreach(function(e) print("(:map)squared=", e) end) + +numbers:filter(function(n: number) + return bit32.band(n, 1) ~= 0 +end):foreach(function(e) print("(:filter)odd=", e) end) + +print(os.clock()-start) \ No newline at end of file diff --git a/tests/start.sh b/tests/start.sh new file mode 100755 index 0000000..6624989 --- /dev/null +++ b/tests/start.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +touch results.txt + +test () { + echo "-- [Test: $1] --" > results.txt + luau $2 >> results.txt + echo "-- [Test: $1] --" >> results.txt +} + +test "map_filter" "./luau/map_filter.luau" \ No newline at end of file