41
41
42
42
import adafruit_itertools as it
43
43
44
+ try :
45
+ from typing import (
46
+ Any ,
47
+ Callable ,
48
+ Iterable ,
49
+ Iterator ,
50
+ List ,
51
+ Optional ,
52
+ Tuple ,
53
+ Type ,
54
+ TypeVar ,
55
+ Union ,
56
+ )
57
+ from typing_extensions import TypeAlias
58
+
59
+ _T = TypeVar ("_T" )
60
+ _N : TypeAlias = Union [int , float , complex ]
61
+ _Predicate : TypeAlias = Callable [[_T ], bool ]
62
+ except ImportError :
63
+ pass
64
+
65
+
44
66
__version__ = "0.0.0+auto.0"
45
67
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Itertools.git"
46
68
47
69
48
- def all_equal (iterable ) :
70
+ def all_equal (iterable : Iterable [ Any ]) -> bool :
49
71
"""Returns True if all the elements are equal to each other.
50
72
51
73
:param iterable: source of values
52
74
53
75
"""
54
76
g = it .groupby (iterable )
55
- next (g ) # should succeed, value isn't relevant
56
77
try :
57
- next (g ) # should fail: only 1 group
78
+ next (g ) # value isn't relevant
79
+ except StopIteration :
80
+ # Empty iterable, return True to match cpython behavior.
81
+ return True
82
+ try :
83
+ next (g )
84
+ # more than one group, so we have different elements.
58
85
return False
59
86
except StopIteration :
87
+ # Only one group - all elements must be equal.
60
88
return True
61
89
62
90
63
- def dotproduct (vec1 , vec2 ) :
91
+ def dotproduct (vec1 : Iterable [ _N ] , vec2 : Iterable [ _N ]) -> _N :
64
92
"""Compute the dot product of two vectors.
65
93
66
94
:param vec1: the first vector
@@ -71,7 +99,11 @@ def dotproduct(vec1, vec2):
71
99
return sum (map (lambda x , y : x * y , vec1 , vec2 ))
72
100
73
101
74
- def first_true (iterable , default = False , pred = None ):
102
+ def first_true (
103
+ iterable : Iterable [_T ],
104
+ default : Union [bool , _T ] = False ,
105
+ pred : Optional [_Predicate [_T ]] = None ,
106
+ ) -> Union [bool , _T ]:
75
107
"""Returns the first true value in the iterable.
76
108
77
109
If no true value is found, returns *default*
@@ -94,7 +126,7 @@ def first_true(iterable, default=False, pred=None):
94
126
return default
95
127
96
128
97
- def flatten (iterable_of_iterables ) :
129
+ def flatten (iterable_of_iterables : Iterable [ Iterable [ _T ]]) -> Iterator [ _T ] :
98
130
"""Flatten one level of nesting.
99
131
100
132
:param iterable_of_iterables: a sequence of iterables to flatten
@@ -104,7 +136,9 @@ def flatten(iterable_of_iterables):
104
136
return it .chain_from_iterable (iterable_of_iterables )
105
137
106
138
107
- def grouper (iterable , n , fillvalue = None ):
139
+ def grouper (
140
+ iterable : Iterable [_T ], n : int , fillvalue : Optional [_T ] = None
141
+ ) -> Iterator [Tuple [_T , ...]]:
108
142
"""Collect data into fixed-length chunks or blocks.
109
143
110
144
:param iterable: source of values
@@ -118,7 +152,7 @@ def grouper(iterable, n, fillvalue=None):
118
152
return it .zip_longest (* args , fillvalue = fillvalue )
119
153
120
154
121
- def iter_except (func , exception ) :
155
+ def iter_except (func : Callable [[], _T ], exception : Type [ BaseException ]) -> Iterator [ _T ] :
122
156
"""Call a function repeatedly, yielding the results, until exception is raised.
123
157
124
158
Converts a call-until-exception interface to an iterator interface.
@@ -143,7 +177,7 @@ def iter_except(func, exception):
143
177
pass
144
178
145
179
146
- def ncycles (iterable , n ) :
180
+ def ncycles (iterable : Iterable [ _T ] , n : int ) -> Iterator [ _T ] :
147
181
"""Returns the sequence elements a number of times.
148
182
149
183
:param iterable: the source of values
@@ -153,7 +187,7 @@ def ncycles(iterable, n):
153
187
return it .chain_from_iterable (it .repeat (tuple (iterable ), n ))
154
188
155
189
156
- def nth (iterable , n , default = None ):
190
+ def nth (iterable : Iterable [ _T ] , n : int , default : Optional [ _T ] = None ) -> Optional [ _T ] :
157
191
"""Returns the nth item or a default value.
158
192
159
193
:param iterable: the source of values
@@ -166,7 +200,7 @@ def nth(iterable, n, default=None):
166
200
return default
167
201
168
202
169
- def padnone (iterable ) :
203
+ def padnone (iterable : Iterable [ _T ]) -> Iterator [ Optional [ _T ]] :
170
204
"""Returns the sequence elements and then returns None indefinitely.
171
205
172
206
Useful for emulating the behavior of the built-in map() function.
@@ -177,13 +211,17 @@ def padnone(iterable):
177
211
return it .chain (iterable , it .repeat (None ))
178
212
179
213
180
- def pairwise (iterable ):
181
- """Pair up valuesin the iterable.
214
+ def pairwise (iterable : Iterable [_T ]) -> Iterator [Tuple [_T , _T ]]:
215
+ """Return successive overlapping pairs from the iterable.
216
+
217
+ The number of tuples from the output will be one fewer than the
218
+ number of values in the input. It will be empty if the input has
219
+ fewer than two values.
182
220
183
221
:param iterable: source of values
184
222
185
223
"""
186
- # pairwise(range(11 )) -> (1, 2 ), (3, 4 ), (5, 6 ), (7, 8), (9, 10 )
224
+ # pairwise(range(5 )) -> (0, 1 ), (1, 2 ), (2, 3 ), (3, 4 )
187
225
a , b = it .tee (iterable )
188
226
try :
189
227
next (b )
@@ -192,7 +230,9 @@ def pairwise(iterable):
192
230
return zip (a , b )
193
231
194
232
195
- def partition (pred , iterable ):
233
+ def partition (
234
+ pred : _Predicate [_T ], iterable : Iterable [_T ]
235
+ ) -> Tuple [Iterator [_T ], Iterator [_T ]]:
196
236
"""Use a predicate to partition entries into false entries and true entries.
197
237
198
238
:param pred: the predicate that divides the values
@@ -204,7 +244,7 @@ def partition(pred, iterable):
204
244
return it .filterfalse (pred , t1 ), filter (pred , t2 )
205
245
206
246
207
- def prepend (value , iterator ) :
247
+ def prepend (value : _T , iterator : Iterable [ _T ]) -> Iterator [ _T ] :
208
248
"""Prepend a single value in front of an iterator
209
249
210
250
:param value: the value to prepend
@@ -215,7 +255,7 @@ def prepend(value, iterator):
215
255
return it .chain ([value ], iterator )
216
256
217
257
218
- def quantify (iterable , pred = bool ):
258
+ def quantify (iterable : Iterable [ _T ] , pred : _Predicate [ _T ] = bool ) -> int :
219
259
"""Count how many times the predicate is true.
220
260
221
261
:param iterable: source of values
@@ -227,7 +267,9 @@ def quantify(iterable, pred=bool):
227
267
return sum (map (pred , iterable ))
228
268
229
269
230
- def repeatfunc (func , times = None , * args ):
270
+ def repeatfunc (
271
+ func : Callable [..., _T ], times : Optional [int ] = None , * args : Any
272
+ ) -> Iterator [_T ]:
231
273
"""Repeat calls to func with specified arguments.
232
274
233
275
Example: repeatfunc(random.random)
@@ -242,7 +284,7 @@ def repeatfunc(func, times=None, *args):
242
284
return it .starmap (func , it .repeat (args , times ))
243
285
244
286
245
- def roundrobin (* iterables ) :
287
+ def roundrobin (* iterables : Iterable [ _T ]) -> Iterator [ _T ] :
246
288
"""Return an iterable created by repeatedly picking value from each
247
289
argument in order.
248
290
@@ -263,18 +305,19 @@ def roundrobin(*iterables):
263
305
nexts = it .cycle (it .islice (nexts , num_active ))
264
306
265
307
266
- def tabulate (function , start = 0 ) :
267
- """Apply a function to a sequence of consecutive integers .
308
+ def tabulate (function : Callable [[ int ], int ], start : int = 0 ) -> Iterator [ int ] :
309
+ """Apply a function to a sequence of consecutive numbers .
268
310
269
- :param function: the function of one integer argument
311
+ :param function: the function of one numeric argument.
270
312
:param start: optional value to start at (default is 0)
271
313
272
314
"""
273
315
# take(5, tabulate(lambda x: x * x))) -> 0 1 4 9 16
274
- return map (function , it .count (start ))
316
+ counter : Iterator [int ] = it .count (start ) # type: ignore[assignment]
317
+ return map (function , counter )
275
318
276
319
277
- def tail (n , iterable ) :
320
+ def tail (n : int , iterable : Iterable [ _T ]) -> Iterator [ _T ] :
278
321
"""Return an iterator over the last n items
279
322
280
323
:param n: how many values to return
@@ -294,7 +337,7 @@ def tail(n, iterable):
294
337
return iter (buf )
295
338
296
339
297
- def take (n , iterable ) :
340
+ def take (n : int , iterable : Iterable [ _T ]) -> List [ _T ] :
298
341
"""Return first n items of the iterable as a list
299
342
300
343
:param n: how many values to take
0 commit comments