List-AllUtils-0.09/0000775000175000017500000000000012414270154013746 5ustar autarchautarchList-AllUtils-0.09/dist.ini0000644000175000017500000000130312414270154015405 0ustar autarchautarchname = List-AllUtils author = Dave Rolsky license = Artistic_2_0 copyright_holder = Dave Rolsky version = 0.09 [@DROLSKY] ; Can't find List::Pairwise for some reason remove = Test::Pod::LinkCheck dist = List-AllUtils next_release_width = 7 stopwords = ARRAYn stopwords = BLOCK's stopwords = EXPR stopwords = KVLIST stopwords = firstidx stopwords = firstval stopwords = lastidx stopwords = lastval stopwords = maxstr stopwords = minmax stopwords = minstr stopwords = natatime stopwords = notall stopwords = pairfirst stopwords = pairgrep stopwords = pairkeys stopwords = pairmap stopwords = pairvalues stopwords = specialisations stopwords = thusly stopwords = uniq stopwords = util List-AllUtils-0.09/t/0000775000175000017500000000000012414270154014211 5ustar autarchautarchList-AllUtils-0.09/t/release-pod-no404s.t0000644000175000017500000000076512414270154017631 0ustar autarchautarch#!perl BEGIN { unless ($ENV{RELEASE_TESTING}) { require Test::More; Test::More::plan(skip_all => 'these tests are for release candidate testing'); } } use strict; use warnings; use Test::More; foreach my $env_skip ( qw( SKIP_POD_NO404S AUTOMATED_TESTING ) ){ plan skip_all => "\$ENV{$env_skip} is set, skipping" if $ENV{$env_skip}; } eval "use Test::Pod::No404s"; if ( $@ ) { plan skip_all => 'Test::Pod::No404s required for testing POD'; } else { all_pod_files_ok(); } List-AllUtils-0.09/t/00-report-prereqs.t0000644000175000017500000001231412414270154017604 0ustar autarchautarch#!perl use strict; use warnings; # This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.019 use Test::More tests => 1; use ExtUtils::MakeMaker; use File::Spec; # from $version::LAX my $lax_version_re = qr/(?: undef | (?: (?:[0-9]+) (?: \. | (?:\.[0-9]+) (?:_[0-9]+)? )? | (?:\.[0-9]+) (?:_[0-9]+)? ) | (?: v (?:[0-9]+) (?: (?:\.[0-9]+)+ (?:_[0-9]+)? )? | (?:[0-9]+)? (?:\.[0-9]+){2,} (?:_[0-9]+)? ) )/x; # hide optional CPAN::Meta modules from prereq scanner # and check if they are available my $cpan_meta = "CPAN::Meta"; my $cpan_meta_pre = "CPAN::Meta::Prereqs"; my $HAS_CPAN_META = eval "require $cpan_meta; $cpan_meta->VERSION('2.120900')" && eval "require $cpan_meta_pre"; ## no critic # Verify requirements? my $DO_VERIFY_PREREQS = 1; sub _max { my $max = shift; $max = ( $_ > $max ) ? $_ : $max for @_; return $max; } sub _merge_prereqs { my ($collector, $prereqs) = @_; # CPAN::Meta::Prereqs object if (ref $collector eq $cpan_meta_pre) { return $collector->with_merged_prereqs( CPAN::Meta::Prereqs->new( $prereqs ) ); } # Raw hashrefs for my $phase ( keys %$prereqs ) { for my $type ( keys %{ $prereqs->{$phase} } ) { for my $module ( keys %{ $prereqs->{$phase}{$type} } ) { $collector->{$phase}{$type}{$module} = $prereqs->{$phase}{$type}{$module}; } } } return $collector; } my @include = qw( ); my @exclude = qw( ); # Add static prereqs to the included modules list my $static_prereqs = do 't/00-report-prereqs.dd'; # Merge all prereqs (either with ::Prereqs or a hashref) my $full_prereqs = _merge_prereqs( ( $HAS_CPAN_META ? $cpan_meta_pre->new : {} ), $static_prereqs ); # Add dynamic prereqs to the included modules list (if we can) my ($source) = grep { -f } 'MYMETA.json', 'MYMETA.yml'; if ( $source && $HAS_CPAN_META ) { if ( my $meta = eval { CPAN::Meta->load_file($source) } ) { $full_prereqs = _merge_prereqs($full_prereqs, $meta->prereqs); } } else { $source = 'static metadata'; } my @full_reports; my @dep_errors; my $req_hash = $HAS_CPAN_META ? $full_prereqs->as_string_hash : $full_prereqs; # Add static includes into a fake section for my $mod (@include) { $req_hash->{other}{modules}{$mod} = 0; } for my $phase ( qw(configure build test runtime develop other) ) { next unless $req_hash->{$phase}; next if ($phase eq 'develop' and not $ENV{AUTHOR_TESTING}); for my $type ( qw(requires recommends suggests conflicts modules) ) { next unless $req_hash->{$phase}{$type}; my $title = ucfirst($phase).' '.ucfirst($type); my @reports = [qw/Module Want Have/]; for my $mod ( sort keys %{ $req_hash->{$phase}{$type} } ) { next if $mod eq 'perl'; next if grep { $_ eq $mod } @exclude; my $file = $mod; $file =~ s{::}{/}g; $file .= ".pm"; my ($prefix) = grep { -e File::Spec->catfile($_, $file) } @INC; my $want = $req_hash->{$phase}{$type}{$mod}; $want = "undef" unless defined $want; $want = "any" if !$want && $want == 0; my $req_string = $want eq 'any' ? 'any version required' : "version '$want' required"; if ($prefix) { my $have = MM->parse_version( File::Spec->catfile($prefix, $file) ); $have = "undef" unless defined $have; push @reports, [$mod, $want, $have]; if ( $DO_VERIFY_PREREQS && $HAS_CPAN_META && $type eq 'requires' ) { if ( $have !~ /\A$lax_version_re\z/ ) { push @dep_errors, "$mod version '$have' cannot be parsed ($req_string)"; } elsif ( ! $full_prereqs->requirements_for( $phase, $type )->accepts_module( $mod => $have ) ) { push @dep_errors, "$mod version '$have' is not in required range '$want'"; } } } else { push @reports, [$mod, $want, "missing"]; if ( $DO_VERIFY_PREREQS && $type eq 'requires' ) { push @dep_errors, "$mod is not installed ($req_string)"; } } } if ( @reports ) { push @full_reports, "=== $title ===\n\n"; my $ml = _max( map { length $_->[0] } @reports ); my $wl = _max( map { length $_->[1] } @reports ); my $hl = _max( map { length $_->[2] } @reports ); splice @reports, 1, 0, ["-" x $ml, "-" x $wl, "-" x $hl]; push @full_reports, map { sprintf(" %*s %*s %*s\n", -$ml, $_->[0], $wl, $_->[1], $hl, $_->[2]) } @reports; push @full_reports, "\n"; } } } if ( @full_reports ) { diag "\nVersions for all modules listed in $source (including optional ones):\n\n", @full_reports; } if ( @dep_errors ) { diag join("\n", "\n*** WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING ***\n", "The following REQUIRED prerequisites were not satisfied:\n", @dep_errors, "\n" ); } pass; # vim: ts=4 sts=4 sw=4 et: List-AllUtils-0.09/t/release-portability.t0000644000175000017500000000053412414270154020356 0ustar autarchautarch#!perl BEGIN { unless ($ENV{RELEASE_TESTING}) { require Test::More; Test::More::plan(skip_all => 'these tests are for release candidate testing'); } } use strict; use warnings; use Test::More; eval 'use Test::Portability::Files'; plan skip_all => 'Test::Portability::Files required for testing portability' if $@; run_tests(); List-AllUtils-0.09/t/release-pod-syntax.t0000644000175000017500000000045612414270154020125 0ustar autarchautarch#!perl BEGIN { unless ($ENV{RELEASE_TESTING}) { require Test::More; Test::More::plan(skip_all => 'these tests are for release candidate testing'); } } # This file was automatically generated by Dist::Zilla::Plugin::PodSyntaxTests. use Test::More; use Test::Pod 1.41; all_pod_files_ok(); List-AllUtils-0.09/t/release-pod-coverage.t0000644000175000017500000000162012414270154020364 0ustar autarchautarch#!perl BEGIN { unless ($ENV{RELEASE_TESTING}) { require Test::More; Test::More::plan(skip_all => 'these tests are for release candidate testing'); } } # This file was automatically generated by Dist::Zilla::Plugin::Test::Pod::Coverage::Configurable. use Test::Pod::Coverage 1.08; use Test::More 0.88; use Pod::Coverage::TrustPod; my %skip = map { $_ => 1 } qw( ); my @modules; for my $module ( all_modules() ) { next if $skip{$module}; push @modules, $module; } plan skip_all => 'All the modules we found were excluded from POD coverage test.' unless @modules; plan tests => scalar @modules; my %trustme = (); for my $module ( sort @modules ) { pod_coverage_ok( $module, { coverage_class => 'Pod::Coverage::TrustPod', trustme => $trustme{$module} || [], }, "pod coverage for $module" ); } done_testing(); List-AllUtils-0.09/t/release-pod-linkcheck.t0000644000175000017500000000077512414270154020536 0ustar autarchautarch#!perl BEGIN { unless ($ENV{RELEASE_TESTING}) { require Test::More; Test::More::plan(skip_all => 'these tests are for release candidate testing'); } } use strict; use warnings; use Test::More; foreach my $env_skip ( qw( SKIP_POD_LINKCHECK ) ){ plan skip_all => "\$ENV{$env_skip} is set, skipping" if $ENV{$env_skip}; } eval "use Test::Pod::LinkCheck"; if ( $@ ) { plan skip_all => 'Test::Pod::LinkCheck required for testing POD'; } else { Test::Pod::LinkCheck->new->all_pod_ok; } List-AllUtils-0.09/t/01-basic.t0000644000175000017500000000362712414270154015703 0ustar autarchautarchuse strict; use warnings; # This is needed to produce sub redefined warnings from List::AllUtils when # List::Util and List::MoreUtils export some of the same subs. I'm not sure # why. BEGIN { $^W++; } use Test::More 0.88; use Test::Warnings; { package Foo; use List::AllUtils; } ok( !Foo->can('first'), 'no exports by default' ); { package Bar; use List::AllUtils qw( first any apply ); sub test_first { return first { $_ > 1 } @_; } sub test_apply { return apply { $_ *= 2 } @_; } } ok( Bar->can('first'), 'explicitly import first' ); ok( Bar->can('any'), 'explicitly import any' ); ok( Bar->can('apply'), 'explicitly import apply' ); ok( !Bar->can('all'), 'did not import all' ); is( Bar::test_first( 1, 2, 3 ), 2, 'Bar::test_first returns expected value' ); is_deeply( [ Bar::test_apply( 1, 2, 3 ) ], [ 2, 4, 6 ], 'Bar::test_apply returns expected list' ); { package Baz; use List::AllUtils qw( :all ); sub test_first { return first { $_ > 1 } @_; } sub test_apply { return apply { $_ *= 2 } @_; } } ok( Baz->can('first'), 'imported everything, got first' ); ok( Baz->can('any'), 'imported everything, got any' ); ok( Baz->can('all'), 'imported everything, got all' ); ok( Baz->can('apply'), 'imported everything, got apply' ); ok( Baz->can('uniq'), 'imported everything, got uniq' ); is( Baz::test_first( 1, 2, 3 ), 2, 'Baz::test_first returns expected value' ); is_deeply( [ Baz::test_apply( 1, 2, 3 ) ], [ 2, 4, 6 ], 'Baz::test_apply returns expected list' ); is( ( List::AllUtils::first { $_ > 5 } ( 1, 2, 5, 22, 7 ) ), 22, 'explicitly calling List::AllUtils::first produces the correct result' ); ok( ( List::AllUtils::any { $_ > 5 } ( 1, 2, 5, 22, 7 ) ), 'explicitly calling List::AllUtils::any produces the correct result' ); done_testing(); List-AllUtils-0.09/t/release-cpan-changes.t0000644000175000017500000000052112414270154020337 0ustar autarchautarch#!perl BEGIN { unless ($ENV{RELEASE_TESTING}) { require Test::More; Test::More::plan(skip_all => 'these tests are for release candidate testing'); } } use strict; use warnings; use Test::More 0.96 tests => 2; use_ok('Test::CPAN::Changes'); subtest 'changes_ok' => sub { changes_file_ok('Changes'); }; done_testing(); List-AllUtils-0.09/t/author-no-tabs.t0000644000175000017500000000140612414270154017240 0ustar autarchautarch BEGIN { unless ($ENV{AUTHOR_TESTING}) { require Test::More; Test::More::plan(skip_all => 'these tests are for testing by the author'); } } use strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::NoTabs 0.09 use Test::More 0.88; use Test::NoTabs; my @files = ( 'lib/List/AllUtils.pm', 't/00-compile.t', 't/00-report-prereqs.dd', 't/00-report-prereqs.t', 't/01-basic.t', 't/author-no-tabs.t', 't/author-pod-spell.t', 't/release-cpan-changes.t', 't/release-eol.t', 't/release-pod-coverage.t', 't/release-pod-linkcheck.t', 't/release-pod-no404s.t', 't/release-pod-syntax.t', 't/release-portability.t', 't/release-synopsis.t' ); notabs_ok($_) foreach @files; done_testing; List-AllUtils-0.09/t/00-report-prereqs.dd0000644000175000017500000000371712414270154017737 0ustar autarchautarchdo { my $x = { 'configure' => { 'requires' => { 'ExtUtils::MakeMaker' => '0' } }, 'develop' => { 'requires' => { 'Pod::Coverage::TrustPod' => '0', 'Test::CPAN::Changes' => '0.19', 'Test::More' => '0.88', 'Test::NoTabs' => '0', 'Test::Pod' => '1.41', 'Test::Pod::Coverage' => '1.08', 'Test::Spelling' => '0.12', 'Test::Synopsis' => '0' } }, 'runtime' => { 'requires' => { 'Exporter' => '0', 'List::MoreUtils' => '0.28', 'List::Util' => '1.31', 'base' => '0', 'strict' => '0', 'warnings' => '0' } }, 'test' => { 'recommends' => { 'CPAN::Meta' => '2.120900' }, 'requires' => { 'ExtUtils::MakeMaker' => '0', 'File::Spec' => '0', 'IO::Handle' => '0', 'IPC::Open3' => '0', 'Test::More' => '0.88', 'Test::Warnings' => '0', 'perl' => '5.006' } } }; $x; }List-AllUtils-0.09/t/00-compile.t0000644000175000017500000000177712414270154016255 0ustar autarchautarchuse 5.006; use strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::Compile 2.046 use Test::More tests => 1 + ($ENV{AUTHOR_TESTING} ? 1 : 0); my @module_files = ( 'List/AllUtils.pm' ); # no fake home requested my $inc_switch = -d 'blib' ? '-Mblib' : '-Ilib'; use File::Spec; use IPC::Open3; use IO::Handle; open my $stdin, '<', File::Spec->devnull or die "can't open devnull: $!"; my @warnings; for my $lib (@module_files) { # see L my $stderr = IO::Handle->new; my $pid = open3($stdin, '>&STDERR', $stderr, $^X, $inc_switch, '-e', "require q[$lib]"); binmode $stderr, ':crlf' if $^O eq 'MSWin32'; my @_warnings = <$stderr>; waitpid($pid, 0); is($?, 0, "$lib loaded ok"); if (@_warnings) { warn @_warnings; push @warnings, @_warnings; } } is(scalar(@warnings), 0, 'no warnings found') or diag 'got warnings: ', explain \@warnings if $ENV{AUTHOR_TESTING}; List-AllUtils-0.09/t/release-eol.t0000644000175000017500000000047612414270154016600 0ustar autarchautarch BEGIN { unless ($ENV{RELEASE_TESTING}) { require Test::More; Test::More::plan(skip_all => 'these tests are for release candidate testing'); } } use strict; use warnings; use Test::More; eval 'use Test::EOL'; plan skip_all => 'Test::EOL required' if $@; all_perl_files_ok({ trailing_whitespace => 1 }); List-AllUtils-0.09/t/author-pod-spell.t0000644000175000017500000000120512414270154017571 0ustar autarchautarch BEGIN { unless ($ENV{AUTHOR_TESTING}) { require Test::More; Test::More::plan(skip_all => 'these tests are for testing by the author'); } } use strict; use warnings; use Test::More; # generated by Dist::Zilla::Plugin::Test::PodSpelling 2.006008 use Test::Spelling 0.12; use Pod::Wordlist; add_stopwords(); all_pod_files_spelling_ok( qw( bin lib ) ); __DATA__ DROLSKY DROLSKY's Rolsky Rolsky's ARRAYn BLOCK's EXPR KVLIST firstidx firstval lastidx lastval maxstr minmax minstr natatime notall pairfirst pairgrep pairkeys pairmap pairvalues specialisations thusly uniq util Dave autarch Ricardo Signes rjbs lib List AllUtils List-AllUtils-0.09/t/release-synopsis.t0000644000175000017500000000031612414270154017701 0ustar autarchautarch#!perl BEGIN { unless ($ENV{RELEASE_TESTING}) { require Test::More; Test::More::plan(skip_all => 'these tests are for release candidate testing'); } } use Test::Synopsis; all_synopsis_ok(); List-AllUtils-0.09/Makefile.PL0000644000175000017500000000277712414270154015733 0ustar autarchautarch # This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v5.020. use strict; use warnings; use ExtUtils::MakeMaker ; my %WriteMakefileArgs = ( "ABSTRACT" => "Combines List::Util and List::MoreUtils in one bite-sized package", "AUTHOR" => "Dave Rolsky ", "CONFIGURE_REQUIRES" => { "ExtUtils::MakeMaker" => 0 }, "DISTNAME" => "List-AllUtils", "EXE_FILES" => [], "LICENSE" => "artistic_2", "NAME" => "List::AllUtils", "PREREQ_PM" => { "Exporter" => 0, "List::MoreUtils" => "0.28", "List::Util" => "1.31", "base" => 0, "strict" => 0, "warnings" => 0 }, "TEST_REQUIRES" => { "ExtUtils::MakeMaker" => 0, "File::Spec" => 0, "IO::Handle" => 0, "IPC::Open3" => 0, "Test::More" => "0.88", "Test::Warnings" => 0 }, "VERSION" => "0.09", "test" => { "TESTS" => "t/*.t" } ); my %FallbackPrereqs = ( "Exporter" => 0, "ExtUtils::MakeMaker" => 0, "File::Spec" => 0, "IO::Handle" => 0, "IPC::Open3" => 0, "List::MoreUtils" => "0.28", "List::Util" => "1.31", "Test::More" => "0.88", "Test::Warnings" => 0, "base" => 0, "strict" => 0, "warnings" => 0 ); unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) { delete $WriteMakefileArgs{TEST_REQUIRES}; delete $WriteMakefileArgs{BUILD_REQUIRES}; $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs; } delete $WriteMakefileArgs{CONFIGURE_REQUIRES} unless eval { ExtUtils::MakeMaker->VERSION(6.52) }; WriteMakefile(%WriteMakefileArgs); List-AllUtils-0.09/META.yml0000644000175000017500000003201212414270154015213 0ustar autarchautarch--- abstract: 'Combines List::Util and List::MoreUtils in one bite-sized package' author: - 'Dave Rolsky ' build_requires: ExtUtils::MakeMaker: '0' File::Spec: '0' IO::Handle: '0' IPC::Open3: '0' Test::More: '0.88' Test::Warnings: '0' perl: '5.006' configure_requires: ExtUtils::MakeMaker: '0' dynamic_config: 0 generated_by: 'Dist::Zilla version 5.020, CPAN::Meta::Converter version 2.142690' license: artistic_2 meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: List-AllUtils provides: List::AllUtils: file: lib/List/AllUtils.pm version: '0.09' requires: Exporter: '0' List::MoreUtils: '0.28' List::Util: '1.31' base: '0' strict: '0' warnings: '0' resources: bugtracker: http://rt.cpan.org/Public/Dist/Display.html?Name=List-AllUtils homepage: http://metacpan.org/release/List-AllUtils repository: git://github.com/autarch/List-AllUtils.git version: '0.09' x_Dist_Zilla: perl: version: '5.016003' plugins: - class: Dist::Zilla::Plugin::MakeMaker config: Dist::Zilla::Role::TestRunner: default_jobs: 1 name: '@DROLSKY/MakeMaker' version: '5.020' - class: Dist::Zilla::Plugin::Authority name: '@DROLSKY/Authority' version: '1.006' - class: Dist::Zilla::Plugin::AutoPrereqs name: '@DROLSKY/AutoPrereqs' version: '5.020' - class: Dist::Zilla::Plugin::GatherDir name: '@DROLSKY/GatherDir' version: '5.020' - class: Dist::Zilla::Plugin::GitHub::Meta name: '@DROLSKY/GitHub::Meta' version: '0.38' - class: Dist::Zilla::Plugin::GitHub::Update name: '@DROLSKY/GitHub::Update' version: '0.38' - class: Dist::Zilla::Plugin::MetaResources name: '@DROLSKY/MetaResources' version: '5.020' - class: Dist::Zilla::Plugin::MetaProvides::Package config: Dist::Zilla::Plugin::MetaProvides::Package: finder_objects: - class: Dist::Zilla::Plugin::FinderCode name: '@DROLSKY/MetaProvides::Package/AUTOVIV/:InstallModulesPM' version: '5.020' Dist::Zilla::Role::MetaProvider::Provider: inherit_missing: '1' inherit_version: '1' meta_noindex: '1' name: '@DROLSKY/MetaProvides::Package' version: '2.001002' - class: Dist::Zilla::Plugin::NextRelease name: '@DROLSKY/NextRelease' version: '5.020' - class: Dist::Zilla::Plugin::Test::Pod::Coverage::Configurable name: '@DROLSKY/Test::Pod::Coverage::Configurable' version: '0.01' - class: Dist::Zilla::Plugin::Test::PodSpelling name: '@DROLSKY/Test::PodSpelling' version: '2.006008' - class: Dist::Zilla::Plugin::Test::ReportPrereqs name: '@DROLSKY/Test::ReportPrereqs' version: '0.019' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: test type: requires name: '@DROLSKY/TestMoreDoneTesting' version: '5.020' - class: Dist::Zilla::Plugin::PromptIfStale config: Dist::Zilla::Plugin::PromptIfStale: check_all_plugins: '1' check_all_prereqs: '1' modules: [] phase: release skip: [] name: '@DROLSKY/stale modules, release' version: '0.027' - class: Dist::Zilla::Plugin::ReadmeAnyFromPod name: '@DROLSKY/ReadmeMarkdownInBuild' version: '0.142470' - class: Dist::Zilla::Plugin::ReadmeAnyFromPod name: '@DROLSKY/ReadmeMarkdownInRoot' version: '0.142470' - class: Dist::Zilla::Plugin::PruneCruft name: '@DROLSKY/PruneCruft' version: '5.020' - class: Dist::Zilla::Plugin::ManifestSkip name: '@DROLSKY/ManifestSkip' version: '5.020' - class: Dist::Zilla::Plugin::MetaYAML name: '@DROLSKY/MetaYAML' version: '5.020' - class: Dist::Zilla::Plugin::License name: '@DROLSKY/License' version: '5.020' - class: Dist::Zilla::Plugin::ExtraTests name: '@DROLSKY/ExtraTests' version: '5.020' - class: Dist::Zilla::Plugin::ExecDir name: '@DROLSKY/ExecDir' version: '5.020' - class: Dist::Zilla::Plugin::ShareDir name: '@DROLSKY/ShareDir' version: '5.020' - class: Dist::Zilla::Plugin::Manifest name: '@DROLSKY/Manifest' version: '5.020' - class: Dist::Zilla::Plugin::TestRelease name: '@DROLSKY/TestRelease' version: '5.020' - class: Dist::Zilla::Plugin::ConfirmRelease name: '@DROLSKY/ConfirmRelease' version: '5.020' - class: Dist::Zilla::Plugin::UploadToCPAN name: '@DROLSKY/UploadToCPAN' version: '5.020' - class: Dist::Zilla::Plugin::CheckPrereqsIndexed name: '@DROLSKY/CheckPrereqsIndexed' version: '0.012' - class: Dist::Zilla::Plugin::CopyReadmeFromBuild name: '@DROLSKY/CopyReadmeFromBuild' version: '0.0019' - class: Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch config: Dist::Zilla::Role::Git::Repo: repo_root: . name: '@DROLSKY/Git::CheckFor::CorrectBranch' version: '0.011' - class: Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts config: Dist::Zilla::Role::Git::Repo: repo_root: . name: '@DROLSKY/Git::CheckFor::MergeConflicts' version: '0.011' - class: Dist::Zilla::Plugin::Git::Describe name: '@DROLSKY/Git::Describe' version: '0.003' - class: Dist::Zilla::Plugin::Git::Contributors config: Dist::Zilla::Plugin::Git::Contributors: include_authors: '0' include_releaser: '1' order_by: name paths: [] name: '@DROLSKY/Git::Contributors' version: '0.007' - class: Dist::Zilla::Plugin::InstallGuide name: '@DROLSKY/InstallGuide' version: '1.200003' - class: Dist::Zilla::Plugin::Meta::Contributors name: '@DROLSKY/Meta::Contributors' version: '0.001' - class: Dist::Zilla::Plugin::MetaConfig name: '@DROLSKY/MetaConfig' version: '5.020' - class: Dist::Zilla::Plugin::MetaJSON name: '@DROLSKY/MetaJSON' version: '5.020' - class: Dist::Zilla::Plugin::PkgVersion name: '@DROLSKY/PkgVersion' version: '5.020' - class: Dist::Zilla::Plugin::SurgicalPodWeaver config: Dist::Zilla::Plugin::PodWeaver: finder: - ':InstallModules' - ':ExecFiles' plugins: - class: Pod::Weaver::Plugin::EnsurePod5 name: '@CorePrep/EnsurePod5' version: '4.006' - class: Pod::Weaver::Plugin::H1Nester name: '@CorePrep/H1Nester' version: '4.006' - class: Pod::Weaver::Plugin::SingleEncoding name: '@Default/SingleEncoding' version: '4.006' - class: Pod::Weaver::Section::Name name: '@Default/Name' version: '4.006' - class: Pod::Weaver::Section::Version name: '@Default/Version' version: '4.006' - class: Pod::Weaver::Section::Region name: '@Default/prelude' version: '4.006' - class: Pod::Weaver::Section::Generic name: SYNOPSIS version: '4.006' - class: Pod::Weaver::Section::Generic name: DESCRIPTION version: '4.006' - class: Pod::Weaver::Section::Generic name: OVERVIEW version: '4.006' - class: Pod::Weaver::Section::Collect name: ATTRIBUTES version: '4.006' - class: Pod::Weaver::Section::Collect name: METHODS version: '4.006' - class: Pod::Weaver::Section::Collect name: FUNCTIONS version: '4.006' - class: Pod::Weaver::Section::Leftovers name: '@Default/Leftovers' version: '4.006' - class: Pod::Weaver::Section::Region name: '@Default/postlude' version: '4.006' - class: Pod::Weaver::Section::Authors name: '@Default/Authors' version: '4.006' - class: Pod::Weaver::Section::Legal name: '@Default/Legal' version: '4.006' name: '@DROLSKY/SurgicalPodWeaver' version: '0.0021' - class: Dist::Zilla::Plugin::EOLTests name: '@DROLSKY/EOLTests' version: '0.02' - class: Dist::Zilla::Plugin::PodSyntaxTests name: '@DROLSKY/PodSyntaxTests' version: '5.020' - class: Dist::Zilla::Plugin::Test::CPAN::Changes name: '@DROLSKY/Test::CPAN::Changes' version: '0.008' - class: Dist::Zilla::Plugin::Test::Compile config: Dist::Zilla::Plugin::Test::Compile: bail_out_on_fail: '0' fail_on_warning: author fake_home: '0' filename: t/00-compile.t module_finder: - ':InstallModules' needs_display: '0' phase: test script_finder: - ':ExecFiles' skips: [] name: '@DROLSKY/Test::Compile' version: '2.046' - class: Dist::Zilla::Plugin::Test::NoTabs config: Dist::Zilla::Plugin::Test::NoTabs: filename: xt/author/no-tabs.t finder: - ':InstallModules' - ':ExecFiles' - ':TestFiles' name: '@DROLSKY/Test::NoTabs' version: '0.09' - class: Dist::Zilla::Plugin::Test::Pod::LinkCheck name: '@DROLSKY/Test::Pod::LinkCheck' version: '1.001' - class: Dist::Zilla::Plugin::Test::Pod::No404s name: '@DROLSKY/Test::Pod::No404s' version: '1.001' - class: Dist::Zilla::Plugin::Test::Portability name: '@DROLSKY/Test::Portability' version: '2.000005' - class: Dist::Zilla::Plugin::Test::Synopsis name: '@DROLSKY/Test::Synopsis' version: '2.000005' - class: Dist::Zilla::Plugin::Git::Check config: Dist::Zilla::Plugin::Git::Check: untracked_files: die Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: - Changes - CONTRIBUTING.md - README.md allow_dirty_match: [] changelog: Changes Dist::Zilla::Role::Git::Repo: repo_root: . name: '@DROLSKY/Git::Check' version: '2.024' - class: Dist::Zilla::Plugin::Git::Commit config: Dist::Zilla::Plugin::Git::Commit: add_files_in: [] commit_msg: v%v%n%n%c time_zone: local Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: - Changes - CONTRIBUTING.md - README.md allow_dirty_match: [] changelog: Changes Dist::Zilla::Role::Git::Repo: repo_root: . name: '@DROLSKY/Git::Commit' version: '2.024' - class: Dist::Zilla::Plugin::Git::Tag config: Dist::Zilla::Plugin::Git::Tag: branch: ~ signed: 0 tag: v0.09 tag_format: v%v tag_message: v%v time_zone: local Dist::Zilla::Role::Git::Repo: repo_root: . name: '@DROLSKY/Git::Tag' version: '2.024' - class: Dist::Zilla::Plugin::Git::Push config: Dist::Zilla::Plugin::Git::Push: push_to: - origin remotes_must_exist: 1 Dist::Zilla::Role::Git::Repo: repo_root: . name: '@DROLSKY/Git::Push' version: '2.024' - class: Dist::Zilla::Plugin::FinderCode name: ':InstallModules' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':IncModules' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':TestFiles' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':ExecFiles' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':ShareFiles' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':MainModule' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':AllFiles' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':NoFiles' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: '@DROLSKY/MetaProvides::Package/AUTOVIV/:InstallModulesPM' version: '5.020' zilla: class: Dist::Zilla::Dist::Builder config: is_trial: '0' version: '5.020' x_authority: cpan:DROLSKY x_contributors: - 'Ricardo Signes ' List-AllUtils-0.09/LICENSE0000644000175000017500000002152012414270154014751 0ustar autarchautarchThis software is Copyright (c) 2014 by Dave Rolsky. This is free software, licensed under: The Artistic License 2.0 (GPL Compatible) The Artistic License 2.0 Copyright (c) 2000-2006, The Perl Foundation. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble This license establishes the terms under which a given free software Package may be copied, modified, distributed, and/or redistributed. The intent is that the Copyright Holder maintains some artistic control over the development of that Package while still keeping the Package available as open source and free software. You are always permitted to make arrangements wholly outside of this license directly with the Copyright Holder of a given Package. If the terms of this license do not permit the full use that you propose to make of the Package, you should contact the Copyright Holder and seek a different licensing arrangement. Definitions "Copyright Holder" means the individual(s) or organization(s) named in the copyright notice for the entire Package. "Contributor" means any party that has contributed code or other material to the Package, in accordance with the Copyright Holder's procedures. "You" and "your" means any person who would like to copy, distribute, or modify the Package. "Package" means the collection of files distributed by the Copyright Holder, and derivatives of that collection and/or of those files. A given Package may consist of either the Standard Version, or a Modified Version. "Distribute" means providing a copy of the Package or making it accessible to anyone else, or in the case of a company or organization, to others outside of your company or organization. "Distributor Fee" means any fee that you charge for Distributing this Package or providing support for this Package to another party. It does not mean licensing fees. "Standard Version" refers to the Package if it has not been modified, or has been modified only in ways explicitly requested by the Copyright Holder. "Modified Version" means the Package, if it has been changed, and such changes were not explicitly requested by the Copyright Holder. "Original License" means this Artistic License as Distributed with the Standard Version of the Package, in its current version or as it may be modified by The Perl Foundation in the future. "Source" form means the source code, documentation source, and configuration files for the Package. "Compiled" form means the compiled bytecode, object code, binary, or any other form resulting from mechanical transformation or translation of the Source form. Permission for Use and Modification Without Distribution (1) You are permitted to use the Standard Version and create and use Modified Versions for any purpose without restriction, provided that you do not Distribute the Modified Version. Permissions for Redistribution of the Standard Version (2) You may Distribute verbatim copies of the Source form of the Standard Version of this Package in any medium without restriction, either gratis or for a Distributor Fee, provided that you duplicate all of the original copyright notices and associated disclaimers. At your discretion, such verbatim copies may or may not include a Compiled form of the Package. (3) You may apply any bug fixes, portability changes, and other modifications made available from the Copyright Holder. The resulting Package will still be considered the Standard Version, and as such will be subject to the Original License. Distribution of Modified Versions of the Package as Source (4) You may Distribute your Modified Version as Source (either gratis or for a Distributor Fee, and with or without a Compiled form of the Modified Version) provided that you clearly document how it differs from the Standard Version, including, but not limited to, documenting any non-standard features, executables, or modules, and provided that you do at least ONE of the following: (a) make the Modified Version available to the Copyright Holder of the Standard Version, under the Original License, so that the Copyright Holder may include your modifications in the Standard Version. (b) ensure that installation of your Modified Version does not prevent the user installing or running the Standard Version. In addition, the Modified Version must bear a name that is different from the name of the Standard Version. (c) allow anyone who receives a copy of the Modified Version to make the Source form of the Modified Version available to others under (i) the Original License or (ii) a license that permits the licensee to freely copy, modify and redistribute the Modified Version using the same licensing terms that apply to the copy that the licensee received, and requires that the Source form of the Modified Version, and of any works derived from it, be made freely available in that license fees are prohibited but Distributor Fees are allowed. Distribution of Compiled Forms of the Standard Version or Modified Versions without the Source (5) You may Distribute Compiled forms of the Standard Version without the Source, provided that you include complete instructions on how to get the Source of the Standard Version. Such instructions must be valid at the time of your distribution. If these instructions, at any time while you are carrying out such distribution, become invalid, you must provide new instructions on demand or cease further distribution. If you provide valid instructions or cease distribution within thirty days after you become aware that the instructions are invalid, then you do not forfeit any of your rights under this license. (6) You may Distribute a Modified Version in Compiled form without the Source, provided that you comply with Section 4 with respect to the Source of the Modified Version. Aggregating or Linking the Package (7) You may aggregate the Package (either the Standard Version or Modified Version) with other packages and Distribute the resulting aggregation provided that you do not charge a licensing fee for the Package. Distributor Fees are permitted, and licensing fees for other components in the aggregation are permitted. The terms of this license apply to the use and Distribution of the Standard or Modified Versions as included in the aggregation. (8) You are permitted to link Modified and Standard Versions with other works, to embed the Package in a larger work of your own, or to build stand-alone binary or bytecode versions of applications that include the Package, and Distribute the result without restriction, provided the result does not expose a direct interface to the Package. Items That are Not Considered Part of a Modified Version (9) Works (including, but not limited to, modules and scripts) that merely extend or make use of the Package, do not, by themselves, cause the Package to be a Modified Version. In addition, such works are not considered parts of the Package itself, and are not subject to the terms of this license. General Provisions (10) Any use, modification, and distribution of the Standard or Modified Versions is governed by this Artistic License. By using, modifying or distributing the Package, you accept this license. Do not use, modify, or distribute the Package, if you do not accept this license. (11) If your Modified Version has been derived from a Modified Version made by someone other than you, you are nevertheless required to ensure that your Modified Version complies with the requirements of this license. (12) This license does not grant you the right to use any trademark, service mark, tradename, or logo of the Copyright Holder. (13) This license includes the non-exclusive, worldwide, free-of-charge patent license to make, have made, use, offer to sell, sell, import and otherwise transfer the Package with respect to any patent claims licensable by the Copyright Holder that are necessarily infringed by the Package. If you institute patent litigation (including a cross-claim or counterclaim) against any party alleging that the Package constitutes direct or contributory patent infringement, then this Artistic License to you shall terminate on the date that such litigation is filed. (14) Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. List-AllUtils-0.09/lib/0000775000175000017500000000000012414270154014514 5ustar autarchautarchList-AllUtils-0.09/lib/List/0000775000175000017500000000000012414270154015427 5ustar autarchautarchList-AllUtils-0.09/lib/List/AllUtils.pm0000644000175000017500000004576312414270154017533 0ustar autarchautarchpackage List::AllUtils; # git description: v0.08-4-ga5ac545 $List::AllUtils::VERSION = '0.09'; use strict; use warnings; # List::Util does not define an :all tag BEGIN { use List::Util 1.31 (); List::Util->import(@List::Util::EXPORT_OK); use List::MoreUtils 0.28; my %imported = map { $_ => 1 } @List::Util::EXPORT_OK; List::MoreUtils->import( grep { !$imported{$_} } @List::MoreUtils::EXPORT_OK ); } use base 'Exporter'; our @EXPORT_OK = ( @List::Util::EXPORT_OK, @List::MoreUtils::EXPORT_OK ); our %EXPORT_TAGS = ( all => \@EXPORT_OK ); 1; # ABSTRACT: Combines List::Util and List::MoreUtils in one bite-sized package __END__ =pod =encoding UTF-8 =head1 NAME List::AllUtils - Combines List::Util and List::MoreUtils in one bite-sized package =head1 VERSION version 0.09 =head1 SYNOPSIS use List::AllUtils qw( first any ); # _Everything_ from List::Util and List::MoreUtils use List::AllUtils qw( :all ); my @numbers = ( 1, 2, 3, 5, 7 ); # or don't import anything return List::AllUtils::first { $_ > 5 } @numbers; =head1 DESCRIPTION Are you sick of trying to remember whether a particular helper is defined in L or L? I sure am. Now you don't have to remember. This module will export all of the functions that either of those two modules defines. Note that all function documentation has been shamelessly copied from L and L. =head2 Which One Wins? Recently, L has started including some of the subs that used to only be in L. This module always exports the version provided by L. The docs below come from L 1.31 and L 0.28. =head1 LIST-REDUCTION FUNCTIONS The following set of functions all reduce a list down to a single value. =head2 reduce BLOCK LIST Reduces LIST by calling BLOCK, in a scalar context, multiple times, setting C<$a> and C<$b> each time. The first call will be with C<$a> and C<$b> set to the first two elements of the list, subsequent calls will be done by setting C<$a> to the result of the previous call and C<$b> to the next element in the list. Returns the result of the last call to BLOCK. If LIST is empty then C is returned. If LIST only contains one element then that element is returned and BLOCK is not executed. $foo = reduce { $a < $b ? $a : $b } 1..10 # min $foo = reduce { $a lt $b ? $a : $b } 'aa'..'zz' # minstr $foo = reduce { $a + $b } 1 .. 10 # sum $foo = reduce { $a . $b } @bar # concat If your algorithm requires that C produce an identity value, then make sure that you always pass that identity value as the first argument to prevent C being returned $foo = reduce { $a + $b } 0, @values; # sum with 0 identity value The remaining list-reduction functions are all specialisations of this generic idea. =head2 first BLOCK LIST Similar to C in that it evaluates BLOCK setting C<$_> to each element of LIST in turn. C returns the first element where the result from BLOCK is a true value. If BLOCK never returns true or LIST was empty then C is returned. $foo = first { defined($_) } @list # first defined value in @list $foo = first { $_ > $value } @list # first value in @list which # is greater than $value This function could be implemented using C like this $foo = reduce { defined($a) ? $a : wanted($b) ? $b : undef } undef, @list for example wanted() could be defined() which would return the first defined value in @list =head2 max LIST Returns the entry in the list with the highest numerical value. If the list is empty then C is returned. $foo = max 1..10 # 10 $foo = max 3,9,12 # 12 $foo = max @bar, @baz # whatever This function could be implemented using C like this $foo = reduce { $a > $b ? $a : $b } 1..10 =head2 maxstr LIST Similar to C, but treats all the entries in the list as strings and returns the highest string as defined by the C operator. If the list is empty then C is returned. $foo = maxstr 'A'..'Z' # 'Z' $foo = maxstr "hello","world" # "world" $foo = maxstr @bar, @baz # whatever This function could be implemented using C like this $foo = reduce { $a gt $b ? $a : $b } 'A'..'Z' =head2 min LIST Similar to C but returns the entry in the list with the lowest numerical value. If the list is empty then C is returned. $foo = min 1..10 # 1 $foo = min 3,9,12 # 3 $foo = min @bar, @baz # whatever This function could be implemented using C like this $foo = reduce { $a < $b ? $a : $b } 1..10 =head2 minstr LIST Similar to C, but treats all the entries in the list as strings and returns the lowest string as defined by the C operator. If the list is empty then C is returned. $foo = minstr 'A'..'Z' # 'A' $foo = minstr "hello","world" # "hello" $foo = minstr @bar, @baz # whatever This function could be implemented using C like this $foo = reduce { $a lt $b ? $a : $b } 'A'..'Z' =head2 sum LIST Returns the sum of all the elements in LIST. If LIST is empty then C is returned. $foo = sum 1..10 # 55 $foo = sum 3,9,12 # 24 $foo = sum @bar, @baz # whatever This function could be implemented using C like this $foo = reduce { $a + $b } 1..10 =head2 sum0 LIST Similar to C, except this returns 0 when given an empty list, rather than C. =head1 KEY/VALUE PAIR LIST FUNCTIONS The following set of functions, all inspired by L, consume an even-sized list of pairs. The pairs may be key/value associations from a hash, or just a list of values. The functions will all preserve the original ordering of the pairs, and will not be confused by multiple pairs having the same "key" value - nor even do they require that the first of each pair be a plain string. =head2 pairgrep BLOCK KVLIST Similar to perl's C keyword, but interprets the given list as an even-sized list of pairs. It invokes the BLOCK multiple times, in scalar context, with C<$a> and C<$b> set to successive pairs of values from the KVLIST. Returns an even-sized list of those pairs for which the BLOCK returned true in list context, or the count of the B in scalar context. (Note, therefore, in scalar context that it returns a number half the size of the count of items it would have returned in list context). @subset = pairgrep { $a =~ m/^[[:upper:]]+$/ } @kvlist Similar to C, C aliases C<$a> and C<$b> to elements of the given list. Any modifications of it by the code block will be visible to the caller. =head2 pairfirst BLOCK KVLIST Similar to the C function, but interprets the given list as an even-sized list of pairs. It invokes the BLOCK multiple times, in scalar context, with C<$a> and C<$b> set to successive pairs of values from the KVLIST. Returns the first pair of values from the list for which the BLOCK returned true in list context, or an empty list of no such pair was found. In scalar context it returns a simple boolean value, rather than either the key or the value found. ( $key, $value ) = pairfirst { $a =~ m/^[[:upper:]]+$/ } @kvlist Similar to C, C aliases C<$a> and C<$b> to elements of the given list. Any modifications of it by the code block will be visible to the caller. =head2 pairmap BLOCK KVLIST Similar to perl's C keyword, but interprets the given list as an even-sized list of pairs. It invokes the BLOCK multiple times, in list context, with C<$a> and C<$b> set to successive pairs of values from the KVLIST. Returns the concatenation of all the values returned by the BLOCK in list context, or the count of the number of items that would have been returned in scalar context. @result = pairmap { "The key $a has value $b" } @kvlist Similar to C, C aliases C<$a> and C<$b> to elements of the given list. Any modifications of it by the code block will be visible to the caller. =head2 pairs KVLIST A convenient shortcut to operating on even-sized lists of pairs, this function returns a list of ARRAY references, each containing two items from the given list. It is a more efficient version of pairmap { [ $a, $b ] } KVLIST It is most convenient to use in a C loop, for example: foreach ( pairs @KVLIST ) { my ( $key, $value ) = @$_; ... } =head2 pairkeys KVLIST A convenient shortcut to operating on even-sized lists of pairs, this function returns a list of the the first values of each of the pairs in the given list. It is a more efficient version of pairmap { $a } KVLIST =head2 pairvalues KVLIST A convenient shortcut to operating on even-sized lists of pairs, this function returns a list of the the second values of each of the pairs in the given list. It is a more efficient version of pairmap { $b } KVLIST =head1 OTHER FUNCTIONS =head2 shuffle LIST Returns the elements of LIST in a random order @cards = shuffle 0..51 # 0..51 in a random order =head1 List::MoreUtils FUNCTIONS =head2 any BLOCK LIST Returns a true value if any item in LIST meets the criterion given through BLOCK. Sets C<$_> for each item in LIST in turn: print "At least one value undefined" if any { ! defined($_) } @list; Returns false otherwise, or if LIST is empty. =head2 all BLOCK LIST Returns a true value if all items in LIST meet the criterion given through BLOCK, or if LIST is empty. Sets C<$_> for each item in LIST in turn: print "All items defined" if all { defined($_) } @list; Returns false otherwise. =head2 none BLOCK LIST Logically the negation of C. Returns a true value if no item in LIST meets the criterion given through BLOCK, or if LIST is empty. Sets C<$_> for each item in LIST in turn: print "No value defined" if none { defined($_) } @list; Returns false otherwise. =head2 notall BLOCK LIST Logically the negation of C. Returns a true value if not all items in LIST meet the criterion given through BLOCK. Sets C<$_> for each item in LIST in turn: print "Not all values defined" if notall { defined($_) } @list; Returns false otherwise, or if LIST is empty. =head2 true BLOCK LIST Counts the number of elements in LIST for which the criterion in BLOCK is true. Sets C<$_> for each item in LIST in turn: printf "%i item(s) are defined", true { defined($_) } @list; =head2 false BLOCK LIST Counts the number of elements in LIST for which the criterion in BLOCK is false. Sets C<$_> for each item in LIST in turn: printf "%i item(s) are not defined", false { defined($_) } @list; =head2 firstidx BLOCK LIST =head2 first_index BLOCK LIST Returns the index of the first element in LIST for which the criterion in BLOCK is true. Sets C<$_> for each item in LIST in turn: my @list = (1, 4, 3, 2, 4, 6); printf "item with index %i in list is 4", firstidx { $_ == 4 } @list; __END__ item with index 1 in list is 4 Returns C<-1> if no such item could be found. C is an alias for C. =head2 lastidx BLOCK LIST =head2 last_index BLOCK LIST Returns the index of the last element in LIST for which the criterion in BLOCK is true. Sets C<$_> for each item in LIST in turn: my @list = (1, 4, 3, 2, 4, 6); printf "item with index %i in list is 4", lastidx { $_ == 4 } @list; __END__ item with index 4 in list is 4 Returns C<-1> if no such item could be found. C is an alias for C. =head2 insert_after BLOCK VALUE LIST Inserts VALUE after the first item in LIST for which the criterion in BLOCK is true. Sets C<$_> for each item in LIST in turn. my @list = qw/This is a list/; insert_after { $_ eq "a" } "longer" => @list; print "@list"; __END__ This is a longer list =head2 insert_after_string STRING VALUE LIST Inserts VALUE after the first item in LIST which is equal to STRING. my @list = qw/This is a list/; insert_after_string "a", "longer" => @list; print "@list"; __END__ This is a longer list =head2 apply BLOCK LIST Applies BLOCK to each item in LIST and returns a list of the values after BLOCK has been applied. In scalar context, the last element is returned. This function is similar to C but will not modify the elements of the input list: my @list = (1 .. 4); my @mult = apply { $_ *= 2 } @list; print "\@list = @list\n"; print "\@mult = @mult\n"; __END__ @list = 1 2 3 4 @mult = 2 4 6 8 Think of it as syntactic sugar for for (my @mult = @list) { $_ *= 2 } =head2 before BLOCK LIST Returns a list of values of LIST up to (and not including) the point where BLOCK returns a true value. Sets C<$_> for each element in LIST in turn. =head2 before_incl BLOCK LIST Same as C but also includes the element for which BLOCK is true. =head2 after BLOCK LIST Returns a list of the values of LIST after (and not including) the point where BLOCK returns a true value. Sets C<$_> for each element in LIST in turn. @x = after { $_ % 5 == 0 } (1..9); # returns 6, 7, 8, 9 =head2 after_incl BLOCK LIST Same as C but also includes the element for which BLOCK is true. =head2 indexes BLOCK LIST Evaluates BLOCK for each element in LIST (assigned to C<$_>) and returns a list of the indices of those elements for which BLOCK returned a true value. This is just like C only that it returns indices instead of values: @x = indexes { $_ % 2 == 0 } (1..10); # returns 1, 3, 5, 7, 9 =head2 firstval BLOCK LIST =head2 first_value BLOCK LIST Returns the first element in LIST for which BLOCK evaluates to true. Each element of LIST is set to C<$_> in turn. Returns C if no such element has been found. C is an alias for C. =head2 lastval BLOCK LIST =head2 last_value BLOCK LIST Returns the last value in LIST for which BLOCK evaluates to true. Each element of LIST is set to C<$_> in turn. Returns C if no such element has been found. C is an alias for C. =head2 pairwise BLOCK ARRAY1 ARRAY2 Evaluates BLOCK for each pair of elements in ARRAY1 and ARRAY2 and returns a new list consisting of BLOCK's return values. The two elements are set to C<$a> and C<$b>. Note that those two are aliases to the original value so changing them will modify the input arrays. @a = (1 .. 5); @b = (11 .. 15); @x = pairwise { $a + $b } @a, @b; # returns 12, 14, 16, 18, 20 # mesh with pairwise @a = qw/a b c/; @b = qw/1 2 3/; @x = pairwise { ($a, $b) } @a, @b; # returns a, 1, b, 2, c, 3 =head2 each_array ARRAY1 ARRAY2 ... Creates an array iterator to return the elements of the list of arrays ARRAY1, ARRAY2 throughout ARRAYn in turn. That is, the first time it is called, it returns the first element of each array. The next time, it returns the second elements. And so on, until all elements are exhausted. This is useful for looping over more than one array at once: my $ea = each_array(@a, @b, @c); while ( my ($a, $b, $c) = $ea->() ) { .... } The iterator returns the empty list when it reached the end of all arrays. If the iterator is passed an argument of 'C', then it returns the index of the last fetched set of values, as a scalar. =head2 each_arrayref LIST Like each_array, but the arguments are references to arrays, not the plain arrays. =head2 natatime EXPR, LIST Creates an array iterator, for looping over an array in chunks of C<$n> items at a time. (n at a time, get it?). An example is probably a better explanation than I could give in words. Example: my @x = ('a' .. 'g'); my $it = natatime 3, @x; while (my @vals = $it->()) { print "@vals\n"; } This prints a b c d e f g =head2 mesh ARRAY1 ARRAY2 [ ARRAY3 ... ] =head2 zip ARRAY1 ARRAY2 [ ARRAY3 ... ] Returns a list consisting of the first elements of each array, then the second, then the third, etc, until all arrays are exhausted. Examples: @x = qw/a b c d/; @y = qw/1 2 3 4/; @z = mesh @x, @y; # returns a, 1, b, 2, c, 3, d, 4 @a = ('x'); @b = ('1', '2'); @c = qw/zip zap zot/; @d = mesh @a, @b, @c; # x, 1, zip, undef, 2, zap, undef, undef, zot C is an alias for C. =head2 uniq LIST =head2 distinct LIST Returns a new list by stripping duplicate values in LIST. The order of elements in the returned list is the same as in LIST. In scalar context, returns the number of unique elements in LIST. my @x = uniq 1, 1, 2, 2, 3, 5, 3, 4; # returns 1 2 3 5 4 my $x = uniq 1, 1, 2, 2, 3, 5, 3, 4; # returns 5 =head2 minmax LIST Calculates the minimum and maximum of LIST and returns a two element list with the first element being the minimum and the second the maximum. Returns the empty list if LIST was empty. The C algorithm differs from a naive iteration over the list where each element is compared to two values being the so far calculated min and max value in that it only requires 3n/2 - 2 comparisons. Thus it is the most efficient possible algorithm. However, the Perl implementation of it has some overhead simply due to the fact that there are more lines of Perl code involved. Therefore, LIST needs to be fairly big in order for C to win over a naive implementation. This limitation does not apply to the XS version. =head2 part BLOCK LIST Partitions LIST based on the return value of BLOCK which denotes into which partition the current value is put. Returns a list of the partitions thusly created. Each partition created is a reference to an array. my $i = 0; my @part = part { $i++ % 2 } 1 .. 8; # returns [1, 3, 5, 7], [2, 4, 6, 8] You can have a sparse list of partitions as well where non-set partitions will be undef: my @part = part { 2 } 1 .. 10; # returns undef, undef, [ 1 .. 10 ] Be careful with negative values, though: my @part = part { -1 } 1 .. 10; __END__ Modification of non-creatable array value attempted, subscript -1 ... Negative values are only okay when they refer to a partition previously created: my @idx = ( 0, 1, -1 ); my $i = 0; my @part = part { $idx[$++ % 3] } 1 .. 8; # [1, 4, 7], [2, 3, 5, 6, 8] =head1 EXPORTS This module exports nothing by default. You can import functions by name, or get everything with the C<:all> tag. =head1 SEE ALSO C and C, obviously. Also see C, which unifies many more util modules, and also lets you rename functions as part of the import. =head1 BUGS Please report any bugs or feature requests to C, or through the web interface at L. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. =head1 AUTHOR Dave Rolsky =head1 COPYRIGHT AND LICENSE This software is Copyright (c) 2014 by Dave Rolsky. This is free software, licensed under: The Artistic License 2.0 (GPL Compatible) =cut List-AllUtils-0.09/META.json0000644000175000017500000005062612414270154015376 0ustar autarchautarch{ "abstract" : "Combines List::Util and List::MoreUtils in one bite-sized package", "author" : [ "Dave Rolsky " ], "dynamic_config" : 0, "generated_by" : "Dist::Zilla version 5.020, CPAN::Meta::Converter version 2.142690", "license" : [ "artistic_2" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : "2" }, "name" : "List-AllUtils", "prereqs" : { "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "develop" : { "requires" : { "Pod::Coverage::TrustPod" : "0", "Test::CPAN::Changes" : "0.19", "Test::More" : "0.88", "Test::NoTabs" : "0", "Test::Pod" : "1.41", "Test::Pod::Coverage" : "1.08", "Test::Spelling" : "0.12", "Test::Synopsis" : "0" } }, "runtime" : { "requires" : { "Exporter" : "0", "List::MoreUtils" : "0.28", "List::Util" : "1.31", "base" : "0", "strict" : "0", "warnings" : "0" } }, "test" : { "recommends" : { "CPAN::Meta" : "2.120900" }, "requires" : { "ExtUtils::MakeMaker" : "0", "File::Spec" : "0", "IO::Handle" : "0", "IPC::Open3" : "0", "Test::More" : "0.88", "Test::Warnings" : "0", "perl" : "5.006" } } }, "provides" : { "List::AllUtils" : { "file" : "lib/List/AllUtils.pm", "version" : "0.09" } }, "release_status" : "stable", "resources" : { "bugtracker" : { "mailto" : "bug-list-allutils@rt.cpan.org", "web" : "http://rt.cpan.org/Public/Dist/Display.html?Name=List-AllUtils" }, "homepage" : "http://metacpan.org/release/List-AllUtils", "repository" : { "type" : "git", "url" : "git://github.com/autarch/List-AllUtils.git", "web" : "https://github.com/autarch/List-AllUtils" } }, "version" : "0.09", "x_Dist_Zilla" : { "perl" : { "version" : "5.016003" }, "plugins" : [ { "class" : "Dist::Zilla::Plugin::MakeMaker", "config" : { "Dist::Zilla::Role::TestRunner" : { "default_jobs" : 1 } }, "name" : "@DROLSKY/MakeMaker", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Authority", "name" : "@DROLSKY/Authority", "version" : "1.006" }, { "class" : "Dist::Zilla::Plugin::AutoPrereqs", "name" : "@DROLSKY/AutoPrereqs", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::GatherDir", "name" : "@DROLSKY/GatherDir", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::GitHub::Meta", "name" : "@DROLSKY/GitHub::Meta", "version" : "0.38" }, { "class" : "Dist::Zilla::Plugin::GitHub::Update", "name" : "@DROLSKY/GitHub::Update", "version" : "0.38" }, { "class" : "Dist::Zilla::Plugin::MetaResources", "name" : "@DROLSKY/MetaResources", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::MetaProvides::Package", "config" : { "Dist::Zilla::Plugin::MetaProvides::Package" : { "finder_objects" : [ { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : "@DROLSKY/MetaProvides::Package/AUTOVIV/:InstallModulesPM", "version" : "5.020" } ] }, "Dist::Zilla::Role::MetaProvider::Provider" : { "inherit_missing" : "1", "inherit_version" : "1", "meta_noindex" : "1" } }, "name" : "@DROLSKY/MetaProvides::Package", "version" : "2.001002" }, { "class" : "Dist::Zilla::Plugin::NextRelease", "name" : "@DROLSKY/NextRelease", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Test::Pod::Coverage::Configurable", "name" : "@DROLSKY/Test::Pod::Coverage::Configurable", "version" : "0.01" }, { "class" : "Dist::Zilla::Plugin::Test::PodSpelling", "name" : "@DROLSKY/Test::PodSpelling", "version" : "2.006008" }, { "class" : "Dist::Zilla::Plugin::Test::ReportPrereqs", "name" : "@DROLSKY/Test::ReportPrereqs", "version" : "0.019" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "test", "type" : "requires" } }, "name" : "@DROLSKY/TestMoreDoneTesting", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::PromptIfStale", "config" : { "Dist::Zilla::Plugin::PromptIfStale" : { "check_all_plugins" : "1", "check_all_prereqs" : "1", "modules" : [], "phase" : "release", "skip" : [] } }, "name" : "@DROLSKY/stale modules, release", "version" : "0.027" }, { "class" : "Dist::Zilla::Plugin::ReadmeAnyFromPod", "name" : "@DROLSKY/ReadmeMarkdownInBuild", "version" : "0.142470" }, { "class" : "Dist::Zilla::Plugin::ReadmeAnyFromPod", "name" : "@DROLSKY/ReadmeMarkdownInRoot", "version" : "0.142470" }, { "class" : "Dist::Zilla::Plugin::PruneCruft", "name" : "@DROLSKY/PruneCruft", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::ManifestSkip", "name" : "@DROLSKY/ManifestSkip", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::MetaYAML", "name" : "@DROLSKY/MetaYAML", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::License", "name" : "@DROLSKY/License", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::ExtraTests", "name" : "@DROLSKY/ExtraTests", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::ExecDir", "name" : "@DROLSKY/ExecDir", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::ShareDir", "name" : "@DROLSKY/ShareDir", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Manifest", "name" : "@DROLSKY/Manifest", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::TestRelease", "name" : "@DROLSKY/TestRelease", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::ConfirmRelease", "name" : "@DROLSKY/ConfirmRelease", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::UploadToCPAN", "name" : "@DROLSKY/UploadToCPAN", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::CheckPrereqsIndexed", "name" : "@DROLSKY/CheckPrereqsIndexed", "version" : "0.012" }, { "class" : "Dist::Zilla::Plugin::CopyReadmeFromBuild", "name" : "@DROLSKY/CopyReadmeFromBuild", "version" : "0.0019" }, { "class" : "Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch", "config" : { "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@DROLSKY/Git::CheckFor::CorrectBranch", "version" : "0.011" }, { "class" : "Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts", "config" : { "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@DROLSKY/Git::CheckFor::MergeConflicts", "version" : "0.011" }, { "class" : "Dist::Zilla::Plugin::Git::Describe", "name" : "@DROLSKY/Git::Describe", "version" : "0.003" }, { "class" : "Dist::Zilla::Plugin::Git::Contributors", "config" : { "Dist::Zilla::Plugin::Git::Contributors" : { "include_authors" : "0", "include_releaser" : "1", "order_by" : "name", "paths" : [] } }, "name" : "@DROLSKY/Git::Contributors", "version" : "0.007" }, { "class" : "Dist::Zilla::Plugin::InstallGuide", "name" : "@DROLSKY/InstallGuide", "version" : "1.200003" }, { "class" : "Dist::Zilla::Plugin::Meta::Contributors", "name" : "@DROLSKY/Meta::Contributors", "version" : "0.001" }, { "class" : "Dist::Zilla::Plugin::MetaConfig", "name" : "@DROLSKY/MetaConfig", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::MetaJSON", "name" : "@DROLSKY/MetaJSON", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::PkgVersion", "name" : "@DROLSKY/PkgVersion", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::SurgicalPodWeaver", "config" : { "Dist::Zilla::Plugin::PodWeaver" : { "finder" : [ ":InstallModules", ":ExecFiles" ], "plugins" : [ { "class" : "Pod::Weaver::Plugin::EnsurePod5", "name" : "@CorePrep/EnsurePod5", "version" : "4.006" }, { "class" : "Pod::Weaver::Plugin::H1Nester", "name" : "@CorePrep/H1Nester", "version" : "4.006" }, { "class" : "Pod::Weaver::Plugin::SingleEncoding", "name" : "@Default/SingleEncoding", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Name", "name" : "@Default/Name", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Version", "name" : "@Default/Version", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Region", "name" : "@Default/prelude", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "SYNOPSIS", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "DESCRIPTION", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "OVERVIEW", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "ATTRIBUTES", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "METHODS", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "FUNCTIONS", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Leftovers", "name" : "@Default/Leftovers", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Region", "name" : "@Default/postlude", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Authors", "name" : "@Default/Authors", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Legal", "name" : "@Default/Legal", "version" : "4.006" } ] } }, "name" : "@DROLSKY/SurgicalPodWeaver", "version" : "0.0021" }, { "class" : "Dist::Zilla::Plugin::EOLTests", "name" : "@DROLSKY/EOLTests", "version" : "0.02" }, { "class" : "Dist::Zilla::Plugin::PodSyntaxTests", "name" : "@DROLSKY/PodSyntaxTests", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Test::CPAN::Changes", "name" : "@DROLSKY/Test::CPAN::Changes", "version" : "0.008" }, { "class" : "Dist::Zilla::Plugin::Test::Compile", "config" : { "Dist::Zilla::Plugin::Test::Compile" : { "bail_out_on_fail" : "0", "fail_on_warning" : "author", "fake_home" : "0", "filename" : "t/00-compile.t", "module_finder" : [ ":InstallModules" ], "needs_display" : "0", "phase" : "test", "script_finder" : [ ":ExecFiles" ], "skips" : [] } }, "name" : "@DROLSKY/Test::Compile", "version" : "2.046" }, { "class" : "Dist::Zilla::Plugin::Test::NoTabs", "config" : { "Dist::Zilla::Plugin::Test::NoTabs" : { "filename" : "xt/author/no-tabs.t", "finder" : [ ":InstallModules", ":ExecFiles", ":TestFiles" ] } }, "name" : "@DROLSKY/Test::NoTabs", "version" : "0.09" }, { "class" : "Dist::Zilla::Plugin::Test::Pod::LinkCheck", "name" : "@DROLSKY/Test::Pod::LinkCheck", "version" : "1.001" }, { "class" : "Dist::Zilla::Plugin::Test::Pod::No404s", "name" : "@DROLSKY/Test::Pod::No404s", "version" : "1.001" }, { "class" : "Dist::Zilla::Plugin::Test::Portability", "name" : "@DROLSKY/Test::Portability", "version" : "2.000005" }, { "class" : "Dist::Zilla::Plugin::Test::Synopsis", "name" : "@DROLSKY/Test::Synopsis", "version" : "2.000005" }, { "class" : "Dist::Zilla::Plugin::Git::Check", "config" : { "Dist::Zilla::Plugin::Git::Check" : { "untracked_files" : "die" }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [ "Changes", "CONTRIBUTING.md", "README.md" ], "allow_dirty_match" : [], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@DROLSKY/Git::Check", "version" : "2.024" }, { "class" : "Dist::Zilla::Plugin::Git::Commit", "config" : { "Dist::Zilla::Plugin::Git::Commit" : { "add_files_in" : [], "commit_msg" : "v%v%n%n%c", "time_zone" : "local" }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [ "Changes", "CONTRIBUTING.md", "README.md" ], "allow_dirty_match" : [], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@DROLSKY/Git::Commit", "version" : "2.024" }, { "class" : "Dist::Zilla::Plugin::Git::Tag", "config" : { "Dist::Zilla::Plugin::Git::Tag" : { "branch" : null, "signed" : 0, "tag" : "v0.09", "tag_format" : "v%v", "tag_message" : "v%v", "time_zone" : "local" }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@DROLSKY/Git::Tag", "version" : "2.024" }, { "class" : "Dist::Zilla::Plugin::Git::Push", "config" : { "Dist::Zilla::Plugin::Git::Push" : { "push_to" : [ "origin" ], "remotes_must_exist" : 1 }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@DROLSKY/Git::Push", "version" : "2.024" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":InstallModules", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":IncModules", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":TestFiles", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ExecFiles", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ShareFiles", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":MainModule", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":AllFiles", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":NoFiles", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : "@DROLSKY/MetaProvides::Package/AUTOVIV/:InstallModulesPM", "version" : "5.020" } ], "zilla" : { "class" : "Dist::Zilla::Dist::Builder", "config" : { "is_trial" : "0" }, "version" : "5.020" } }, "x_authority" : "cpan:DROLSKY", "x_contributors" : [ "Ricardo Signes " ] } List-AllUtils-0.09/Changes0000644000175000017500000000266212414270154015245 0ustar autarchautarch0.09 2014-10-05 - Clarify which of List::Util and List::MoreUtils wins when they both provide the same function. Requested by Karen Etheridge. RT #98560. 0.08 2014-04-01 - This version now works with both List::MoreUtils 0.28-0.33 and the latest trial version, 0.400_006. Note that it does not work with earlier versions of 0.400. 0.07 2013-10-14 - The last version totally broke all exports from List::MoreUtils. Now there are actual tests for this. Reported by Tatsuhiko Miyagawa. RT #89509. 0.06 2013-10-14 - List::Util 1.33 provides some subs that are also provided by List::MoreUtils. This caused subroutine redefeined warnings. List::AllUtils now only imports subs from List::MoreUtils that aren't defined by List::Util. This works with List::Util 1.31+. Reported by Zefram. RT #89467. 0.05 2013-08-30 - Really require List::Util 1.31, instead of just saying so in the Changes. Reported by Przemysław Wesołek. RT #88296 0.04 2013-08-25 - Updated to require List::Util 1.31, which includes a bunch of new pairwise functions. 0.03 2012-02-21 - Updated docs to match List::MoreUtils 0.28+. Reported by ilmari. RT #75196. 0.02 2009-09-12 - Added a generated Makefile.PL. Fixes RT #48805. - Code tweak so that this module will always export everything exported by List::Util, even if that module adds new functions. 0.01 2009-01-23 - First version, released on an unsuspecting world. List-AllUtils-0.09/MANIFEST0000644000175000017500000000074112414270154015077 0ustar autarchautarch# This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.020. Changes INSTALL LICENSE MANIFEST META.json META.yml Makefile.PL README.md dist.ini lib/List/AllUtils.pm t/00-compile.t t/00-report-prereqs.dd t/00-report-prereqs.t t/01-basic.t t/author-no-tabs.t t/author-pod-spell.t t/release-cpan-changes.t t/release-eol.t t/release-pod-coverage.t t/release-pod-linkcheck.t t/release-pod-no404s.t t/release-pod-syntax.t t/release-portability.t t/release-synopsis.t List-AllUtils-0.09/INSTALL0000644000175000017500000000170112414270154014774 0ustar autarchautarch This is the Perl distribution List-AllUtils. Installing List-AllUtils is straightforward. ## Installation with cpanm If you have cpanm, you only need one line: % cpanm List::AllUtils If you are installing into a system-wide directory, you may need to pass the "-S" flag to cpanm, which uses sudo to install the module: % cpanm -S List::AllUtils ## Installing with the CPAN shell Alternatively, if your CPAN shell is set up, you should just be able to do: % cpan List::AllUtils ## Manual installation As a last resort, you can manually install it. Download the tarball, untar it, then build it: % perl Makefile.PL % make && make test Then install it: % make install If you are installing into a system-wide directory, you may need to run: % sudo make install ## Documentation List-AllUtils documentation is available as POD. You can run perldoc from a shell to read the documentation: % perldoc List::AllUtils List-AllUtils-0.09/README.md0000644000175000017500000004460612414270154015235 0ustar autarchautarch# NAME List::AllUtils - Combines List::Util and List::MoreUtils in one bite-sized package # VERSION version 0.09 # SYNOPSIS use List::AllUtils qw( first any ); # _Everything_ from List::Util and List::MoreUtils use List::AllUtils qw( :all ); my @numbers = ( 1, 2, 3, 5, 7 ); # or don't import anything return List::AllUtils::first { $_ > 5 } @numbers; # DESCRIPTION Are you sick of trying to remember whether a particular helper is defined in [List::Util](https://metacpan.org/pod/List::Util) or [List::MoreUtils](https://metacpan.org/pod/List::MoreUtils)? I sure am. Now you don't have to remember. This module will export all of the functions that either of those two modules defines. Note that all function documentation has been shamelessly copied from [List::Util](https://metacpan.org/pod/List::Util) and [List::MoreUtils](https://metacpan.org/pod/List::MoreUtils). ## Which One Wins? Recently, [List::Util](https://metacpan.org/pod/List::Util) has started including some of the subs that used to only be in [List::MoreUtils](https://metacpan.org/pod/List::MoreUtils). This module always exports the version provided by [List::Util](https://metacpan.org/pod/List::Util). The docs below come from [List::Util](https://metacpan.org/pod/List::Util) 1.31 and [List::MoreUtils](https://metacpan.org/pod/List::MoreUtils) 0.28. # LIST-REDUCTION FUNCTIONS The following set of functions all reduce a list down to a single value. ## reduce BLOCK LIST Reduces LIST by calling BLOCK, in a scalar context, multiple times, setting `$a` and `$b` each time. The first call will be with `$a` and `$b` set to the first two elements of the list, subsequent calls will be done by setting `$a` to the result of the previous call and `$b` to the next element in the list. Returns the result of the last call to BLOCK. If LIST is empty then `undef` is returned. If LIST only contains one element then that element is returned and BLOCK is not executed. $foo = reduce { $a < $b ? $a : $b } 1..10 # min $foo = reduce { $a lt $b ? $a : $b } 'aa'..'zz' # minstr $foo = reduce { $a + $b } 1 .. 10 # sum $foo = reduce { $a . $b } @bar # concat If your algorithm requires that `reduce` produce an identity value, then make sure that you always pass that identity value as the first argument to prevent `undef` being returned $foo = reduce { $a + $b } 0, @values; # sum with 0 identity value The remaining list-reduction functions are all specialisations of this generic idea. ## first BLOCK LIST Similar to `grep` in that it evaluates BLOCK setting `$_` to each element of LIST in turn. `first` returns the first element where the result from BLOCK is a true value. If BLOCK never returns true or LIST was empty then `undef` is returned. $foo = first { defined($_) } @list # first defined value in @list $foo = first { $_ > $value } @list # first value in @list which # is greater than $value This function could be implemented using `reduce` like this $foo = reduce { defined($a) ? $a : wanted($b) ? $b : undef } undef, @list for example wanted() could be defined() which would return the first defined value in @list ## max LIST Returns the entry in the list with the highest numerical value. If the list is empty then `undef` is returned. $foo = max 1..10 # 10 $foo = max 3,9,12 # 12 $foo = max @bar, @baz # whatever This function could be implemented using `reduce` like this $foo = reduce { $a > $b ? $a : $b } 1..10 ## maxstr LIST Similar to `max`, but treats all the entries in the list as strings and returns the highest string as defined by the `gt` operator. If the list is empty then `undef` is returned. $foo = maxstr 'A'..'Z' # 'Z' $foo = maxstr "hello","world" # "world" $foo = maxstr @bar, @baz # whatever This function could be implemented using `reduce` like this $foo = reduce { $a gt $b ? $a : $b } 'A'..'Z' ## min LIST Similar to `max` but returns the entry in the list with the lowest numerical value. If the list is empty then `undef` is returned. $foo = min 1..10 # 1 $foo = min 3,9,12 # 3 $foo = min @bar, @baz # whatever This function could be implemented using `reduce` like this $foo = reduce { $a < $b ? $a : $b } 1..10 ## minstr LIST Similar to `min`, but treats all the entries in the list as strings and returns the lowest string as defined by the `lt` operator. If the list is empty then `undef` is returned. $foo = minstr 'A'..'Z' # 'A' $foo = minstr "hello","world" # "hello" $foo = minstr @bar, @baz # whatever This function could be implemented using `reduce` like this $foo = reduce { $a lt $b ? $a : $b } 'A'..'Z' ## sum LIST Returns the sum of all the elements in LIST. If LIST is empty then `undef` is returned. $foo = sum 1..10 # 55 $foo = sum 3,9,12 # 24 $foo = sum @bar, @baz # whatever This function could be implemented using `reduce` like this $foo = reduce { $a + $b } 1..10 ## sum0 LIST Similar to `sum`, except this returns 0 when given an empty list, rather than `undef`. # KEY/VALUE PAIR LIST FUNCTIONS The following set of functions, all inspired by [List::Pairwise](https://metacpan.org/pod/List::Pairwise), consume an even-sized list of pairs. The pairs may be key/value associations from a hash, or just a list of values. The functions will all preserve the original ordering of the pairs, and will not be confused by multiple pairs having the same "key" value - nor even do they require that the first of each pair be a plain string. ## pairgrep BLOCK KVLIST Similar to perl's `grep` keyword, but interprets the given list as an even-sized list of pairs. It invokes the BLOCK multiple times, in scalar context, with `$a` and `$b` set to successive pairs of values from the KVLIST. Returns an even-sized list of those pairs for which the BLOCK returned true in list context, or the count of the **number of pairs** in scalar context. (Note, therefore, in scalar context that it returns a number half the size of the count of items it would have returned in list context). @subset = pairgrep { $a =~ m/^[[:upper:]]+$/ } @kvlist Similar to `grep`, `pairgrep` aliases `$a` and `$b` to elements of the given list. Any modifications of it by the code block will be visible to the caller. ## pairfirst BLOCK KVLIST Similar to the `first` function, but interprets the given list as an even-sized list of pairs. It invokes the BLOCK multiple times, in scalar context, with `$a` and `$b` set to successive pairs of values from the KVLIST. Returns the first pair of values from the list for which the BLOCK returned true in list context, or an empty list of no such pair was found. In scalar context it returns a simple boolean value, rather than either the key or the value found. ( $key, $value ) = pairfirst { $a =~ m/^[[:upper:]]+$/ } @kvlist Similar to `grep`, `pairfirst` aliases `$a` and `$b` to elements of the given list. Any modifications of it by the code block will be visible to the caller. ## pairmap BLOCK KVLIST Similar to perl's `map` keyword, but interprets the given list as an even-sized list of pairs. It invokes the BLOCK multiple times, in list context, with `$a` and `$b` set to successive pairs of values from the KVLIST. Returns the concatenation of all the values returned by the BLOCK in list context, or the count of the number of items that would have been returned in scalar context. @result = pairmap { "The key $a has value $b" } @kvlist Similar to `map`, `pairmap` aliases `$a` and `$b` to elements of the given list. Any modifications of it by the code block will be visible to the caller. ## pairs KVLIST A convenient shortcut to operating on even-sized lists of pairs, this function returns a list of ARRAY references, each containing two items from the given list. It is a more efficient version of pairmap { [ $a, $b ] } KVLIST It is most convenient to use in a `foreach` loop, for example: foreach ( pairs @KVLIST ) { my ( $key, $value ) = @$_; ... } ## pairkeys KVLIST A convenient shortcut to operating on even-sized lists of pairs, this function returns a list of the the first values of each of the pairs in the given list. It is a more efficient version of pairmap { $a } KVLIST ## pairvalues KVLIST A convenient shortcut to operating on even-sized lists of pairs, this function returns a list of the the second values of each of the pairs in the given list. It is a more efficient version of pairmap { $b } KVLIST # OTHER FUNCTIONS ## shuffle LIST Returns the elements of LIST in a random order @cards = shuffle 0..51 # 0..51 in a random order # List::MoreUtils FUNCTIONS ## any BLOCK LIST Returns a true value if any item in LIST meets the criterion given through BLOCK. Sets `$_` for each item in LIST in turn: print "At least one value undefined" if any { ! defined($_) } @list; Returns false otherwise, or if LIST is empty. ## all BLOCK LIST Returns a true value if all items in LIST meet the criterion given through BLOCK, or if LIST is empty. Sets `$_` for each item in LIST in turn: print "All items defined" if all { defined($_) } @list; Returns false otherwise. ## none BLOCK LIST Logically the negation of `any`. Returns a true value if no item in LIST meets the criterion given through BLOCK, or if LIST is empty. Sets `$_` for each item in LIST in turn: print "No value defined" if none { defined($_) } @list; Returns false otherwise. ## notall BLOCK LIST Logically the negation of `all`. Returns a true value if not all items in LIST meet the criterion given through BLOCK. Sets `$_` for each item in LIST in turn: print "Not all values defined" if notall { defined($_) } @list; Returns false otherwise, or if LIST is empty. ## true BLOCK LIST Counts the number of elements in LIST for which the criterion in BLOCK is true. Sets `$_` for each item in LIST in turn: printf "%i item(s) are defined", true { defined($_) } @list; ## false BLOCK LIST Counts the number of elements in LIST for which the criterion in BLOCK is false. Sets `$_` for each item in LIST in turn: printf "%i item(s) are not defined", false { defined($_) } @list; ## firstidx BLOCK LIST ## first\_index BLOCK LIST Returns the index of the first element in LIST for which the criterion in BLOCK is true. Sets `$_` for each item in LIST in turn: my @list = (1, 4, 3, 2, 4, 6); printf "item with index %i in list is 4", firstidx { $_ == 4 } @list; __END__ item with index 1 in list is 4 Returns `-1` if no such item could be found. `first_index` is an alias for `firstidx`. ## lastidx BLOCK LIST ## last\_index BLOCK LIST Returns the index of the last element in LIST for which the criterion in BLOCK is true. Sets `$_` for each item in LIST in turn: my @list = (1, 4, 3, 2, 4, 6); printf "item with index %i in list is 4", lastidx { $_ == 4 } @list; __END__ item with index 4 in list is 4 Returns `-1` if no such item could be found. `last_index` is an alias for `lastidx`. ## insert\_after BLOCK VALUE LIST Inserts VALUE after the first item in LIST for which the criterion in BLOCK is true. Sets `$_` for each item in LIST in turn. my @list = qw/This is a list/; insert_after { $_ eq "a" } "longer" => @list; print "@list"; __END__ This is a longer list ## insert\_after\_string STRING VALUE LIST Inserts VALUE after the first item in LIST which is equal to STRING. my @list = qw/This is a list/; insert_after_string "a", "longer" => @list; print "@list"; __END__ This is a longer list ## apply BLOCK LIST Applies BLOCK to each item in LIST and returns a list of the values after BLOCK has been applied. In scalar context, the last element is returned. This function is similar to `map` but will not modify the elements of the input list: my @list = (1 .. 4); my @mult = apply { $_ *= 2 } @list; print "\@list = @list\n"; print "\@mult = @mult\n"; __END__ @list = 1 2 3 4 @mult = 2 4 6 8 Think of it as syntactic sugar for for (my @mult = @list) { $_ *= 2 } ## before BLOCK LIST Returns a list of values of LIST up to (and not including) the point where BLOCK returns a true value. Sets `$_` for each element in LIST in turn. ## before\_incl BLOCK LIST Same as `before` but also includes the element for which BLOCK is true. ## after BLOCK LIST Returns a list of the values of LIST after (and not including) the point where BLOCK returns a true value. Sets `$_` for each element in LIST in turn. @x = after { $_ % 5 == 0 } (1..9); # returns 6, 7, 8, 9 ## after\_incl BLOCK LIST Same as `after` but also includes the element for which BLOCK is true. ## indexes BLOCK LIST Evaluates BLOCK for each element in LIST (assigned to `$_`) and returns a list of the indices of those elements for which BLOCK returned a true value. This is just like `grep` only that it returns indices instead of values: @x = indexes { $_ % 2 == 0 } (1..10); # returns 1, 3, 5, 7, 9 ## firstval BLOCK LIST ## first\_value BLOCK LIST Returns the first element in LIST for which BLOCK evaluates to true. Each element of LIST is set to `$_` in turn. Returns `undef` if no such element has been found. `first_val` is an alias for `firstval`. ## lastval BLOCK LIST ## last\_value BLOCK LIST Returns the last value in LIST for which BLOCK evaluates to true. Each element of LIST is set to `$_` in turn. Returns `undef` if no such element has been found. `last_val` is an alias for `lastval`. ## pairwise BLOCK ARRAY1 ARRAY2 Evaluates BLOCK for each pair of elements in ARRAY1 and ARRAY2 and returns a new list consisting of BLOCK's return values. The two elements are set to `$a` and `$b`. Note that those two are aliases to the original value so changing them will modify the input arrays. @a = (1 .. 5); @b = (11 .. 15); @x = pairwise { $a + $b } @a, @b; # returns 12, 14, 16, 18, 20 # mesh with pairwise @a = qw/a b c/; @b = qw/1 2 3/; @x = pairwise { ($a, $b) } @a, @b; # returns a, 1, b, 2, c, 3 ## each\_array ARRAY1 ARRAY2 ... Creates an array iterator to return the elements of the list of arrays ARRAY1, ARRAY2 throughout ARRAYn in turn. That is, the first time it is called, it returns the first element of each array. The next time, it returns the second elements. And so on, until all elements are exhausted. This is useful for looping over more than one array at once: my $ea = each_array(@a, @b, @c); while ( my ($a, $b, $c) = $ea->() ) { .... } The iterator returns the empty list when it reached the end of all arrays. If the iterator is passed an argument of '`index`', then it returns the index of the last fetched set of values, as a scalar. ## each\_arrayref LIST Like each\_array, but the arguments are references to arrays, not the plain arrays. ## natatime EXPR, LIST Creates an array iterator, for looping over an array in chunks of `$n` items at a time. (n at a time, get it?). An example is probably a better explanation than I could give in words. Example: my @x = ('a' .. 'g'); my $it = natatime 3, @x; while (my @vals = $it->()) { print "@vals\n"; } This prints a b c d e f g ## mesh ARRAY1 ARRAY2 \[ ARRAY3 ... \] ## zip ARRAY1 ARRAY2 \[ ARRAY3 ... \] Returns a list consisting of the first elements of each array, then the second, then the third, etc, until all arrays are exhausted. Examples: @x = qw/a b c d/; @y = qw/1 2 3 4/; @z = mesh @x, @y; # returns a, 1, b, 2, c, 3, d, 4 @a = ('x'); @b = ('1', '2'); @c = qw/zip zap zot/; @d = mesh @a, @b, @c; # x, 1, zip, undef, 2, zap, undef, undef, zot `zip` is an alias for `mesh`. ## uniq LIST ## distinct LIST Returns a new list by stripping duplicate values in LIST. The order of elements in the returned list is the same as in LIST. In scalar context, returns the number of unique elements in LIST. my @x = uniq 1, 1, 2, 2, 3, 5, 3, 4; # returns 1 2 3 5 4 my $x = uniq 1, 1, 2, 2, 3, 5, 3, 4; # returns 5 ## minmax LIST Calculates the minimum and maximum of LIST and returns a two element list with the first element being the minimum and the second the maximum. Returns the empty list if LIST was empty. The `minmax` algorithm differs from a naive iteration over the list where each element is compared to two values being the so far calculated min and max value in that it only requires 3n/2 - 2 comparisons. Thus it is the most efficient possible algorithm. However, the Perl implementation of it has some overhead simply due to the fact that there are more lines of Perl code involved. Therefore, LIST needs to be fairly big in order for `minmax` to win over a naive implementation. This limitation does not apply to the XS version. ## part BLOCK LIST Partitions LIST based on the return value of BLOCK which denotes into which partition the current value is put. Returns a list of the partitions thusly created. Each partition created is a reference to an array. my $i = 0; my @part = part { $i++ % 2 } 1 .. 8; # returns [1, 3, 5, 7], [2, 4, 6, 8] You can have a sparse list of partitions as well where non-set partitions will be undef: my @part = part { 2 } 1 .. 10; # returns undef, undef, [ 1 .. 10 ] Be careful with negative values, though: my @part = part { -1 } 1 .. 10; __END__ Modification of non-creatable array value attempted, subscript -1 ... Negative values are only okay when they refer to a partition previously created: my @idx = ( 0, 1, -1 ); my $i = 0; my @part = part { $idx[$++ % 3] } 1 .. 8; # [1, 4, 7], [2, 3, 5, 6, 8] # EXPORTS This module exports nothing by default. You can import functions by name, or get everything with the `:all` tag. # SEE ALSO `List::Util` and `List::MoreUtils`, obviously. Also see `Util::Any`, which unifies many more util modules, and also lets you rename functions as part of the import. # BUGS Please report any bugs or feature requests to `bug-list-allutils@rt.cpan.org`, or through the web interface at [http://rt.cpan.org](http://rt.cpan.org). I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. # AUTHOR Dave Rolsky # COPYRIGHT AND LICENSE This software is Copyright (c) 2014 by Dave Rolsky. This is free software, licensed under: The Artistic License 2.0 (GPL Compatible)