class Dry::Types::Sum

Sum type

@api public

Attributes

left[R]

@return [Type]

right[R]

@return [Type]

Public Class Methods

new(left, right, **options) click to toggle source

@param [Type] left @param [Type] right @param [Hash] options

@api private

Calls superclass method Dry::Types::Meta::new
# File lib/dry/types/sum.rb, line 44
def initialize(left, right, **options)
  super
  @left, @right = left, right
  freeze
end

Public Instance Methods

call_safe(input, &block) click to toggle source

@param [Object] input

@return [Object]

@api private

# File lib/dry/types/sum.rb, line 92
def call_safe(input, &block)
  left.call_safe(input) { right.call_safe(input, &block) }
end
call_unsafe(input) click to toggle source

@param [Object] input

@return [Object]

@api private

# File lib/dry/types/sum.rb, line 83
def call_unsafe(input)
  left.call_safe(input) { right.call_unsafe(input) }
end
constrained(options) click to toggle source

@param [Hash] options

@return [Constrained,Sum]

@see Builder#constrained

@api public

Calls superclass method Dry::Types::Builder#constrained
# File lib/dry/types/sum.rb, line 170
def constrained(options)
  if optional?
    right.constrained(options).optional
  else
    super
  end
end
constrained?() click to toggle source

@return [false]

@api public

# File lib/dry/types/sum.rb, line 67
def constrained?
  false
end
default?() click to toggle source

@return [false]

@api public

# File lib/dry/types/sum.rb, line 60
def default?
  false
end
failure(input, _error = nil) click to toggle source

@api private

# File lib/dry/types/sum.rb, line 123
def failure(input, _error = nil)
  if !left.valid?(input)
    left.failure(input, left.try(input).error)
  else
    right.failure(input, right.try(input).error)
  end
end
meta(data = Undefined) click to toggle source

Manage metadata to the type. If the type is an optional, meta delegates to the right branch

@see [Meta#meta]

@api public

Calls superclass method Dry::Types::Meta#meta
# File lib/dry/types/sum.rb, line 146
def meta(data = Undefined)
  if Undefined.equal?(data)
    optional? ? right.meta : super
  elsif optional?
    self.class.new(left, right.meta(data), **options)
  else
    super
  end
end
name() click to toggle source

@return [String]

@api public

# File lib/dry/types/sum.rb, line 53
def name
  [left, right].map(&:name).join(" | ")
end
optional?() click to toggle source

@return [Boolean]

@api public

# File lib/dry/types/sum.rb, line 74
def optional?
  primitive?(nil)
end
primitive?(value) click to toggle source

@param [Object] value

@return [Boolean]

@api private

# File lib/dry/types/sum.rb, line 136
def primitive?(value)
  left.primitive?(value) || right.primitive?(value)
end
success(input) click to toggle source

@api private

# File lib/dry/types/sum.rb, line 112
def success(input)
  if left.valid?(input)
    left.success(input)
  elsif right.valid?(input)
    right.success(input)
  else
    raise ArgumentError, "Invalid success value '#{input}' for #{inspect}"
  end
end
to_ast(meta: true) click to toggle source

@see Nominal#to_ast

@api public

# File lib/dry/types/sum.rb, line 159
def to_ast(meta: true)
  [:sum, [left.to_ast(meta: meta), right.to_ast(meta: meta), meta ? self.meta : EMPTY_HASH]]
end
to_proc() click to toggle source

Wrap the type with a proc

@return [Proc]

@api public

# File lib/dry/types/sum.rb, line 183
def to_proc
  proc { |value| self.(value) }
end
try(input) { |failure| ... } click to toggle source

@param [Object] input

@api public

# File lib/dry/types/sum.rb, line 99
def try(input)
  left.try(input) do
    right.try(input) do |failure|
      if block_given?
        yield(failure)
      else
        failure
      end
    end
  end
end