Module: Datacaster::Utils

Extended by:
Utils
Included in:
Utils
Defined in:
lib/datacaster/utils.rb

Instance Method Summary collapse

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

Returns:

  • (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