warscript 0.0.1-dev.e561d29 → 0.0.1-dev.e5e97e8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/attributes.d.ts +1 -0
  2. package/attributes.lua +9 -0
  3. package/core/types/frame.lua +24 -21
  4. package/core/types/player.d.ts +15 -0
  5. package/core/types/player.lua +56 -14
  6. package/core/types/playerCamera.d.ts +2 -0
  7. package/core/types/playerCamera.lua +123 -5
  8. package/core/types/tileCell.d.ts +9 -0
  9. package/core/types/tileCell.lua +92 -0
  10. package/core/types/timer.d.ts +3 -2
  11. package/core/types/timer.lua +22 -2
  12. package/decl/native.d.ts +2 -2
  13. package/engine/behavior.d.ts +3 -0
  14. package/engine/behavior.lua +53 -0
  15. package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
  16. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  17. package/engine/behaviour/ability/restore-mana.d.ts +1 -1
  18. package/engine/behaviour/ability/restore-mana.lua +6 -6
  19. package/engine/behaviour/unit/stun-immunity.d.ts +2 -0
  20. package/engine/behaviour/unit/stun-immunity.lua +11 -2
  21. package/engine/behaviour/unit.d.ts +8 -2
  22. package/engine/behaviour/unit.lua +29 -2
  23. package/engine/buff.d.ts +0 -3
  24. package/engine/buff.lua +64 -85
  25. package/engine/internal/ability.d.ts +3 -1
  26. package/engine/internal/ability.lua +26 -9
  27. package/engine/internal/item+owner.lua +12 -6
  28. package/engine/internal/item.d.ts +13 -15
  29. package/engine/internal/item.lua +63 -49
  30. package/engine/internal/misc/frame-coordinates.d.ts +2 -0
  31. package/engine/internal/misc/frame-coordinates.lua +21 -0
  32. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  33. package/engine/internal/misc/get-terrain-z.lua +11 -0
  34. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  35. package/engine/internal/misc/player-local-handle.lua +5 -0
  36. package/engine/internal/unit/ability.d.ts +14 -14
  37. package/engine/internal/unit/ability.lua +72 -45
  38. package/engine/internal/unit/main-selected.lua +12 -27
  39. package/engine/internal/unit+ability.lua +10 -1
  40. package/engine/internal/unit-missile-launch.lua +44 -20
  41. package/engine/internal/unit.d.ts +16 -9
  42. package/engine/internal/unit.lua +102 -54
  43. package/engine/local-client.d.ts +2 -0
  44. package/engine/local-client.lua +30 -0
  45. package/engine/object-data/entry/ability-type.lua +4 -1
  46. package/engine/object-field/ability.d.ts +3 -3
  47. package/engine/object-field/ability.lua +7 -6
  48. package/engine/object-field.d.ts +8 -2
  49. package/engine/object-field.lua +184 -93
  50. package/engine/random.d.ts +9 -0
  51. package/engine/random.lua +13 -0
  52. package/engine/synchronization.d.ts +11 -0
  53. package/engine/synchronization.lua +77 -0
  54. package/engine/text-tag.d.ts +1 -1
  55. package/engine/text-tag.lua +92 -17
  56. package/net/socket.lua +1 -1
  57. package/objutil/buff.lua +1 -1
  58. package/package.json +2 -2
  59. package/patch-lualib.lua +1 -1
  60. package/utility/arrays.d.ts +1 -0
  61. package/utility/arrays.lua +8 -0
  62. package/utility/callback-array.d.ts +17 -0
  63. package/utility/callback-array.lua +61 -0
  64. package/utility/functions.d.ts +2 -0
  65. package/utility/functions.lua +7 -0
  66. package/utility/linked-set.d.ts +1 -0
  67. package/utility/linked-set.lua +19 -1
  68. package/utility/lua-maps.d.ts +11 -2
  69. package/utility/lua-maps.lua +33 -2
  70. package/utility/lua-sets.d.ts +1 -0
  71. package/utility/lua-sets.lua +4 -0
  72. package/utility/types.d.ts +3 -0
@@ -11,6 +11,12 @@ local ____timer = require("core.types.timer")
11
11
  local Timer = ____timer.Timer
12
12
  local ____destroyable = require("destroyable")
13
13
  local AbstractDestroyable = ____destroyable.AbstractDestroyable
14
+ local ____playerCamera = require("core.types.playerCamera")
15
+ local worldCoordinatesToFrame = ____playerCamera.worldCoordinatesToFrame
16
+ local ____get_2Dterrain_2Dz = require("engine.internal.misc.get-terrain-z")
17
+ local getTerrainZ = ____get_2Dterrain_2Dz.getTerrainZ
18
+ local ____player_2Dlocal_2Dhandle = require("engine.internal.misc.player-local-handle")
19
+ local PLAYER_LOCAL_HANDLE = ____player_2Dlocal_2Dhandle.PLAYER_LOCAL_HANDLE
14
20
  local createTextTag = CreateTextTag
15
21
  local destroyTextTag = DestroyTextTag
16
22
  local setTextTagText = SetTextTagText
@@ -24,6 +30,13 @@ local setTextTagPermanent = SetTextTagPermanent
24
30
  local setTextTagAge = SetTextTagAge
25
31
  local setTextTagLifespan = SetTextTagLifespan
26
32
  local setTextTagFadepoint = SetTextTagFadepoint
33
+ local isUnitHidden = IsUnitHidden
34
+ local isUnitLoaded = IsUnitLoaded
35
+ local isUnitVisible = IsUnitVisible
36
+ local getUnitFlyHeight = GetUnitFlyHeight
37
+ local getUnitX = GetUnitX
38
+ local getUnitY = GetUnitY
39
+ local unitAlive = UnitAlive
27
40
  local DEFAULT_FONT_SIZE = 0.024
28
41
  local function applyConfiguration(textTag, configuration)
29
42
  setTextTagFadepoint(textTag, configuration.fadepoint)
@@ -41,6 +54,33 @@ local function applyConfiguration(textTag, configuration)
41
54
  setTextTagVisibility(textTag, true)
42
55
  end
43
56
  local unitTextTags = setmetatable({}, {__mode = "k"})
57
+ local function ensureHandle(textTag)
58
+ local handle = textTag[101]
59
+ if handle == nil then
60
+ handle = createTextTag()
61
+ applyConfiguration(handle, textTag[102])
62
+ setTextTagPermanent(handle, true)
63
+ setTextTagText(handle, textTag[103] or "", textTag[104] or DEFAULT_FONT_SIZE)
64
+ local color = textTag[105]
65
+ if color ~= nil then
66
+ setTextTagColor(
67
+ handle,
68
+ color.r,
69
+ color.g,
70
+ color.b,
71
+ color.a
72
+ )
73
+ end
74
+ local unit = textTag[100]
75
+ if unit ~= nil then
76
+ setTextTagPosUnit(handle, unit.handle, textTag[102].offsetZ)
77
+ else
78
+ setTextTagPos(handle, textTag[106] or 0, textTag[107] or 0, 0)
79
+ end
80
+ textTag[101] = handle
81
+ end
82
+ return handle
83
+ end
44
84
  ____exports.TextTag = __TS__Class()
45
85
  local TextTag = ____exports.TextTag
46
86
  TextTag.name = "TextTag"
@@ -50,7 +90,11 @@ function TextTag.prototype.____constructor(self, handle)
50
90
  self[101] = handle
51
91
  end
52
92
  function TextTag.prototype.onDestroy(self)
53
- destroyTextTag(self[101])
93
+ local handle = self[101]
94
+ if handle ~= nil then
95
+ destroyTextTag(handle)
96
+ self[101] = nil
97
+ end
54
98
  unitTextTags[self] = nil
55
99
  return AbstractDestroyable.prototype.onDestroy(self)
56
100
  end
@@ -61,14 +105,11 @@ function TextTag.flash(self, configuration, text, x, y, z)
61
105
  applyConfiguration(textTag, configuration)
62
106
  end
63
107
  function TextTag.create(self, configuration, text, unit)
64
- local handle = createTextTag()
65
- setTextTagText(handle, text, DEFAULT_FONT_SIZE)
66
- setTextTagPosUnit(handle, unit.handle, configuration.offsetZ)
67
- applyConfiguration(handle, configuration)
68
- setTextTagPermanent(handle, true)
69
- local textTag = __TS__New(____exports.TextTag, handle)
108
+ local textTag = __TS__New(____exports.TextTag)
109
+ textTag[103] = text
70
110
  textTag[100] = unit
71
111
  textTag[102] = configuration
112
+ ensureHandle(textTag)
72
113
  unitTextTags[textTag] = true
73
114
  return textTag
74
115
  end
@@ -80,7 +121,11 @@ __TS__SetDescriptor(
80
121
  return self[103] or ""
81
122
  end,
82
123
  set = function(self, text)
83
- setTextTagText(self[101], text, self[104] or DEFAULT_FONT_SIZE)
124
+ setTextTagText(
125
+ ensureHandle(self),
126
+ text,
127
+ self[104] or DEFAULT_FONT_SIZE
128
+ )
84
129
  self[103] = text
85
130
  end
86
131
  },
@@ -94,7 +139,11 @@ __TS__SetDescriptor(
94
139
  return self[104] or DEFAULT_FONT_SIZE
95
140
  end,
96
141
  set = function(self, fontSize)
97
- setTextTagText(self[101], self[103] or "", DEFAULT_FONT_SIZE)
142
+ setTextTagText(
143
+ ensureHandle(self),
144
+ self[103] or "",
145
+ fontSize
146
+ )
98
147
  self[104] = fontSize
99
148
  end
100
149
  },
@@ -109,7 +158,7 @@ __TS__SetDescriptor(
109
158
  end,
110
159
  set = function(self, color)
111
160
  setTextTagColor(
112
- self[101],
161
+ ensureHandle(self),
113
162
  color.r,
114
163
  color.g,
115
164
  color.b,
@@ -129,7 +178,11 @@ __TS__SetDescriptor(
129
178
  end,
130
179
  set = function(self, unit)
131
180
  if unit ~= nil then
132
- setTextTagPosUnit(self[101], unit.handle, 0)
181
+ setTextTagPosUnit(
182
+ ensureHandle(self),
183
+ unit.handle,
184
+ 0
185
+ )
133
186
  self[106] = nil
134
187
  self[107] = nil
135
188
  unitTextTags[self] = true
@@ -137,7 +190,12 @@ __TS__SetDescriptor(
137
190
  local unit = self[100]
138
191
  local x = unit.x
139
192
  local y = unit.y
140
- setTextTagPos(self[101], x, y, 0)
193
+ setTextTagPos(
194
+ ensureHandle(self),
195
+ x,
196
+ y,
197
+ 0
198
+ )
141
199
  self[106] = x
142
200
  self[107] = y
143
201
  unitTextTags[self] = nil
@@ -160,14 +218,14 @@ __TS__SetDescriptor(
160
218
  return ____self__106_2 or 0
161
219
  end,
162
220
  set = function(self, x)
163
- local ____self__101_6 = self[101]
221
+ local ____ensureHandle_result_6 = ensureHandle(self)
164
222
  local ____x_7 = x
165
223
  local ____self__107_5 = self[107]
166
224
  if ____self__107_5 == nil then
167
225
  local ____opt_3 = self[100]
168
226
  ____self__107_5 = ____opt_3 and ____opt_3.y
169
227
  end
170
- setTextTagPos(____self__101_6, ____x_7, ____self__107_5 or 0, 0)
228
+ setTextTagPos(____ensureHandle_result_6, ____x_7, ____self__107_5 or 0, 0)
171
229
  self[106] = x
172
230
  self[100] = nil
173
231
  unitTextTags[self] = nil
@@ -188,13 +246,13 @@ __TS__SetDescriptor(
188
246
  return ____self__107_10 or 0
189
247
  end,
190
248
  set = function(self, y)
191
- local ____self__101_14 = self[101]
249
+ local ____ensureHandle_result_14 = ensureHandle(self)
192
250
  local ____self__106_13 = self[106]
193
251
  if ____self__106_13 == nil then
194
252
  local ____opt_11 = self[100]
195
253
  ____self__106_13 = ____opt_11 and ____opt_11.x
196
254
  end
197
- setTextTagPos(____self__101_14, ____self__106_13 or 0, y, 0)
255
+ setTextTagPos(____ensureHandle_result_14, ____self__106_13 or 0, y, 0)
198
256
  self[107] = y
199
257
  self[100] = nil
200
258
  unitTextTags[self] = nil
@@ -268,7 +326,24 @@ TextTag.SHADOW_STRIKE = __TS__ObjectAssign(
268
326
  )
269
327
  Timer.onPeriod[1 / 64]:addListener(function()
270
328
  for textTag in pairs(unitTextTags) do
271
- setTextTagPosUnit(textTag[101], textTag[100].handle, textTag[102].offsetZ)
329
+ local unit = textTag[100].handle
330
+ local x = getUnitX(unit)
331
+ local y = getUnitY(unit)
332
+ local ____, ____, isInView = worldCoordinatesToFrame(
333
+ x,
334
+ y,
335
+ getUnitFlyHeight(unit) + getTerrainZ(x, y)
336
+ )
337
+ if isInView and not isUnitHidden(unit) and not isUnitLoaded(unit) and isUnitVisible(unit, PLAYER_LOCAL_HANDLE) and unitAlive(unit) then
338
+ setTextTagPosUnit(
339
+ ensureHandle(textTag),
340
+ unit,
341
+ textTag[102].offsetZ
342
+ )
343
+ elseif textTag[101] ~= nil then
344
+ destroyTextTag(textTag[101])
345
+ textTag[101] = nil
346
+ end
272
347
  end
273
348
  end)
274
349
  return ____exports
package/net/socket.lua CHANGED
@@ -28,13 +28,13 @@ function Socket.prototype.____constructor(self)
28
28
  onReceive[self[0]]:addListener(function(sender, data)
29
29
  local chunks = chunksByPlayer[sender]
30
30
  if chunks ~= nil then
31
+ chunksByPlayer[sender] = nil
31
32
  chunks[#chunks + 1] = data
32
33
  Event.invoke(
33
34
  self.onMessage,
34
35
  sender,
35
36
  tableConcat(chunks)
36
37
  )
37
- chunksByPlayer[sender] = nil
38
38
  else
39
39
  Event.invoke(self.onMessage, sender, data)
40
40
  end
package/objutil/buff.lua CHANGED
@@ -762,7 +762,7 @@ Unit.onDamaging:addListener(function(source, target, event)
762
762
  end
763
763
  end)
764
764
  Unit.itemPickedUpEvent:addListener(function(unit, item)
765
- if item.powerup and item:hasAbility(fourCC("APdi")) then
765
+ if item.isPowerUp and item:hasAbility(fourCC("APdi")) then
766
766
  end
767
767
  end)
768
768
  return ____exports
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package",
3
3
  "name": "warscript",
4
- "version": "0.0.1-dev.e561d29",
4
+ "version": "0.0.1-dev.e5e97e8",
5
5
  "description": "A typescript library for Warcraft III using Warpack.",
6
6
  "keywords": [
7
7
  "warcraft",
@@ -24,7 +24,7 @@
24
24
  "@warscript/language-extensions": "^0.0.1",
25
25
  "@warscript/tstl-plugin": "^0.0.4",
26
26
  "lua-types": "^2.13.1",
27
- "warpack": "0.0.1-dev.78d2c64"
27
+ "warpack": "0.0.1-dev.251db08"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@typescript-eslint/eslint-plugin": "^8.13.0",
package/patch-lualib.lua CHANGED
@@ -3,7 +3,7 @@ local lualib = _G.require("lualib_bundle")
3
3
  local next = _G.next
4
4
  local ____type = _G.type
5
5
  lualib.__TS__ArrayIsArray = function(value)
6
- return ____type(value) == "table" and (value[1] ~= nil or ({next(value)}) == nil) and value.constructor == nil
6
+ return ____type(value) == "table" and (value[1] ~= nil or (next(value)) == nil) and value.constructor == nil
7
7
  end
8
8
  local __TS__SetDescriptor = lualib.__TS__SetDescriptor
9
9
  lualib.__TS__ObjectDefineProperty = function(target, key, desc)
@@ -5,6 +5,7 @@ export declare const joinToString: <T>(array: readonly T[], separator: string, t
5
5
  export declare const arrayOfNotNull: <T>(...elements: readonly (T | undefined | null)[]) => T[];
6
6
  export declare const array: <T, N extends number>(length: N, initialize: (index: number) => T) => TupleOf<T, N>;
7
7
  export declare const toLuaSet: <T extends AnyNotNil>(array: readonly T[]) => LuaSet<T>;
8
+ export declare const contains: <T>(array: readonly T[], element: T) => boolean;
8
9
  export declare const forEach: <T, Args extends any[]>(array: readonly T[], consumerOrKey: ((value: T, ...args: Args) => void) | KeysOfType<T, (this: T, ...args: Args) => void>, ...args: Args) => void;
9
10
  export declare const all: {
10
11
  <T>(array: readonly T[], transform: (value: T) => boolean): boolean;
@@ -49,6 +49,14 @@ ____exports.toLuaSet = function(array)
49
49
  end
50
50
  return result
51
51
  end
52
+ ____exports.contains = function(array, element)
53
+ for i = 1, #array do
54
+ if array[i] == element then
55
+ return true
56
+ end
57
+ end
58
+ return false
59
+ end
52
60
  ____exports.forEach = function(array, consumerOrKey, ...)
53
61
  if type(consumerOrKey) == "function" then
54
62
  for i = 1, #array do
@@ -0,0 +1,17 @@
1
+ /** @noSelfInFile */
2
+ type Callback = {
3
+ readonly __callback: unique symbol;
4
+ };
5
+ export type CallbackId = number & {
6
+ readonly __callbackId: unique symbol;
7
+ };
8
+ export type CallbackArray = {
9
+ readonly __callbackArray: unique symbol;
10
+ } & Callback[];
11
+ export declare const callbackArray: () => CallbackArray;
12
+ export declare function addCallback<Args extends any[]>(this: void, array: CallbackArray, callback: (...args: Args) => unknown, ...args: Args): CallbackId;
13
+ export declare function clearCallbacks(this: void, array: CallbackArray): void;
14
+ export declare function consumeCallback(this: void, array: CallbackArray, id: CallbackId): void;
15
+ export declare function consumeCallbacks(this: void, array: CallbackArray): void;
16
+ export declare function invokeCallbacks(this: void, array: CallbackArray): void;
17
+ export {};
@@ -0,0 +1,61 @@
1
+ local ____exports = {}
2
+ local safeCall, tableUnpack
3
+ function ____exports.invokeCallbacks(array)
4
+ local length = array[1] or 2
5
+ local i = 2
6
+ while i ~= length do
7
+ local callback = array[i]
8
+ i = i + 1
9
+ local argsCount = array[i]
10
+ i = i + 1
11
+ safeCall(
12
+ callback,
13
+ tableUnpack(array, i, i + argsCount - 1)
14
+ )
15
+ i = i + argsCount
16
+ end
17
+ end
18
+ safeCall = warpack.safeCall
19
+ local select = _G.select
20
+ local tableMove = table.move
21
+ tableUnpack = table.unpack
22
+ ____exports.callbackArray = function() return {} end
23
+ local function doNothing()
24
+ end
25
+ function ____exports.addCallback(array, callback, ...)
26
+ local id = array[1] or 2
27
+ local i = id
28
+ array[i] = callback
29
+ local argsCount = select("#", ...)
30
+ i = i + 1
31
+ array[i] = argsCount
32
+ for j = 1, argsCount do
33
+ i = i + 1
34
+ array[i] = (select(j, ...))
35
+ end
36
+ array[1] = i + 1
37
+ return id
38
+ end
39
+ function ____exports.clearCallbacks(array)
40
+ local length = array[1] or 2
41
+ tableMove(array, length, length + length - 2, 1)
42
+ end
43
+ function ____exports.consumeCallback(array, id)
44
+ local callback = array[id]
45
+ array[id] = doNothing
46
+ id = id + 1
47
+ local argsCount = array[id]
48
+ id = id + 1
49
+ safeCall(
50
+ callback,
51
+ tableUnpack(array, id, id + argsCount - 1)
52
+ )
53
+ end
54
+ function ____exports.consumeCallbacks(array)
55
+ local length = array[1] or 2
56
+ ____exports.invokeCallbacks(array)
57
+ local newLength = array[1] or 2
58
+ tableMove(array, length, length + newLength - 3, 2)
59
+ array[1] = newLength - length + 2
60
+ end
61
+ return ____exports
@@ -9,3 +9,5 @@ export declare const secondArgument: <T>(_: unknown, value: T) => T;
9
9
  export declare const thirdArgument: <T>(_first: unknown, _second: unknown, value: T) => T;
10
10
  export declare const increment: (value: number) => number;
11
11
  export declare const or: (lhs: boolean, rhs: boolean) => boolean;
12
+ export type Transform<T, R> = (<T, R>(value: T) => R) | KeysOfType<T, R>;
13
+ export declare const transform: <T, R>(object: T, transform: Transform<T, R>) => R;
@@ -93,4 +93,11 @@ ____exports.secondArgument = function(_, value) return value end
93
93
  ____exports.thirdArgument = function(_first, _second, value) return value end
94
94
  ____exports.increment = function(value) return value + 1 end
95
95
  ____exports["or"] = function(lhs, rhs) return lhs or rhs end
96
+ ____exports.transform = function(object, transform)
97
+ if type(transform) == "function" then
98
+ return transform(object)
99
+ else
100
+ return object[transform]
101
+ end
102
+ end
96
103
  return ____exports
@@ -36,6 +36,7 @@ export declare class LinkedSet<T extends AnyNotNil> implements ReadonlyLinkedSet
36
36
  copyOf(): LinkedSet<T>;
37
37
  first(): T | undefined;
38
38
  last(): T | undefined;
39
+ pop(): T | undefined;
39
40
  next(key: T): T | undefined;
40
41
  previous(key: T): T | undefined;
41
42
  add(key: T): boolean;
@@ -42,6 +42,23 @@ end
42
42
  function LinkedSet.prototype.last(self)
43
43
  return self.l
44
44
  end
45
+ function LinkedSet.prototype.pop(self)
46
+ local f = self.f
47
+ if f == nil then
48
+ return nil
49
+ end
50
+ local n = self.n
51
+ local next = n[f]
52
+ n[f] = nil
53
+ self.f = next
54
+ if next ~= nil then
55
+ self.p[next] = nil
56
+ else
57
+ self.l = nil
58
+ end
59
+ self.s = self.s - 1
60
+ return f
61
+ end
45
62
  function LinkedSet.prototype.next(self, key)
46
63
  return self.n[key]
47
64
  end
@@ -107,8 +124,9 @@ function LinkedSet.prototype.forEach(self, action, ...)
107
124
  local n = self.n
108
125
  local c = self.f
109
126
  while c ~= nil do
127
+ local next = n[c]
110
128
  action(c, ...)
111
- c = n[c]
129
+ c = next
112
130
  end
113
131
  end
114
132
  function LinkedSet.prototype.toArray(self)
@@ -4,6 +4,15 @@ export declare const emptyLuaMap: <K extends AnyNotNil, V>() => ReadonlyLuaMap<K
4
4
  export declare const mutableLuaMap: <K extends AnyNotNil, V>() => LuaMap<K, V>;
5
5
  export declare const mutableWeakLuaMap: <K extends AnyNotNil, V>() => LuaMap<K, V>;
6
6
  export declare const luaMapOf: <K extends AnyNotNil, V>(...pairs: Flatten<TupleOf<[K, V], 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40>>) => LuaMap<K, V>;
7
- export declare const luaMapInvert: <K extends AnyNotNil, V extends AnyNotNil>(luaMap: LuaMap<K, V>) => LuaMap<V, K>;
8
- export declare const mapValues: <K extends AnyNotNil, V1, V2>(luaMap: LuaMap<K, V1>, transform: (value: V1) => V2) => LuaMap<K, V2>;
7
+ export declare const luaMapInvert: <K extends AnyNotNil, V extends AnyNotNil>(luaMap: ReadonlyLuaMap<K, V | undefined | null>) => LuaMap<V, K>;
8
+ export declare const toLuaMap: <K extends PropertyKey, V>(record: Record<K, V>) => LuaMap<K, V>;
9
+ export declare const flattenKeys: <K extends AnyNotNil, V>(luaMap: ReadonlyLuaMap<readonly K[], V> | ReadonlyLuaMap<K[], V>) => LuaMap<K, V>;
10
+ export declare const mapKeys: {
11
+ <K1 extends AnyNotNil, K2 extends AnyNotNil, V>(luaMap: ReadonlyLuaMap<K1, V>, transform: (value: K1) => K2): LuaMap<K2, V>;
12
+ <K1 extends AnyNotNil, K2 extends keyof K1, V>(luaMap: ReadonlyLuaMap<K1, V>, key: K2): K1[K2] extends AnyNotNil ? LuaMap<K1[K2], V> : never;
13
+ };
14
+ export declare const mapValues: {
15
+ <K extends AnyNotNil, V1, V2>(luaMap: ReadonlyLuaMap<K, V1>, transform: (value: V1) => V2): LuaMap<K, V2>;
16
+ <K extends AnyNotNil, V1, V2 extends keyof V1>(luaMap: ReadonlyLuaMap<K, V1>, key: V2): LuaMap<K, V1[V2]>;
17
+ };
9
18
  export declare const getOrPut: <K extends AnyNotNil, V>(luaMap: LuaMap<K, V>, key: K, defaultValue: () => V) => V;
@@ -27,10 +27,41 @@ ____exports.luaMapInvert = function(luaMap)
27
27
  end
28
28
  return invertLuaMap
29
29
  end
30
+ ____exports.toLuaMap = function(record)
31
+ return record
32
+ end
33
+ ____exports.flattenKeys = function(luaMap)
34
+ local result = {}
35
+ for keys, value in pairs(luaMap) do
36
+ for ____, key in ipairs(keys) do
37
+ result[key] = value
38
+ end
39
+ end
40
+ return result
41
+ end
42
+ ____exports.mapKeys = function(luaMap, transform)
43
+ local result = {}
44
+ if type(transform) == "function" then
45
+ for key, value in pairs(luaMap) do
46
+ result[transform(key)] = value
47
+ end
48
+ else
49
+ for key, value in pairs(luaMap) do
50
+ result[key[transform]] = value
51
+ end
52
+ end
53
+ return result
54
+ end
30
55
  ____exports.mapValues = function(luaMap, transform)
31
56
  local result = {}
32
- for key, value in pairs(luaMap) do
33
- result[key] = transform(value)
57
+ if type(transform) == "function" then
58
+ for key, value in pairs(luaMap) do
59
+ result[key] = transform(value)
60
+ end
61
+ else
62
+ for key, value in pairs(luaMap) do
63
+ result[key] = value[transform]
64
+ end
34
65
  end
35
66
  return result
36
67
  end
@@ -1,4 +1,5 @@
1
1
  /** @noSelfInFile */
2
+ export declare const emptyLuaSet: <T extends AnyNotNil>() => ReadonlyLuaSet<T>;
2
3
  export declare const mutableLuaSet: <T extends AnyNotNil>() => LuaSet<T>;
3
4
  export declare const luaSetOf: <T extends AnyNotNil>(...elements: readonly T[]) => LuaSet<T>;
4
5
  export declare const luaSetOfNotNull: <T extends AnyNotNil>(...elements: readonly (T | undefined | null)[]) => LuaSet<T>;
@@ -1,5 +1,9 @@
1
1
  local ____exports = {}
2
2
  local select = _G.select
3
+ local EMPTY_LUA_SET = {}
4
+ ____exports.emptyLuaSet = function()
5
+ return EMPTY_LUA_SET
6
+ end
3
7
  ____exports.mutableLuaSet = function()
4
8
  return {}
5
9
  end
@@ -37,4 +37,7 @@ export type Flatten<T extends readonly any[], A extends readonly any[] = []> = T
37
37
  export type Prohibit<T, K extends keyof any> = T & {
38
38
  [P in K]?: never;
39
39
  };
40
+ type TupleSplit<T, N extends number, O extends readonly any[] = readonly []> = O["length"] extends N ? [O, T] : T extends readonly [infer F, ...infer R] ? TupleSplit<readonly [...R], N, readonly [...O, F]> : [O, T];
41
+ export type TakeFirst<T extends readonly any[], N extends number> = TupleSplit<T, N>[0];
42
+ export type SkipFirst<T extends readonly any[], N extends number> = TupleSplit<T, N>[1];
40
43
  export {};