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

use v6;
use Test;

plan 11;

{
  my $var;
  my $was_in_first = 0;
  my $sub = { FIRST { $was_in_first++; $var = rand } };

  $sub();
  is $was_in_first, 1, 'our FIRST {} block was invoked';
  my $orig_var = $var;

  $sub();
  is $was_in_first, 1, 'our FIRST {} block was invoked only once...';
  is $var, $orig_var, "...and our var wasn't changed";
}

{
  my $sub = {
    my $var = 42;
    FIRST { $var = 23 };
    $var;
  };

  is $sub(), 23, 'our FIRST {} block set our variable (1)';
  is $sub(), 42, 'our FIRST {} wasn\'t invoked again (1-1)';
  is $sub(), 42, 'our FIRST {} wasn\'t invoked again (1-2)';
}

{
  my $was_in_first;
  my $sub = {
    my $var = FIRST { $was_in_first++; 23 };
    $var //= 42;
    $var;
  };

  is $sub(), 23, 'our FIRST {} block set our variable (2)';
  is $sub(), 23, 'our FIRST {} wasn\'t invoked again (2-1)';
  is $sub(), 23, 'our FIRST {} wasn\'t invoked again (2-2)';
  is $was_in_first, 1, 'our FIRST {} block was invoked exactly once';
}

# Test that FIRST {} blocks are executed only once even if they return undef
# (the first implementation ran than twice instead).
{
  my $was_in_first;
  my $sub = { FIRST { $was_in_first++; undef } };

  $sub();
  $sub();
  $sub();
  is $was_in_first, 1, 'our FIRST { ...; undef } block was invoked exactly once';
}