Sha256: c3edc5781a4ab87afa5ac8e808a732b9692a4d6d3c28de74f536d0068fedcddd

Contents?: true

Size: 1.34 KB

Versions: 5

Compression:

Stored size: 1.34 KB

Contents

begin
  require 'calibre/functor'
rescue LoadError
  require 'facets/support/functor'
end

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

5 entries across 5 versions & 1 rubygems

Version Path
facets-1.0.0 lib/facet/enumerable/ew.rb
facets-1.0.3 packages/core/lib/facet/enumerable/ew.rb
facets-1.1.0 lib/facet/enumerable/ew.rb
facets-1.2.0 lib/facets/core/enumerable/ew.rb
facets-1.2.1 lib/facets/core/enumerable/ew.rb