Module: ActiveObject::Array
- Defined in:
- lib/active_object/array.rb
Instance Method Summary collapse
- #after(value) ⇒ Object
- #before(value) ⇒ Object
- #delete_first ⇒ Object
- #delete_first! ⇒ Object
- #delete_last ⇒ Object
- #delete_last! ⇒ Object
- #delete_values(*args) ⇒ Object
- #denillify(value = 0) ⇒ Object
- #denillify!(value = 0) ⇒ Object
- #dig(key, *rest) ⇒ Object
- #duplicates(minimum = 2) ⇒ Object
- #from(position) ⇒ Object
- #fulfill(value, number) ⇒ Object
- #groups(number) ⇒ Object
-
#in_groups(number, fill_with = nil) ⇒ Object
rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/AbcSize.
-
#in_groups_of(number, fill_with = nil) ⇒ Object
rubocop:disable Metrics/MethodLength, Metrics/AbcSize.
-
#merge(*values) ⇒ Object
rubocop:enable Metrics/MethodLength, Metrics/AbcSize.
- #nillify ⇒ Object
- #nillify! ⇒ Object
- #probability ⇒ Object
- #reject_values(*args) ⇒ Object
- #sample! ⇒ Object
-
#split(number = nil) ⇒ Object
rubocop:disable Metrics/MethodLength, Metrics/AbcSize.
-
#strip ⇒ Object
rubocop:enable Metrics/MethodLength, Metrics/AbcSize.
- #strip! ⇒ Object
- #to(position) ⇒ Object
-
#to_sentence(options = {}) ⇒ Object
rubocop:disable Metrics/MethodLength.
Instance Method Details
#after(value) ⇒ Object
6 7 8 9 10 |
# File 'lib/active_object/array.rb', line 6 def after(value) return unless include?(value) self[(index(value).to_i + 1) % length] end |
#before(value) ⇒ Object
12 13 14 15 16 |
# File 'lib/active_object/array.rb', line 12 def before(value) return unless include?(value) self[(index(value).to_i - 1) % length] end |
#delete_first ⇒ Object
18 19 20 |
# File 'lib/active_object/array.rb', line 18 def delete_first self[1..-1] end |
#delete_first! ⇒ Object
22 23 24 |
# File 'lib/active_object/array.rb', line 22 def delete_first! replace(delete_first) end |
#delete_last ⇒ Object
26 27 28 |
# File 'lib/active_object/array.rb', line 26 def delete_last self[0...-1] end |
#delete_last! ⇒ Object
30 31 32 |
# File 'lib/active_object/array.rb', line 30 def delete_last! replace(delete_last) end |
#delete_values(*args) ⇒ Object
34 35 36 37 38 |
# File 'lib/active_object/array.rb', line 34 def delete_values(*args) result = [] args.each { |val| result << delete(val) } result end |
#denillify(value = 0) ⇒ Object
40 41 42 |
# File 'lib/active_object/array.rb', line 40 def denillify(value = 0) map { |val| val.nil? ? value : val } end |
#denillify!(value = 0) ⇒ Object
44 45 46 |
# File 'lib/active_object/array.rb', line 44 def denillify!(value = 0) replace(denillify(value)) end |
#dig(key, *rest) ⇒ Object
48 49 50 51 52 53 54 |
# File 'lib/active_object/array.rb', line 48 def dig(key, *rest) value = (self[key] rescue nil) return if value.nil? return value if rest.empty? return value.dig(*rest) if value.respond_to?(:dig) end |
#duplicates(minimum = 2) ⇒ Object
56 57 58 59 60 |
# File 'lib/active_object/array.rb', line 56 def duplicates(minimum = 2) hash = ::Hash.new(0) each { |val| hash[val] += 1 } hash.delete_if { |_, val| val < minimum }.keys end |
#from(position) ⇒ Object
62 63 64 |
# File 'lib/active_object/array.rb', line 62 def from(position) self[position, length] || [] end |
#fulfill(value, number) ⇒ Object
66 67 68 69 70 |
# File 'lib/active_object/array.rb', line 66 def fulfill(value, number) amount = (number - 1) return self if amount <= length fill(value, length..amount) end |
#groups(number) ⇒ Object
72 73 74 75 76 77 78 |
# File 'lib/active_object/array.rb', line 72 def groups(number) return [] if number <= 0 num, rem = length.divmod(number) collection = (0..(num - 1)).collect { |val| self[(val * number), number] } rem.positive? ? collection << self[-rem, rem] : collection end |
#in_groups(number, fill_with = nil) ⇒ Object
rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/AbcSize
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/active_object/array.rb', line 81 def in_groups(number, fill_with = nil) collection_length = length division = collection_length.div(number) modulo = collection_length % number collection = [] start = 0 number.times do |int| mod_gt_zero = modulo.positive? grouping = division + (mod_gt_zero && modulo > int ? 1 : 0) collection << last_group = slice(start, grouping) last_group << fill_with if fill_with != false && mod_gt_zero && grouping == division start += grouping end block_given? ? collection.each { |val| yield(val) } : collection end |
#in_groups_of(number, fill_with = nil) ⇒ Object
rubocop:disable Metrics/MethodLength, Metrics/AbcSize
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/active_object/array.rb', line 101 def in_groups_of(number, fill_with = nil) if number.to_i <= 0 raise ArgumentError, "Group length must be a positive integer, was #{number.inspect}" end if fill_with == false collection = self else padding = (number - length % number) % number collection = dup.concat(::Array.new(padding, fill_with)) end sliced_collection = collection.each_slice(number) block_given? ? sliced_collection { |val| yield(val) } : sliced_collection.to_a end |
#merge(*values) ⇒ Object
rubocop:enable Metrics/MethodLength, Metrics/AbcSize
120 121 122 123 |
# File 'lib/active_object/array.rb', line 120 def merge(*values) values.each { |val| concat(val) } self end |
#nillify ⇒ Object
125 126 127 |
# File 'lib/active_object/array.rb', line 125 def nillify map { |val| !val.nil? && (val.try(:blank?) || val.try(:to_s).blank?) ? nil : val } end |
#nillify! ⇒ Object
129 130 131 |
# File 'lib/active_object/array.rb', line 129 def nillify! replace(nillify) end |
#probability ⇒ Object
133 134 135 136 137 138 139 140 141 142 143 144 |
# File 'lib/active_object/array.rb', line 133 def probability hash = ::Hash.new(0.0) differ = 0.0 each do |val| hash[val] += 1.0 differ += 1.0 end hash.each_key { |val| hash[val] /= differ } hash end |
#reject_values(*args) ⇒ Object
146 147 148 |
# File 'lib/active_object/array.rb', line 146 def reject_values(*args) reject { |val| args.include?(val) } end |
#sample! ⇒ Object
150 151 152 |
# File 'lib/active_object/array.rb', line 150 def sample! delete_at(::Random.rand(length - 1)) end |
#split(number = nil) ⇒ Object
rubocop:disable Metrics/MethodLength, Metrics/AbcSize
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 |
# File 'lib/active_object/array.rb', line 155 def split(number = nil) if block_given? each_with_object([[]]) do |element, results| yield(element) ? (results << []) : (results.last << element) end else results = [[]] arr = dup until arr.empty? if (idx = arr.index(number)) results.last.concat(arr.shift(idx)) arr.shift results << [] else results.last.concat(arr.shift(arr.length)) end end results end end |
#strip ⇒ Object
rubocop:enable Metrics/MethodLength, Metrics/AbcSize
179 180 181 |
# File 'lib/active_object/array.rb', line 179 def strip reject(&:blank?) end |
#strip! ⇒ Object
183 184 185 |
# File 'lib/active_object/array.rb', line 183 def strip! replace(strip) end |
#to(position) ⇒ Object
187 188 189 |
# File 'lib/active_object/array.rb', line 187 def to(position) position >= 0 ? first(position + 1) : self[0..position] end |
#to_sentence(options = {}) ⇒ Object
rubocop:disable Metrics/MethodLength
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
# File 'lib/active_object/array.rb', line 192 def to_sentence( = {}) default_connectors = { words_connector: ', ', two_words_connector: ' and ', last_word_connector: ', and ' } = default_connectors.merge!() case length when 0 '' when 1 self[0].to_s.dup when 2 "#{self[0]}#{[:two_words_connector]}#{self[1]}" else "#{self[0...-1].join([:words_connector])}#{[:last_word_connector]}#{self[-1]}" end end |