@@ -16,13 +16,14 @@ local f = require "plenary.functional"
1616local exports = {}
1717
1818--- @generic V
19- --- @alias PlenaryIteratorsIterator fun ( table : V[] , i ?: integer ): integer , V ?
19+ --- @alias PlenaryIteratorsIterator fun ( param : string | V[] , i ?: integer ): integer ?, string | V | nil
2020
2121--- @class PlenaryIterator
2222--- @field gen PlenaryIteratorsIterator
23- --- @field param table
23+ --- @field param string | table
2424--- @field state ? integer
25- --- @overload fun ( param ?: table , state ?: integer ): integer , any ?
25+ --- @overload fun ( param ?: string | table , state ?: integer ): integer ?, any ?
26+
2627local Iterator = {}
2728Iterator .__index = Iterator
2829
@@ -35,6 +36,11 @@ Iterator.__index = Iterator
3536--- So instead we do not return param and state as multivals when doing wrap
3637--- This causes the first loop iteration to call param and state with nil because we didn't return them as multivals
3738--- We have to use or to check for nil and default to interal starting state and param
39+ --- @generic T
40+ --- @param param ? string | T[]
41+ --- @param state ? integer
42+ --- @return integer i
43+ --- @return string | T v
3844function Iterator :__call (param , state )
3945 return self .gen (param or self .param , state or self .state )
4046end
4652
4753-- A special hack for zip/chain to skip last two state, if a wrapped iterator
4854-- has been passed
55+ --- @param ... any
56+ --- @return integer
4957local numargs = function (...)
5058 local n = select (" #" , ... )
5159 if n >= 3 then
@@ -63,13 +71,21 @@ local numargs = function(...)
6371 return n
6472end
6573
74+ --- @param state_x ? integer
75+ --- @param ... any
76+ --- @return ...
6677local return_if_not_empty = function (state_x , ...)
6778 if state_x == nil then
6879 return nil
6980 end
7081 return ...
7182end
7283
84+ --- @param fun function
85+ --- @param state_x ? integer
86+ --- @param ... any
87+ --- @return integer ?
88+ --- @return ...
7389local call_if_not_empty = function (fun , state_x , ...)
7490 if state_x == nil then
7591 return nil
8096---- ----------------------------------------------------------------------------
8197-- Basic Functions
8298---- ----------------------------------------------------------------------------
99+ --- @param _param any
100+ --- @param _state any
101+ --- @return nil
83102local nil_gen = function (_param , _state )
84103 return nil
85104end
86105
87106local pairs_gen = pairs {}
88107
108+ --- @generic K , V
109+ --- @param map table<K , V>
110+ --- @param key K
111+ --- @return K key
112+ --- @return K key
113+ --- @return V value
89114local map_gen = function (map , key )
90115 local value
91116 key , value = pairs_gen (map , key )
94119
95120--- @param param string
96121--- @param state integer
97- --- @return integer ? state
98- --- @return string ? r
122+ --- @return integer state
123+ --- @return string r
99124local string_gen = function (param , state )
100125 state = state + 1
101126 if state > # param then
@@ -105,18 +130,12 @@ local string_gen = function(param, state)
105130 return state , r
106131end
107132
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
133+ --- @param obj string | function | table | PlenaryIterator
134+ --- @param param ? string | table
114135--- @param state ? integer
115136--- @return PlenaryIteratorsIterator gen
116- --- @return T | U | nil param
137+ --- @return string | table | nil param
117138--- @return integer ? state
118- --- @overload fun ( obj : PlenaryIteratorsIterator , param : any , state ?: integer ): PlenaryIteratorsIterator , any , integer ?
119- --- @overload fun ( obj : string ): PlenaryIteratorsIterator , string ?, integer ?
120139local rawiter = function (obj , param , state )
121140 assert (obj ~= nil , " invalid iterator" )
122141
151170--- Wraps the iterator triplet into a table to allow metamethods and calling with method form
152171--- Important! We do not return param and state as multivals like the original luafun
153172--- See the __call metamethod for more information
154- --- @param gen any
155- --- @param param any
156- --- @param state any
173+ --- @param gen PlenaryIteratorsIterator
174+ --- @param param ? string | table
175+ --- @param state ? integer
157176--- @return PlenaryIterator
158177local function wrap (gen , param , state )
159178 return setmetatable ({
@@ -165,17 +184,17 @@ end
165184
166185--- Unwrap an iterator metatable into the iterator triplet
167186--- @param self PlenaryIterator
168- --- @return any
169- --- @return any
170- --- @return any
187+ --- @return PlenaryIteratorsIterator gen
188+ --- @return string | table param
189+ --- @return integer ? state
171190local unwrap = function (self )
172191 return self .gen , self .param , self .state
173192end
174193
175194--- Create an iterator from an object
176- --- @param obj any
177- --- @param param any ( optional )
178- --- @param state any ( optional )
195+ --- @param obj string | function | table | PlenaryIterator
196+ --- @param param ? table
197+ --- @param state ? integer
179198--- @return PlenaryIterator
180199local iter = function (obj , param , state )
181200 return wrap (rawiter (obj , param , state ))
@@ -185,13 +204,15 @@ exports.iter = iter
185204exports .wrap = wrap
186205exports .unwrap = unwrap
187206
207+ --- @param fn PlenaryIteratorsIterator
188208function Iterator :for_each (fn )
189209 local param , state = self .param , self .state
190210 repeat
191211 state = call_if_not_empty (fn , self .gen (param , state ))
192212 until state == nil
193213end
194214
215+ --- @return PlenaryIterator
195216function Iterator :stateful ()
196217 return wrap (
197218 co .wrap (function ()
228249---- ----------------------------------------------------------------------------
229250-- Generators
230251---- ----------------------------------------------------------------------------
252+ --- @param param { [1] : integer , [2] : integer }
253+ --- @param state ? integer
254+ --- @return integer ? state
255+ --- @return integer ? state
231256local range_gen = function (param , state )
232257 local stop , step = param [1 ], param [2 ]
233258 state = state + step
@@ -237,6 +262,10 @@ local range_gen = function(param, state)
237262 return state , state
238263end
239264
265+ --- @param param { [1] : integer , [2] : integer }
266+ --- @param state ? integer
267+ --- @return integer ? state
268+ --- @return integer ? state
240269local range_rev_gen = function (param , state )
241270 local stop , step = param [1 ], param [2 ]
242271 state = state + step
@@ -247,9 +276,9 @@ local range_rev_gen = function(param, state)
247276end
248277
249278--- Creates a range iterator
250- --- @param start number
251- --- @param stop number
252- --- @param step number
279+ --- @param start integer
280+ --- @param stop ? integer
281+ --- @param step ? integer
253282--- @return PlenaryIterator
254283local range = function (start , stop , step )
255284 if step == nil then
@@ -276,21 +305,35 @@ local range = function(start, stop, step)
276305end
277306exports .range = range
278307
308+ --- @generic T
309+ --- @param param_x T[]
310+ --- @param state_x integer
311+ --- @return integer state
312+ --- @return T ...
279313local duplicate_table_gen = function (param_x , state_x )
280314 return state_x + 1 , unpack (param_x )
281315end
282316
317+ --- @param param_x fun ( state : integer ): ...
318+ --- @param state_x integer
319+ --- @return integer state
320+ --- @return any ...
283321local duplicate_fun_gen = function (param_x , state_x )
284322 return state_x + 1 , param_x (state_x )
285323end
286324
325+ --- @generic T
326+ --- @param param_x T
327+ --- @param state_x integer
328+ --- @return integer state
329+ --- @return T param
287330local duplicate_gen = function (param_x , state_x )
288331 return state_x + 1 , param_x
289332end
290333
291334--- Creates an infinite iterator that will yield the arguments
292335--- If multiple arguments are passed, the args will be packed and unpacked
293- --- @param ...: the arguments to duplicate
336+ --- @param ... any the arguments to duplicate
294337--- @return PlenaryIterator
295338local duplicate = function (...)
296339 if select (" #" , ... ) <= 1 then
@@ -303,7 +346,7 @@ exports.duplicate = duplicate
303346
304347--- Creates an iterator from a function
305348--- NOTE: if the function is a closure and modifies state, the resulting iterator will not be stateless
306- --- @param fun function
349+ --- @param fun fun ( state : integer ): ...
307350--- @return PlenaryIterator
308351local from_fun = function (fun )
309352 assert (type (fun ) == " function" )
@@ -327,17 +370,25 @@ local ones = function()
327370end
328371exports .ones = ones
329372
373+ --- @param param_x { [1] : integer , [2] : integer }
374+ --- @param _state_x any
375+ --- @return 0
376+ --- @return integer
330377local rands_gen = function (param_x , _state_x )
331378 return 0 , math.random (param_x [1 ], param_x [2 ])
332379end
333380
381+ --- @param _param_x any
382+ --- @param _state_x any
383+ --- @return 0
384+ --- @return float
334385local rands_nil_gen = function (_param_x , _state_x )
335386 return 0 , math.random ()
336387end
337388
338389--- Creates an infinite iterator that will yield random values.
339- --- @param n number
340- --- @param m number
390+ --- @param n integer
391+ --- @param m integer
341392--- @return PlenaryIterator
342393local rands = function (n , m )
343394 if n == nil and m == nil then
@@ -355,6 +406,10 @@ local rands = function(n, m)
355406end
356407exports .rands = rands
357408
409+ --- @param param { [1] : string , [2] : string }
410+ --- @param state ? integer
411+ --- @return integer ?
412+ --- @return string ?
358413local split_gen = function (param , state )
359414 local input , sep = param [1 ], param [2 ]
360415 local input_len = # input
@@ -375,8 +430,8 @@ local split_gen = function(param, state)
375430end
376431
377432--- Return an iterator of substrings separated by a string
378- --- @param input string : the string to split
379- --- @param sep string : the separator to find and split based on
433+ --- @param input string the string to split
434+ --- @param sep string the separator to find and split based on
380435--- @return PlenaryIterator
381436local split = function (input , sep )
382437 return wrap (split_gen , { input , sep }, 1 )
@@ -385,13 +440,15 @@ exports.split = split
385440
386441--- Splits a string based on a single space
387442--- An alias for split(input, " ")
388- --- @param input any
389- --- @return any
443+ --- @param input string
444+ --- @return PlenaryIterator
390445local words = function (input )
391446 return split (input , " " )
392447end
393448exports .words = words
394449
450+ --- @param input string
451+ --- @return PlenaryIterator
395452local lines = function (input )
396453 -- TODO: platform specific linebreaks
397454 return split (input , " \n " )
@@ -401,27 +458,45 @@ exports.lines = lines
401458---- ----------------------------------------------------------------------------
402459-- Transformations
403460---- ----------------------------------------------------------------------------
461+ --- @alias PlenaryIteratorsLoop fun ( i ?: integer , v ?: any )
462+
463+ --- @param param { [1] : PlenaryIteratorsIterator , [2] : string | table , [3] : PlenaryIteratorsLoop }
464+ --- @param state ? integer
465+ --- @return integer ?
466+ --- @return ...
404467local map_gen2 = function (param , state )
405468 local gen_x , param_x , fun = param [1 ], param [2 ], param [3 ]
406469 return call_if_not_empty (fun , gen_x (param_x , state ))
407470end
408471
409472--- Iterator adapter that maps the previous iterator with a function
410- --- @param fun function : The function to map with. Will be called on each element
473+ --- @param fun PlenaryIteratorsLoop The function to map with. Will be called on each element
411474--- @return PlenaryIterator
412475function Iterator :map (fun )
413476 return wrap (map_gen2 , { self .gen , self .param , fun }, self .state )
414477end
415478
479+ --- @alias PlenaryIteratorsFlattenParam { [1] : PlenaryIteratorsIterator , [2] : string | table , [3] : integer }
480+
416481local flatten_gen1
417482do
483+ --- @param new_iter PlenaryIterator
484+ --- @param state_x ? integer
485+ --- @param ...
486+ --- @return PlenaryIteratorsFlattenParam ?
487+ --- @return ...
418488 local it = function (new_iter , state_x , ...)
419489 if state_x == nil then
420490 return nil
421491 end
422492 return { new_iter .gen , new_iter .param , state_x }, ...
423493 end
424494
495+ --- @param state PlenaryIteratorsFlattenParam
496+ --- @param state_x ? integer
497+ --- @param ... unknown
498+ --- @return PlenaryIteratorsFlattenParam ?
499+ --- @return ...
425500 flatten_gen1 = function (state , state_x , ...)
426501 if state_x == nil then
427502 return nil
432507 -- experimental part
433508 if getmetatable (first_arg ) == Iterator then
434509 -- attach the iterator to the rest
435- local new_iter = (first_arg .. wrap (state [1 ], state [2 ], state_x )):flatten ()
510+ local new_iter = (first_arg .. wrap (state [1 ], state [2 ], state_x )):flatten () --[[ @as PlenaryIterator ]]
436511 -- advance the iterator by one
437512 return it (new_iter , new_iter .gen (new_iter .param , new_iter .state ))
438513 end
441516 end
442517end
443518
519+ --- @param _ any
520+ --- @param state ? PlenaryIteratorsFlattenParam
521+ --- @return PlearyIteratorsFlattenParam ?
522+ --- @return ...
444523local flatten_gen = function (_ , state )
445524 if state == nil then
446525 return
0 commit comments