#!/usr/bin/perl
#
# eg20: 3rd lazylist example, use map_l and grep_l..
#

use strict;
use warnings;
use Function::Parameters qw(:strict);

use List;
$List::as_string_limit = 8;

# $list = stepup( $n, $step ) - return an infinite list n, n+step, n+2*step...
fun stepup( $n, $step )
{
	return List->cons( $n, fun { stepup($n+$step,$step); } );
}

my $odds = stepup( 1, 2 );
print "first few odds: $odds\n";

my $evens = map_l {$_ + 1} $odds;

print "first few evens: $evens\n";

my $evengt7 = grep_l {$_ > 7} $evens;

print "first few even gt7: $evengt7\n";

my $squares = grep_l { my $r = int(sqrt($_)); $r*$r == $_ } $evengt7;

print "first few even perfect squares > 7: $squares\n";
