Sha256: f223932ec01b7cbb3bd6ad0a624a522f2dd715f306bb3c7551b848e0272613a9

Contents?: true

Size: 1.03 KB

Versions: 6

Compression:

Stored size: 1.03 KB

Contents

# frozen_string_literal: true

module Refinements
  # Provides additional enhancements to the Struct primitive.
  module Structs
    refine Struct.singleton_class do
      def with_positions(*values) = keyword_init? ? new(**members.zip(values).to_h) : new(*values)
    end

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

      def merge! object = nil
        to_h.merge!(**object.to_h).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

      def transmute(...) = dup.transmute!(...)

      def transmute! object, **key_map
        mapping = key_map.invert
        merge! object.to_h.slice(*mapping.keys).transform_keys!(mapping)
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
refinements-11.0.1 lib/refinements/structs.rb
refinements-11.0.0 lib/refinements/structs.rb
refinements-10.1.1 lib/refinements/structs.rb
refinements-10.1.0 lib/refinements/structs.rb
refinements-10.0.1 lib/refinements/structs.rb
refinements-10.0.0 lib/refinements/structs.rb