Skip to content

Commit

Permalink
- Added the Range.reverse() method to reverse a given range
Browse files Browse the repository at this point in the history
Example:
	range(1, 10).reverse.each { |i|
		say i;		# prints: 10, 9, 8, ..., 1
	};

- Internal simplifications to the RangeString and RangeNumber objects
- Added the Number.binomial() alias for Number.nok()
  • Loading branch information
trizen committed Sep 5, 2015
1 parent e9b61a5 commit 33a1ce8
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 61 deletions.
2 changes: 1 addition & 1 deletion lib/Sidef/Types/Array/Array.pm
Original file line number Diff line number Diff line change
Expand Up @@ -799,7 +799,7 @@ package Sidef::Types::Array::Array {

sub range {
my ($self) = @_;
Sidef::Types::Array::RangeNumber->new(from => 0, to => $#{$self}, step => 1, direction => 'up');
Sidef::Types::Array::RangeNumber->new(from => 0, to => $#{$self}, step => 1);
}

sub pairs {
Expand Down
62 changes: 35 additions & 27 deletions lib/Sidef/Types/Array/RangeNumber.pm
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,23 @@ package Sidef::Types::Array::RangeNumber {
$self;
}

sub reverse {
my ($self) = @_;

$self->{step} = -$self->{step};
($self->{from}, $self->{to}) = ($self->{to}, $self->{from});

$self;
}

sub min {
my ($self) = @_;
Sidef::Types::Number::Number->new($self->{direction} eq 'up' ? $self->{from} : $self->{to});
Sidef::Types::Number::Number->new($self->{step} > 0 ? $self->{from} : $self->{to});
}

sub max {
my ($self) = @_;
Sidef::Types::Number::Number->new($self->{direction} eq 'up' ? $self->{to} : $self->{from});
Sidef::Types::Number::Number->new($self->{step} > 0 ? $self->{to} : $self->{from});
}

sub step {
Expand All @@ -44,13 +53,13 @@ package Sidef::Types::Array::RangeNumber {
my $step = $self->{step};

Sidef::Types::Bool::Bool->new(
$value >= $min and $value <= $max
and (
$step == 1 ? 1
: $self->{direction} eq 'up' ? (int(($value - $min) / $step) * $step == ($value - $min))
: (int(($value - $max) / $step) * $step == ($value - $max))
)
);
$value >= $min and $value <= $max
and (
$step == 1 ? 1
: $step > 0 ? (int(($value - $min) / $step) * $step == ($value - $min))
: (int(($value - $max) / $step) * $step == ($value - $max))
)
);
}

*includes = \&contains;
Expand All @@ -62,29 +71,28 @@ package Sidef::Types::Array::RangeNumber {
my $from = $self->{from};
my $limit = $self->{to};

if ($self->{direction} eq 'up') {
if ($step == 1 and not $limit > (-1 >> 1) and not $from > (-1 >> 1)) {
if ($step == 1 and not $limit > (-1 >> 1) and not $from > (-1 >> 1)) {

# Unpack limit
$limit = $limit->bstr if ref($limit);
# Unpack limit
$limit = $limit->bstr if ref($limit);

foreach my $i ($from .. $limit) {
if (defined(my $res = $code->_run_code(Sidef::Types::Number::Number->new($i)))) {
return $res;
}
foreach my $i ($from .. $limit) {
if (defined(my $res = $code->_run_code(Sidef::Types::Number::Number->new($i)))) {
return $res;
}

}
else {
for (my $i = $from ; $i <= $limit ; $i += $step) {
if (defined(my $res = $code->_run_code(Sidef::Types::Number::Number->new($i)))) {
return $res;
}

}

elsif ($step > 0) {
for (my $i = $from ; $i <= $limit ; $i += $step) {
if (defined(my $res = $code->_run_code(Sidef::Types::Number::Number->new($i)))) {
return $res;
}
}
}
else {
for (my $i = $from ; $i >= $limit ; $i -= $step) {
for (my $i = $from ; $i >= $limit ; $i += $step) {
if (defined(my $res = $code->_run_code(Sidef::Types::Number::Number->new($i)))) {
return $res;
}
Expand All @@ -111,14 +119,14 @@ package Sidef::Types::Array::RangeNumber {
my ($name) = (defined($AUTOLOAD) ? ($AUTOLOAD =~ /^.*[^:]::(.*)$/) : '');

my $array;
my $method = $self->{direction} eq 'up' ? 'array_to' : 'array_downto';
my $method = $self->{step} > 0 ? 'array_to' : 'array_downto';

my $step = $self->{step};
my $from = $self->{from};
my $to = $self->{to};

$array = Sidef::Types::Number::Number->new($from)
->$method(Sidef::Types::Number::Number->new($to), $step != 1 ? Sidef::Types::Number::Number->new($step) : ());
$array = Sidef::Types::Number::Number->new($from)->$method(Sidef::Types::Number::Number->new($to),
abs($step) != 1 ? Sidef::Types::Number::Number->new(abs($step)) : ());

$name eq '' ? $array : $array->$name(@args);
}
Expand Down
23 changes: 15 additions & 8 deletions lib/Sidef/Types/Array/RangeString.pm
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,28 @@ package Sidef::Types::Array::RangeString {

sub min {
my ($self) = @_;
Sidef::Types::String::String->new($self->{direction} eq 'up' ? $self->{from} : $self->{to});
Sidef::Types::String::String->new($self->{asc} ? $self->{from} : $self->{to});
}

sub max {
my ($self) = @_;
Sidef::Types::String::String->new($self->{direction} eq 'up' ? $self->{to} : $self->{from});
Sidef::Types::String::String->new($self->{asc} ? $self->{to} : $self->{from});
}

sub bounds {
my ($self) = @_;
Sidef::Types::Array::List->new($self->min, $self->max);
}

sub reverse {
my ($self) = @_;

$self->{asc} ^= 1;
($self->{from}, $self->{to}) = ($self->{to}, $self->{from});

$self;
}

sub contains {
my ($self, $num) = @_;

Expand All @@ -42,7 +51,7 @@ package Sidef::Types::Array::RangeString {
my $from = $self->{from};
my $to = $self->{to};

if ($self->{direction} eq 'up') {
if ($self->{asc}) {
if (length($from) == 1 and length($to) == 1) {
foreach my $i (ord($from) .. ord($to)) {
if (defined(my $res = $code->_run_code(Sidef::Types::String::String->new(chr($i))))) {
Expand Down Expand Up @@ -77,6 +86,7 @@ package Sidef::Types::Array::RangeString {
}
}

$self;
}

our $AUTOLOAD;
Expand All @@ -96,12 +106,9 @@ package Sidef::Types::Array::RangeString {
my ($name) = (defined($AUTOLOAD) ? ($AUTOLOAD =~ /^.*[^:]::(.*)$/) : '');

my $array;
my $method = $self->{direction} eq 'up' ? 'array_to' : 'array_downto';

my $from = $self->{from};
my $to = $self->{to};
$array = Sidef::Types::String::String->new($from)->$method(Sidef::Types::String::String->new($to));
my $method = $self->{asc} ? 'array_to' : 'array_downto';

$array = Sidef::Types::String::String->new($self->{from})->$method(Sidef::Types::String::String->new($self->{to}));
$name eq '' ? $array : $array->$name(@args);
}

Expand Down
7 changes: 5 additions & 2 deletions lib/Sidef/Types/Number/Complex.pm
Original file line number Diff line number Diff line change
Expand Up @@ -276,8 +276,11 @@ package Sidef::Types::Number::Complex {
*fround = \&roundf;
*fRound = \&roundf;

sub digit { ... }
sub nok { ... }
sub digit { ... }

sub nok { ... }
*binomial = \&nok;

sub length { ... }

*len = \&length;
Expand Down
32 changes: 17 additions & 15 deletions lib/Sidef/Types/Number/Number.pm
Original file line number Diff line number Diff line change
Expand Up @@ -253,10 +253,9 @@ package Sidef::Types::Number::Number {
my ($self, $num, $step) = @_;
$step = defined($step) ? $step->get_value : 1;
Sidef::Types::Array::RangeNumber->new(
from => $self->get_value,
to => $num->get_value,
step => $step,
direction => 'up'
from => $self->get_value,
to => $num->get_value,
step => $step,
);
}

Expand All @@ -267,15 +266,23 @@ package Sidef::Types::Number::Number {
my ($self, $num, $step) = @_;
$step = defined($step) ? $step->get_value : 1;
Sidef::Types::Array::RangeNumber->new(
from => $self->get_value,
to => $num->get_value,
step => $step,
direction => 'down'
from => $self->get_value,
to => $num->get_value,
step => -$step,
);
}

*downTo = \&downto;

sub range {
my ($self, $to) = @_;

defined($to)
? $self->to($to)
: $self->new(0)->to($self);

}

sub sqrt {
my ($self) = @_;
$self->new(CORE::sqrt($self->get_value));
Expand Down Expand Up @@ -527,13 +534,6 @@ package Sidef::Types::Number::Number {
*fround = \&roundf;
*fRound = \&roundf;

sub range {
my ($self, $to) = @_;
defined($to)
? ($self->to($to))
: ($self->get_value >= 0 ? $self->new(0)->to($self) : $self->to($self->new(0)));
}

sub length {
my ($self) = @_;
$self->new($self->get_value->length);
Expand All @@ -551,6 +551,8 @@ package Sidef::Types::Number::Number {
$self->new($self->get_value->as_int->bnok($k->get_value));
}

*binomial = \&nok;

sub of {
my ($self, $obj) = @_;

Expand Down
2 changes: 2 additions & 0 deletions lib/Sidef/Types/Number/NumberFast.pm
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,8 @@ package Sidef::Types::Number::Number {
$n->factorial->div($n->subtract($k)->factorial->multiply($k->factorial));
}
*binomial = \&nok;
sub to_bin {
my ($self) = @_;
Expand Down
17 changes: 9 additions & 8 deletions lib/Sidef/Types/String/String.pm
Original file line number Diff line number Diff line change
Expand Up @@ -173,21 +173,22 @@ package Sidef::Types::String::String {
sub to {
my ($self, $string) = @_;
Sidef::Types::Array::RangeString->new(
from => $self->get_value,
to => $string->get_value,
direction => 'up'
from => $self->get_value,
to => $string->get_value,
asc => 1,
);
}

*upto = \&to;
*upTo = \&to;
*upto = \&to;
*upTo = \&to;
*range = \&to;

sub downto {
my ($self, $string) = @_;
Sidef::Types::Array::RangeString->new(
from => $self->get_value,
to => $string->get_value,
direction => 'down'
from => $self->get_value,
to => $string->get_value,
asc => 0,
);
}

Expand Down

0 comments on commit 33a1ce8

Please sign in to comment.