Class: Fast::Find

Inherits:
Object
  • Object
show all
Defined in:
lib/fast.rb

Overview

Find is the top level class that respond to #match?(node) interface. It matches recurively and check deeply depends of the token type.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(token) ⇒ Find

Returns a new instance of Find.



394
395
396
# File 'lib/fast.rb', line 394

def initialize(token)
  self.token = token
end

Instance Attribute Details

#tokenObject

Returns the value of attribute token.



393
394
395
# File 'lib/fast.rb', line 393

def token
  @token
end

Instance Method Details

#==(other) ⇒ Object



441
442
443
444
445
# File 'lib/fast.rb', line 441

def ==(other)
  return false if other.nil? || !other.respond_to?(:token)

  token == other.token
end

#compare_symbol_or_head(node, expression) ⇒ Object



416
417
418
419
420
421
422
423
424
425
# File 'lib/fast.rb', line 416

def compare_symbol_or_head(node, expression)
  case node
  when Parser::AST::Node
    node.type == expression.to_sym
  when String
    node == expression.to_s
  else
    node == expression
  end
end

#debug(node, expression, match) ⇒ Object



433
434
435
# File 'lib/fast.rb', line 433

def debug(node, expression, match)
  puts "#{expression} == #{node} # => #{match}"
end

#debug_match_recursive(node, expression) ⇒ Object



427
428
429
430
431
# File 'lib/fast.rb', line 427

def debug_match_recursive(node, expression)
  match = original_match_recursive(node, expression)
  debug(node, expression, match)
  match
end

#match?(node) ⇒ Boolean

Returns:

  • (Boolean)


398
399
400
# File 'lib/fast.rb', line 398

def match?(node)
  match_recursive(node, valuate(token))
end

#match_recursive(node, expression) ⇒ Object



402
403
404
405
406
407
408
409
410
411
412
413
414
# File 'lib/fast.rb', line 402

def match_recursive(node, expression)
  case expression
  when Proc then expression.call(node)
  when Find then expression.match?(node)
  when Symbol then compare_symbol_or_head(node, expression)
  when Enumerable
    expression.each_with_index.all? do |exp, i|
      match_recursive(i.zero? ? node : node.children[i - 1], exp)
    end
  else
    node == expression
  end
end

#to_sObject



437
438
439
# File 'lib/fast.rb', line 437

def to_s
  "f[#{[*token].join(', ')}]"
end