Skip to content

Commit 4290294

Browse files
committed
Add "extend" function to iterative.
1 parent 52dd87a commit 4290294

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

domdf_python_tools/iterative.py

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,20 @@
3333
import itertools
3434
import textwrap
3535
from operator import itemgetter
36-
from typing import Any, Callable, Generator, Iterable, Iterator, List, Optional, Sequence, Tuple, Type, Union
36+
from typing import (
37+
Any,
38+
Callable,
39+
Generator,
40+
Iterable,
41+
Iterator,
42+
List,
43+
Optional,
44+
Sequence,
45+
Tuple,
46+
Type,
47+
TypeVar,
48+
Union
49+
)
3750

3851
# 3rd party
3952
from natsort import natsorted, ns # type: ignore
@@ -53,8 +66,11 @@
5366
"natmax",
5467
"groupfloats",
5568
"ranges_from_iterable",
69+
"extend",
5670
]
5771

72+
_T = TypeVar("_T")
73+
5874

5975
def chunks(l: Sequence[Any], n: int) -> Generator[Any, None, None]:
6076
"""
@@ -322,3 +338,22 @@ def ranges_from_iterable(iterable: Iterable[float], step: float = 1) -> Iterable
322338

323339
for group in groupfloats(iterable, step):
324340
yield group[0], group[-1]
341+
342+
343+
def extend(sequence: Iterable[_T], minsize: int) -> List[_T]:
344+
"""
345+
Extend ``sequence`` by repetition until it is at least as long as ``minsize``.
346+
347+
.. versionadded:: 2.3.0
348+
349+
:param sequence:
350+
:param minsize:
351+
"""
352+
353+
output = list(sequence)
354+
cycle = itertools.cycle(output)
355+
356+
while len(output) < minsize:
357+
output.append(next(cycle))
358+
359+
return output

tests/test_iterative.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
Len,
2222
chunks,
2323
double_chain,
24+
extend,
2425
flatten,
2526
groupfloats,
2627
make_tree,
@@ -220,3 +221,23 @@ def test_ranges_from_iterable():
220221

221222
expects = [(1, 5), (7, 10)]
222223
assert list(ranges_from_iterable([1, 2, 3, 4, 5, 7, 8, 9, 10])) == expects
224+
225+
226+
def _extend_param(sequence, expects):
227+
return pytest.param(sequence, expects, id=sequence)
228+
229+
230+
@pytest.mark.parametrize(
231+
"sequence, expects",
232+
[
233+
_extend_param('a', "aaaa"),
234+
_extend_param("ab", "abab"),
235+
_extend_param("abc", "abca"),
236+
_extend_param("abcd", "abcd"),
237+
_extend_param("abcde", "abcde"),
238+
pytest.param(('a', 'b', 'c', 'd', 'e'), "abcde", id="tuple"),
239+
pytest.param(['a', 'b', 'c', 'd', 'e'], "abcde", id="list"),
240+
]
241+
)
242+
def test_extend(sequence, expects):
243+
assert ''.join(extend(sequence, 4)) == expects

0 commit comments

Comments
 (0)