Feature #6483
closedparametric map
Description
I found very common use-case for map: map with parameters and &:meth syntax. For example:
matrix =[[1,2,3],[4,5,6]]
matrix.pmap(' ',&:join).join("\n") # => "1 2 3\n4 5 6
[1,2,3,4,5].pmap(2, &:to_s) # ['1', '10', '11', '100', '101']
[1,2,3,4,5].pmap(&:to_s) # ['1', '2, '3', '4', '5'] # empty parameter list behaves as usual map
Isn't it much better than ugly and verbose code:
matrix.map{|line| line.join(' ')}.join("\n")
I can write simple implementation
class Proc
def curry_except_self(*args)
Proc.new{|slf| curry[slf,*args] }
end
end
module Enumerable
def pmap!(*args,&block)
map! &block.curry_except_self(*args)
end
def pmap(*args,&block)
dup.pmap!(*args, &block)
end
end
Use-cases can be rewritten as tests (I can send my own unit-test if needed)
Also I've two related things to discuss.
- First is &-syntax. Is it possible to change ruby-interpeter in such a way that &:proc could be at any place. matrix.pmap(&:join,' ') is much prettier than matrix.join(' ',&:join) What is the reason behind this restriction? And if one can remove this restriction, we'd have new nice syntax.
- I'm not very experience in functional programming with curry etc, but it seems to me that currying proc without supplying first argument(self) can be common task when &:meth syntax is in play. If so, may be my curry_except_self(*args) also should be included in ruby.