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