Sha256: 9818de02c849120ab1c9f0084fdffb9ac1964c668e5d6b1b7665785f028b4ff0

Contents?: true

Size: 1 KB

Versions: 5

Compression:

Stored size: 1 KB

Contents

# frozen_string_literal: true

module Refinements
  # Provides additional enhancements to the Struct primitive.
  module Structs
    refine Struct.singleton_class do
      def keyworded? = inspect.include?("keyword_init: true")

      def with_keywords(**arguments) = keyworded? ? new(**arguments) : new.merge!(**arguments)

      def with_positions(*values) = keyworded? ? new(**members.zip(values).to_h) : new(*values)
    end

    refine Struct do
      def merge(**attributes) = dup.merge!(**attributes)

      def merge! **attributes
        to_h.merge(**attributes).each { |key, value| self[key] = value }
        self
      end

      def revalue attributes = each_pair
        return self unless block_given?

        dup.tap { |copy| attributes.each { |key, value| copy[key] = yield self[key], value } }
      end

      def revalue! attributes = each_pair
        return self unless block_given?

        attributes.each { |key, value| self[key] = yield self[key], value }
        self
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
refinements-8.5.2 lib/refinements/structs.rb
refinements-8.5.1 lib/refinements/structs.rb
refinements-8.5.0 lib/refinements/structs.rb
refinements-8.4.1 lib/refinements/structs.rb
refinements-8.3.0 lib/refinements/structs.rb