lib/kind/enum.rb in kind-5.7.0 vs lib/kind/enum.rb in kind-5.8.0

- old
+ new

@@ -9,53 +9,61 @@ require 'kind/enum/methods' extend self def values(input) - enum_module = ::Module.new + __create(input) + end - enum_items = - case input - when ::Hash then create_from_hash(input) - when ::Array then create_from_array(input) - else raise ArgumentError, 'use an array or hash to define a Kind::Enum' - end + def from_array(input, use_index_as_value:) + __create(input, use_index_as_value) + end - enum_items.each { |item| enum_module.const_set(item.name, item) } + private - enum_map = enum_items.each_with_object({}) do |item, memo| - memo[item.to_s] = item - memo[item.value] = item - memo[item.to_sym] = item - end + def __create(input, use_index_as_value = true) + enum_module = ::Module.new - enum_module.const_set(:ENUM__MAP, enum_map) - enum_module.const_set(:ENUM__HASH, enum_items.map(&:to_ary).to_h.freeze) - enum_module.const_set(:ENUM__KEYS, ::Set.new(enum_items.map(&:key)).freeze) - enum_module.const_set(:ENUM__VALS, ::Set.new(enum_items.map(&:value)).freeze) - enum_module.const_set(:ENUM__REFS, ::Set.new(enum_map.keys)) - enum_module.const_set(:ENUM__ITEMS, enum_items.freeze) + enum_items = + case input + when ::Hash then __create_from_hash(input) + when ::Array then __create_from_array(input, use_index_as_value) + else raise ArgumentError, 'use an array or hash to define a Kind::Enum' + end - enum_module.send(:private_constant, :ENUM__MAP, :ENUM__HASH, :ENUM__KEYS, - :ENUM__VALS, :ENUM__REFS, :ENUM__ITEMS) + enum_items.each { |item| enum_module.const_set(item.name, item) } - enum_module.module_eval(METHODS) + enum_map = enum_items.each_with_object({}) do |item, memo| + memo[item.to_s] = item + memo[item.value] = item + memo[item.to_sym] = item + end - enum_module.extend(enum_module) - enum_module - end + enum_module.const_set(:ENUM__MAP, enum_map) + enum_module.const_set(:ENUM__HASH, enum_items.map(&:to_ary).to_h.freeze) + enum_module.const_set(:ENUM__KEYS, ::Set.new(enum_items.map(&:key)).freeze) + enum_module.const_set(:ENUM__VALS, ::Set.new(enum_items.map(&:value)).freeze) + enum_module.const_set(:ENUM__REFS, ::Set.new(enum_map.keys)) + enum_module.const_set(:ENUM__ITEMS, enum_items.freeze) - private + enum_module.send(:private_constant, :ENUM__MAP, :ENUM__HASH, :ENUM__KEYS, + :ENUM__VALS, :ENUM__REFS, :ENUM__ITEMS) - def create_from_hash(input) - input.map { |key, value| build_item(key, value) } + enum_module.module_eval(METHODS) + + enum_module.extend(enum_module) + enum_module end - def create_from_array(input) - input.map.with_index { |key, index| build_item(key, index) } + def __create_from_hash(input) + input.map { |key, value| __item(key, value) } end - def build_item(key, value) + def __create_from_array(input, use_index_as_value) + input.map.with_index { |key, index| use_index_as_value ? __item(key, index) : __item(key, key) } + end + + def __item(key, value) return Item.new(key, value) if key.respond_to?(:to_sym) raise ArgumentError, 'use a string or symbol to define a Kind::Enum item' end end