@@ -13,12 +13,17 @@ local compat = require "plenary.compat"
13
13
-- Tools
14
14
---- ----------------------------------------------------------------------------
15
15
16
+ --- @class PlenaryIterators
16
17
local exports = {}
17
18
18
- --- @class Iterator
19
- --- @field gen function
20
- --- @field param any
21
- --- @field state any
19
+ --- @generic V
20
+ --- @alias PlenaryIteratorsIterator fun ( table : V[] , i ?: integer ): integer , V ?
21
+
22
+ --- @class PlenaryIterator
23
+ --- @field gen PlenaryIteratorsIterator
24
+ --- @field param table
25
+ --- @field state ? integer
26
+ --- @overload fun ( param ?: table , state ?: integer ): integer , any ?
22
27
local Iterator = {}
23
28
Iterator .__index = Iterator
24
29
@@ -35,6 +40,7 @@ function Iterator:__call(param, state)
35
40
return self .gen (param or self .param , state or self .state )
36
41
end
37
42
43
+ --- @return string
38
44
function Iterator :__tostring ()
39
45
return " <iterator>"
40
46
end
@@ -87,6 +93,10 @@ local map_gen = function(map, key)
87
93
return key , key , value
88
94
end
89
95
96
+ --- @param param string
97
+ --- @param state integer
98
+ --- @return integer ? state
99
+ --- @return string ? r
90
100
local string_gen = function (param , state )
91
101
state = state + 1
92
102
if state > # param then
@@ -96,6 +106,18 @@ local string_gen = function(param, state)
96
106
return state , r
97
107
end
98
108
109
+ --- @generic T : table , U : table
110
+ --- @alias PlenaryIteratorsRawiterTable fun ( obj : T | PlenaryIterator , param ?: string , state ?: integer ): PlenaryIteratorsIterator , T | U | nil , integer ?
111
+
112
+ --- @generic T : table , U : table
113
+ --- @param obj T | PlenaryIterator
114
+ --- @param param ? string
115
+ --- @param state ? integer
116
+ --- @return PlenaryIteratorsIterator gen
117
+ --- @return T | U | nil param
118
+ --- @return integer ? state
119
+ --- @overload fun ( obj : PlenaryIteratorsIterator , param : any , state ?: integer ): PlenaryIteratorsIterator , any , integer ?
120
+ --- @overload fun ( obj : string ): PlenaryIteratorsIterator , string ?, integer ?
99
121
local rawiter = function (obj , param , state )
100
122
assert (obj ~= nil , " invalid iterator" )
101
123
133
155
--- @param gen any
134
156
--- @param param any
135
157
--- @param state any
136
- --- @return Iterator
158
+ --- @return PlenaryIterator
137
159
local function wrap (gen , param , state )
138
160
return setmetatable ({
139
161
gen = gen ,
@@ -143,7 +165,7 @@ local function wrap(gen, param, state)
143
165
end
144
166
145
167
--- Unwrap an iterator metatable into the iterator triplet
146
- --- @param self Iterator
168
+ --- @param self PlenaryIterator
147
169
--- @return any
148
170
--- @return any
149
171
--- @return any
155
177
--- @param obj any
156
178
--- @param param any (optional )
157
179
--- @param state any (optional )
158
- --- @return Iterator
180
+ --- @return PlenaryIterator
159
181
local iter = function (obj , param , state )
160
182
return wrap (rawiter (obj , param , state ))
161
183
end
229
251
--- @param start number
230
252
--- @param stop number
231
253
--- @param step number
232
- --- @return Iterator
254
+ --- @return PlenaryIterator
233
255
local range = function (start , stop , step )
234
256
if step == nil then
235
257
if stop == nil then
270
292
--- Creates an infinite iterator that will yield the arguments
271
293
--- If multiple arguments are passed, the args will be packed and unpacked
272
294
--- @param ...: the arguments to duplicate
273
- --- @return Iterator
295
+ --- @return PlenaryIterator
274
296
local duplicate = function (...)
275
297
if select (" #" , ... ) <= 1 then
276
298
return wrap (duplicate_gen , select (1 , ... ), 0 )
@@ -283,7 +305,7 @@ exports.duplicate = duplicate
283
305
--- Creates an iterator from a function
284
306
--- NOTE: if the function is a closure and modifies state, the resulting iterator will not be stateless
285
307
--- @param fun function
286
- --- @return Iterator
308
+ --- @return PlenaryIterator
287
309
local from_fun = function (fun )
288
310
assert (type (fun ) == " function" )
289
311
return wrap (duplicate_fun_gen , fun , 0 )
@@ -292,15 +314,15 @@ exports.from_fun = from_fun
292
314
293
315
--- Creates an infinite iterator that will yield zeros.
294
316
--- This is an alias to calling duplicate(0)
295
- --- @return Iterator
317
+ --- @return PlenaryIterator
296
318
local zeros = function ()
297
319
return wrap (duplicate_gen , 0 , 0 )
298
320
end
299
321
exports .zeros = zeros
300
322
301
323
--- Creates an infinite iterator that will yield ones.
302
324
--- This is an alias to calling duplicate(1)
303
- --- @return Iterator
325
+ --- @return PlenaryIterator
304
326
local ones = function ()
305
327
return wrap (duplicate_gen , 1 , 0 )
306
328
end
317
339
--- Creates an infinite iterator that will yield random values.
318
340
--- @param n number
319
341
--- @param m number
320
- --- @return Iterator
342
+ --- @return PlenaryIterator
321
343
local rands = function (n , m )
322
344
if n == nil and m == nil then
323
345
return wrap (rands_nil_gen , 0 , 0 )
356
378
--- Return an iterator of substrings separated by a string
357
379
--- @param input string : the string to split
358
380
--- @param sep string : the separator to find and split based on
359
- --- @return Iterator
381
+ --- @return PlenaryIterator
360
382
local split = function (input , sep )
361
383
return wrap (split_gen , { input , sep }, 1 )
362
384
end
387
409
388
410
--- Iterator adapter that maps the previous iterator with a function
389
411
--- @param fun function : The function to map with. Will be called on each element
390
- --- @return Iterator
412
+ --- @return PlenaryIterator
391
413
function Iterator :map (fun )
392
414
return wrap (map_gen2 , { self .gen , self .param , fun }, self .state )
393
415
end
@@ -429,7 +451,7 @@ local flatten_gen = function(_, state)
429
451
end
430
452
431
453
--- Iterator adapter that will recursivley flatten nested iterator structure
432
- --- @return Iterator
454
+ --- @return PlenaryIterator
433
455
function Iterator :flatten ()
434
456
return wrap (flatten_gen , false , { self .gen , self .param , self .state })
435
457
end
@@ -482,13 +504,13 @@ end
482
504
483
505
--- Iterator adapter that will filter values
484
506
--- @param fun function : The function to filter values with. If the function returns true , the value will be kept.
485
- --- @return Iterator
507
+ --- @return PlenaryIterator
486
508
function Iterator :filter (fun )
487
509
return wrap (filter_gen , { self .gen , self .param , fun }, self .state )
488
510
end
489
511
490
512
--- Iterator adapter that will provide numbers from 1 to n as the first multival
491
- --- @return Iterator
513
+ --- @return PlenaryIterator
492
514
function Iterator :enumerate ()
493
515
local i = 0
494
516
return self :map (function (...)
618
640
--- Used for treating consecutive iterators as a single iterator.
619
641
--- Infinity iterators are supported, but are not recommended.
620
642
--- @param ...: the iterators to chain
621
- --- @return Iterator
643
+ --- @return PlenaryIterator
622
644
local chain = function (...)
623
645
local n = numargs (... )
624
646
667
689
--- The returned iterator is truncated in length to the length of the shortest iterator.
668
690
--- For multi-return iterators only the first variable is used.
669
691
--- @param ...: the iterators to zip
670
- --- @return Iterator
692
+ --- @return PlenaryIterator
671
693
local zip = function (...)
672
694
local n = numargs (... )
673
695
if n == 0 then
0 commit comments