use 5.20.0;

use List::Lazy qw/ lazy_list lazy_range /;

my $mask = 2**16 - 1;

my $list_a = ( lazy_list {
    $_ *= 16_807;
    $_ %= 2147483647;
    $_;
} 679 )->grep( sub { not $_ % 4 } )->map(sub{ $_ & $mask });

my $list_b = ( lazy_list {
    $_ *= 48_271;
    $_ %= 2147483647;
    $_;
} 771 )->grep( sub { not $_ % 8 } )->map(sub{ $_ & $mask });


use DDP;
my $i = 0;
say $list_a
    ->until(sub{ ++$i >= 5_000_000})
    ->spy(sub { say $i unless $i % 100_000 })
    ->grep(sub { $_ == $list_b->next } )
    ->reduce(sub { $a + 1},0);