Skip to content

Commit 832687b

Browse files
committed
hoge
1 parent 272dfb3 commit 832687b

File tree

1 file changed

+115
-36
lines changed

1 file changed

+115
-36
lines changed

lua/plenary/iterators.lua

Lines changed: 115 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@ local f = require "plenary.functional"
1616
local 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+
2627
local Iterator = {}
2728
Iterator.__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
3844
function Iterator:__call(param, state)
3945
return self.gen(param or self.param, state or self.state)
4046
end
@@ -46,6 +52,8 @@ end
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
4957
local numargs = function(...)
5058
local n = select("#", ...)
5159
if n >= 3 then
@@ -63,13 +71,21 @@ local numargs = function(...)
6371
return n
6472
end
6573

74+
---@param state_x? integer
75+
---@param ... any
76+
---@return ...
6677
local return_if_not_empty = function(state_x, ...)
6778
if state_x == nil then
6879
return nil
6980
end
7081
return ...
7182
end
7283

84+
---@param fun function
85+
---@param state_x? integer
86+
---@param ... any
87+
---@return integer?
88+
---@return ...
7389
local call_if_not_empty = function(fun, state_x, ...)
7490
if state_x == nil then
7591
return nil
@@ -80,12 +96,21 @@ end
8096
--------------------------------------------------------------------------------
8197
-- Basic Functions
8298
--------------------------------------------------------------------------------
99+
---@param _param any
100+
---@param _state any
101+
---@return nil
83102
local nil_gen = function(_param, _state)
84103
return nil
85104
end
86105

87106
local 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
89114
local map_gen = function(map, key)
90115
local value
91116
key, value = pairs_gen(map, key)
@@ -94,8 +119,8 @@ end
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
99124
local 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
106131
end
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?
120139
local rawiter = function(obj, param, state)
121140
assert(obj ~= nil, "invalid iterator")
122141

@@ -151,9 +170,9 @@ end
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
158177
local 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
171190
local unwrap = function(self)
172191
return self.gen, self.param, self.state
173192
end
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
180199
local iter = function(obj, param, state)
181200
return wrap(rawiter(obj, param, state))
@@ -185,13 +204,15 @@ exports.iter = iter
185204
exports.wrap = wrap
186205
exports.unwrap = unwrap
187206

207+
---@param fn PlenaryIteratorsIterator
188208
function 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
193213
end
194214

215+
---@return PlenaryIterator
195216
function Iterator:stateful()
196217
return wrap(
197218
co.wrap(function()
@@ -228,6 +249,10 @@ end
228249
--------------------------------------------------------------------------------
229250
-- Generators
230251
--------------------------------------------------------------------------------
252+
---@param param { [1]: integer, [2]: integer }
253+
---@param state? integer
254+
---@return integer? state
255+
---@return integer? state
231256
local 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
238263
end
239264

265+
---@param param { [1]: integer, [2]: integer }
266+
---@param state? integer
267+
---@return integer? state
268+
---@return integer? state
240269
local 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)
247276
end
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
254283
local range = function(start, stop, step)
255284
if step == nil then
@@ -276,21 +305,35 @@ local range = function(start, stop, step)
276305
end
277306
exports.range = range
278307

308+
---@generic T
309+
---@param param_x T[]
310+
---@param state_x integer
311+
---@return integer state
312+
---@return T ...
279313
local duplicate_table_gen = function(param_x, state_x)
280314
return state_x + 1, unpack(param_x)
281315
end
282316

317+
---@param param_x fun(state: integer): ...
318+
---@param state_x integer
319+
---@return integer state
320+
---@return any ...
283321
local duplicate_fun_gen = function(param_x, state_x)
284322
return state_x + 1, param_x(state_x)
285323
end
286324

325+
---@generic T
326+
---@param param_x T
327+
---@param state_x integer
328+
---@return integer state
329+
---@return T param
287330
local duplicate_gen = function(param_x, state_x)
288331
return state_x + 1, param_x
289332
end
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
295338
local 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
308351
local from_fun = function(fun)
309352
assert(type(fun) == "function")
@@ -327,17 +370,25 @@ local ones = function()
327370
end
328371
exports.ones = ones
329372

373+
---@param param_x { [1]: integer, [2]: integer }
374+
---@param _state_x any
375+
---@return 0
376+
---@return integer
330377
local rands_gen = function(param_x, _state_x)
331378
return 0, math.random(param_x[1], param_x[2])
332379
end
333380

381+
---@param _param_x any
382+
---@param _state_x any
383+
---@return 0
384+
---@return float
334385
local rands_nil_gen = function(_param_x, _state_x)
335386
return 0, math.random()
336387
end
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
342393
local rands = function(n, m)
343394
if n == nil and m == nil then
@@ -355,6 +406,10 @@ local rands = function(n, m)
355406
end
356407
exports.rands = rands
357408

409+
---@param param { [1]: string, [2]: string }
410+
---@param state? integer
411+
---@return integer?
412+
---@return string?
358413
local 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)
375430
end
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
381436
local 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
390445
local words = function(input)
391446
return split(input, " ")
392447
end
393448
exports.words = words
394449

450+
---@param input string
451+
---@return PlenaryIterator
395452
local 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 ...
404467
local 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))
407470
end
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
412475
function Iterator:map(fun)
413476
return wrap(map_gen2, { self.gen, self.param, fun }, self.state)
414477
end
415478

479+
---@alias PlenaryIteratorsFlattenParam { [1]: PlenaryIteratorsIterator, [2]: string|table, [3]: integer }
480+
416481
local flatten_gen1
417482
do
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
@@ -432,7 +507,7 @@ do
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
@@ -441,6 +516,10 @@ do
441516
end
442517
end
443518

519+
---@param _ any
520+
---@param state? PlenaryIteratorsFlattenParam
521+
---@return PlearyIteratorsFlattenParam?
522+
---@return ...
444523
local flatten_gen = function(_, state)
445524
if state == nil then
446525
return

0 commit comments

Comments
 (0)