Changelog
8.14.0
------
* New functions
* :func:`longest_common_prefix` (thanks to nanouasyn)
* :func:`iequals` (thanks to nanouasyn)
* Changes to existing functions
* `concurrent.futures.ThreadPoolExecutor` is now imported lazily in :func:`callback_iter`.
* :func:`tail` is now optimized for iterables with a fixed length.
* Other changes
* Some documentation issues were fixed (thanks to pochmann and timgates42)
* This library is now marked for Python 3.10 compatibility in PyPI (thanks to chayim)
8.13.0
------
* New functions
* The :func:`subslices` recipe from the `itertools` docs was added (thanks to rhettinger)
* Changes to existing functions
* The :func:`ichunked` function is now more efficient (thanks to hjtran0 and seanmacavaney)
* The :func:`difference` function is now more efficient (thanks to Masynchin)
* The :func:`grouper` recipe now has more features, mirroring the one in the `itertools` docs (thanks to rhettinger)
* Other changes
* Some documentation issues were fixed (thanks to medvied and Freed-Wu)
* The `more_itertools` package is now built with `flit` (thanks to mgorny)
8.12.0
------
* Bug fixes
* Some documentation issues were fixed (thanks to Masynchin, spookylukey, astrojuanlu, and stephengmatthews)
* Python 3.5 support was temporarily restored (thanks to mattbonnell)
8.11.0
------
* New functions
* The :func:`before_and_after`, :func:`sliding_window`, and :func:`triplewise` recipes from the Python 3.10 docs were added
* :func:`duplicates_everseen` and :func:`duplicates_justseen` (thanks to OrBin and DavidPratt512)
* :func:`minmax` (thanks to Ricocotam, MSeifert04, and ruancomelli)
* :func:`strictly_n` (thanks to hwalinga and NotWearingPants)
* :func:`unique_in_window`
* Changes to existing functions
* :func:`groupby_transform` had its type stub improved (thanks to mjk4 and ruancomelli)
* :func:`is_sorted` now accepts a ``strict`` parameter (thanks to Dutcho and ruancomelli)
* :func:`zip_broadcast` was updated to fix a bug (thanks to kalekundert)
8.10.0
------
* Changes to existing functions
* The type stub for :func:`iter_except` was improved (thanks to MarcinKonowalczyk)
* Other changes:
* Type stubs now ship with the source release (thanks to saaketp)
* The Sphinx docs were improved (thanks to MarcinKonowalczyk)
8.9.0
-----
* New functions
* :func:`interleave_evenly` (thanks to mbugert)
* :func:`repeat_each` (thanks to FinalSh4re)
* :func:`chunked_even` (thanks to valtron)
* :func:`map_if` (thanks to sassbalint)
* :func:`zip_broadcast` (thanks to kalekundert)
* Changes to existing functions
* The type stub for :func:`chunked` was improved (thanks to PhilMacKay)
* The type stubs for :func:`zip_equal` and `zip_offset` were improved (thanks to maffoo)
* Building Sphinx docs locally was improved (thanks to MarcinKonowalczyk)
8.8.0
-----
* New functions
* :func:`countable` (thanks to krzysieq)
* Changes to existing functions
* :func:`split_before` was updated to handle empy collections (thanks to TiunovNN)
* :func:`unique_everseen` got a performance boost (thanks to Numerlor)
* The type hint for :func:`value_chain` was corrected (thanks to vr2262)
8.7.0
-----
* New functions
* :func:`convolve` (from the Python itertools docs)
* :func:`product_index`, :func:`combination_index`, and :func:`permutation_index` (thanks to N8Brooks)
* :func:`value_chain` (thanks to jenstroeger)
* Changes to existing functions
* :func:`distinct_combinations` now uses a non-recursive algorithm (thanks to knutdrand)
* :func:`pad_none` is now the preferred name for :func:`padnone`, though the latter remains available.
* :func:`pairwise` will now use the Python standard library implementation on Python 3.10+
* :func:`sort_together` now accepts a ``key`` argument (thanks to brianmaissy)
* :func:`seekable` now has a ``peek`` method, and can indicate whether the iterator it's wrapping is exhausted (thanks to gsakkis)
* :func:`time_limited` can now indicate whether its iterator has expired (thanks to roysmith)
* The implementation of :func:`unique_everseen` was improved (thanks to plammens)
* Other changes:
* Various documentation updates (thanks to cthoyt, Evantm, and cyphase)
8.6.0
-----
* New itertools
* :func:`all_unique` (thanks to brianmaissy)
* :func:`nth_product` and :func:`nth_permutation` (thanks to N8Brooks)
* Changes to existing itertools
* :func:`chunked` and :func:`sliced` now accept a ``strict`` parameter (thanks to shlomif and jtwool)
* Other changes
* Python 3.5 has reached its end of life and is no longer supported.
* Python 3.9 is officially supported.
* Various documentation fixes (thanks to timgates42)
8.5.0
-----
* New itertools
* :func:`windowed_complete` (thanks to MarcinKonowalczyk)
* Changes to existing itertools:
* The :func:`is_sorted` implementation was improved (thanks to cool-RR)
* The :func:`groupby_transform` now accepts a ``reducefunc`` parameter.
* The :func:`last` implementation was improved (thanks to brianmaissy)
* Other changes
* Various documentation fixes (thanks to craigrosie, samuelstjean, PiCT0)
* The tests for :func:`distinct_combinations` were improved (thanks to Minabsapi)
* Automated tests now run on GitHub Actions. All commits now check:
* That unit tests pass
* That the examples in docstrings work
* That test coverage remains high (using `coverage`)
* For linting errors (using `flake8`)
* For consistent style (using `black`)
* That the type stubs work (using `mypy`)
* That the docs build correctly (using `sphinx`)
* That packages build correctly (using `twine`)
8.4.0
-----
* New itertools
* :func:`mark_ends` (thanks to kalekundert)
* :func:`is_sorted`
* Changes to existing itertools:
* :func:`islice_extended` can now be used with real slices (thanks to cool-RR)
* The implementations for :func:`filter_except` and :func:`map_except` were improved (thanks to SergBobrovsky)
* Other changes
* Automated tests now enforce code style (using `black <https://github.com/psf/black>`__)
* The various signatures of :func:`islice_extended` and :func:`numeric_range` now appear in the docs (thanks to dsfulf)
* The test configuration for mypy was updated (thanks to blueyed)
8.3.0
-----
* New itertools
* :func:`zip_equal` (thanks to frankier and alexmojaki)
* Changes to existing itertools:
* :func:`split_at`, :func:`split_before`, :func:`split_after`, and :func:`split_when` all got a ``maxsplit`` paramter (thanks to jferard and ilai-deutel)
* :func:`split_at` now accepts a ``keep_separator`` parameter (thanks to jferard)
* :func:`distinct_permutations` can now generate ``r``-length permutations (thanks to SergBobrovsky and ilai-deutel)
* The :func:`windowed` implementation was improved (thanks to SergBobrovsky)
* The :func:`spy` implementation was improved (thanks to has2k1)
* Other changes
* Type stubs are now tested with ``stubtest`` (thanks to ilai-deutel)
* Tests now run with ``python -m unittest`` instead of ``python setup.py test`` (thanks to jdufresne)
8.2.0
-----
* Bug fixes
* The .pyi files for typing were updated. (thanks to blueyed and ilai-deutel)
* Changes to existing itertools:
* :func:`numeric_range` now behaves more like the built-in :func:`range`. (thanks to jferard)
* :func:`bucket` now allows for enumerating keys. (thanks to alexchandel)
* :func:`sliced` now should now work for numpy arrays. (thanks to sswingle)
* :func:`seekable` now has a ``maxlen`` parameter.
8.1.0
-----
* Bug fixes
* :func:`partition` works with ``pred=None`` again. (thanks to MSeifert04)
* New itertools
* :func:`sample` (thanks to tommyod)
* :func:`nth_or_last` (thanks to d-ryzhikov)
* Changes to existing itertools:
* The implementation for :func:`divide` was improved. (thanks to jferard)
8.0.2
-----
* Bug fixes
* The type stub files are now part of the wheel distribution (thanks to keisheiled)
8.0.1
-----
* Bug fixes
* The type stub files now work for functions imported from the
root package (thanks to keisheiled)
8.0.0
-----
* New itertools and other additions
* This library now ships type hints for use with mypy.
(thanks to ilai-deutel for the implementation, and to gabbard and fmagin for assistance)
* :func:`split_when` (thanks to jferard)
* :func:`repeat_last` (thanks to d-ryzhikov)
* Changes to existing itertools:
* The implementation for :func:`set_partitions` was improved. (thanks to jferard)
* :func:`partition` was optimized for expensive predicates. (thanks to stevecj)
* :func:`unique_everseen` and :func:`groupby_transform` were re-factored. (thanks to SergBobrovsky)
* The implementation for :func:`difference` was improved. (thanks to Jabbey92)
* Other changes
* Python 3.4 has reached its end of life and is no longer supported.
* Python 3.8 is officially supported. (thanks to jdufresne)
* The ``collate`` function has been deprecated.
It raises a ``DeprecationWarning`` if used, and will be removed in a future release.
* :func:`one` and :func:`only` now provide more informative error messages. (thanks to gabbard)
* Unit tests were moved outside of the main package (thanks to jdufresne)
* Various documentation fixes (thanks to kriomant, gabbard, jdufresne)
7.2.0
-----
* New itertools
* :func:`distinct_combinations`
* :func:`set_partitions` (thanks to kbarrett)
* :func:`filter_except`
* :func:`map_except`
7.1.0
-----
* New itertools
* :func:`ichunked` (thanks davebelais and youtux)
* :func:`only` (thanks jaraco)
* Changes to existing itertools:
* :func:`numeric_range` now supports ranges specified by
``datetime.datetime`` and ``datetime.timedelta`` objects (thanks to MSeifert04 for tests).
* :func:`difference` now supports an *initial* keyword argument.
* Other changes
* Various documentation fixes (thanks raimon49, pylang)