* transcode_data.h (rb_transcoder_stateful_type_t): defined.
[ruby-svn.git] / lib / yaml / dbm.rb
blob87d6009250d64091fccb58a08fad6be1084ca5a9
1 require 'yaml'
2 require 'dbm'
4 # YAML + DBM = YDBM
5 # - Same interface as DBM class
7 module YAML
9 class DBM < ::DBM
10     VERSION = "0.1"
11     def []( key )
12         fetch( key )
13     end
14     def []=( key, val )
15         store( key, val )
16     end
17     def fetch( keystr, ifnone = nil )
18         begin
19             val = super( keystr )
20             return YAML::load( val ) if String === val
21         rescue IndexError
22         end
23         if block_given?
24             yield keystr
25         else
26             ifnone
27         end
28     end
29     def index( keystr )
30         super( keystr.to_yaml )
31     end
32     def values_at( *keys )
33         keys.collect { |k| fetch( k ) }
34     end
35     def delete( key )
36         v = super( key )
37         if String === v
38             v = YAML::load( v ) 
39         end
40         v
41     end
42     def delete_if
43         del_keys = keys.dup
44         del_keys.delete_if { |k| yield( k, fetch( k ) ) == false }
45         del_keys.each { |k| delete( k ) } 
46         self
47     end
48     def reject
49         hsh = self.to_hash
50         hsh.reject { |k,v| yield k, v }
51     end
52     def each_pair
53         keys.each { |k| yield k, fetch( k ) }
54         self
55     end
56     def each_value
57         super { |v| yield YAML::load( v ) }
58         self
59     end
60     def values
61         super.collect { |v| YAML::load( v ) }
62     end
63     def has_value?( val )
64         each_value { |v| return true if v == val }
65         return false
66     end
67     def invert
68         h = {}
69         keys.each { |k| h[ self.fetch( k ) ] = k }
70         h
71     end
72     def replace( hsh )
73         clear
74         update( hsh )
75     end
76     def shift
77         a = super
78         a[1] = YAML::load( a[1] ) if a
79         a
80     end
81     def select( *keys )
82         if block_given?
83             self.keys.collect { |k| v = self[k]; [k, v] if yield k, v }.compact
84         else
85             values_at( *keys )
86         end
87     end
88     def store( key, val )
89         super( key, val.to_yaml )
90         val
91     end
92     def update( hsh )
93         hsh.keys.each do |k|
94             self.store( k, hsh.fetch( k ) )
95         end
96         self
97     end
98     def to_a
99         a = []
100         keys.each { |k| a.push [ k, self.fetch( k ) ] }
101         a
102     end
103     def to_hash
104         h = {}
105         keys.each { |k| h[ k ] = self.fetch( k ) }
106         h
107     end
108     alias :each :each_pair