Lab-Measurement
view release on metacpan or search on metacpan
lib/Lab/Moose/Sweep/Step.pm view on Meta::CPAN
package Lab::Moose::Sweep::Step;
$Lab::Moose::Sweep::Step::VERSION = '3.931';
#ABSTRACT: Base class for step/list sweeps
use v5.20;
use Moose;
use Moose::Util::TypeConstraints 'enum';
use MooseX::Params::Validate;
use Data::Dumper;
# Do not import all functions as they clash with the attribute methods.
use Lab::Moose 'linspace';
use Carp;
extends 'Lab::Moose::Sweep';
#
# Public attributes set by the user
#
has from => ( is => 'ro', isa => 'Num', predicate => 'has_from' );
has to => ( is => 'ro', isa => 'Num', predicate => 'has_to' );
has step =>
( is => 'ro', isa => 'Lab::Moose::PosNum', predicate => 'has_step' );
has points =>
( is => 'ro', isa => 'ArrayRef[Num]', predicate => 'has_points' );
has steps => ( is => 'ro', isa => 'ArrayRef[Num]', predicate => 'has_steps' );
has list => (
is => 'ro', isa => 'ArrayRef[Num]', predicate => 'has_list',
writer => '_list'
);
has backsweep => ( is => 'ro', isa => 'Bool', default => 0 );
has both_directions => ( is => 'ro', isa => 'Bool', default => 0 );
has setter => ( is => 'ro', isa => 'CodeRef', required => 1 );
#
# Private attributes used internally
#
has _points => (
is => 'ro', isa => 'ArrayRef[Num]', lazy => 1, init_arg => undef,
builder => '_build_points', traits => ['Array'],
handles => { get_point => 'get', num_points => 'count', points_array => 'elements' },
writer => 'write_points',
);
has index => (
is => 'ro', isa => 'Int', default => 0, init_arg => undef,
writer => '_index'
);
has current_value => (
is => 'ro', isa => 'Num', init_arg => undef,
writer => '_current_value'
);
my $error_msg = <<"EOF";
give either (from => ..., to => ..., step => ...)
or (list => [...])
or (points => [...], steps => [....])
or (points => [...], step => )
EOF
sub _build_points {
my $self = shift;
my $has_from_to_step
= $self->has_from && $self->has_to && $self->has_step;
my $has_list = $self->has_list;
my $has_points_steps = $self->has_points && $self->has_steps;
my $has_points_step = $self->has_points && $self->has_step;
if ( $has_from_to_step + $has_list + $has_points_steps + $has_points_step
!= 1 ) {
croak $error_msg;
}
my @points;
if ($has_list) {
@points = @{ $self->list() };
if ( @points < 1 ) {
croak "list needs at least 1 point";
}
}
elsif ($has_from_to_step) {
@points = linspace(
from => $self->from,
to => $self->to,
step => $self->step
);
}
else {
# points_steps or points_step
my @steps;
my @corner_points = @{ $self->points };
if ( @corner_points < 2 ) {
croak "points array needs at least two elements";
}
if ($has_points_steps) {
@steps = @{ $self->steps };
( run in 1.222 second using v1.01-cache-2.11-cpan-39bf76dae61 )