init commit
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
tests/results.*
|
89
luau/src.luau
Normal file
89
luau/src.luau
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
--!strict
|
||||||
|
--!optimize 2
|
||||||
|
|
||||||
|
local Array = {}
|
||||||
|
Array.__index = Array
|
||||||
|
|
||||||
|
type constructor<T> = { inner: {T} }
|
||||||
|
export type Array<T> = typeof(setmetatable({} :: constructor<T>, Array))
|
||||||
|
|
||||||
|
type FnCall<T, R = T> = (T, number, Array<T>) -> R
|
||||||
|
|
||||||
|
function Array.new<T>(from: {T}?): Array<T>
|
||||||
|
return setmetatable({ inner = from or {} }, Array)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Array:table<T>(): {T}
|
||||||
|
return self.inner
|
||||||
|
end
|
||||||
|
|
||||||
|
function Array:pop<T>(): 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<T>(): Array<T>
|
||||||
|
return Array.new(table.clone(self.inner))
|
||||||
|
end
|
||||||
|
|
||||||
|
function Array:len(): number
|
||||||
|
return #self.inner
|
||||||
|
end
|
||||||
|
|
||||||
|
function Array:get<T, I>(index: I): T?
|
||||||
|
return self.inner[index]
|
||||||
|
end
|
||||||
|
|
||||||
|
function Array:push<T>(...: T): ()
|
||||||
|
for _, val: T in {...} do
|
||||||
|
table.insert(self.inner, val)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function Array:foreach<T>(callbackFn: FnCall<T, nil>): Array<T>
|
||||||
|
for ind: number, val: T in self.inner do
|
||||||
|
callbackFn(val, ind, self)
|
||||||
|
end
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
function Array:map<T, M>(callbackFn: FnCall<T, M>): Array<M>
|
||||||
|
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<T>(callbackFn: FnCall<T, boolean>): Array<T>
|
||||||
|
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<T>(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<T>(): string
|
||||||
|
return self:map(function(val: T, ind: number)
|
||||||
|
return ind .. ": " .. tostring(val) .. (ind ~= self:len() and ", " or "")
|
||||||
|
end):concat()
|
||||||
|
end
|
||||||
|
|
||||||
|
return Array
|
21
tests/luau/map_filter.luau
Normal file
21
tests/luau/map_filter.luau
Normal file
@ -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)
|
11
tests/start.sh
Executable file
11
tests/start.sh
Executable file
@ -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"
|
Reference in New Issue
Block a user