class Atomy::Pattern::QuasiQuote::MatchWalker

Public Instance Methods

go(a, b) click to toggle source
# File lib/atomy/pattern/quasi_quote.rb, line 110
def go(a, b)
  if a.is_a?(Atomy::Pattern)
    a.matches?(b)
  elsif b.is_a?(a.class)
    a.each_attribute do |attr, val|
      return false unless val == b.send(attr)
    end

    a.each_child do |attr, val|
      theirval = b.send(attr)

      if val.is_a?(Array) # TODO test that theirval is an array too
        return false unless go_array(val, theirval)
      else
        return false unless go(val, b.send(attr))
      end
    end

    true
  else
    false
  end
end
go_array(as, bs) click to toggle source
# File lib/atomy/pattern/quasi_quote.rb, line 134
def go_array(as, bs)
  splat = nil
  req_size = 0
  as.each do |a|
    if a.is_a?(Atomy::Pattern::Splat)
      splat = a
      break
    end

    req_size += 1
  end

  if splat
    return false unless bs.size >= req_size
  else
    return false unless bs.size == req_size
  end

  req_size.times do |i|
    return false unless go(as[i], bs[i])
  end

  if splat
    return false unless splat.matches?(bs[req_size..-1])
  end

  true
end