Class: Hash

Inherits:
Object show all
Defined in:
lib/lab42/core/open_object.rb,
lib/lab42/core/hash.rb

Overview

class OpenObject

Instance Method Summary collapse

Instance Method Details

#fetch!(key, *defaults, &defblk) ⇒ Object Also known as: fetch_or_set



4
5
6
7
8
9
10
# File 'lib/lab42/core/hash.rb', line 4

def fetch! key, *defaults, &defblk
  default_present = !(defaults.empty? && defblk.nil?)
  return fetch key unless default_present
  fetch key do
    self[ key ] = defblk ? defblk.() : defaults.first
  end
end

#only(*args) ⇒ Object



18
19
20
21
22
23
24
25
26
# File 'lib/lab42/core/hash.rb', line 18

def only *args
  args.inject Hash.new do | r, k |
    if has_key? k
      r.merge k => self[k]
    else
      r
    end
  end
end

#reject_values(*behavior, &beh) ⇒ Object



28
29
30
31
# File 'lib/lab42/core/hash.rb', line 28

def reject_values *behavior, &beh
  beh = Lab42::Meta::Behavior.behavior *behavior, &beh
  reject{ |_, v| beh.(v) }
end

#replace_rec(*keys, limit: nil, limits: nil, &valblock) ⇒ Object

Raises:

  • (ArgumentError)


13
14
15
16
# File 'lib/lab42/core/hash.rb', line 13

def replace_rec *keys, limit: nil, limits: nil, &valblock
  raise ArgumentError, "must not pass in limit: and limits: keyword parameters" if limit && limits
  return Lab42::Meta::Hash.hash_replace_rec self, keys, valblock, limit || limits
end

#select_values(*behavior, &beh) ⇒ Object



33
34
35
36
# File 'lib/lab42/core/hash.rb', line 33

def select_values *behavior, &beh
  beh = Lab42::Meta::Behavior.behavior *behavior, &beh
  select{ |_, v| beh.(v) }
end

#to_open_objectObject



57
58
59
# File 'lib/lab42/core/open_object.rb', line 57

def to_open_object
  OpenObject.new **self
end

#with_present(key, default: nil) ⇒ Object



38
39
40
41
42
43
44
# File 'lib/lab42/core/hash.rb', line 38

def with_present key, default: nil
  if has_key? key
    yield fetch(key), self
  else
    default
  end
end

#without(*keys) ⇒ Object



46
47
48
49
50
51
52
53
54
# File 'lib/lab42/core/hash.rb', line 46

def without *keys
  inject Hash.new do | r, (k,v) |
    if keys.include? k
      r
    else
      r.merge k => v
    end
  end
end