List-Gen

 view release on metacpan or  search on metacpan

t/listgen.t  view on Meta::CPAN

}
{
    my $fac; $fac = cache gen {$_ < 2 or $_ * $$fac[$_ - 1]};

    t 'generators: factorial',
       is => "@$fac[0 .. 10]", '1 1 2 6 24 120 720 5040 40320 362880 3628800';
}
{
    my $zipgen = zipgen [range(0, 100)->filter(sub{$_ % 2})->all], range(-100, 9**9**9);

    t 'zipgen',
       is => "@$zipgen[5 .. 15]", '-98 7 -97 9 -96 11 -95 13 -94 15 -93',
       is => $zipgen->size, 100;
}
{
    my $zipgen = zipgen range(0, 100)->filter(sub{$_ % 2}), range(-100, 9**9**9);

    t 'zipgen mutable',
       is => "@$zipgen[5 .. 15]", '-98 7 -97 9 -96 11 -95 13 -94 15 -93',
       is => $zipgen->size, 202;

    $zipgen->apply;
    t 'zipgen mutable apply',
        is => $zipgen->size, 100;
}
{
    my $zipgen = zipgen range(0, 10)->filter(sub{$_ % 2}), range(-100, 9**9**9);

    my @got;
    local $_;
    push @got, $_ while <$zipgen>;
    t 'zipgen mutable 2 - ',
       is => "@got", '1 -100 3 -99 5 -98 7 -97 9 -96';

}
{
    my $zipgen = zipgenmax [range(0, 100)->filter(sub{$_ % 2})->all], range(-100, 9**9**9);

    t 'zipgenmax',
       is => "@$zipgen[5 .. 15]", '-98 7 -97 9 -96 11 -95 13 -94 15 -93',
       is => $zipgen->size, 9**9**9;
}
{
    my $triples = zipwith {\@_} <1..>, <20..>, <300..>;

    t zipwith =>
        is => "@{$$triples[0]}", '1 20 300',
        is => "@{$$triples[1]}", '2 21 301',
        is => "@{$$triples[2]}", '3 22 302',
        is => "@{$$triples[3]}", '4 23 303';
}
{
    my $zip = zipwithab {$a . $b} <1..>, <20..>;

    t zipwithab =>
        is => $$zip[0], '120',
        is => $$zip[1], '221',
        is => $$zip[2], '322';
}
{
    my $overlay = overlay gen {$_ ** 2};

    t 'overlay',
       is => "@$overlay[1 .. 4]", '1 4 9 16',
       ok => eval {$$overlay[2] = 1},
       is => "@$overlay[1 .. 4]", '1 1 9 16';
}
{
    my $ofib; $ofib = overlay cache gen {$$ofib[$_ - 1] + $$ofib[$_ - 2]};
    @$ofib[0, 1] = (0, 1);

    t 'overlay: fibonacci 1',
       is => "@$ofib[0 .. 15]", '0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610';
}
{
    my $ofib; $ofib = gen {$$ofib[$_ - 1] + $$ofib[$_ - 2]}
                    ->cache
                    ->overlay( 0 => 0, 1 => 1 );

    t 'overlay: fibonacci 2',
       is => "@$ofib[0 .. 15]", '0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610';
}

t 'recursive',
   is => join(' ', gen {self($_ - 1) + self($_ - 2)}
                 ->overlay( 0 => 0, 1 => 1 )
                 ->cache
                 ->recursive
                 ->slice(0 .. 15)
        ), '0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610';


eval {
    my $cube = While {$_ < 30} gen {$_**3};

    t 'while',
       is_deeply => [$cube->all], [qw/0 1 8 27/];

    my $gen = do {
        my ($a, $b) = (0, 1);
        gather {
            ($a, $b) = ($b, take($a) + $b)
        }
    }->while(sub {$_ < 700});

    t 'while, iterative',
       is_deeply => do {
            my @fib;
            push @fib, $_ for @$gen;
            \@fib
       }, [qw/0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610/];

    my $while = While {$_ < 10} gen {$_};

    t 'while, initial over',
        is => $$while[20], undef;

    t 'while, second over',
        ok => !eval {my $x = $$while[20]; 1};

    t 'while, second over msg',
       like => $@, qr/past end/;

    t 'while, under after over',
        is => $$while[7], 7;

    t 'while, over-- after over',
        is => $$while[19], undef;

    my $deref = While {$_ < 10} <0..99>;

    t 'while, array deref outside foreach',
        ok => !eval {my $x = join ' ' => @$deref; 1};

    t 'while, array deref outside foreach msg',
        like => $@, qr/past end/;

    t 'while, second array deref',
        is => "@$deref", '0 1 2 3 4 5 6 7 8 9';
    1;
} or diag $@;

{
    my $pow = Until {$_ > 20 } gen {$_**2};

    t 'until',



( run in 1.577 second using v1.01-cache-2.11-cpan-5735350b133 )