MMCT TEAM
Server IP : 111.118.215.189  /  Your IP : 3.144.235.139
Web Server : Apache
System : Linux md-in-83.webhostbox.net 4.19.286-203.ELK.el7.x86_64 #1 SMP Wed Jun 14 04:33:55 CDT 2023 x86_64
User : a1673wkz ( 2475)
PHP Version : 8.2.25
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON
Directory (0755) :  /usr/share/ruby/vendor_ruby/puppet/vendor/rgen/lib/rgen/

[  Home  ][  C0mmand  ][  Upload File  ]

Current File : //usr/share/ruby/vendor_ruby/puppet/vendor/rgen/lib/rgen/array_extensions.rb
# RGen Framework
# (c) Martin Thiede, 2006

require 'rgen/metamodel_builder'

class Array

  def >>(method)
    compact.inject([]) { |r,e| r | ( (o=e.send(method)).is_a?(Array) ? o : [o] ) }
  end
  
  def method_missing(m, *args)

    # This extensions has the side effect that it allows to call any method on any
    # empty array with an empty array as the result. This behavior is required for
    # navigating models.
    #
    # This is a problem for Hash[] called with an (empty) array of tupels.
    # It will call to_hash expecting a Hash as the result. When it gets an array instead,
    # it fails with an exception. Make sure it gets a NoMethodException as without this
    # extension and it will catch that and return an empty hash as expected.
    #
    # Similar problems exist for other Ruby built-in methods which are expected to fail.
    #
    return super unless (size == 0 && 
      m != :to_hash && m != :to_str) ||
      compact.any?{|e| e.is_a? RGen::MetamodelBuilder::MMBase}
    # use an array to build the result to achiev similar ordering
    result = []
    inResult = {}
    compact.each do |e|
      if e.is_a? RGen::MetamodelBuilder::MMBase        
        ((o=e.send(m)).is_a?(Array) ? o : [o] ).each do |v|
          next if inResult[v.object_id]
          inResult[v.object_id] = true
          result << v
        end
      else
        raise StandardError.new("Trying to call a method on an array element not a RGen MMBase")
      end
    end
    result.compact
  end

end

MMCT - 2023