Sha256: cd6ec00f376dcb93617f495bd36d2f31a53efbc3f942d7e09d4e4b47d6c744e3

Contents?: true

Size: 1.83 KB

Versions: 5

Compression:

Stored size: 1.83 KB

Contents

# frozen_string_literal: true

module Dry
  module Types
    # PrimitiveInferrer returns the list of classes matching a type.
    #
    # @api public
    class PrimitiveInferrer
      extend Core::Cache

      # Compiler reduces type AST into a list of primitives
      #
      # @api private
      class Compiler
        # @api private
        def visit(node)
          meth, rest = node
          public_send(:"visit_#{meth}", rest)
        end

        # @api private
        def visit_nominal(node)
          type, _ = node
          type
        end

        # @api private
        def visit_hash(_)
          ::Hash
        end
        alias_method :visit_schema, :visit_hash

        # @api private
        def visit_array(_)
          ::Array
        end

        # @api private
        def visit_lax(node)
          visit(node)
        end

        # @api private
        def visit_constructor(node)
          other, * = node
          visit(other)
        end

        # @api private
        def visit_enum(node)
          other, * = node
          visit(other)
        end

        # @api private
        def visit_sum(node)
          left, right = node

          [visit(left), visit(right)].flatten(1)
        end

        # @api private
        def visit_constrained(node)
          other, * = node
          visit(other)
        end

        # @api private
        def visit_any(_)
          ::Object
        end
      end

      # @return [Compiler]
      # @api private
      attr_reader :compiler

      # @api private
      def initialize
        @compiler = Compiler.new
      end

      # Infer primitives from the provided type
      #
      # @return [Array[Class]]
      #
      # @api private
      def [](type)
        self.class.fetch_or_store(type) do
          Array(compiler.visit(type.to_ast)).freeze
        end
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
dry-types-1.7.2 lib/dry/types/primitive_inferrer.rb
dry-types-1.7.1 lib/dry/types/primitive_inferrer.rb
dry-types-1.7.0 lib/dry/types/primitive_inferrer.rb
dry-types-1.6.1 lib/dry/types/primitive_inferrer.rb
dry-types-1.6.0 lib/dry/types/primitive_inferrer.rb