class Vector2
  attr_accessor :x, :y
	
  def initialize( *args )
    if args.size == 0
      @x = 0
      @y = 0
    elsif args.size == 1
      copyFrom( args[0] )
    elsif args.size == 2
      Vector2.valid? args[0], args[1]
      
      @x = args[0]
      @y = args[1]
    else
      raise ArgumentError.new( "invalid argument list" )
    end
    
    @dataType = x.class
  end
  
  def copyFrom( source )
    unless source.is_a?( Array ) || source.is_a?( Vector2 )
      raise ArgumentError.new( "expected Array or Vector2" )
    end
    Vector2.valid? source[0], source[1]
    
    @x = source[0]
    @y = source[1]
  end
  
  def -@
    Vector2.new( -x, -y )
  end
  
  def +( right )
    Vector2.new( x + right.x, y + right.y )
  end
  
  def -( right )
    Vector2.new( x - right.x, y - right.y )
  end
  
  def *( right )
    Vector2.new( x * right.x, y * right.y )
  end
  
  def /( right )
    Vector2.new( x / right.x, y / right.y )
  end
  
  def ==( right )
    x == right.x && y == right.y
  end
  
  def []( index )
    if index == 0 || index == :x
      return x
    elsif index == 1 || index == :y
      return y
    end
    
    raise ArgumentError.new( "Expected index to be either 0..1 or :x and :y" )
  end
  
  def self.valid?( x, y )
    if x.class != y.class
      raise RuntimeError.new( "x and y must be of same type" )
    end
    
    if x.is_a?( Numeric ) == false
      raise RuntimeError.new( "x and y must be numeric!" )
    end
    
    true
  end
end