class Dry::Types::Intersection

Intersection type

@api public

Public Class Methods

operator() click to toggle source
# File lib/dry/types/intersection.rb, line 15
def self.operator
  :&
end

Public Instance Methods

call_safe(input, &block) click to toggle source

@param [Object] input

@return [Object]

@api private

# File lib/dry/types/intersection.rb, line 33
def call_safe(input, &block)
  try_sides(input, &block).input
end
call_unsafe(input) click to toggle source

@param [Object] input

@return [Object]

@api private

# File lib/dry/types/intersection.rb, line 24
def call_unsafe(input)
  merge_results(left.call_unsafe(input), right.call_unsafe(input))
end
primitive?(value) click to toggle source

@param [Object] value

@return [Boolean]

@api private

# File lib/dry/types/intersection.rb, line 55
def primitive?(value)
  left.primitive?(value) && right.primitive?(value)
end
try(input) { |failure| ... } click to toggle source

@param [Object] input

@api public

# File lib/dry/types/intersection.rb, line 40
def try(input)
  try_sides(input) do |failure|
    if block_given?
      yield(failure)
    else
      failure
    end
  end
end

Private Instance Methods

merge_results(left_result, right_result) click to toggle source

@api private

# File lib/dry/types/intersection.rb, line 94
def merge_results(left_result, right_result)
  case left_result
  when ::Array
    left_result
      .zip(right_result)
      .map { |lhs, rhs| merge_results(lhs, rhs) }
  when ::Hash
    left_result.merge(right_result)
  else
    left_result
  end
end
try_side(side, input) { |f| ... } click to toggle source

@api private

# File lib/dry/types/intersection.rb, line 76
def try_side(side, input)
  failure = nil

  result = side.try(input) do |f|
    failure = f
    yield(f)
  end

  if result.is_a?(Result)
    result
  elsif failure
    Result::Failure.new(result, failure)
  else
    Result::Success.new(result)
  end
end
try_sides(input, &block) click to toggle source

@api private

# File lib/dry/types/intersection.rb, line 62
def try_sides(input, &block)
  results = []

  [left, right].each do |side|
    result = try_side(side, input, &block)
    return result if result.failure?

    results << result
  end

  Result::Success.new(merge_results(*results.map(&:input)))
end