Class: Atomy::Pattern::QuasiQuote::MatchWalker

Inherits:
Object
  • Object
show all
Defined in:
lib/atomy/pattern/quasi_quote.rb

Instance Method Summary collapse

Instance Method Details

#go(a, b) ⇒ Object



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# 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) ⇒ Object



134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# 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