Sha256: ea1d9f59087c31c7c2e25da125a305f86a7eb435f6ff6eabc42d2712812ba3c4

Contents?: true

Size: 1.28 KB

Versions: 17

Compression:

Stored size: 1.28 KB

Contents

require 'facets/more/functor'

module Enumerable

  # Returns an elementwise Functor designed to make R-like
  # elementwise operations possible.
  #
  #   [1,2].ew + 3          #=> [4,5]
  #   [1,2].ew + [4,5]      #=> [5,7]
  #   [1,2].ew + [[4,5],3]  #=> [[5,7],[4,5]
  #
  #--
  # Special thanks to Martin DeMello for helping to develop this.
  #++
  def elementwise
    Functor.new do |op,*args|
      a = args.collect do |arg|
        if arg.kind_of?(Enumerable)
          ln = ( arg.length > self.length ? self.length : arg.length )
          self[0...ln].zip(arg[0...ln]).collect{ |a,b| a.send(op,b) }
          #self[0...ln].zip(arg[0...1n]).collect{ |a,b| b ? a.send(op,b) : nil }
        else
          self.collect{ |a| a.send(op,arg) }
        end
      end
      a.flatten! if args.length == 1
      a
    end
  end

  alias_method :ew, :elementwise

end


#  _____         _
# |_   _|__  ___| |_
#   | |/ _ \/ __| __|
#   | |  __/\__ \ |_
#   |_|\___||___/\__|
#
=begin test

  require 'test/unit'

  class TCEnumerable < Test::Unit::TestCase

    def test_ew
      a = [1,2,3]
      b = [4,5]
      assert_equal( [4,5,6], a.ew + 3 )
      assert_equal( [5,7], a.ew + b )
      assert_equal( [[5,7],[3,4,5]], a.ew.+(b,2) )
      assert_equal( [[5,7],[4,5,6]], a.ew.+(b,3) )
    end

  end

=end

Version data entries

17 entries across 17 versions & 1 rubygems

Version Path
facets-1.3.0 lib/facets/core/enumerable/ew.rb
facets-1.3.2 lib/facets/core/enumerable/ew.rb
facets-1.3.3 lib/facets/core/enumerable/ew.rb
facets-1.3.1 lib/facets/core/enumerable/ew.rb
facets-1.4.1 lib/facets/core/enumerable/ew.rb
facets-1.4.2 lib/facets/core/enumerable/ew.rb
facets-1.4.0 lib/facets/core/enumerable/ew.rb
facets-1.4.3 lib/facets/core/enumerable/ew.rb
facets-1.4.5 lib/facets/core/enumerable/ew.rb
facets-1.4.4 lib/facets/core/enumerable/ew.rb
facets-1.7.30 lib/facets/core/enumerable/ew.rb
facets-1.7.0 lib/facets/core/enumerable/ew.rb
facets-1.7.38 lib/facets/core/enumerable/ew.rb
facets-1.7.46 lib/facets/core/enumerable/ew.rb
facets-1.8.0 lib/facets/core/enumerable/ew.rb
facets-1.8.20 lib/facets/core/enumerable/ew.rb
facets-1.8.8 lib/facets/core/enumerable/ew.rb