Polylithic linked list structure used to implement several data structures in Rake.
Cons a new head onto the tail list.
# File rake-13.0.1/lib/rake/linked_list.rb, line 73
def self.cons(head, tail)
new(head, tail)
end
The standard empty list class for the given LinkedList class.
# File rake-13.0.1/lib/rake/linked_list.rb, line 78
def self.empty
self::EMPTY
end
Make a list out of the given arguments. This method is polymorphic
# File rake-13.0.1/lib/rake/linked_list.rb, line 59
def self.make(*args)
# return an EmptyLinkedList if there are no arguments
return empty if !args || args.empty?
# build a LinkedList by starting at the tail and iterating
# through each argument
# inject takes an EmptyLinkedList to start
args.reverse.inject(empty) do |list, item|
list = cons(item, list)
list # return the newly created list for each item in the block
end
end
Lists are structurally equivalent.
# File rake-13.0.1/lib/rake/linked_list.rb, line 25
def ==(other)
current = self
while !current.empty? && !other.empty?
return false if current.head != other.head
current = current.tail
other = other.tail
end
current.empty? && other.empty?
end
Polymorphically add a new element to the head of a list. The type of head node will be the same list type as the tail.
# File rake-13.0.1/lib/rake/linked_list.rb, line 12
def conj(item)
self.class.cons(item, self)
end
For each item in the list.
# File rake-13.0.1/lib/rake/linked_list.rb, line 48
def each
current = self
while !current.empty?
yield(current.head)
current = current.tail
end
self
end
Is the list empty? .make guards against a list being empty making any instantiated LinkedList object not empty by default You should consider overriding this method if you implement your own .make method
# File rake-13.0.1/lib/rake/linked_list.rb, line 20
def empty?
false
end