[#15707] Schedule for the 1.8.7 release — "Akinori MUSHA" <knu@...>

Hi, developers,

21 messages 2008/03/01

[#15740] Copy-on-write friendly garbage collector — Hongli Lai <hongli@...99.net>

Hi.

31 messages 2008/03/03
[#15742] Re: Copy-on-write friendly garbage collector — Yukihiro Matsumoto <matz@...> 2008/03/03

Hi,

[#15829] Re: Copy-on-write friendly garbage collector — Daniel DeLorme <dan-ml@...42.com> 2008/03/08

Yukihiro Matsumoto wrote:

[#15756] embedding Ruby 1.9.0 inside pthread — "Suraj Kurapati" <sunaku@...>

Hello,

18 messages 2008/03/03
[#15759] Re: embedding Ruby 1.9.0 inside pthread — Nobuyoshi Nakada <nobu@...> 2008/03/04

Hi,

[#15760] Re: embedding Ruby 1.9.0 inside pthread — Yukihiro Matsumoto <matz@...> 2008/03/04

Hi,

[#15762] Re: embedding Ruby 1.9.0 inside pthread — "Suraj N. Kurapati" <sunaku@...> 2008/03/04

Yukihiro Matsumoto wrote:

[#15783] Adding startup and shutdown to Test::Unit — Daniel Berger <Daniel.Berger@...>

Hi all,

15 messages 2008/03/04

[#15835] TimeoutError in core, timeouts for ConditionVariable#wait — MenTaLguY <mental@...>

I've been reworking JRuby's stdlib to improve performance and fix

10 messages 2008/03/09

[#15990] Recent changes in Range#step behavior — "Vladimir Sizikov" <vsizikov@...>

Hi,

35 messages 2008/03/23
[#15991] Re: Recent changes in Range#step behavior — Dave Thomas <dave@...> 2008/03/23

[#15993] Re: Recent changes in Range#step behavior — "Vladimir Sizikov" <vsizikov@...> 2008/03/23

Hi Dave,

[#15997] Re: Recent changes in Range#step behavior — Dave Thomas <dave@...> 2008/03/23

[#16024] Re: Recent changes in Range#step behavior — "Vladimir Sizikov" <vsizikov@...> 2008/03/26

Hi Dave,

[#16025] Re: Recent changes in Range#step behavior — Yukihiro Matsumoto <matz@...> 2008/03/26

Hi,

[#16026] Re: Recent changes in Range#step behavior — Dave Thomas <dave@...> 2008/03/26

[#16027] Re: Recent changes in Range#step behavior — Yukihiro Matsumoto <matz@...> 2008/03/26

Hi,

[#16029] Re: Recent changes in Range#step behavior — Dave Thomas <dave@...> 2008/03/26

[#16030] Re: Recent changes in Range#step behavior — Yukihiro Matsumoto <matz@...> 2008/03/26

Hi,

[#16031] Re: Recent changes in Range#step behavior — Dave Thomas <dave@...> 2008/03/26

[#16032] Re: Recent changes in Range#step behavior — "Vladimir Sizikov" <vsizikov@...> 2008/03/26

On Wed, Mar 26, 2008 at 7:01 PM, Dave Thomas <dave@pragprog.com> wrote:

[#16033] Re: Recent changes in Range#step behavior — Dave Thomas <dave@...> 2008/03/26

[#16041] Re: Recent changes in Range#step behavior — David Flanagan <david@...> 2008/03/26

Dave Thomas wrote:

Re: Questions on Enumerator#skip_first and Enumerable#first

From: "Artem Voroztsov" <artem.voroztsov@...>
Date: 2008-03-18 18:37:07 UTC
List: ruby-core #15953
I remember Matz talked about LazyArray's in  Ruby 2.0
(http://www.ruby-forum.com/topic/129792#579690),
which, i guest should solve performance issues of current drop and take.

The question is not only in :drop and :take methods, but also in :map,
:inject and etc.

I prefer method 'Enumerator#map' does not start from the beginning of
the collection.
In fact I think restarting is not possible for abstract Enumerator.

After some (crude, breaking semantics) redefinitions we can compose :take,
:drop and :map without creating intermediate arrays.

# a.rb
class Object
  def singleton_class
    class <<self; self; end
  end
end
module Enumerable
  class Enumerator
    def drop(n=1)
      n.times { self.next }
      self
    end

    def take(n=1)
      enum = Enumerator.new(self, :each)
      enum.instance_variable_set('@parent', self)
      enum.instance_variable_set('@left_elmts', n)

      enum.singleton_class.class_eval do
        def next
          @left_elmts -= 1
          if @left_elmts >= 0
            @parent.next
          else
            raise StopIteration, "Take limit reached"
          end
        end
      end
      enum
    end

    def map(&block)
      res = []
      begin
        loop {res << block[self.next] }
      rescue StopIteration=>e;
      end
      res
    end
  end
end

p( (1..1000000000).each.drop(2).take(3).map{|i| i}  )

$ time ruby_dev a.rb
[3, 4, 5]

real    0m0.017s
user    0m0.006s
sys     0m0.002s

In This Thread

Prev Next