Array#squeeze

M

Martin DeMello

The recent mention of String#squeeze made me wonder if it would not be a
good idea to add a #squeeze method to Array (or possibly even to
Enumerable) as well. Certainly I've needed it at least as often as I've
needed #uniq

martin
 
L

Logan Capaldo

The recent mention of String#squeeze made me wonder if it would not be a
good idea to add a #squeeze method to Array (or possibly even to
Enumerable) as well. Certainly I've needed it at least as often as I've
needed #uniq

martin

Well here's a possible implementation:

module Enumerable
def squeeze(*args)
raise ArgumentError.new("Provide 0 or 1 arguments") if
args.length > 1
inject([]) do |a, b|
if args.length == 0
if b == a.last
a
else
a << b
end
else
if b == a.last && a.last == args[0]
a
else
a << b
end
end
end
end
end
 
D

David A. Black

Hi --

The recent mention of String#squeeze made me wonder if it would not be a
good idea to add a #squeeze method to Array (or possibly even to
Enumerable) as well. Certainly I've needed it at least as often as I've
needed #uniq

How close is this to what you might want, at least for Array?

irb(main):001:0> a = [1,2,3,4,1,2]
=> [1, 2, 3, 4, 1, 2]
irb(main):002:0> a |= [1,2]
=> [1, 2, 3, 4]


David
 
M

Martin DeMello

David A. Black said:
The recent mention of String#squeeze made me wonder if it would not be a
good idea to add a #squeeze method to Array (or possibly even to
Enumerable) as well. Certainly I've needed it at least as often as I've
needed #uniq

How close is this to what you might want, at least for Array?

irb(main):001:0> a = [1,2,3,4,1,2]
=> [1, 2, 3, 4, 1, 2]
irb(main):002:0> a |= [1,2]
=> [1, 2, 3, 4]

Nope, that's not what I meant - I wanted to compress a run of elements
into a single element, pretty much like unix's uniq does. (Logan posted
an implementation already).

martin
 
M

Mark Hubbart

The recent mention of String#squeeze made me wonder if it would not be a
good idea to add a #squeeze method to Array (or possibly even to
Enumerable) as well. Certainly I've needed it at least as often as I've
needed #uniq

martin

Well here's a possible implementation:

module Enumerable
def squeeze(*args)
raise ArgumentError.new("Provide 0 or 1 arguments") if
args.length > 1
inject([]) do |a, b|
if args.length == 0
if b == a.last
a
else
a << b
end
else
if b == a.last && a.last == args[0]
a
else
a << b
end
end
end
end
end

String's squeeze allows arbitrary numbers of character arguments. II
would think Enumerable#squeeze should do the same:

module Enumerable
def squeeze(*args)
ary = []
check = proc{|item| args.empty?? true : args.include?(item) }
each{|elem| ary << elem unless ary.last == elem and check[elem] }
ary
end
end

cheers,
Mark
 
L

Logan Capaldo

The recent mention of String#squeeze made me wonder if it would not be a
good idea to add a #squeeze method to Array (or possibly even to
Enumerable) as well. Certainly I've needed it at least as often as I've
needed #uniq

martin

Well here's a possible implementation:

module Enumerable
def squeeze(*args)
raise ArgumentError.new("Provide 0 or 1 arguments") if
args.length > 1
inject([]) do |a, b|
if args.length == 0
if b == a.last
a
else
a << b
end
else
if b == a.last && a.last == args[0]
a
else
a << b
end
end
end
end
end

String's squeeze allows arbitrary numbers of character arguments. II
would think Enumerable#squeeze should do the same:

module Enumerable
def squeeze(*args)
ary = []
check = proc{|item| args.empty?? true : args.include?(item) }
each{|elem| ary << elem unless ary.last == elem and check[elem] }
ary
end
end

cheers,
Mark

String's squeeze does, but their are problems with duplicating the
exact semantics of String#squeeze because according to the
documentation it uses the intersection of the strings passed as an
argument and has support for ranges of strings (ie "m-z"). Ranges
would be pretty easy just use x..y.include? but if we are following
the same semantics as String#squeeze your implementation is incorrect.
I will admit yours is more succint then my silly nested ifs. ;)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,756
Messages
2,569,540
Members
45,025
Latest member
KetoRushACVFitness

Latest Threads

Top