Files
devops/perl/Examples/Chap4/Iterator_Utils.pm
2025-09-17 16:08:16 +08:00

106 lines
1.5 KiB
Perl

###
### Iterator_Utils.pm
###
## Chapter 4 section 2.1
package Iterator_Utils;
use base Exporter;
@EXPORT_OK = qw(NEXTVAL Iterator
append imap igrep
iterate_function filehandle_iterator list_iterator);
%EXPORT_TAGS = ('all' => \@EXPORT_OK);
sub NEXTVAL { $_[0]->() }
## Chapter 4 section 2.1.1
sub Iterator (&) { return $_[0] }
## Chapter 4 section 3.1
sub iterate_function {
my $n = 0;
my $f = shift;
return Iterator {
return $f->($n++);
};
}
## Chapter 4 section 3.3
sub filehandle_iterator {
my $fh = shift;
return Iterator { <$fh> };
}
1;
## Chapter 4 section 4.1
sub imap (&$) {
my ($transform, $it) = @_;
return Iterator {
local $_ = NEXTVAL($it);
return unless defined $_;
return $transform->();
}
}
## Chapter 4 section 4.2
sub igrep (&$) {
my ($is_interesting, $it) = @_;
return Iterator {
local $_;
while (defined ($_ = NEXTVAL($it))) {
return $_ if $is_interesting->();
}
return;
}
}
## Chapter 4 section 4.3
sub list_iterator {
my @items = @_;
return Iterator {
return shift @items;
};
}
## Chapter 4 section 4.4
sub append {
my @its = @_;
return Iterator {
while (@its) {
my $val = NEXTVAL($its[0]);
return $val if defined $val;
shift @its; # Discard exhausted iterator
}
return;
};
}
## Chapter 4 section 7.2
sub igrep_l (&$) {
my ($is_interesting, $it) = @_;
return Iterator {
while (my @vals = NEXTVAL($it)) {
return @vals if $is_interesting->(@vals);
}
return;
}
}