Module: Tins::EnumSqueeze
- Defined in:
- lib/tins/enum_squeeze.rb
Instance Method Summary collapse
-
#squeeze(*sels, &block) ⇒ Array
Collapse consecutive duplicate elements, mirroring
String#squeeze. -
#squeeze!(*sels, &block) ⇒ self?
Collapse consecutive duplicate elements in place.
Instance Method Details
#squeeze(*sels, &block) ⇒ Array
Collapse consecutive duplicate elements, mirroring
String#squeeze.
Two elements are considered duplicates when
item == previous is true.
Optionally restrict squeezing to elements matching one or
more selectors via case-equality (+===+), mirroring how
String#squeeze uses character-class expressions.
Elements not matching any selector are never collapsed.
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/tins/enum_squeeze.rb', line 53 def squeeze(*sels, &block) !sels.empty? && block and raise ArgumentError, 'you cannot pass both *sels and &block' unless block if sels.empty? block = -> x { true } else block = -> x { sels.any? { _1 === x } } end end result = [] prev = A_THING_THAT_IS_NOT_A_THING each do |item| if item != prev || !block.(item) result << item prev = item end end result end |
#squeeze!(*sels, &block) ⇒ self?
Collapse consecutive duplicate elements in place.
Destructive counterpart to squeeze: the receiver is modified
via replace; no new object is allocated.
109 110 111 112 113 114 |
# File 'lib/tins/enum_squeeze.rb', line 109 def squeeze!(*sels, &block) respond_to?(:replace) or raise 'cannot be squeezed in place!' squeezed = squeeze(*sels, &block) return if squeezed.count == count replace squeezed end |