On 5/6/05, Mark Hubbart <> wrote:
> On 5/6/05, Logan Capaldo <> wrote:
> > On 5/6/05, 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
> > >
> > > 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.