File: variables.rb

package info (click to toggle)
ruby-declarative 0.0.10-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 256 kB
  • sloc: ruby: 595; makefile: 6
file content (38 lines) | stat: -rw-r--r-- 1,119 bytes parent folder | download | duplicates (2)
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