Skip to content

Commit

Permalink
- Added the RangeNumber.map() method, strictly for performance improv…
Browse files Browse the repository at this point in the history
…ements.

Example:
	range(1, 100).map { i**2 };   # an intermediary array is no longer created
  • Loading branch information
trizen committed Sep 16, 2015
1 parent c7294c9 commit 00fc434
Showing 1 changed file with 32 additions and 0 deletions.
32 changes: 32 additions & 0 deletions lib/Sidef/Types/Array/RangeNumber.pm
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,38 @@ package Sidef::Types::Array::RangeNumber {
$self;
}

sub map {
my ($self, $code) = @_;

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

my @values;
if ($step == 1 and not $limit > (-1 >> 1) and not $from > (-1 >> 1)) {

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

foreach my $i ($from .. $limit) {
push @values, $code->run(Sidef::Types::Number::Number->new($i));
}
}

elsif ($step > 0) {
for (my $i = $from ; $i <= $limit ; $i += $step) {
push @values, $code->run(Sidef::Types::Number::Number->new($i));
}
}
else {
for (my $i = $from ; $i >= $limit ; $i += $step) {
push @values, $code->run(Sidef::Types::Number::Number->new($i));
}
}

Sidef::Types::Array::Array->new(@values);
}

our $AUTOLOAD;
sub DESTROY { }

Expand Down

0 comments on commit 00fc434

Please sign in to comment.