forked from discourse/discourse
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathenum.rb
46 lines (40 loc) · 1.11 KB
/
enum.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
class Enum < Hash
# Public: Initialize an enum.
#
# members - the array of enum members. May contain a hash of options:
# :start - the number of first enum member. Defaults to 1.
#
# Examples
#
# FRUITS = Enum.new(:apple, :orange, :kiwi)
def initialize(*members)
super({})
options = members.extract_options!
start = options.fetch(:start) { 1 }
update Hash[members.zip(start..members.count + start)]
end
# Public: Access the number/value of member.
#
# ids_or_value - number or value of member.
#
# Returns value if number was provided, and number if value was provided.
def [](id_or_value)
fetch(id_or_value) { key(id_or_value) }
end
# Public: Check if supplied member is valid.
def valid?(member)
has_key?(member)
end
# Public: Create a subset of enum, only include specified keys.
def only(*keys)
dup.tap do |d|
d.keep_if { |k| keys.include?(k) }
end
end
# Public: Create a subset of enum, preserve all items but specified ones.
def except(*keys)
dup.tap do |d|
d.delete_if { |k| keys.include?(k) }
end
end
end