Revision history for Iterator-Flex

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.
