Module: Datacaster::Utils
Instance Method Summary collapse
- #deep_freeze(value, copy: true) ⇒ Object
- #deep_merge(first, second) ⇒ Object
- #merge_errors(left, right) ⇒ Object
- #pickable?(value) ⇒ Boolean
Instance Method Details
#deep_freeze(value, copy: true) ⇒ Object
12 13 14 |
# File 'lib/datacaster/utils.rb', line 12 def deep_freeze(value, copy: true) Ractor.make_shareable(value, copy:) end |
#deep_merge(first, second) ⇒ Object
7 8 9 10 |
# File 'lib/datacaster/utils.rb', line 7 def deep_merge(first, second) merger = proc { |_, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : Array === v1 && Array === v2 ? v1 | v2 : [:undefined, nil, :nil].include?(v2) ? v1 : v2 } first.merge(second.to_h, &merger) end |
#merge_errors(left, right) ⇒ Object
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 |
# File 'lib/datacaster/utils.rb', line 16 def merge_errors(left, right) add_error_to_base = ->(hash, error) { hash[:base] ||= [] hash[:base] = merge_errors(hash[:base], error) hash } return [] if left.nil? && right.nil? return right if left.nil? return left if right.nil? result = case [left.class, right.class] when [Array, Array] left | right when [Array, Hash] add_error_to_base.(right, left) when [Hash, Hash] (left.keys | right.keys).map do |k| [k, merge_errors(left[k], right[k])] end.to_h when [Hash, Array] add_error_to_base.(left, right) else raise ArgumentError.new("Expected failures to be Arrays or Hashes, left: #{left.inspect}, right: #{right.inspect}") end result end |
#pickable?(value) ⇒ Boolean
45 46 47 48 49 |
# File 'lib/datacaster/utils.rb', line 45 def pickable?(value) is_literal = ->(v) { [String, Symbol, Integer].any? { |c| v.is_a?(c) } } is_literal.(value) || value.is_a?(Array) && !value.empty? && value.all? { |v| is_literal.(v) } end |