]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/commitdiff
core/utils/extends.rb: add #conjoin for Array
authorAdam James <atj@pulsewidth.org.uk>
Tue, 16 Jun 2009 22:27:50 +0000 (23:27 +0100)
committerAdam James <atj@pulsewidth.org.uk>
Mon, 29 Jun 2009 22:23:33 +0000 (23:23 +0100)
lib/rbot/core/utils/extends.rb

index 083f2b858087f23b6f0200876f872d79ab691340..332a16296473b529c2e58f306935de17e887458e 100644 (file)
@@ -125,6 +125,45 @@ class ::Array
     end
   end
 
+  # This method is an advanced version of #join
+  # allowing fine control of separators:
+  #
+  #   [1,2,3].conjoin(', ', ' and ')
+  #   => "1, 2 and 3
+  #
+  #   [1,2,3,4].conjoin{ |i, a, b| i % 2 == 0 ? '.' : '-' }
+  #   => "1.2-3.4"
+  #
+  # Code lifted from the ruby facets project:
+  # <http://facets.rubyforge.org>
+  # git-rev: c8b7395255b977d3c7de268ff563e3c5bc7f1441
+  # file: lib/core/facets/array/conjoin.rb
+  def conjoin(*args, &block)
+    return first.to_s if size < 2
+
+    sep = []
+
+    if block_given?
+      (size - 1).times do |i|
+        sep << yield(i, *slice(i, 2))
+      end
+    else
+      options = (Hash === args.last) ? args.pop : {}
+      separator = args.shift || ""
+      options[-1] = args.shift unless args.empty?
+
+      sep = [separator] * (size - 1)
+
+      if options.key?(:last)
+        options[-1] = options.delete(:last)
+      end
+      options[-1] ||= _(" and ")
+
+      options.each{ |i, s| sep[i] = s }
+    end
+
+    zip(sep).join
+  end
 end
 
 # Extensions to the Range class