Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: opal/opal
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: c46e937609f6
Choose a base ref
...
head repository: opal/opal
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 2b065429fade
Choose a head ref
  • 3 commits
  • 4 files changed
  • 1 contributor

Commits on Oct 27, 2013

  1. Copy the full SHA
    ad418fd View commit details
  2. Implement Enumerable#max_by

    meh committed Oct 27, 2013
    Copy the full SHA
    51e6dd5 View commit details
  3. Implement Enumerable#min_by

    meh committed Oct 27, 2013
    Copy the full SHA
    2b06542 View commit details
Showing with 81 additions and 1 deletion.
  1. +69 −1 corelib/enumerable.rb
  2. +5 −0 spec/opal/enumerable/max_by_break_spec.rb
  3. +5 −0 spec/opal/enumerable/min_by_break_spec.rb
  4. +2 −0 spec/rubyspecs
70 changes: 69 additions & 1 deletion corelib/enumerable.rb
Original file line number Diff line number Diff line change
@@ -572,6 +572,42 @@ def max(&block)
}
end

def max_by(&block)
return enum_for :max_by unless block

%x{
var result,
by;
self.$each._p = function() {
var param = #{Opal.destructure(`arguments`)},
value = $opal.$yield1(block, param);
if (result === undefined) {
result = param;
by = value;
return;
}
if (value === $breaker) {
result = $breaker.$v;
return $breaker;
}
if (#{`value` <=> `by`} > 0) {
result = param
by = value;
}
};
self.$each();
return result === undefined ? nil : result;
}
end

alias member? include?

def min(&block)
%x{
var result;
@@ -618,7 +654,39 @@ def min(&block)
}
end

alias member? include?
def min_by(&block)
return enum_for :min_by unless block

%x{
var result,
by;
self.$each._p = function() {
var param = #{Opal.destructure(`arguments`)},
value = $opal.$yield1(block, param);
if (result === undefined) {
result = param;
by = value;
return;
}
if (value === $breaker) {
result = $breaker.$v;
return $breaker;
}
if (#{`value` <=> `by`} < 0) {
result = param
by = value;
}
};
self.$each();
return result === undefined ? nil : result;
}
end

def none?(&block)
%x{
5 changes: 5 additions & 0 deletions spec/opal/enumerable/max_by_break_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
describe "Enumerable#max_by" do
it "breaks out with the proper value" do
[1, 2, 3].max_by { break 42 }.should == 42
end
end
5 changes: 5 additions & 0 deletions spec/opal/enumerable/min_by_break_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
describe "Enumerable#min_by" do
it "breaks out with the proper value" do
[1, 2, 3].min_by { break 42 }.should == 42
end
end
2 changes: 2 additions & 0 deletions spec/rubyspecs
Original file line number Diff line number Diff line change
@@ -119,8 +119,10 @@ core/enumerable/include_spec
core/enumerable/inject_spec
core/enumerable/map_spec
core/enumerable/max_spec
core/enumerable/max_by_spec
core/enumerable/member_spec
core/enumerable/min_spec
core/enumerable/min_by_spec
core/enumerable/none_spec
core/enumerable/one_spec
core/enumerable/reduce_spec