Sha256: 36b5dced2b6b4bbc2c59a1fce7d46b3f8828302570b8001ec7da6dabb0afee89

Contents?: true

Size: 1.17 KB

Versions: 4

Compression:

Stored size: 1.17 KB

Contents

# frozen_string_literal: true

module Marameters
  module Signatures
    # Blends ancestor and descendant method parameters together while allowing default overrides.
    class Inheritor
      def initialize key_length: 1, kinds: KINDS
        @key_length = key_length
        @kinds = kinds
        freeze
      end

      def call ancestor, descendant
        merge(ancestor, descendant).values.sort_by! { |(kind, *)| kinds.index kind }
      end

      private

      attr_reader :key_length, :kinds

      def merge ancestor, descendant
        ancestor.to_a.union(descendant.to_a).each.with_object({}) do |parameter, all|
          key = parameter[..key_length]
          kind = key.first

          case kind
            when :req, :opt then all[key] = parameter if descendant.positionals_and_maybe_keywords?
            when :nokey then all
            when :keyreq, :key
              different = ancestor.keywords? && ancestor.keywords.sort != descendant.keywords.sort
              all[:keyrest] = [:keyrest] if different
              all[key] = parameter if descendant.include? parameter
            else all[kind] = parameter
          end
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
marameters-4.2.0 lib/marameters/signatures/inheritor.rb
marameters-4.1.0 lib/marameters/signatures/inheritor.rb
marameters-4.0.1 lib/marameters/signatures/inheritor.rb
marameters-4.0.0 lib/marameters/signatures/inheritor.rb