класс SyntaxSuggest::PriorityEngulfQueue
Отслеживает элементы в очереди по приоритету и гарантирует, что при поглощении/перекрытии/удалении одного элемента другим, больший элемент вытесняет меньший.
Публичные методы класса
# File lib/syntax_suggest/priority_engulf_queue.rb, line 9 def initialize @queue = PriorityQueue.new end
Публичные методы экземпляра
# File lib/syntax_suggest/priority_engulf_queue.rb, line 17 def empty? @queue.empty? end
# File lib/syntax_suggest/priority_engulf_queue.rb, line 21 def length @queue.length end
# File lib/syntax_suggest/priority_engulf_queue.rb, line 25 def peek @queue.peek end
# File lib/syntax_suggest/priority_engulf_queue.rb, line 29 def pop @queue.pop end
# File lib/syntax_suggest/priority_engulf_queue.rb, line 33 def push(block) prune_engulf(block) @queue << block flush_deleted self end
# File lib/syntax_suggest/priority_engulf_queue.rb, line 13 def to_a @queue.to_a end
Приватные методы экземпляра
# File lib/syntax_suggest/priority_engulf_queue.rb, line 41
def flush_deleted
while @queue&.peek&.deleted?
@queue.pop
end
end # File lib/syntax_suggest/priority_engulf_queue.rb, line 47
def prune_engulf(block)
# If we're about to pop off the same block, we can skip deleting
# things from the frontier this iteration since we'll get it
# on the next iteration
return if @queue.peek && (block <=> @queue.peek) == 1
if block.starts_at != block.ends_at # A block of size 1 cannot engulf another
@queue.to_a.each { |b|
if b.starts_at >= block.starts_at && b.ends_at <= block.ends_at
b.delete
true
end
}
end
end
Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.