Make Walkman:: use ID3 instead of a custom hash.
[amarok_sonynw.git] / walkgirl / invert_hash.rb
blob13beb3932871b4ac656634fdd0395fc0935b64b2
1 # ==============================================================================
2 # EXTENDING CLASS HASH
3 # ==============================================================================
5 # (C) Copyright 2004 by Tilo Sloboda <tools@unixgods.org>
7 # updated:  Time-stamp: <Sat 18-Dec-2004 12:44:13 Tilo Sloboda>
9 # License:
10 #         Freely available under the terms of the OpenSource "Artistic License"
11 #         in combination with the Addendum A (below)
13 #         In case you did not get a copy of the license along with the software,
14 #         it is also available at:   http://www.unixgods.org/~tilo/artistic-license.html
16 # Addendum A:
17 #         THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU!
18 #         SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
19 #         REPAIR OR CORRECTION.
21 #         IN NO EVENT WILL THE COPYRIGHT HOLDERS  BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL,
22 #         SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY
23 #         TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
24 #         INACCURATE OR USELESS OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM
25 #         TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF THE COPYRIGHT HOLDERS OR OTHER PARTY HAS BEEN
26 #         ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
28 # ==============================================================================
30 # Homepage:  http://www.unixgods.org/~tilo/Ruby/invert_hash.html
33 # Ruby's Hash.invert method leaves a lot to wish for..  it can't handle the  
34 # common case that two or more hash entries point to the same value..
36 # e.g.:
37 #   h =  {"ooh gott"=>3, "bla"=>3, "aua"=>3, "kotz"=>2, "blubb"=>9, "seier"=>3, "schigga"=>9}
38 #   h.invert
39 #   => {2=>"kotz", 3=>"seier", 9=>"schigga"}
41 #   the above result IS SIMPLY WRONG!
43 #   h.invert.invert
44 #   => {"kotz"=>2, "seier"=>3, "schigga"=>9}
46 #   h.invert.invert == h
47 #   => false
49 #   Let's conclude that Ruby's built-in Hash.invert method is REALLY BROKEN!
51 #  
52 #   OK, let's try this new inverse method:
54 #   require 'invert_hash'
56 #   h.inverse
57 #   => {2=>"kotz", 3=>["seier", "aua", "bla", "ooh gott"], 9=>["schigga", "blubb"]}
59 #   h.inverse.inverse
60 #   => {"ooh gott"=>3, "bla"=>3, "aua"=>3, "kotz"=>2, "blubb"=>9, "seier"=>3, "schigga"=>9}
62 #   h.inverse.inverse == h
63 #   => true
65 #   Looks much better, doesn't it?
69 class Hash
71     def inverse
72       i = Hash.new
73       self.each_pair{ |k,v|
74           if (v.class == Array)
75               v.each{ |x|
76                 if i.has_key?(x)
77                    i[x] = [k,i[x]].flatten
78                 else
79                    i[x] = k
80                 end
81               }
82           else
83                 if i.has_key?(v)
84                    i[v] = [k,i[v]].flatten
85                 else
86                    i[v] = k
87                 end
88           end
89       }
90       return i
91     end
92     
93 end
95 __END__
97 # if you want to permanently overload Ruby's original invert method, you may want to do this:
99 class Hash
100     alias old_invert invert
101     
102     def invert
103        self.inverse
104     end