From: Farrel Lifson Date: 2007-03-04T20:16:35+09:00 Subject: [PATCH] Join with block ------=_Part_124394_19745002.1173006992371 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline This patch adds the ability to give the Array#join method a block like so [1,3,2,4].join(' which is X than '){|sep,a,b| a > b ? sep.sub(/X/,"#{a-b} more") : sep.sub(/X/,"#{b-a} less")} which produces 1 which is 2 less than 3 which is 1 more than 2 which is 2 less than 4 The patch is based off the original rb_ary_join and so it handles nested arrays in the same recursive manner as rb_ary_join: [[1,2],[3,4]].join {|sep,a,b| b.class.eql?(Array) ? "->" : ":"} which produces 1:2->3:4 The parameters passed into the block are the separator string (sep) which is the parameter passed to the join method, and the two elements (a,b) between which sep will be inserted. The following methods are added/modified: * rb_ary_join_m : Calls rb_ary_join or rb_ary_join_block depending on whether a block is given. * rb_ary_join_block: Performs the join using the given block. * recursive_join_block: Same functionality as recursive_join but calls rb_ary_join_block. Tests are added to sample/test.rb and the definition of rb_ary_join_block is added to intern.h. Unfortunately due to some weird transparent proxy errors in South Africa, I can't log into Rubyforge to add this to the Ruby project patch tracker. If someone could submit it for me I would appreciate it (that is if it doesn't get shot out the sky here first) Thanks, Farrel ------=_Part_124394_19745002.1173006992371 Content-Type: text/x-patch; name=join-block-patch.diff; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: base64 X-Attachment-Id: f_eyve1vte Content-Disposition: attachment; filename="join-block-patch.diff" SW5kZXg6IGFycmF5LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYXJyYXkuYwkocmV2aXNpb24gMTE5ODIpCisr KyBhcnJheS5jCSh3b3JraW5nIGNvcHkpCkBAIC0xMzI2LDYgKzEzMjYsNzAgQEAKICAgICByZXR1 cm4gcmVzdWx0OwogfQogCitzdGF0aWMgVkFMVUUKK3JlY3Vyc2l2ZV9qb2luX2Jsb2NrKFZBTFVF IGFyeSwgVkFMVUUgYXJncCwgaW50IHJlY3VyKQoreworICBWQUxVRSAqYXJnID0gKFZBTFVFICop YXJncDsKKyAgaWYgKHJlY3VyKSB7CisJICByZXR1cm4gcmJfc3RyX25ldzIoIlsuLi5dIik7Cisg IH0KKyAgcmV0dXJuIHJiX2FyeV9qb2luX2Jsb2NrKGFyZ1swXSwgYXJnWzFdKTsKK30KKworVkFM VUUKK3JiX2FyeV9qb2luX2Jsb2NrKFZBTFVFIGFyeSxWQUxVRSBzZXApCit7CisgIGlmIChSQVJS QVlfTEVOKGFyeSkgPT0gMCkgcmV0dXJuIHJiX3N0cl9uZXcoMCwwKTsKKyAgaW50IHRhaW50ID0g UWZhbHNlOworICBWQUxVRSByZXN1bHQsIHRtcDsKKyAgaWYgKE9CSl9UQUlOVEVEKGFyeSkgfHwg T0JKX1RBSU5URUQoc2VwKSkgdGFpbnQgPSBRdHJ1ZTsKKyAgcmVzdWx0ID0gcmJfc3RyX25ldzIo IiIpOworICBsb25nIGk7CisgIGZvciAoaT0wO2k8UkFSUkFZX0xFTihhcnkpLTE7aSsrKQorICB7 CisgICAgdG1wID0gcmJfYXJ5X2VudHJ5KGFyeSxpKTsKKyAgICBzd2l0Y2ggKFRZUEUodG1wKSkg eworCSAgICBjYXNlIFRfU1RSSU5HOgorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFRfQVJSQVk6 CisJICAgIHsKKwkJICAgIFZBTFVFIGFyZ3NbMl07CisJCSAgICBhcmdzWzBdID0gdG1wOworCQkg ICAgYXJnc1sxXSA9IHNlcDsKKwkJICAgIHRtcCA9IHJiX2V4ZWNfcmVjdXJzaXZlKHJlY3Vyc2l2 ZV9qb2luX2Jsb2NrLCBhcnksIChWQUxVRSlhcmdzKTsKKwkgICAgfQorCSAgICAgIGJyZWFrOwor CSAgICBkZWZhdWx0OgorCSAgICAgIHRtcCA9IHJiX29ial9hc19zdHJpbmcodG1wKTsKKwkgIH0K KyAgICBpZiAoT0JKX1RBSU5URUQodG1wKSkgdGFpbnQgPSBRdHJ1ZTsKKyAgICByYl9zdHJfYnVm X2FwcGVuZChyZXN1bHQsdG1wKTsKKyAgICBWQUxVRSBibG9ja19hcmdzID0gcmJfYXJ5X25ldzMo MyxzZXAscmJfYXJ5X2VudHJ5KGFyeSxpKSxyYl9hcnlfZW50cnkoYXJ5LGkrMSkpOyAgCisgICAg dG1wID0gcmJfb2JqX2FzX3N0cmluZyhyYl95aWVsZChibG9ja19hcmdzKSk7CisgICAgaWYgKE9C Sl9UQUlOVEVEKHRtcCkpIHRhaW50ID0gUXRydWU7CisgICAgcmJfc3RyX2J1Zl9hcHBlbmQocmVz dWx0LHRtcCk7CisgIH0KKyAgdG1wID0gcmJfYXJ5X2VudHJ5KGFyeSxSQVJSQVlfTEVOKGFyeSkt MSk7CisgIHN3aXRjaCAoVFlQRSh0bXApKSB7CisgICAgY2FzZSBUX1NUUklORzoKKyAgICAgIGJy ZWFrOworICAgIGNhc2UgVF9BUlJBWToKKyAgICAgIHsKKyAgICAgICAgVkFMVUUgYXJnc1syXTsK KwkJICAgIGFyZ3NbMF0gPSB0bXA7CisJCSAgICBhcmdzWzFdID0gc2VwOworCQkgICAgdG1wID0g cmJfZXhlY19yZWN1cnNpdmUocmVjdXJzaXZlX2pvaW5fYmxvY2ssIGFyeSwgKFZBTFVFKWFyZ3Mp OworCSAgICB9CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgdG1wID0gcmJf b2JqX2FzX3N0cmluZyh0bXApOworCX0KKyAgaWYgKE9CSl9UQUlOVEVEKHRtcCkpIHRhaW50ID0g UXRydWU7CisgIHJiX3N0cl9idWZfYXBwZW5kKHJlc3VsdCx0bXApOworICBpZiAodGFpbnQpIE9C Sl9UQUlOVChyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorCiAvKgogICogIGNhbGwtc2Vx OgogICogICAgIGFycmF5LmpvaW4oc2VwPSQsKSAgICAtPiBzdHIKQEAgLTEzNDEsMTEgKzE0MDUs MTQgQEAKIHJiX2FyeV9qb2luX20oaW50IGFyZ2MsIFZBTFVFICphcmd2LCBWQUxVRSBhcnkpCiB7 CiAgICAgVkFMVUUgc2VwOwotCisgICAgCiAgICAgcmJfc2Nhbl9hcmdzKGFyZ2MsIGFyZ3YsICIw MSIsICZzZXApOwogICAgIGlmIChOSUxfUChzZXApKSBzZXAgPSByYl9vdXRwdXRfZnM7CiAgICAg Ci0gICAgcmV0dXJuIHJiX2FyeV9qb2luKGFyeSwgc2VwKTsKKyAgICBpZiAocmJfYmxvY2tfZ2l2 ZW5fcCgpKQorICAgICAgcmV0dXJuIHJiX2FyeV9qb2luX2Jsb2NrKGFyeSwgc2VwKTsKKyAgICBl bHNlCisgICAgICByZXR1cm4gcmJfYXJ5X2pvaW4oYXJ5LCBzZXApOwogfQogCiBzdGF0aWMgVkFM VUUKSW5kZXg6IHNhbXBsZS90ZXN0LnJiCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHNhbXBsZS90ZXN0LnJiCShy ZXZpc2lvbiAxMTk4MikKKysrIHNhbXBsZS90ZXN0LnJiCSh3b3JraW5nIGNvcHkpCkBAIC03NDgs NiArNzQ4LDE4IEBACiAkeC5jb25jYXQoJHgpCiB0ZXN0X29rKCR4ID09IFsxLDIsMywxLDIsM10p CiAKKyMgam9pbgorJHggPSBbMSwzLDIsNF0KK3Rlc3Rfb2soIjEzMjQiID09ICR4LmpvaW4pCit0 ZXN0X29rKCIxLTMtMi00IiA9PSAkeC5qb2luKCItIikpCit0ZXN0X29rKCIxMzI0IiA9PSAkeC5q b2luKCl7fSkKK3Rlc3Rfb2soIjEzMjQiID09ICR4LmpvaW4oIi0iKXt9KQordGVzdF9vaygiMS0z LTItNCIgPT0gJHguam9pbnsiLSJ9KQordGVzdF9vaygiMTwzPjI8NCIgPT0gJHguam9pbnt8c2Vw LGEsYnxhID4gYiA/ICI+IiA6ICI8In0pCit0ZXN0X29rKCIxLTwzLT4yLTw0IiA9PSAkeC5qb2lu KCItIil7fHNlcCxhLGJ8IHNlcCArIChhID4gYiA/ICI+IiA6ICI8Iil9KQorJHggPSBbWzEsMl0s WzMsNF1dCit0ZXN0X29rKCIxOjItPjM6NCI9PSR4LmpvaW57fHNlcCxhLGJ8IGIuY2xhc3MuZXFs PyhBcnJheSkgPyAiLT4iIDogIjoifSkKKwogdGVzdF9jaGVjayAiaGFzaCIKICR4ID0gezE9PjIs IDI9PjQsIDM9PjZ9CiAkeSA9IHsxLCAyLCAyLCA0LCAzLCA2fQpJbmRleDogaW50ZXJuLmgKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQotLS0gaW50ZXJuLmgJKHJldmlzaW9uIDExOTgyKQorKysgaW50ZXJuLmgJKHdvcmtp bmcgY29weSkKQEAgLTU1LDYgKzU1LDcgQEAKIFZBTFVFIHJiX2FyeV9lbnRyeShWQUxVRSwgbG9u Zyk7CiBWQUxVRSByYl9hcnlfZWFjaChWQUxVRSk7CiBWQUxVRSByYl9hcnlfam9pbihWQUxVRSwg VkFMVUUpOworVkFMVUUgcmJfYXJ5X2pvaW5fYmxvY2soVkFMVUUsIFZBTFVFKTsKIFZBTFVFIHJi X2FyeV9wcmludF9vbihWQUxVRSwgVkFMVUUpOwogVkFMVUUgcmJfYXJ5X3JldmVyc2UoVkFMVUUp OwogVkFMVUUgcmJfYXJ5X3NvcnQoVkFMVUUpOwo= ------=_Part_124394_19745002.1173006992371--