lib/saxon/xdm/array.rb
require_relative '../s9api'
require_relative 'sequence_like'
module Saxon
module XDM
# Represents an XDM Array
class Array
# Create a new {XDM::Array} from a Ruby Array. The contents of the array
# will be converted to {XDM::Value}s using {XDM.Value()}. An existing
# {S9API::XdmArray} will simply be wrapped and returned.
#
# @return [XDM::Array] the new XDM Array
def self.create(array)
case array
when S9API::XdmArray
new(array)
else
new(S9API::XdmArray.new(array.map { |item|
XDM.Value(item).to_java
}))
end
end
include SequenceLike
include ItemSequenceLike
include Enumerable
attr_reader :s9_xdm_array
private :s9_xdm_array
# @api private
def initialize(s9_xdm_array)
@s9_xdm_array = s9_xdm_array
end
# Iterate over the Array, yielding each element.
# @yieldparam value [XDM::Value] the current value from the Array
def each(&block)
cached_array.each(&block)
end
# Fetch element at index +i+ in the array.
# @param i [Integer] the index of the element to retrieve.
def [](i)
cached_array[i]
end
# @return [Integer] the length of the array
def length
s9_xdm_array.arrayLength
end
alias_method :size, :length
# compares two {XDM::AtomicValue}s using the underlying Saxon and XDM
# comparision rules
#
# @param other [Saxon::XDM::AtomicValue]
# @return [Boolean]
def ==(other)
return false unless other.is_a?(XDM::Array)
return false if length != other.length
cached_array == other.to_a
end
# Return a (frozen) Ruby {::Array} containing all the elements of the {XDM::Array}
def to_a
cached_array
end
alias_method :eql?, :==
# Compute a hash-code for this {Array}.
#
# Two {XDM::Array}s with the same content will have the same hash code (and will compare using eql?).
# @see Object#hash
def hash
@hash ||= cached_array.hash
end
# @return the underlying Java XdmArray
def to_java
s9_xdm_array
end
private
def cached_array
@cached_array ||= s9_xdm_array.asList.map { |s9_xdm_value| XDM.Value(s9_xdm_value) }.freeze
end
end
end
end