Array#squeeze

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

···

On 5/6/05, Martin DeMello <martindemello@yahoo.com> wrote:

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

Hi --

···

On Fri, 6 May 2005, Martin DeMello wrote:

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

--
David A. Black
dblack@wobblini.net

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

···

David A. Black <dblack@wobblini.net> wrote:

On Fri, 6 May 2005, Martin DeMello wrote:

> 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]

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

···

On 5/6/05, Logan Capaldo <logancapaldo@gmail.com> wrote:

On 5/6/05, Martin DeMello <martindemello@yahoo.com> wrote:
> 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 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. :wink:

···

On 5/6/05, Mark Hubbart <discordantus@gmail.com> wrote:

On 5/6/05, Logan Capaldo <logancapaldo@gmail.com> wrote:
> On 5/6/05, Martin DeMello <martindemello@yahoo.com> wrote:
> > 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