-
Notifications
You must be signed in to change notification settings - Fork 85
/
Copy pathenv.rb
161 lines (136 loc) · 2.84 KB
/
env.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
class << ENV
def to_hash
{}.tap { |h| self.each { |k, v| h[k] = v } }
end
def empty?
self.size == 0
end
def replace(hash)
hash = Topaz.convert_type(hash, Hash, :to_hash)
self.clear
hash.each { |k, v| self[k] = v }
self
end
def update(hash, &block)
hash = Topaz.convert_type(hash, Hash, :to_hash)
hash.each do |k, v|
if block && self[k]
self[k] = yield(k, self[k], v)
else
self[k] = v
end
end
self
end
def clear
self.each_key { |k| self[k] = nil }
end
def values
self.map { |_, v| v }
end
def keys
self.map { |k, _| k }
end
def value?(value)
self.each_value { |v| return true if v == value }
false
end
alias has_value? value?
def key(value)
self.each { |k, v| return k if v == value }
nil
end
alias index key
def each_value(&block)
return enum_for(:each_value) unless block
self.each { |_, v| yield(v) }
end
def each_key(&block)
return enum_for(:each_key) unless block
self.each { |k, _| yield(k) }
end
def assoc(key)
key = Topaz.convert_type(key, String, :to_str)
self.each { |k, v| return [k, v] if key == k }
nil
end
def rassoc(value)
value = Topaz.convert_type(value, String, :to_str)
self.each { |k, v| return [k, v] if value == v }
nil
end
def select!(&block)
return enum_for(:select!) unless block
modified = false
self.each do |key, value|
unless yield(key, value)
delete(key)
modified = true
end
end
modified ? self : nil
end
def keep_if(&block)
return enum_for(:keep_if) unless block
select!(&block)
self
end
def reject!(&block)
return enum_for(:reject!) unless block
modified = false
self.each do |key, value|
if yield(key, value)
delete(key)
modified = true
end
end
modified ? self : nil
end
def delete_if(&block)
return enum_for(:delete_if) unless block
reject!(&block)
self
end
def fetch(key, *args, &block)
val = self[key]
return val if val
return yield(key) if block
return args[0] if args.size == 1
raise KeyError.new("key not found")
end
def to_s
'ENV'
end
def inspect
to_hash.inspect
end
def shift
self.each do |k, v|
delete(k)
return [k, v]
end
nil
end
def values_at(*keys)
keys.map { |k| self[k] }
end
def invert
{}.tap { |h| self.each { |k, v| h[v] = k } }
end
def select(&block)
return enum_for(:select) unless block
to_hash.keep_if(&block)
end
def reject(&block)
return enum_for(:reject) unless block
to_hash.delete_if(&block)
end
def delete(key, &block)
key = Topaz.convert_type(key, String, :to_str)
if val = self[key]
self[key] = nil
return val
end
block ? yield(key) : nil
end
end