class Dry::Types::Map

def coerce(input)

def coerce(input)
  return failure(
    input, "#{input.inspect} must be an instance of #{primitive}"
  ) unless primitive?(input)
  output, failures = {}, []
  input.each do |k,v|
    res_k = options[:key_type].try(k)
    res_v = options[:value_type].try(v)
    if res_k.failure?
      failures << "input key #{k.inspect} is invalid: #{res_k.error}"
    elsif output.key?(res_k.input)
      failures << "duplicate coerced hash key #{res_k.input.inspect}"
    elsif res_v.failure?
      failures << "input value #{v.inspect} for key #{k.inspect} is invalid: #{res_v.error}"
    else
      output[res_k.input] = res_v.input
    end
  end
  return success(output) if failures.empty?
  failure(input, failures)
end