CXC-Data-Visitor

 view release on metacpan or  search on metacpan

t/sort.t  view on Meta::CPAN

#! perl

use v5.20;
use Test2::V0;

use CXC::Data::Visitor '-all';
use Ref::Util 'is_hashref', 'is_arrayref';
use experimental 'signatures', 'postderef';
use Data::Dump 'pp';

sub myhash {
    (
        a => 1,
        b => [ 2, 3, 4 ],
        c => {
            d => [ 5, 6, 7 ],
            e => 8,
        },
    );
}

subtest 'default' => sub {
    my %hash = myhash;
    my @order;
    visit(
        \%hash,
        sub ( $kydx, $vref, @ ) {
            push @order, $vref->$*;
            return RESULT_CONTINUE;
        },
        visit => VISIT_LEAF,
    );
    is( \@order, [ 1 .. 8 ] ) or diag pp @order;
};

subtest 'key_sort => true' => sub {

    my %hash = myhash;

    my @keys_a  = keys %hash;
    my @keeys_c = keys $hash{c}->%*;

    my @input = ( \%hash );
    my @expected;
    while ( @input ) {
        my $element = shift @input;
        if ( is_arrayref $element ) {
            unshift @input, $element->@*;
        }
        elsif ( is_hashref $element ) {
            unshift @input, values $element->%*;
        }
        else {
            push @expected, $element;
        }
    }

    my @order;
    visit(
        \%hash,
        sub ( $kydx, $vref, @ ) {
            push @order, $vref->$*;
            return RESULT_CONTINUE;
        },
        visit    => VISIT_LEAF,
        key_sort => !!1,
    );



( run in 1.590 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )