Sha256: 0efaa7bef667a5eb241aa97327ac9e13e02cc55586e7dfab3aed63fb5ed6a3bc

Contents?: true

Size: 640 Bytes

Versions: 3

Compression:

Stored size: 640 Bytes

Contents

require 'kleisli'

module Dry
  module Data
    class SumType
      attr_reader :left

      attr_reader :right

      def initialize(left, right)
        @left, @right = left, right
      end

      def name
        [left, right].map(&:name).join(' | ')
      end

      def call(input)
        begin
          value = left[input]

          if left.valid?(value)
            value
          else
            right[value]
          end
        rescue TypeError
          right[input]
        end
      end
      alias_method :[], :call

      def valid?(input)
        left.valid?(input) || right.valid?(input)
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
dry-data-0.4.2 lib/dry/data/sum_type.rb
dry-data-0.4.1 lib/dry/data/sum_type.rb
dry-data-0.4.0 lib/dry/data/sum_type.rb