lib/sxp/list.rb in sxp-0.0.3 vs lib/sxp/list.rb in sxp-0.0.4

- old
+ new

@@ -1,64 +1,108 @@ require 'sxp/pair' module SXP + ## + # A singly-linked list. class List < Pair include Enumerable + ## + # @param [Array] elements + # @return [Object] def self.[](*elements) self.new(elements) end + ## + # @param [Array] elements + # @yield [list] + # @yieldparam [List] list def initialize(elements = [], &block) @pair = nil unshift(*elements) unless elements.empty? block.call(self) if block_given? end + ## + # @return [String] def inspect "(" << map { |value| value.inspect }.join(' ') << ")" end - def head() first end - def tail() rest end + ## + # @return [Object] + def head + first + end + ## + # @return [Object] + def tail + rest + end + + ## + # @return [Object] def rest empty? ? false : @pair.tail end - # Array interface - + ## + # @param [Object] other + # @return [Object] def &(other) self.class.new(self.to_a & other.to_a) end + ## + # @param [Object] other + # @return [Object] def |(other) self.class.new(self.to_a | other.to_a) end + ## + # @param [Object] times + # @return [Object] def *(times) result = (self.to_a * times) result.is_a?(Array) ? self.class.new(result) : result end + ## + # @param [Object] other + # @return [Object] def +(other) self.class.new(self.to_a + other.to_a) end + ## + # @param [Object] other + # @return [Object] def -(other) self.class.new(self.to_a - other.to_a) end + ## + # @param [Object] object + # @return [Object] def <<(object) push(object) self end + ## + # @param [Object] other + # @return [Object] def <=>(other) to_a <=> other.to_a end + ## + # @param [Object] other + # @return [Object] def ==(other) case other when List self.length == other.length && to_a == other.to_a when other.respond_to?(:to_list) @@ -66,98 +110,146 @@ else false end end + ## + # @param [Array] args + # @return [Object] def [](*args) result = to_a[*args] result.is_a?(Array) ? self.class.new(result) : result # FIXME end + ## + # @param [Array] args + # @return [Object] def []=(*args) raise NotImplementedError # TODO end + ## + # @param [Object] object + # @return [Object] def assoc(object) raise NotImplementedError # TODO end + ## + # @param [Integer] index + # @return [Object] def at(index) to_a.at(index) end + ## + # @return [Object] def clear @pair = nil self end + ## + # @return [Object] def collect!(&block) raise NotImplementedError # TODO end + ## + # @return [Object] def compact self.class.new(to_a.compact) end + ## + # @return [Object] def compact! raise NotImplementedError # TODO end + ## + # @param [Object] other + # @return [Object] def concat(other) raise NotImplementedError # TODO end + ## + # @param [Object] object + # @return [Object] def delete(object, &block) raise NotImplementedError # TODO end + ## + # @param [Integer] index + # @return [Object] def delete_at(index) raise NotImplementedError # TODO end + ## + # @return [Object] def delete_if(&block) raise NotImplementedError # TODO end + ## + # @return [Enumerator] def each(&block) pair = @pair while pair != nil block.call(pair.head) pair = pair.tail end self end + ## + # @return [Enumerator] def each_index(&block) index = 0 each do block.call(index) index += 1 end - self end + ## + # @return [Boolean] def empty? @pair.nil? end + ## + # @param [Object] other + # @return [Boolean] def eql?(other) case other when self then true when List self.length == other.length && to_a.eql?(other.to_a) end end + ## + # @param [Array] args + # @return [Object] def fetch(*args, &block) to_a.fetch(*args, &block) end + ## + # @param [Array] args + # @return [Object] def fill(*args, &block) raise NotImplementedError # TODO end + ## + # @param [Integer] count + # @return [Object] def first(count = nil) case when count.nil? @pair.head unless empty? when count == 1 @@ -165,75 +257,117 @@ when count > 1 empty? ? [] : to_a.first(count) end end + ## + # @return [Object] def flatten raise NotImplementedError # TODO end + ## + # @return [Object] def flatten! raise NotImplementedError # TODO end + ## + # @param [Object] object + # @return [Object] def include?(object) to_a.include?(object) end + ## + # @param [Object] object + # @return [Object] def index(object) to_a.index(object) end + ## + # @param [Integer] index + # @param [Array] objects + # @return [Object] def insert(index, *objects) raise NotImplementedError # TODO end + ## + # @param [String] separator + # @return [Object] def join(separator = $,) to_a.join(separator) end + ## + # @param [Integer] count + # @return [Object] def last(count = nil) case when count.nil? to_a.last else to_a.last(count) end end + ## + # @return [Integer] def length @length ||= to_a.length end + ## + # @return [Object] def map!(&block) collect!(&block) end + ## + # @return [Integer] def nitems to_a.nitems end + ## + # @param [Object] template + # @return [Object] def pack(template) to_a.pack(template) end + ## + # @return [Object] def pop raise NotImplementedError # TODO end + ## + # @param [Array] objects + # @return [Object] def push(*objects) raise NotImplementedError # TODO end + ## + # @param [Object] key + # @return [Object] def rassoc(key) raise NotImplementedError # TODO end + ## + # @return [Object] def reject!(&block) raise NotImplementedError # TODO end + ## + # @param [Object] other_list + # @return [Object] def replace(other_list) case other_list when Pair @pair = other_list when List @@ -245,83 +379,124 @@ # TODO end self end + ## + # @return [Object] def reverse self.class.new(to_a.reverse) end + ## + # @return [Object] def reverse! raise NotImplementedError # TODO end + ## + # @return [Object] def reverse_each(&block) to_a.reverse_each(&block) self end + ## + # @param [Object] object + # @return [Object] def rindex(object) to_a.rindex(object) end + ## + # @return [Object] def shift raise NotImplementedError # TODO end + ## + # @return [Integer] def size length end + ## + # @param [Array] args + # @return [Object] def slice(*args) self[*args] end + ## + # @param [Array] args + # @return [Object] def slice!(*args) raise NotImplementedError # TODO end + ## + # @return [Object] def sort(&block) (array = to_a).sort!(&block) self.class.new(array) end + ## + # @return [Object] def sort! raise NotImplementedError # TODO end + ## + # @return [List] def to_list self end + ## + # @return [Pair] def to_pair @pair end + ## + # @return [String] def to_s join end + ## + # @return [Object] def transpose self.class.new(to_a.transpose) end + ## + # @return [Object] def uniq self.class.new(to_a.uniq) end + ## + # @return [Object] def uniq! raise NotImplementedError # TODO end + ## + # @param [Array] objects + # @return [Object] def unshift(*objects) objects.reverse_each do |object| @pair = Pair.new(object, @pair) end self end + ## + # @param [Array] selector + # @return [Object] def values_at(*selector) self.class.new(to_a.values_at(*selector)) end - end -end + end # class List +end # module SXP