class Proc
def <<(g)
def <<(g) if lambda? lambda { |*args, &blk| call(g.call(*args, &blk)) } else proc { |*args, &blk| call(g.call(*args, &blk)) } end end
def >>(g)
def >>(g) if lambda? lambda { |*args, &blk| g.call(call(*args, &blk)) } else proc { |*args, &blk| g.call(call(*args, &blk)) } end end
def curry(argc = nil)
def curry(argc = nil) min_argc = arity < 0 ? -arity - 1 : arity argc ||= min_argc if lambda? and arity < 0 ? argc < min_argc : argc != arity raise ArgumentError, "wrong number of arguments (#{argc} for #{min_argc})" end creator = lambda? ? :lambda : :proc block = send(creator) do |*args| if args.size >= argc call(*args) else send(creator) do |*more_args| args += more_args block.call(*args) end end end end
def lambda?
def lambda? !!__is_lambda__ end