Class: Gravitext::HTMap::UniMap
- Inherits:
-
Object
- Object
- Gravitext::HTMap::UniMap
- Defined in:
- lib/gravitext-util/unimap.rb
Overview
Extension to com.gravitext.htmap.UniMap providing convenience methods, including ruby accessors for keys registered in UniMap::KEY_SPACE, and for ruby Hash and JSON compatibility.
Class Method Summary collapse
-
.create_key(name, vtype = Java::java.lang.Object) ⇒ Object
Create a new key in UniMap::KEY_SPACE.
-
.deep_hash(m) ⇒ Object
Recursive UniMap#deep_hash implementation.
-
.define_accessors ⇒ Object
Define class constants and accessors for each key currently in the KEY_SPACE.
-
.key_to_symbol(key) ⇒ Object
Return cached symbol for the specified key (8bit optimized).
-
.str_to_key(str) ⇒ Object
Return Key for specified string name or symbol (8bit optimized) Must have define_accessors for the key first.
Instance Method Summary collapse
-
#deep_hash ⇒ Object
Like to_hash but converts all nested UniMaps to hashes as well.
-
#each(&block) ⇒ Object
Calls block with (Key, value) for each non-nil value.
-
#get(key) ⇒ Object
(also: #[])
Get key value or nil, where key may be a Key, String, or Symbol.
-
#get_k(key) ⇒ Object
Get Key value or nil.
-
#has_key?(key) ⇒ Boolean
(also: #include?, #key?, #member?)
Is this key set, not nil, where key may be a Key, String, or Symbol.
-
#inspect ⇒ Object
Inspect via deep_hash and Hash#inspect.
-
#is_a?(klass) ⇒ Boolean
Override: this is a Hash as well.
-
#kind_of?(klass) ⇒ Boolean
Override: this is a Hash as well.
-
#merge(other) ⇒ Object
Merge other (Hash or UniMap) and return new UniMap.
-
#merge!(other) ⇒ Object
Merge other (Hash or UniMap) values to self.
-
#remove(key) ⇒ Object
(also: #delete)
Remove the specified key, where key may be a Key, String, or Symbol.
-
#set(key, value) ⇒ Object
(also: #[]=)
Set key to value, where key may be a Key, String, or Symbol.
-
#set_k(key, value) ⇒ Object
Set key<Key> to value, returning prior value or nil.
-
#to_a ⇒ Object
Return self as array of [ key.to_sym, value ] arrays.
-
#to_hash ⇒ Object
Returns self as Hash, with symbols for keys.
-
#to_json(*args) ⇒ Object
To JSON, in form supported by JSON module.
Class Method Details
.create_key(name, vtype = Java::java.lang.Object) ⇒ Object
Create a new key in UniMap::KEY_SPACE. Useful for ruby-only keys or for keys passed as parameters to Java.
Parameters
- :name<~to_s>
-
New key name (lower_case by convention)
- :vtype<~java_class>
-
Java class value type (default: java.lang.Object)
Returns
com.gravitext.htmap.Key
41 42 43 |
# File 'lib/gravitext-util/unimap.rb', line 41 def create_key( name, vtype = Java::java.lang.Object ) KEY_SPACE.create_generic( name, vtype.java_class ) end |
.deep_hash(m) ⇒ Object
Recursive UniMap#deep_hash implementation
111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/gravitext-util/unimap.rb', line 111 def deep_hash( m ) case m when UniMap m.inject( {} ) do |o, (k, v)| o[ key_to_symbol( k ) ] = deep_hash( v ) o end when Array m.map { |v| deep_hash( v ) } else m end end |
.define_accessors ⇒ Object
Define class constants and accessors for each key currently in the KEY_SPACE.
To define accessors for keys defined in java, statically reference the containing class before calling this method. As Ruby’s define_method is not likely thread safe, invoke during initialization in advance of starting threaded execution. May be called multiple times.
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/gravitext-util/unimap.rb', line 53 def define_accessors klist = [] khash = {} KEY_SPACE.keys.each do |key| klist[ key.id ] = key.name.to_sym khash[ key.name ] = key khash[ key.name.to_sym ] = key const = key.name.upcase if const_defined?( const ) cval = const_get( const ) if cval != key fail "Constant #{key} already set to incompatible value #{cval}" end else const_set( const, key ) end getter = key.name.downcase unless method_defined?( getter ) class_eval <<-RUBY def #{getter} get_k( #{const} ) end RUBY end setter = getter + '=' unless method_defined?( setter ) class_eval <<-RUBY def #{setter}( value ) set_k( #{const}, value ) end RUBY end end @key_list = klist.freeze # key name symbols array indexed by key.id @key_hash = khash.freeze # Hash of symbols,strings to Key end |
.key_to_symbol(key) ⇒ Object
Return cached symbol for the specified key (8bit optimized). Must have define_accessors for the key first.
100 101 102 |
# File 'lib/gravitext-util/unimap.rb', line 100 def key_to_symbol( key ) @key_list.at( key.id ) end |
.str_to_key(str) ⇒ Object
Return Key for specified string name or symbol (8bit optimized) Must have define_accessors for the key first.
106 107 108 |
# File 'lib/gravitext-util/unimap.rb', line 106 def str_to_key( str ) @key_hash[ str ] end |
Instance Method Details
#deep_hash ⇒ Object
Like to_hash but converts all nested UniMaps to hashes as well.
200 201 202 |
# File 'lib/gravitext-util/unimap.rb', line 200 def deep_hash UniMap.deep_hash( self ) end |
#each(&block) ⇒ Object
Calls block with (Key, value) for each non-nil value
181 182 183 |
# File 'lib/gravitext-util/unimap.rb', line 181 def each( &block ) HTMapHelper.unimap_each( self, &block ) end |
#get(key) ⇒ Object Also known as: []
Get key value or nil, where key may be a Key, String, or Symbol
148 149 150 151 |
# File 'lib/gravitext-util/unimap.rb', line 148 def get( key ) key = UniMap.str_to_key( key ) unless key.is_a?( Key ) key && get_k( key ) end |
#get_k(key) ⇒ Object
Get Key value or nil
154 155 156 |
# File 'lib/gravitext-util/unimap.rb', line 154 def get_k( key ) HTMapHelper.get_map( self, key ) end |
#has_key?(key) ⇒ Boolean Also known as: include?, key?, member?
Is this key set, not nil, where key may be a Key, String, or Symbol.
171 172 173 174 |
# File 'lib/gravitext-util/unimap.rb', line 171 def has_key?( key ) key = UniMap.str_to_key( key ) unless key.is_a?( Key ) key && contains_key( key ) end |
#inspect ⇒ Object
Inspect via deep_hash and Hash#inspect
224 225 226 |
# File 'lib/gravitext-util/unimap.rb', line 224 def inspect deep_hash.inspect end |
#is_a?(klass) ⇒ Boolean
Override: this is a Hash as well.
240 241 242 |
# File 'lib/gravitext-util/unimap.rb', line 240 def is_a?( klass ) ( klass == Hash ) || super end |
#kind_of?(klass) ⇒ Boolean
Override: this is a Hash as well.
235 236 237 |
# File 'lib/gravitext-util/unimap.rb', line 235 def kind_of?( klass ) ( klass == Hash ) || super end |
#merge(other) ⇒ Object
Merge other (Hash or UniMap) and return new UniMap. Nil values in other Hash are ignored.
206 207 208 |
# File 'lib/gravitext-util/unimap.rb', line 206 def merge( other ) clone.merge!( other ) end |
#merge!(other) ⇒ Object
Merge other (Hash or UniMap) values to self. Nil values in other Hash are ignored.
212 213 214 215 216 217 218 219 220 221 |
# File 'lib/gravitext-util/unimap.rb', line 212 def merge!( other ) if other.is_a?( UniMap ) put_all( other ) else other.each do |k,v| set( k, v ) unless v.nil? end end self end |
#remove(key) ⇒ Object Also known as: delete
Remove the specified key, where key may be a Key, String, or Symbol. Returning old value or nil.
162 163 164 165 |
# File 'lib/gravitext-util/unimap.rb', line 162 def remove( key ) key = UniMap.str_to_key( key ) unless key.is_a?( Key ) key && HTMapHelper.remove_map( self, key ) end |
#set(key, value) ⇒ Object Also known as: []=
Set key to value, where key may be a Key, String, or Symbol. Returns prior value or nil.
129 130 131 132 133 134 135 136 137 138 |
# File 'lib/gravitext-util/unimap.rb', line 129 def set( key, value ) unless key.is_a?( Key ) k = UniMap.str_to_key( key ) unless k raise IndexError, "No Key named #{key.inspect} in UniMap.KEY_SPACE" end key = k end set_k( key, value ) end |
#set_k(key, value) ⇒ Object
Set key<Key> to value, returning prior value or nil.
141 142 143 |
# File 'lib/gravitext-util/unimap.rb', line 141 def set_k( key, value ) HTMapHelper.set_map( self, key, value ) end |
#to_a ⇒ Object
Return self as array of [ key.to_sym, value ] arrays
186 187 188 |
# File 'lib/gravitext-util/unimap.rb', line 186 def to_a map { |key,val| [ UniMap.key_to_symbol( key ), val ] } end |
#to_hash ⇒ Object
Returns self as Hash, with symbols for keys
191 192 193 194 195 196 197 |
# File 'lib/gravitext-util/unimap.rb', line 191 def to_hash h = {} each do |key,val| h[ UniMap.key_to_symbol( key ) ] = val end h end |
#to_json(*args) ⇒ Object
To JSON, in form supported by JSON module. Note that this only works if you also require ‘json’ yourself.
230 231 232 |
# File 'lib/gravitext-util/unimap.rb', line 230 def to_json(*args) to_hash.to_json(*args) end |