def uniq(&block)
      array = self.to_a
      if block_given?
        if array.frozen?
          return self.class.new(array.uniq(&block).freeze)
        elsif array.uniq!(&block) # returns nil if no changes were made
          return self.class.new(array.freeze)
        else
          return self
        end
      elsif array.frozen?
        return self.class.new(array.uniq.freeze)
      elsif array.uniq! # returns nil if no changes were made
        return self.class.new(array.freeze)
      else
        return self
      end
    end
def uniq(&block)
      array = self.to_a
      if block_given?
        if array.frozen?
          return self.class.new(array.uniq(&block).freeze)
        elsif array.uniq!(&block) # returns nil if no changes were made
          return self.class.new(array.freeze)
        else
          return self
        end
      elsif array.frozen?
        return self.class.new(array.uniq.freeze)
      elsif array.uniq! # returns nil if no changes were made
        return self.class.new(array.freeze)
      else
        return self
      end
    end
Return a new `Tuple` with no duplicate elements, as determined by `#hash` and
 `#eql?`. For each group of equivalent elements, only the first will be retained.

 @example
   Erlang::Tuple["A", "B", "C", "B"].uniq      # => Erlang::Tuple["A", "B", "C"]
   Erlang::Tuple["a", "A", "b"].uniq(&:upcase) # => Erlang::Tuple["a", "b"]

 @return [Tuple]