Skip to content

Commit d620ef9

Browse files
committed
feat: add operator module
1 parent 3bad7c7 commit d620ef9

5 files changed

Lines changed: 374 additions & 0 deletions

File tree

spec/operator_spec.lua

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
---@diagnostic disable: param-type-mismatch
2+
3+
local ops = require("mods.operator")
4+
5+
describe("mods.operator", function()
6+
-- stylua: ignore start
7+
local function sum(a, b) return a + b end
8+
local tbl = { a = 1 }
9+
local tests = {
10+
---operator--|--------args------|-expected---
11+
{ "add" , { 3, 4 } , 7 },
12+
{ "sub" , { 3, 4 } , -1 },
13+
{ "mul" , { 3, 4 } , 12 },
14+
{ "div" , { 10, 4 } , 2.5 },
15+
{ "idiv" , { 5, 2 } , 2 },
16+
{ "mod" , { 5, 2 } , 1 },
17+
{ "pow" , { 2, 4 } , 16 },
18+
{ "unm" , { -3 } , 3 },
19+
20+
{ "eq" , { 1, 1 } , true },
21+
{ "neq" , { 1, 2 } , true },
22+
{ "lt" , { 1, 2 } , true },
23+
{ "le" , { 2, 2 } , true },
24+
{ "gt" , { 3, 2 } , true },
25+
{ "ge" , { 2, 2 } , true },
26+
27+
{ "land" , { false, true } , false },
28+
{ "land" , { true, true } , true },
29+
{ "lor" , { false, true } , true },
30+
{ "lor" , { false, false } , false },
31+
{ "lnot" , { true } , false },
32+
33+
{ "concat" , { "a", "b" } , "ab" },
34+
{ "len" , { "abc" } , 3 },
35+
36+
{ "index" , { tbl, "a" } , 1 },
37+
{ "index" , { tbl, "b" } , nil },
38+
{ "call" , { sum, 1, 2 } , 3 },
39+
{ "setindex" , { tbl, "a", 2 } , 2 },
40+
}
41+
-- stylua: ignore end
42+
43+
for i = 1, #tests do
44+
local op, args, expected = unpack(tests[i])
45+
it(op .. "() returns correct value", function()
46+
assert.are_equal(expected, ops[op](unpack(args)))
47+
end)
48+
end
49+
end)

src/mods/init.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ local mods = {}
22
for _, name in ipairs({
33
"is",
44
"List",
5+
"operator",
56
"Set",
67
"str",
78
"stringcase",

src/mods/operator.lua

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
local floor = math.floor
2+
3+
---@type mods.operator
4+
local M = {}
5+
6+
-- stylua: ignore start
7+
function M.add(a, b) return a + b end
8+
function M.sub(a, b) return a - b end
9+
function M.mul(a, b) return a * b end
10+
function M.div(a, b) return a / b end
11+
function M.idiv(a, b) return floor(a / b) end
12+
function M.mod(a, b) return a % b end
13+
function M.pow(a, b) return a ^ b end
14+
function M.unm(a) return -a end
15+
16+
function M.eq(a, b) return a == b end
17+
function M.neq(a, b) return a ~= b end
18+
function M.lt(a, b) return a < b end
19+
function M.le(a, b) return a <= b end
20+
function M.gt(a, b) return a > b end
21+
function M.ge(a, b) return a >= b end
22+
23+
function M.land(a, b) return a and b end
24+
function M.lor(a, b) return a or b end
25+
function M.lnot(a) return not a end
26+
27+
function M.concat(a, b) return a .. b end
28+
function M.len(a) return #a end
29+
30+
function M.index(t, k) return t[k] end
31+
function M.setindex(t, k, v) t[k] = v return v end
32+
function M.call(f, ...) return f(...) end
33+
34+
return M

types/mods.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
---@class mods
55
---@field is mods.is
66
---@field List mods.List
7+
---@field operator mods.operator
78
---@field Set mods.Set
89
---@field str mods.str
910
---@field stringcase mods.stringcase

types/operator.lua

Lines changed: 289 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,289 @@
1+
---@meta mods.operator
2+
3+
---Operator helpers as functions.
4+
---@class mods.operator
5+
local M = {}
6+
7+
--------------------------------------------------------------------------------
8+
---------------------------------- Arithmetic ----------------------------------
9+
--------------------------------------------------------------------------------
10+
11+
---Returns `a + b`.
12+
---
13+
---**Example:**
14+
---```lua
15+
---operator.add(1, 2) -- 3
16+
---```
17+
---@param a number
18+
---@param b number
19+
---@return number
20+
---@nodiscard
21+
function M.add(a, b) end
22+
23+
---Returns `a - b`.
24+
---
25+
---**Example:**
26+
---```lua
27+
---operator.sub(5, 3) -- 2
28+
---```
29+
---@param a number
30+
---@param b number
31+
---@return number
32+
---@nodiscard
33+
function M.sub(a, b) end
34+
35+
---Returns `a * b`.
36+
---
37+
---**Example:**
38+
---```lua
39+
---operator.mul(3, 4) -- 12
40+
---```
41+
---@param a number
42+
---@param b number
43+
---@return number
44+
---@nodiscard
45+
function M.mul(a, b) end
46+
47+
---Returns `a / b`.
48+
---
49+
---**Example:**
50+
---```lua
51+
---operator.div(10, 4) -- 2.5
52+
---```
53+
---@param a number
54+
---@param b number
55+
---@return number
56+
---@nodiscard
57+
function M.div(a, b) end
58+
59+
---Returns integer division `math.floor(a / b)`.
60+
---
61+
---**Example:**
62+
---```lua
63+
---operator.idiv(5, 2) -- 2
64+
---```
65+
---@param a number
66+
---@param b number
67+
---@return number
68+
---@nodiscard
69+
function M.idiv(a, b) end
70+
71+
---Returns `a % b`.
72+
---
73+
---**Example:**
74+
---```lua
75+
---operator.mod(5, 2) -- 1
76+
---```
77+
---@param a number
78+
---@param b number
79+
---@return number
80+
---@nodiscard
81+
function M.mod(a, b) end
82+
83+
---Returns `a ^ b`.
84+
---
85+
---**Example:**
86+
---```lua
87+
---operator.pow(2, 4) -- 16
88+
---```
89+
---@param a number
90+
---@param b number
91+
---@return number
92+
---@nodiscard
93+
function M.pow(a, b) end
94+
95+
---Returns `-a`.
96+
---
97+
---**Example:**
98+
---```lua
99+
---operator.unm(3) -- -3
100+
---```
101+
---@param a number
102+
---@return number
103+
---@nodiscard
104+
function M.unm(a) end
105+
106+
--------------------------------------------------------------------------------
107+
---------------------------------- Comparison ----------------------------------
108+
--------------------------------------------------------------------------------
109+
110+
---Returns `a == b`.
111+
---
112+
---**Example:**
113+
---```lua
114+
---operator.eq(1, 1) -- true
115+
---```
116+
---@param a any
117+
---@param b any
118+
---@return boolean
119+
---@nodiscard
120+
function M.eq(a, b) end
121+
122+
---Returns `a ~= b`.
123+
---
124+
---**Example:**
125+
---```lua
126+
---operator.neq(1, 2) -- true
127+
---```
128+
---@param a any
129+
---@param b any
130+
---@return boolean
131+
---@nodiscard
132+
function M.neq(a, b) end
133+
134+
---Returns `a < b`.
135+
---
136+
---**Example:**
137+
---```lua
138+
---operator.lt(1, 2) -- true
139+
---```
140+
---@param a number
141+
---@param b number
142+
---@return boolean
143+
---@nodiscard
144+
function M.lt(a, b) end
145+
146+
---Returns `a <= b`.
147+
---
148+
---**Example:**
149+
---```lua
150+
---operator.lte(2, 2) -- true
151+
---```
152+
---@param a number
153+
---@param b number
154+
---@return boolean
155+
---@nodiscard
156+
function M.le(a, b) end
157+
158+
---Returns `a > b`.
159+
---
160+
---**Example:**
161+
---```lua
162+
---operator.gt(3, 2) -- true
163+
---```
164+
---@param a number
165+
---@param b number
166+
---@return boolean
167+
---@nodiscard
168+
function M.gt(a, b) end
169+
170+
---Returns `a >= b`.
171+
---
172+
---**Example:**
173+
---```lua
174+
---operator.gte(2, 2) -- true
175+
---```
176+
---@param a number
177+
---@param b number
178+
---@return boolean
179+
---@nodiscard
180+
function M.ge(a, b) end
181+
182+
--------------------------------------------------------------------------------
183+
------------------------------------ Logical -----------------------------------
184+
--------------------------------------------------------------------------------
185+
186+
---Returns `a and b`.
187+
---
188+
---**Example:**
189+
---```lua
190+
---operator.land(true, false) -- false
191+
---```
192+
---@param a any
193+
---@param b any
194+
---@return any
195+
---@nodiscard
196+
function M.land(a, b) end
197+
198+
---Returns `a or b`.
199+
---
200+
---**Example:**
201+
---```lua
202+
---operator.lor(false, true) -- true
203+
---```
204+
---@param a any
205+
---@param b any
206+
---@return any
207+
---@nodiscard
208+
function M.lor(a, b) end
209+
210+
---Returns `not a`.
211+
---
212+
---**Example:**
213+
---```lua
214+
---operator.lnot(true) -- false
215+
---```
216+
---@param a any
217+
---@return boolean
218+
---@nodiscard
219+
function M.lnot(a) end
220+
221+
--------------------------------------------------------------------------------
222+
------------------------------- String & Length --------------------------------
223+
--------------------------------------------------------------------------------
224+
225+
---Returns `a .. b`.
226+
---
227+
---**Example:**
228+
---```lua
229+
---operator.concat("a", "b") -- "ab"
230+
---```
231+
---@param a string
232+
---@param b string
233+
---@return string
234+
---@nodiscard
235+
function M.concat(a, b) end
236+
237+
---Returns `#a`.
238+
---
239+
---**Example:**
240+
---```lua
241+
---operator.len("abc") -- 3
242+
---```
243+
---@param a string|table
244+
---@return integer
245+
---@nodiscard
246+
function M.len(a) end
247+
248+
--------------------------------------------------------------------------------
249+
-------------------------------- Tables & Calls --------------------------------
250+
--------------------------------------------------------------------------------
251+
252+
---Returns `t[k]`.
253+
---
254+
---**Example:**
255+
---```lua
256+
---operator.index({ a = 1 }, "a") -- 1
257+
---```
258+
---@param t table
259+
---@param k any
260+
---@return any
261+
---@nodiscard
262+
function M.index(t, k) end
263+
264+
---Sets `t[k] = v` and returns `v`.
265+
---
266+
---**Example:**
267+
---```lua
268+
---operator.setindex({}, "a", 1) -- 1
269+
---```
270+
---@param t table
271+
---@param k any
272+
---@param v any
273+
---@return any
274+
---@nodiscard
275+
function M.setindex(t, k, v) end
276+
277+
---Calls `f(...)`.
278+
---
279+
---**Example:**
280+
---```lua
281+
---operator.call(math.max, 1, 2) -- 2
282+
---```
283+
---@param f fun(...: any): any
284+
---@param ... any
285+
---@return any
286+
---@nodiscard
287+
function M.call(f, ...) end
288+
289+
return M

0 commit comments

Comments
 (0)