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
|
module Declarative
# Implements the pattern of maintaining a hash of key/values (usually "defaults")
# that are mutated several times by user and library code (override defaults).
#
# The Variables instance then represents the configuration data to be processed by the
# using library (e.g. Representable or Trailblazer).
class Variables
class Proc < ::Proc
end
# @return Hash hash where `overrides` is merged onto `defaults` respecting Merge, Append etc.
def self.merge(defaults, overrides)
defaults = defaults.merge({}) # todo: use our DeepDup. # TODO: or how could we provide immutability?
overrides.each do |k, v|
if v.is_a?(Variables::Proc)
defaults[k] = v.( defaults[k] )
else
defaults[k] = v
end
end
defaults
end
def self.Merge(merged_hash)
Variables::Proc.new do |original|
(original || {}).merge( merged_hash )
end
end
def self.Append(appended_array)
Variables::Proc.new do |original|
(original || []) + appended_array
end
end
end # Variables
end
|