The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

use strict;

use Test::More tests => 7;

use CPS qw( kloop );

my $poke;

my @nums;

my $num = 1;

kloop(
   sub {
      my ( $knext, $klast ) = @_;

      push @nums, $num;
      $num++;

      $poke = ( $num == 3 ) ? $klast : $knext;
   },
   sub {
      push @nums, "finished";
   },
);

is_deeply( \@nums, [ 1 ], 'kloop async - @nums initially' );
$poke->();
is_deeply( \@nums, [ 1, 2 ], 'kloop async - @nums after first poke' );
$poke->();
is_deeply( \@nums, [ 1, 2, "finished" ], 'kloop async - @nums after second poke' );

@nums = ();

our $nested = 0;

kloop(
   sub {
      my ( $knext, $klast ) = @_;

      is( $nested, 0, "kloop sync call does not nest for $num" );

      local $nested = 1;

      push @nums, $num;
      $num++;

      ( ( $num == 5 ) ? $klast : $knext )->();
   },
   sub {
      push @nums, "finished";
   },
);

is_deeply( \@nums, [ 3, 4, "finished" ], 'kloop sync - @nums initially' );

my @result;
kloop(
   sub {
      my ( $knext, $klast ) = @_;
      $klast->( 1, 2, 3 );
   },
   sub {
      push @result, @_;
   }
);

is_deeply( \@result, [], 'kloop clears @_ in $klast' );