CXC-Data-Visitor

 view release on metacpan or  search on metacpan

lib/CXC/Data/Visitor.pm  view on Meta::CPAN

package CXC::Data::Visitor;

# ABSTRACT: Invoke a callback on every element at every level of a data structure.

use v5.20;
use strict;
use warnings;


use feature 'current_sub';
use experimental 'signatures', 'lexical_subs', 'postderef';

#<<< no tidy
our $VERSION = '0.12';
#>>>

use base 'Exporter::Tiny';
use Hash::Util 'lock_hash', 'unlock_hash', 'unlock_value';
use POSIX 'floor';
use Scalar::Util 'refaddr', 'looks_like_number';
use Ref::Util 'is_plain_arrayref', 'is_plain_hashref', 'is_coderef', 'is_plain_ref',
  'is_plain_refref';
use Feature::Compat::Defer;

use constant {
    CYCLE_DIE      => 'die',
    CYCLE_CONTINUE => 'continue',
    CYCLE_TRUNCATE => 'truncate',
};
use constant CYCLE_QR => qr /\A die|continue|truncate \z/x;
use constant {
    VISIT_HASH      => 0b0001,
    VISIT_ARRAY     => 0b0010,
    VISIT_CONTAINER => 0b0011,
    VISIT_LEAF      => 0b0100,
    VISIT_ALL       => 0b0111,
    VISIT_ROOT      => 0b1000,
};
use constant {
    RESULT_NULL              => 0b000000,
    RESULT_RETURN            => 0b000001,
    RESULT_CONTINUE          => 0b000010,
    RESULT_REVISIT_CONTENTS  => 0b000100,
    RESULT_REVISIT_CONTAINER => 0b000100,    # back compat
    RESULT_REVISIT_ELEMENT   => 0b001000,
    RESULT_STOP_DESCENT      => 0b010000,
    RESULT_REVISIT_ROOT      => 0b100000,
};

use constant {
    PASS_VISIT_ELEMENT   => 0b01,
    PASS_REVISIT_ELEMENT => 0b10,
};

our %EXPORT_TAGS = (
    funcs   => [qw( visit )],
    results => [ qw(
          RESULT_NULL
          RESULT_RETURN
          RESULT_CONTINUE
          RESULT_REVISIT_ROOT
          RESULT_REVISIT_CONTENTS
          RESULT_REVISIT_CONTAINER
          RESULT_REVISIT_ELEMENT
          RESULT_STOP_DESCENT
        ),
    ],

    cycles => [ qw(
          CYCLE_DIE
          CYCLE_CONTINUE
          CYCLE_TRUNCATE
        ),
    ],

    visits => [ qw(
          VISIT_ARRAY
          VISIT_HASH
          VISIT_CONTAINER
          VISIT_LEAF
          VISIT_ALL



( run in 2.126 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )