"Aredridel" <aredridel@nbtsc.org> wrote in message
Would a single method, traverse_component be sufficient to build an
implementation on, do you think? Pass it a path component, and have the
object return whatever makes sense? (for a hash or array, map it to ;
for Objects in general, map it to send?)
Perhaps have a second method, traverse_filter, that receives an array of
filters, for XPath-style qualifications like [@attr = 'foo'], or
[/childobject]?
My thoughts ... suppose query was based on 2 kinds of procs, traversers and
filters. Simplest traversers would just do x.send :foo (abbreviated
[:foo]?), simplest filters might just check an attribute value (abbreviated
{:foo=>bar}?).
class Q
attr_accessor :traverser, :filter
# traverser: obj->obj
# filter. obj->bool
We can build paths by composing queries.
def (traverser, filter)
# shortcuts for symbols, hashes, etc.
Q.new self, traverser, filter
end
def initialize prefix, traverser, filter
end
end
This will let us navigate from an object, and filter an object in or out.
Then perhaps a query-oriented collection.
class QColl
def eval (query) #-> QColl
# transitive traverse, filter
# return new QColl
end
def self.wrap(array)
# wrap new QColl around array
end
And if we want sugar: collection.foo{|f| f.bar<10}
instead of arr.collect{|x|x.foo}.select{|f| f.bar < 10}
def method_missing sym, *args, &filter
self.eval Q.new nil, proc{|x| x.send sym, *args}, filter
end
end
Thoughts?