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 )