@@ -15,6 +15,30 @@ export type Identifier = Identifier.Identifier
1515
1616local read = Identifier .read
1717
18+ type ClientQueryResult <U ...> = {
19+ __index : ClientQueryResult <U ...>,
20+ __iter : (self : ClientQueryResult <U ...>) -> () -> (number , U ...),
21+
22+ _snapshot : { IncomingPacket },
23+ _identifier : Identifier ,
24+ _senders : { NetServer },
25+
26+ iter : (self : ClientQueryResult <U ...>) -> () -> (number , U ...),
27+ }
28+
29+ type ServerQueryResult <U ...> = {
30+ __index : ServerQueryResult <U ...>,
31+ __iter : (self : ServerQueryResult <U ...>) -> () -> (number , Player , U ...),
32+
33+ _snapshot : { IncomingPacket },
34+ _identifier : Identifier ,
35+ _senders : { Player },
36+ _view : "server" ,
37+
38+ iter : (self : ServerQueryResult <U ...>) -> () -> (number , Player , U ...),
39+ from : (self : QueryResult <U ...>, ...Player ) -> QueryResult <U ...>,
40+ }
41+
1842--[=[
1943 @class QueryResult
2044 @since v0.4.0
@@ -37,23 +61,31 @@ local read = Identifier.read
3761 See [Querying Data](/docs/getting-started/routes#querying) for more information.
3862]=]
3963type QueryResultImpl <U ...> = {
64+ __index : QueryResultImpl <U ...>,
65+ __iter : (self : QueryResult <U ...>) -> () -> (number , Player | NetServer , U ...),
66+
4067 _snapshot : { IncomingPacket },
4168 _identifier : Identifier ,
4269 _senders : { Player | NetServer },
70+ _view : "client" ? ,
4371
44- __index : QueryResultImpl <U ...>,
45- __iter : (self : QueryResult <U ...>) -> () -> (number ? , (Player | NetServer )? , U ...),
46-
72+ iter : (self : QueryResult <U ...>) -> () -> (number , Player | NetServer , U ...),
4773 from : (self : QueryResult <U ...>, ...(Player | NetServer )) -> QueryResult <U ...>,
4874
75+ client : (self : QueryResult <U ...>) -> ClientQueryResult <U ...>,
76+ server : (self : QueryResult <U ...>) -> ServerQueryResult <U ...>,
77+
4978 new : (
5079 snapshot : { IncomingPacket },
5180 identifier : Identifier ,
5281 senders : { Recipient }?
5382 ) -> QueryResult <U ...>,
5483}
5584
56- export type QueryResult <U ...> = typeof (setmetatable ({}, {} :: QueryResultImpl <U ...>))
85+ export type QueryResult <U ...> = typeof (setmetatable (
86+ {} :: QueryResultImpl <U ...>,
87+ {} :: QueryResultImpl <U ...>
88+ ))
5789
5890local QueryResult : QueryResultImpl <...any > = {} :: QueryResultImpl <...any >
5991QueryResult .__index = QueryResult
@@ -82,6 +114,8 @@ function QueryResult:__iter()
82114
83115 local filteredSnapshot = {}
84116
117+ local view = self ._view
118+
85119 for i = 1 , # self ._snapshot do
86120 local packet = self ._snapshot [i ]
87121 if not packet then
@@ -100,18 +134,38 @@ function QueryResult:__iter()
100134
101135 local i = 0
102136
103- return function ()
137+ return function (): ... any
104138 i += 1
105139
106140 local packet = filteredSnapshot [i ]
107141 if not packet then
108142 return
109143 end
110144
145+ if view == "client" then
146+ return i , unpack (packet .data )
147+ end
148+
111149 return i , packet .sender , unpack (packet .data )
112150 end
113151end
114152
153+ --[=[
154+ @method iter
155+ @within QueryResult
156+
157+ An iterator method for typechecking.
158+
159+ ```lua
160+ for i , sender , ... in route :query ():iter () do
161+ -- ...
162+ end
163+ ```
164+ ]=]
165+ function QueryResult :iter ()
166+ return self :__iter ()
167+ end
168+
115169--[=[
116170 @method from
117171 @within QueryResult
@@ -139,6 +193,40 @@ function QueryResult:from(...)
139193 return self .new (self ._snapshot , self ._identifier , senders )
140194end
141195
196+ --[=[
197+ @method client
198+ @within QueryResult
199+
200+ Switches the query to a client view, for typechecking.
201+ The client view will not return a `sender` when iterating.
202+
203+ ```lua
204+ for i , ... in route :query ():client ():iter () do
205+ -- ...
206+ end
207+ ```
208+ ]=]
209+ function QueryResult :client ()
210+ self ._view = "client"
211+ return self :: any
212+ end
213+
214+ --[=[
215+ @method server
216+ @within QueryResult
217+
218+ Switches the query to a server view, for typechecking.
219+
220+ ```lua
221+ for i , player , ... in route :query ():server ():iter () do
222+ -- ...
223+ end
224+ ```
225+ ]=]
226+ function QueryResult :server ()
227+ return self :: any
228+ end
229+
142230--[=[
143231 @function new
144232 @within QueryResult
@@ -153,7 +241,7 @@ function QueryResult.new(snapshot, identifier, senders)
153241 _snapshot = snapshot ,
154242 _identifier = identifier ,
155243 _senders = senders or {},
156- }, QueryResult )
244+ }, QueryResult ) :: any
157245end
158246
159247return QueryResult
0 commit comments