Interesting problem. Aside from seeing a doctor, my suggestions are in
the comments in the revised variant below:
---
require 'set'
# encapsulate
class DB
# use hash's default syntax
def initialize
@c = Hash.new{ | hash, key | hash[key] = Set.new }
end
# was: add, use << to follow ruby idiom for array, set
# store val with hash for quicker comparison
def <<(hash)
hash.each do |key,val|
@c[key] << [ val, hash ]
end
end
# need a delete operation ...
def delete(hash)
@c.delete(hash)
end
# was: match_all, use select to follow ruby enumerable idiom
# determine candidates on the fly, avoid intersection code using Set
def select(template)
good = Set.new; bad = Set.new
template.each do |key,val1|
(@c[key]).each do |val2,hash|
( val1 === val2 ? good : bad ) << hash unless bad.include?
hash
end
end
return good.to_a
end
# was: match_first, use select to follow ruby enumerable idiom
# determine candidates on the fly, avoid intersection code using Set
def find(template)
good = Set.new; bad = Set.new
template.each do |key,val1|
(@c[key]).each do |val2,hash|
( val1 === val2 ? good : bad ) << hash unless bad.include?
hash
end
return good.to_a.first unless good.empty?
end
return nil
end
end
---
HTH!
Dan Yoder
http://dev.zeraweb.com/
On Dec 18, 9:45 am, Christophe Mckeon <chromatoph... / gmail.com> wrote:
> > You are crazy. Please contact a doctor ASAP. Oh, sorry. :-)
>
> :)
>
>
>
> > I think you are on a pretty good way. Here's what I would do
> > differently:
>
> > ...
>
> thanks robert. yeah i'd like to do some caching, but as hashes are
> constantly
> added and removed from the collection, i'll have to weigh up the
> overhead of managing a cache, maybe even implement it and do some
> profiling w/ and w/o. guess i'll have to read up on cache algs.
>
> regards,
> _c
>
> --
> Posted viahttp://www.ruby-forum.com/.