Sha256: ff7db5e6c2b4496ca6267af0f5f1eef9873fd507fd4942e092598d826949cdbe

Contents?: true

Size: 1.12 KB

Versions: 3

Compression:

Stored size: 1.12 KB

Contents

# frozen_string_literal: true

module Dry
  module Types
    # @api private
    class Printer
      # @api private
      class Composition
        def initialize(printer, composition_class)
          @printer = printer
          @composition_class = composition_class
          freeze
        end

        def visit(composition)
          visit_constructors(composition) do |constructors|
            @printer.visit_options(composition.options, composition.meta) do |opts|
              yield "#{@composition_class.composition_name}<#{constructors}#{opts}>"
            end
          end
        end

        private

        def visit_constructors(composition)
          visit_constructor(composition.left) do |left|
            visit_constructor(composition.right) do |right|
              yield "#{left} #{@composition_class.operator} #{right}"
            end
          end
        end

        def visit_constructor(type, &block)
          case type
          when @composition_class
            visit_constructors(type, &block)
          else
            @printer.visit(type, &block)
          end
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
dry-types-1.7.2 lib/dry/types/printer/composition.rb
dry-types-1.7.1 lib/dry/types/printer/composition.rb
dry-types-1.7.0 lib/dry/types/printer/composition.rb