Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use strict;
- use warnings;
- use utf8;
- our $AUTHOR = "cpan:potatogim";
- our $VERSION = "0.1";
- package My::Generator;
- use Generator::Object;
- our %tree = (
- 'dir1' => [ 'dira', 'dirb', 'dirc' ],
- 'dir1/dirc' => [ 'dird', 'dire', 'dirf' ],
- 'dir2' => [ 'dirg', 'dirh' ],
- 'dir2/dirg' => [ 'diri' ],
- );
- sub scandir
- {
- my $self = shift;
- my %args = @_;
- return generator
- {
- my $path = $args{path};
- foreach my $entry (@{$tree{$path}})
- {
- $_->yield($entry);
- }
- };
- }
- sub walk
- {
- my $self = shift;
- my %args = @_;
- return generator
- {
- my $gen = $_;
- my $top = $args{top};
- my $topdown = $args{topdown};
- my $follow = $args{followlinks};
- my $onerror = $args{onerror};
- my @dirs = ();
- my @nondirs = ();
- my $direntry = $self->scandir(path => $top);
- while (my $entry = $direntry->next)
- {
- push(@dirs, $entry);
- }
- # printf "TOP : %s\n", $top;
- # printf "TOPDOWN : %s\n", $topdown;
- # printf "FOLLOW : %s\n", $follow;
- # printf "DIRS : %s\n", join(', ', @dirs);
- if ($topdown)
- {
- $gen->yield($top, \@dirs, \@nondirs);
- }
- foreach my $dir (@dirs)
- {
- my $new_top = join('/', $top, $dir);
- my $c_gen = $self->walk(
- top => $new_top,
- topdown => $topdown,
- followlinks => $follow,
- onerror => $onerror);
- while (my ($c_top, $c_dirs, $c_nondirs) = $c_gen->next)
- {
- $gen->yield($c_top, $c_dirs, $c_nondirs);
- }
- }
- if (!$topdown)
- {
- $gen->yield($top, \@dirs, \@nondirs);
- }
- };
- }
- sub new
- {
- bless {}, shift;
- }
- package main;
- my $obj = My::Generator->new();
- print "NON-TOPDOWN\n";
- my $gen = $obj->walk(top => 'dir1', topdown => 0, followlinks => 1, onerror => undef);
- while (my ($top, $dirs, $nondirs) = $gen->next)
- {
- printf "\nTOP : %s\n", $top // 'undef';
- printf "DIRS : %s\n", defined($dirs) ? join(', ', @{$dirs}) : 'undef';
- }
- print "TOPDOWN\n";
- $gen = $obj->walk(top => 'dir1', topdown => 1, followlinks => 1, onerror => undef);
- while (my ($top, $dirs, $nondirs) = $gen->next)
- {
- printf "\nTOP : %s\n", $top // 'undef';
- printf "DIRS : %s\n", defined($dirs) ? join(', ', @{$dirs}) : 'undef';
- }
Add Comment
Please, Sign In to add comment