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 <active> when next was called.
      now the state is updated to <active> only if it was <inactive>.


0.01      2018-01-05 16:36:29-05:00 America/New_York

* First release upon an unsuspecting world.
