Skip to content

Commit

Permalink
- Better performance in Array/Range each_cons.
Browse files Browse the repository at this point in the history
  • Loading branch information
trizen committed Feb 2, 2020
1 parent d98bba5 commit dca04b0
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 15 deletions.
26 changes: 18 additions & 8 deletions lib/Sidef/Types/Array/Array.pm
Original file line number Diff line number Diff line change
Expand Up @@ -1398,13 +1398,18 @@ package Sidef::Types::Array::Array {
$n = CORE::int($n);

my @values;
my $count = 0;

foreach my $item (@$self) {
CORE::push(@values, $item);
if (@values == $n) {
my @copy = @values;
if (++$count > $n) {
CORE::shift(@values);
$block->run(@copy);
--$count;
}

CORE::push(@values, $item);

if ($count == $n) {
$block->run(@values);
}
}

Expand All @@ -1420,13 +1425,18 @@ package Sidef::Types::Array::Array {

my @result;
my @values;
my $count = 0;

foreach my $item (@$self) {
CORE::push(@values, $item);
if (@values == $n) {
my @copy = @values;
if (++$count > $n) {
CORE::shift(@values);
CORE::push(@result, $block->run(@copy));
--$count;
}

CORE::push(@values, $item);

if ($count == $n) {
CORE::push(@result, $block->run(@values));
}
}

Expand Down
24 changes: 17 additions & 7 deletions lib/Sidef/Types/Range/Range.pm
Original file line number Diff line number Diff line change
Expand Up @@ -263,15 +263,21 @@ package Sidef::Types::Range::Range {
$n > 0 or return $self;

my @values;
my $iter = $self->iter;
my $count = 0;
my $iter = $self->iter;

for (; ;) {
my $value = $iter->run() // last;
push @values, $value;
if (@values == $n) {
my @copy = @values;

if (++$count > $n) {
shift @values;
$block->run(@copy);
--$count;
}

push @values, $value;

if ($count == $n) {
$block->run(@values);
}
}

Expand All @@ -285,15 +291,19 @@ package Sidef::Types::Range::Range {
$n > 0 or return $self;

my @values;
my $iter = $self->iter;
my $count = 0;
my $iter = $self->iter;

for (; ;) {
my $value = $iter->run() // do {
$block->run(@values) if @values;
return $self;
};

push @values, $value;
if (@values == $n) {

if (++$count == $n) {
$count = 0;
$block->run(splice(@values));
}
}
Expand Down
43 changes: 43 additions & 0 deletions scripts/Tests/slices_cons.sf
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,34 @@ do {
assert_eq(arr1, [[1, 2, 3], [7, 8, 9], [10]])
}

do {
var arr1 = []
var arr2 = []
r.each_slice(5, {|*a|
arr1 << a
})
a.each_slice(5, {|*a|
arr2 << a
})
assert_eq(arr1, arr2)
assert_eq(arr1, [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
}

do {
var arr1 = []
var arr2 = []
r.each_slice(3, {|*a|
arr1 << a
break if (a == [4,5,6])
})
a.each_slice(3, {|*a|
arr2 << a
break if (a == [4,5,6])
})
assert_eq(arr1, arr2)
assert_eq(arr1, [[1, 2, 3], [4, 5, 6]])
}

do {
var arr1 = []
var arr2 = []
Expand All @@ -41,6 +69,21 @@ do {
assert_eq(arr1, [[1, 2, 3], [2, 3, 4], [3, 4, 5], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 10]])
}

do {
var arr1 = []
var arr2 = []
r.each_cons(3, {|*a|
arr1 << a
break if (a == [4,5,6])
})
a.each_cons(3, {|*a|
arr2 << a
break if (a == [4,5,6])
})
assert_eq(arr1, arr2)
assert_eq(arr1, [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]])
}

do {
var arr1 = r.map_cons(3, {|*a|
next if (a == [4,5,6])
Expand Down

0 comments on commit dca04b0

Please sign in to comment.