Class: SleepingKingStudios::Tools::ArrayTools
- Defined in:
- lib/sleeping_king_studios/tools/array_tools.rb
Overview
Tools for working with array-like enumerable objects.
Constant Summary collapse
- ARRAY_METHODS =
Expected methods that an Array-like object should implement.
%i[[] count each].freeze
- OTHER_METHODS =
Methods that an Array-like object should not implement.
%i[each_key each_pair].freeze
Instance Method Summary collapse
-
#array?(obj) ⇒ Boolean
Returns true if the object is or appears to be an Array.
-
#bisect(ary) {|item| ... } ⇒ Array<Array<Object>>
deprecated
Deprecated.
v1.3.0 Use Enumerable#partition instead.
-
#count_values(ary) ⇒ Object
(also: #tally)
deprecated
Deprecated.
v1.3.0 Use Enumerable#tally instead.
-
#deep_dup(ary) ⇒ Array
Creates a deep copy of the array and its contents.
-
#deep_freeze(ary) ⇒ Array
Freezes the array and performs a deep freeze on each array item.
- #fetch(ary, index, default = UNDEFINED, &block) ⇒ Object
-
#humanize_list(ary, **options, &) ⇒ String
Generates a human-readable string representation of the list items.
-
#immutable?(ary) ⇒ Boolean
Checks if the array and its contents are immutable.
-
#mutable?(ary) ⇒ Boolean
Checks if the array or any of its contents are mutable.
-
#splice(ary, start, delete_count, *insert) ⇒ Array<Object>
deprecated
Deprecated.
v1.3.0 Use Array#[]= with a range instead.
Methods inherited from Base
#initialize, instance, #toolbelt
Constructor Details
This class inherits a constructor from SleepingKingStudios::Tools::Base
Instance Method Details
#array?(obj) ⇒ Boolean
Returns true if the object is or appears to be an Array.
This method checks for the method signatures of the object. An Array-like method will define all of the the #[], #count, and #each methods, and neither of the #each_key or #each_pair methods.
48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/sleeping_king_studios/tools/array_tools.rb', line 48 def array?(obj) return true if obj.is_a?(Array) ARRAY_METHODS.each do |method_name| return false unless obj.respond_to?(method_name) end OTHER_METHODS.each do |method_name| return false if obj.respond_to?(method_name) end true end |
#bisect(ary) {|item| ... } ⇒ Array<Array<Object>>
v1.3.0 Use Enumerable#partition instead.
Partitions the array into matching and non-matching items.
Separates the array into two arrays, the first containing all items in the original array that matches the provided block, and the second containing all items in the original array that do not match the provided block.
88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/sleeping_king_studios/tools/array_tools.rb', line 88 def bisect(ary, &) toolbelt.core_tools.deprecate( "#{self.class.name}#bisect", message: 'Use Enumerable#partition instead.' ) require_array!(ary) raise ArgumentError, 'no block given' unless block_given? ary.each.partition(&) end |
#count_values(ary) ⇒ Hash{Object=>Integer} #count_values(ary) {|item| ... } ⇒ Hash{Object=>Integer} Also known as: tally
v1.3.0 Use Enumerable#tally instead.
Counts the number of times each item or result appears in the object.
136 137 138 139 140 141 142 143 144 145 |
# File 'lib/sleeping_king_studios/tools/array_tools.rb', line 136 def count_values(ary, &) toolbelt.core_tools.deprecate( "#{self.class.name}#count_values", message: 'Use Enumerable#tally instead.' ) require_array!(ary) (block_given? ? ary.map(&) : ary.to_a).tally end |
#deep_dup(ary) ⇒ Array
Creates a deep copy of the array and its contents.
Iterates over the array and returns a new Array with deep copies of each array item.
175 176 177 178 179 |
# File 'lib/sleeping_king_studios/tools/array_tools.rb', line 175 def deep_dup(ary) require_array!(ary) ary.map { |obj| toolbelt.object_tools.deep_dup obj } end |
#deep_freeze(ary) ⇒ Array
Freezes the array and performs a deep freeze on each array item.
199 200 201 202 203 204 205 |
# File 'lib/sleeping_king_studios/tools/array_tools.rb', line 199 def deep_freeze(ary) require_array!(ary) ary.freeze ary.each { |obj| toolbelt.object_tools.deep_freeze obj } end |
#fetch(ary, index, default = nil) ⇒ Object #fetch(ary, index) {|index| ... } ⇒ Object
243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 |
# File 'lib/sleeping_king_studios/tools/array_tools.rb', line 243 def fetch(ary, index, default = UNDEFINED, &block) require_array!(ary) if ary.respond_to?(:fetch) return native_fetch(ary, index, default, &block) end size = ary.respond_to?(:size) ? ary.size : ary.count return ary[index] if index < size && index >= -size return block.call(index) if block_given? return default unless default == UNDEFINED raise IndexError, "index #{index} outside of array bounds: -#{size}...#{size}" end |
#humanize_list(ary, **options, &) ⇒ String
307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 |
# File 'lib/sleeping_king_studios/tools/array_tools.rb', line 307 def humanize_list(ary, **, &) require_array!(ary) return '' if ary.empty? size = ary.size ary = ary.map(&) if block_given? return ary[0].to_s if size == 1 separator, last_separator = (size:, **) return "#{ary[0]}#{last_separator}#{ary[1]}" if size == 2 "#{ary[0...-1].join(separator)}#{last_separator}#{ary.last}" end |
#immutable?(ary) ⇒ Boolean
Checks if the array and its contents are immutable.
An array is considered immutable if the array itself is frozen and each item in the array is immutable.
355 356 357 358 359 360 361 362 363 364 365 |
# File 'lib/sleeping_king_studios/tools/array_tools.rb', line 355 def immutable?(ary) require_array!(ary) return false unless ary.frozen? ary.each do |item| return false unless toolbelt.object_tools.immutable?(item) end true end |
#mutable?(ary) ⇒ Boolean
Checks if the array or any of its contents are mutable.
377 378 379 |
# File 'lib/sleeping_king_studios/tools/array_tools.rb', line 377 def mutable?(ary) !immutable?(ary) end |
#splice(ary, start, delete_count, *insert) ⇒ Array<Object>
v1.3.0 Use Array#[]= with a range instead.
Replaces a range of items in the array with the given items.
416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 |
# File 'lib/sleeping_king_studios/tools/array_tools.rb', line 416 def splice(ary, start, delete_count, *insert) toolbelt.core_tools.deprecate( "#{self.class.name}#splice", message: 'Use Array#[]= with a range instead.' ) require_array!(ary) start += ary.count if start.negative? range = start...(start + delete_count) deleted = ary[range] ary[range] = insert deleted end |