Sha256: 3db8368d653c600ab36453e8f048de59323723f5ea953029c7c09ea21df1867f
Contents?: true
Size: 1.65 KB
Versions: 4
Compression:
Stored size: 1.65 KB
Contents
class Hash class Normalized < Hash def self.subclass(&block) Class.new(self) do define_method :initialize do |hash={}| super hash, &block end end end def initialize(hash={}, &block) @normalization_block = block update hash end def [](key) super normalize_key(key) end def []=(key, value) super normalize_key(key), normalize_value(value) end alias_method :store, :[]= def delete(key) super normalize_key(key) end def update(hash, &block) hash.each do |key, value| new_val = block && key?(key) ? block.call(key, self[key], value) : value store key, new_val end self end alias_method :merge!, :update def merge(hash, &block) dup.update hash, &block end def key?(key) super normalize_key(key) end alias_method :include?, :key? alias_method :has_key?, :key? alias_method :member?, :key? def fetch(key, *args, &block) super normalize_key(key), *args, &block end def to_h each_with_object({}) do |(key, value), hash| hash[key] = value_to_h value end end private def normalize_key(key) @normalization_block.call key end def normalize_value(value) if value.kind_of? Hash self.class.new value elsif value.kind_of? Array value.map { |v| normalize_value v } else value end end def value_to_h(value) if value.kind_of? Hash value.to_h elsif value.kind_of? Array value.map { |v| value_to_h v } else value end end end end
Version data entries
4 entries across 4 versions & 1 rubygems
Version | Path |
---|---|
hash_ext-0.4.0 | lib/hash_ext/normalized.rb |
hash_ext-0.3.1 | lib/hash_ext/normalized.rb |
hash_ext-0.3.0 | lib/hash_ext/normalized.rb |
hash_ext-0.2.3 | lib/hash_ext/normalized.rb |