Sha256: 57075a431d6b12dce5ee963bd34031fa8da4bf677e36c0f101dd6990fbbf242d

Contents?: true

Size: 1.01 KB

Versions: 1

Compression:

Stored size: 1.01 KB

Contents

# frozen_string_literal: true

module Refinements
  module Structs
    refine Struct.singleton_class do
      def keyworded?
        inspect.include? "keyword_init: true"
      end

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

      def with_positions *values
        keyworded? ? new(Hash[members.zip values]) : new(*values)
      end
    end

    refine Struct do
      def merge **attributes
        dup.merge! attributes
      end

      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 do |copy|
          attributes.each { |key, value| copy[key] = yield self[key], value }
        end
      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

1 entries across 1 versions & 1 rubygems

Version Path
refinements-7.18.0 lib/refinements/structs.rb