Guest User

Untitled

a guest
Jul 22nd, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.43 KB | None | 0 0
  1. h = {:abc => 123, :xyz => 789, :qaz => 789, :wsx => [888, 999]}
  2. h.fetch(:xyz) # => 789
  3. h.rfetch(123) # => abc
  4. h.rfetch(789) # => [:xyz, :qaz]
  5. h.rfetch(888) # => :wsx
  6.  
  7. class BiHash
  8. def initialize
  9. @forward = Hash.new { |h, k| h[k] = [ ] }
  10. @reverse = Hash.new { |h, k| h[k] = [ ] }
  11. end
  12.  
  13. def insert(k, v)
  14. @forward[k].push(v)
  15. @reverse[v].push(k)
  16. v
  17. end
  18.  
  19. def fetch(k)
  20. fetch_from(@forward, k)
  21. end
  22.  
  23. def rfetch(v)
  24. fetch_from(@reverse, v)
  25. end
  26.  
  27. protected
  28.  
  29. def fetch_from(h, k)
  30. return nil if(!h.has_key?(k))
  31. v = h[k]
  32. v.length == 1 ? v.first : v.dup
  33. end
  34. end
  35.  
  36. b = BiHash.new
  37. b.insert(:a, 'a')
  38. b.insert(:a, 'b')
  39. b.insert(:a, 'c')
  40. b.insert(:b, 'a')
  41. b.insert(:c, 'x')
  42.  
  43. puts b.fetch(:a).inspect # ["a", "b", "c"]
  44. puts b.fetch(:b).inspect # "a"
  45. puts b.rfetch('a').inspect # [:a, :b]
  46. puts b.rfetch('x').inspect # :c
  47. puts b.fetch(:not_there).inspect # nil
  48. puts b.rfetch('not there').inspect # nil
  49.  
  50. h = {:abc => 123, :xyz => 789, :qaz => 789, :wsx => [888, 999]}
  51. h.rassoc(123) # => [:abc, 123]
  52.  
  53. h = MyBidirectionalArray.new(:foo => 42, :bar => [:hello, :world])
  54. h.rfetch(:world) # => :bar
  55. h[:bar].shift
  56. h[:bar] # => [:world]
  57. h.rfetch(:world) # => should be nil, but how to detect this??
  58.  
  59. class Hash
  60. def rfetch val
  61. select { |k,v| v.is_a?(Array) ? v.include?(val) : v == val }.map { |x| x[0] }
  62. end
  63. end
Add Comment
Please, Sign In to add comment