class Hash

Public Class Methods

map(obj, &block) click to toggle source

map any Enumerable into a Hash, like Hash[obj.map … ]

# File lib/theusual/hash.rb, line 6
def map(obj, &block)
  Hash[
    obj.map do |*args|
      block.call *args
    end.compact
  ]
end

Public Instance Methods

-(other) click to toggle source

set like operator

# File lib/theusual/hash.rb, line 145
def -(other)
  raise TypeError unless other.class <= Hash
  select {|k,v| !other.has_key? k}
end
compact(modifier = nil) click to toggle source
# File lib/theusual/hash.rb, line 56
def compact(modifier = nil)
  falsy = modifier == :falsy
  blanks = falsy || modifier == :blanks

  reject do |k, v|
    isblank = blanks && v.respond_to?(:empty?) && v.empty?
    isfalsy = falsy && (v == 0)

    !v || isblank || isfalsy
  end
end
compact!(modifier = nil) click to toggle source
# File lib/theusual/hash.rb, line 68
def compact!(modifier = nil)
  replace compact(modifier)
end
except(*keys) click to toggle source
# File lib/theusual/hash.rb, line 31
def except(*keys)
  clone.except! *keys
end
except!(*keys) click to toggle source
# File lib/theusual/hash.rb, line 35
def except!(*keys)
  keys.each { |key| delete(key) }
  self
end
hmap(&block) click to toggle source

map the block's results back to a hash

# File lib/theusual/hash.rb, line 74
def hmap(&block)
  Hash[ map {|k, v| block.call(k, v) }.compact ]
end
hmap!(&block) click to toggle source
# File lib/theusual/hash.rb, line 78
def hmap!(&block)
  replace hmap &block
end
kmap(&block) click to toggle source

map keys, but preserve associated values ie. apidock.com/rails/v4.2.7/Hash/transform_keys

# File lib/theusual/hash.rb, line 85
def kmap(&block)
  Hash[map do |k, v|
    [ block.arity == 1 ? block.call(k) : block.call(k, v), v ]
  end]
end
kmap!(&block) click to toggle source
# File lib/theusual/hash.rb, line 91
def kmap!(&block)
  replace kmap &block
end
ksort(&block) click to toggle source

sort by key values, for pretty printing

# File lib/theusual/hash.rb, line 110
def ksort(&block)
  Hash[
    sort_by do |k, v|
      if block
        yield k
      else
        k
      end
    end
  ]
end
ksort!(&block) click to toggle source
# File lib/theusual/hash.rb, line 122
def ksort!(&block)
  replace ksort &block
end
select_keys(*keys) click to toggle source
# File lib/theusual/hash.rb, line 41
def select_keys(*keys)
  if keys.length == 1 and keys.first.class < Enumerable
    keys = keys.first
  end

  Hash.map keys do |k|
    [ k, self[k] ]
  end
end
select_keys!(*keys) click to toggle source
# File lib/theusual/hash.rb, line 51
def select_keys!(*keys)
  replace select_keys *keys
end
symbolize_keys() click to toggle source
# File lib/theusual/hash.rb, line 151
def symbolize_keys
  clone.symbolize_keys!
end
symbolize_keys!() click to toggle source
# File lib/theusual/hash.rb, line 155
def symbolize_keys!
  kmap! { |key| key.to_sym rescue key }
end
update(*hashes) click to toggle source

expand update() to accept multiple arguments eg. {}.update({a: 1}, {b: 2})

# File lib/theusual/hash.rb, line 19
def update(*hashes)
  clone.update! *hashes
end
update!(*hashes) click to toggle source
# File lib/theusual/hash.rb, line 23
def update!(*hashes)
  hashes.each do |h|
    h.each {|k,v| self[k] = v}
  end
  self
end
vmap(&block) click to toggle source

map values, but preserve associated keys ie. apidock.com/rails/v4.2.7/Hash/transform_values

# File lib/theusual/hash.rb, line 98
def vmap(&block)
  clone.vmap! &block
end
vmap!(&block) click to toggle source
# File lib/theusual/hash.rb, line 102
def vmap!(&block)
  each do |k, v|
    self[k] = block.arity == 1 ? block.call(v) : block.call(k, v)
  end
end
vsort(&block) click to toggle source
# File lib/theusual/hash.rb, line 127
def vsort(&block)
  Hash[
    sort_by do |k, v|
      if block
        yield v
      else
        v
      end
    end
  ]
end
vsort!(&block) click to toggle source
# File lib/theusual/hash.rb, line 139
def vsort!(&block)
  replace vsort &block
end

Private Instance Methods

replace(hash) click to toggle source

replace contents of hash with new stuff

# File lib/theusual/hash.rb, line 163
def replace(hash)
  clear
  merge! hash
end