From: "yhara (Yutaka HARA)" <redmine@...>
Date: 2012-10-25T20:16:54+09:00
Subject: [ruby-dev:46268] [ruby-trunk - Feature #4787] Integer#each_modulo(n)


Issue #4787 has been updated by yhara (Yutaka HARA).

Target version changed from 2.0.0 to next minor


----------------------------------------
Feature #4787: Integer#each_modulo(n)
https://bugs.ruby-lang.org/issues/4787#change-31543

Author: mrkn (Kenta Murata)
Status: Assigned
Priority: Normal
Assignee: matz (Yukihiro Matsumoto)
Category: core
Target version: next minor


I suggest a new feature of Integer to enumerate by iterated Integer#modulo.
An example implementation in Ruby is the following code:

  class Integer
    def each_modulo(n)
      raise ArgumentError, "argument must be an Integer" unless n.is_a? Integer
      raise ArgumentError, "argument must be larger than 1" if n <= 1
      return Enumerator.new(self, :each_modulo, n) unless block_given?
      q = self
      while q > 0
        q, r = q.divmod(n)
        yield(r)
      end
    end
  end
  
  p 133.each_modulo(3).to_a #=> [1, 2, 2, 1, 1]

The following code is an example use of the feature:

  class Integer
    def each_thousand_separation
      each_modulo(1000)
    end
  
    def thousand_separated_string(sep=',')
      each_thousand_separation.map(&'%03d'.method(:%)).inject{|s, n| n + sep + s }
    end
  end
  
  p 100_000_000_200.thousand_separated_string #=> "100,000,000,200"

I make an implementation in C, and attach the patch for that.


-- 
http://bugs.ruby-lang.org/