Revision history for Iterator-Flex 0.34 2026-04-27 18:16:21 EDT [BUGFIX] * igrep/Grep and the foreach iterator method returned early if the iterator stream contained a false value. * imap skips empty list results rather than returning premature undef values. * the drain iterator method, itake/Take, ichunk/Chunk, and icache/Cache validate capacity parameters * construct_from_iterable didn't consistently validate its options [DOCUMENTATION] * Fix typos in documentation and test descriptions. 0.33 2025-12-18 12:38:43 EST [ENHANCEMENT] * iterators have new predicates (throws_on_exhaustion, returns_on_exhaustion) to determine exhaustion handling * Iterator methods which begin with 'i' are available without the leading 'i'. The previous ones (e.g. imap, ichunk) are deprecated but still available. As these are methods on existing iterators, the leading 'i' is superfluous. * New iterator method, foreach * Added iterator methods which track the existing adapters: cat/chain, gather, take, buffer 0.32 2025-10-02 14:37:03 EDT [TESTS] * t/permute.t inadvertently asked for a Perl feature it didn't need, precluding testing on Perl's < 5.36. ++SREZIC. 0.31 2025-09-20 17:51:23 EDT [ENHANCEMENT] * new: iflatten/Flatten - flatten an iterator's values * reduce overhead in creating iterators * many optimizations in individual iterators 0.30 2025-09-15 15:34:00 EDT [ENHANCEMENT] * ipermute/Permute - permute an array * ibuffer/Buffer - buffer an iterator's output * ibatch is an alias for ichunk * itake/Take - take a set number of elements from an iterator 0.29 2025-09-09 14:47:49 EDT [BUG FIX] * ichunk/Chunk returned an empty arrayref rather than signalling exhaustion if the number of input elements was an exact multiple of the capacity. ++marioroy 0.28 2025-08-28 17:54:59 EDT [API CHANGE] * igather/Gather * the default behavior on input iterator exhaustion is GATHER_CYCLE_STOP; new cycle_on_exhaustion parameter may be set to GATHER_CYCLE_CHOOSE for old behavior. [ENHANCEMENT] * igather/Gather * gather cycles can be restarted based upon difference between elements. (GATHER_ELEMENT_CACHE | GATHER_ELEMENT_RESTART ) * the default behavior on exhaustion is GATHER_CYCLE_STOP; * rewind is supported * examples! 0.27 2025-08-27 17:33:40 EDT [ENHANCEMENT] * New modifier, ichunk/Chunk, combines upstream iterator elements into chunks of a given size. 0.26 2025-08-22 16:04:52 EDT [ENHANCEMENT] * Stack now supports reset and rewind, with caveats and extra knobs * the drain method takes an optional number of elements to drain * imap now properly handles subs which return lists * imap supports 'rewind' [BUG FIX] * Zip 'rewind' was actually a 'reset'. Now it's truly 'rewind'. * Map was under the impression it supported 'current', but it doesn't. 0.25 2025-08-18 14:27:59 EDT [BUG FIX] * Zip claimed it supported rewind, but didn't, resulting in an inscrutable run time error 0.24 2025-07-28 13:41:45 EDT [BUGFIX] * workaround perldb issues with blessed coderefs (https://github.com/Perl/perl5/issues/23486 ) 0.23 2025-07-28 10:45:02 EDT [TESTS] * add missing test for Zip where insertions requested but not actually needed. 0.22 2025-07-27 00:38:09 EDT [ENHANCEMENT] * Zip now provides different ways of handling input iterators which exhaust out of sequence. 0.21 2025-07-25 16:06:53 EDT [ENHANCEMENT] * new iterator, Iterator::Flex::Common/izip / Iterator::Flex::Zip 0.20 2025-07-24 21:20:01-04:00 America/New_York [ENHANCEMENT] * iterators now have a drain method. * New iterator adapter, Gather, allows for gathering selected elements into a buffer, returning the buffer, repeating. see Iterator::Flex::Common/igather, Iterator::Flex::Gather [BUG FIX] * iterator ->may() method always returned true; now it does what's on the tin. * several of the iterator wrappers had incorrect prototypes and didn't pass all of their args to the iterator constructors. [INTERNALS] * Iterator state is now tracked in the iterator registry using arrays instead of hashes. 0.19 2025-06-19 12:19:18-04:00 America/New_York [DOCUMENTATION] * icat takes a list of iterables, not an arrayref 0.18 2023-11-03 19:44:53-04:00 America/New_York * add Stack and istack to iterate and manipulate a stack of iterators 0.17 2023-10-30 23:13:49-04:00 America/New_York [ENHANCEMENT] * add Cat and icat to concatenate iterators 0.16 2023-09-28 19:17:13-04:00 America/New_York [ENHANCEMENT] * document cache iterator's 'at' method (and make it work) 0.15 2022-07-18 11:50:51-04:00 America/New_York [BUG FIX] * resolve RT#141012, always call overload::Method with three arguments. HVDS++ * sequences did not correctly handle exhaustion => 'throw' or exhaustion => [ return => $sentinel ] * some of the non-documented ways of handling input exhaustion didn't work as expected. [DOCUMENTATION] * rework Iterator::Flex::Manual:Authoring * iterator adaptors handling of input exhaustion from their input iterators was not properly/fully documented. 0.14 2021-10-06 15:00:47-04:00 America/New_York [BUILD] * require Role::Tiny >= 2.002004, or role composition doesn't work correctly. 0.13 2021-10-06 11:24:26-04:00 America/New_York [BUG FIX] * incorrectly set %INC value to undef to register generated module; caused failures under Perl >= 5.32 [DOCUMENTATION] * updates 0.12 2021-10-05 17:40:04-04:00 America/New_York * First public release [INCOMPATIBILITY] * explicitly requires Perl v5.28 * yet another radical API change and refactoring. hopefully the last! [ENHANCEMENTS] * lots of documentation. still not complete * better handling of proxy iterators * beginning of error handling [TODO] * icycle should handle any rewindable iterator, not just arrays 0.11 2020-04-30 10:48:47-04:00 America/New_York [INCOMPATIBILITY] * explicitly requires Perl 5.10.0. [API_CHANGE] * native iterators must use the 'self' rather than 'set_self' attributes to provide access to the closed-over self. [REFACTOR] * new iterator exhaustion model cleanly separates exhaustion transition policies (return/throw) and handling imported iterables' policies (pass through, replace). * robust handling of imported iterables exhaustion sentinels or exceptions. [BUILD] * now uses Module::Build::Tiny 0.10 2018-09-16 18:21:49-04:00 America/New_York [REFACTOR] * Internal refactor to improve performance and simplify code * Iterator classes are constructed directly without requiring parsing of the attribute hash. * Only existing class based iterators should/can be frozen. * ITERATOR_BASE has been removed. The idea was never thought completely through. Still haven't worked out how to change base class for * on-the-fly creation of iterators is now in Factory. 0.09 2018-06-01 13:10:56-04:00 America/New_York [BUG FIX] * sequence iterator was not numerically stable for real number sequences, as it used repeated sums instead of a multiply. 0.08 2018-05-18 15:12:15-04:00 America/New_York [ENHANCEMENT] * new iterator, Cycle/icycle, cycles through an array. 0.07 2018-05-14 10:49:43-04:00 America/New_York [BUG FIX] * subsequent creation of iterators with a method did not incorporate the method 0.06 2018-05-07 12:21:27-04:00 America/New_York [BUG FIX] * method for detecting existing method roles was broken 0.05 2018-05-07 12:21:27-04:00 America/New_York [ENHANCEMENT] * arbitrary methods may be added to iterator classes 0.04 2018-05-04 17:21:15-04:00 America/New_York [BUG FIXES] * ifreeze properly handles exhausted predicates [ENHANCEMENT] * new iterator method "may", indicates if it and it's dependencies support a method. * more optimization; should make things faster (by some unknown amount) [INTERNAL CHANGES] * move implementation of iterators out of Flex and into separate classes. 0.03 2018-01-16 13:27:23-05:00 America/New_York [ BUG FIX ] * thawing an iproduct iterator with labeled iterator arguments was borken. 0.02 2018-01-16 13:27:23-05:00 America/New_York [ ENHANCEMENTS ] * new iterator functions: ifreeze, icache * new ':all' export tag * add support for current() method * new spec on what prev/current/next return as function of iterator state [ BUG FIXES ] * iproduct needs dependent iterators to have memory of last and current values when freezing. rewind() is renamed to reset(), and new rewind retains current/prev values. * iterator states were always set to when next was called. now the state is updated to only if it was . 0.01 2018-01-05 16:36:29-05:00 America/New_York * First release upon an unsuspecting world.