Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Ticket #9611: alternate_enumerable_syntax_with_tests.diff

File alternate_enumerable_syntax_with_tests.diff, 10.6 kB (added by jcoglan, 10 months ago)
  • src/array.js

    old new  
    110110      if (value !== undefined) results.push(value); 
    111111    }); 
    112112    return '[' + results.join(', ') + ']'; 
     113  }, 
     114   
     115  toFunction: function() { 
     116    var method = this[0], args = this.slice(1); 
     117    if (!method) return Prototype.K; 
     118    return function(o) { 
     119      var fn = o[method]; 
     120      return (typeof fn == 'function') ? fn.apply(o, args) : undefined; 
     121    }; 
    113122  } 
    114123}); 
    115124 
  • src/base.js

    old new  
    196196 
    197197Function.prototype.defer = Function.prototype.delay.curry(0.01); 
    198198 
     199Function.from = function(iterator) { 
     200  if (typeof iterator == 'function') return iterator; 
     201  if (iterator.toFunction) return iterator.toFunction(); 
     202  if (typeof iterator == 'object') return $H(iterator).toFunction(); 
     203  return Prototype.K; 
     204}; 
     205 
    199206Date.prototype.toJSON = function() { 
    200207  return '"' + this.getFullYear() + '-' + 
    201208    (this.getMonth() + 1).toPaddedString(2) + '-' + 
  • src/enumerable.js

    old new  
    2323  }, 
    2424 
    2525  all: function(iterator, context) { 
     26    if (iterator) iterator = Function.from(iterator); 
    2627    iterator = iterator ? iterator.bind(context) : Prototype.K; 
    2728    var result = true; 
    2829    this.each(function(value, index) { 
     
    3334  }, 
    3435 
    3536  any: function(iterator, context) { 
     37    if (iterator) iterator = Function.from(iterator); 
    3638    iterator = iterator ? iterator.bind(context) : Prototype.K; 
    3739    var result = false; 
    3840    this.each(function(value, index) { 
     
    4345  }, 
    4446 
    4547  collect: function(iterator, context) { 
     48    if (iterator) iterator = Function.from(iterator); 
    4649    iterator = iterator ? iterator.bind(context) : Prototype.K; 
    4750    var results = []; 
    4851    this.each(function(value, index) { 
     
    5255  }, 
    5356   
    5457  detect: function(iterator, context) { 
     58    if (iterator) iterator = Function.from(iterator); 
    5559    iterator = iterator.bind(context); 
    5660    var result; 
    5761    this.each(function(value, index) { 
     
    6468  }, 
    6569   
    6670  findAll: function(iterator, context) { 
     71    if (iterator) iterator = Function.from(iterator); 
    6772    iterator = iterator.bind(context); 
    6873    var results = []; 
    6974    this.each(function(value, index) { 
     
    125130  }, 
    126131   
    127132  max: function(iterator, context) { 
     133    if (iterator) iterator = Function.from(iterator); 
    128134    iterator = iterator ? iterator.bind(context) : Prototype.K; 
    129135    var result; 
    130136    this.each(function(value, index) { 
     
    136142  }, 
    137143   
    138144  min: function(iterator, context) { 
     145    if (iterator) iterator = Function.from(iterator); 
    139146    iterator = iterator ? iterator.bind(context) : Prototype.K; 
    140147    var result; 
    141148    this.each(function(value, index) { 
     
    147154  }, 
    148155   
    149156  partition: function(iterator, context) { 
     157    if (iterator) iterator = Function.from(iterator); 
    150158    iterator = iterator ? iterator.bind(context) : Prototype.K; 
    151159    var trues = [], falses = []; 
    152160    this.each(function(value, index) { 
     
    165173  }, 
    166174   
    167175  reject: function(iterator, context) { 
     176    if (iterator) iterator = Function.from(iterator); 
    168177    iterator = iterator.bind(context); 
    169178    var results = []; 
    170179    this.each(function(value, index) { 
     
    175184  }, 
    176185   
    177186  sortBy: function(iterator, context) { 
     187    if (iterator) iterator = Function.from(iterator); 
    178188    iterator = iterator.bind(context); 
    179189    return this.map(function(value, index) { 
    180190      return {value: value, criteria: iterator(value, index)}; 
  • src/hash.js

    old new  
    104104   
    105105  toJSON: function() { 
    106106    return Hash.toJSON(this); 
     107  }, 
     108   
     109  toFunction: function() { 
     110    var hash = this, keys = this.keys(); 
     111    if (keys.length === 0) return Prototype.K; 
     112    return function(o) { 
     113      var result = true, key, fn, args, op; 
     114      for (var i = 0, n = keys.length; i < n; i++) { 
     115        key = keys[i]; 
     116        fn = o[key]; args = hash[key]; 
     117        if (typeof fn == 'function' && !(args instanceof Array)) args = [args]; 
     118        result = result && ((typeof fn == 'function') ? fn.apply(o, args) : fn == args); 
     119      } 
     120      return result; 
     121    }; 
    107122  } 
    108123}); 
    109124 
  • src/string.js

    old new  
    112112  toArray: function() { 
    113113    return this.split(''); 
    114114  }, 
    115  
     115   
     116  toFunction: function() { 
     117    var properties = this.split('.'); 
     118    if (!properties[0]) return Prototype.K; 
     119    return function(o) { 
     120      var object, member = o; 
     121      for (var i = 0, n = properties.length; i < n; i++) { 
     122        object = member; 
     123        member = object[properties[i]]; 
     124        if (typeof member == 'function') member = member.apply(object); 
     125      } 
     126      return member; 
     127    }; 
     128  }, 
     129   
    116130  succ: function() { 
    117131    return this.slice(0, this.length - 1) + 
    118132      String.fromCharCode(this.charCodeAt(this.length - 1) + 1); 
  • test/unit/enumerable.html

    old new  
    3232</tbody> 
    3333</table> 
    3434 
     35<div style="display: block;" class="finder"></div> 
     36<div style="display: none;" class="finder"></div> 
     37<div style="display: inline;" class="finder"></div> 
     38 
    3539<!-- Tests follow --> 
    3640<script type="text/javascript" language="javascript" charset="utf-8"> 
    3741// <![CDATA[ 
     
    4549     
    4650    Nicknames: $w('sam- noradio htonl Ulysses'), 
    4751     
     52    Radios: [ 
     53      {checked: true}, {checked: false}, {checked: 1}, {checked: true}, 
     54      {checked: ''}, {checked: 17}, {checked: null}, {checked: 'foo'} 
     55    ], 
     56     
     57    Records: [ 
     58      {valid: function() { return this.name == 'Bob'; }, name: 'Mike'}, 
     59      {valid: function() { return this.name == 'Bob'; }, name: 'Bob'} 
     60    ], 
     61     
     62    Values: [{value: 12}, {value: -5}, {value: 9}, {value: 6}], 
     63     
     64    Nested: [{value: {integer: 12}}, {value: {integer: -5}}, {value: {integer: 9}}, {value: {integer: 6}}], 
     65     
    4866    Basic: [1, 2, 3], 
    4967     
    5068    Primes: [ 
     
    122140      assert(!Fixtures.Basic.any(function(value) { 
    123141        return value > 5; 
    124142      })); 
     143      assert(Fixtures.Radios.any('checked')); 
     144      assert(Fixtures.Records.any('valid')); 
    125145    }}, 
    126146     
    127147    testAll: function() {with(this) { 
     
    137157      assert(!Fixtures.Basic.all(function(value) { 
    138158        return value > 1; 
    139159      })); 
     160      assert([{checked: true}, {checked: 12}, {checked: 'foo'}].all('checked')); 
     161      assert(!Fixtures.Radios.all('checked')); 
     162      assert(!Fixtures.Records.all('valid')); 
    140163    }}, 
    141164     
    142165    testCollect: function() {with(this) { 
     
    146169        }).join(", ")); 
    147170       
    148171      assertEqual(26,  Fixtures.Primes.map().length); 
     172       
     173      assertEqual(Fixtures.Nicknames.join(', '), 
     174        Fixtures.People.collect('nickname').join(', ')); 
     175       
     176      assertEqual(Fixtures.Values.pluck('value').join(', '), 
     177        Fixtures.Nested.collect('value.integer').join(', ')); 
     178       
     179      var set = Fixtures.Values.collect(function(v) { 
     180        return { 
     181          value: function() { return {quantity: this.k}; }, 
     182          k: v.value 
     183        }; 
     184      }); 
     185      assertEqual(Fixtures.Values.pluck('value').join(', '), 
     186        set.collect('value.quantity').join(', ')); 
     187       
     188      assertEqual('plums, apples, oranges', 
     189        ['apples', 'oranges', 'plums'].sortBy({replace: [/^./, '']}).join(', ')); 
    149190    }}, 
    150191     
    151192    testDetect: function() {with(this) { 
     
    153194        Fixtures.People.detect(function(person) { 
    154195          return person.nickname.match(/no/); 
    155196        }).name); 
     197      assertEqual(true, Fixtures.Radios.detect('checked').checked); 
     198      assertEqual('Bob', Fixtures.Records.detect('valid').name); 
    156199    }}, 
    157200     
    158201    testEachSlice: function() {with(this) { 
     
    181224    testFindAll: function() {with(this) { 
    182225      assertEqual(Fixtures.Primes.join(', '), 
    183226        Fixtures.Z.findAll(prime).join(', ')); 
     227      assertEqual(5, Fixtures.Radios.findAll('checked').length); 
     228      assertEqual(2, $$('div.finder').findAll('visible').length); 
     229       
     230      assertEqual(3, $$('div').findAll(['hasClassName', 'finder']).length); 
     231      assertEqual(3, $$('div').findAll({hasClassName: ['finder']}).length); 
     232      assertEqual(2, $$('div').findAll({hasClassName: 'finder', visible: true}).length); 
     233      assertEqual(3, $$('div').findAll({hasClassName: ['finder'], tagName: 'DIV'}).length); 
     234      assertEqual(0, $$('div').findAll({hasClassName: ['finder'], tagName: 'SPAN'}).length); 
    184235    }}, 
    185236     
    186237    testGrep: function() {with(this) { 
     
    257308      assertEqual(97, Fixtures.Primes.max()); 
    258309      assertEqual(2, [ -9, -8, -7, -6, -4, -3, -2,  0, -1,  2 ].max()); 
    259310      assertEqual('sam-', Fixtures.Nicknames.max()); // ?s > ?U 
     311      assertEqual(12, Fixtures.Values.max('value')); 
    260312    }}, 
    261313     
    262314    testMin: function() {with(this) { 
    263315      assertEqual(1, Fixtures.Z.min()); 
    264316      assertEqual(0, [  1, 2, 3, 4, 5, 6, 7, 8, 0, 9 ].min()); 
    265317      assertEqual('Ulysses', Fixtures.Nicknames.min()); // ?U < ?h 
     318      assertEqual(-5, Fixtures.Values.min('value')); 
    266319    }}, 
    267320     
    268321    testPartition: function() {with(this) { 
     
    273326      assertEqual(2, result.length); 
    274327      assertEqual('sam-, htonl', result[0].join(', ')); 
    275328      assertEqual('noradio, Ulysses', result[1].join(', ')); 
     329       
     330      result = Fixtures.Radios.partition('checked'); 
     331      assertEqual(5, result[0].length); 
     332      assertEqual(3, result[1].length); 
    276333    }}, 
    277334     
    278335    testPluck: function() {with(this) { 
     
    284341      assertEqual(0,  
    285342        Fixtures.Nicknames.reject(Prototype.K).length); 
    286343         
     344      assertEqual(3, 
     345        Fixtures.Radios.reject('checked').length); 
     346         
     347      assertEqual(1, 
     348        Fixtures.Records.reject('valid').length); 
     349         
    287350      assertEqual('sam-, noradio, htonl', 
    288351        Fixtures.Nicknames.reject(function(nickname) { 
    289352          return nickname != nickname.toLowerCase(); 
     
    295358        Fixtures.People.sortBy(function(value) { 
    296359          return value.nickname.toLowerCase(); 
    297360        }).pluck('nickname').join(', ')); 
     361         
     362      assertEqual('-5, 6, 9, 12', 
     363        Fixtures.Values.sortBy('value').pluck('value').join(', ')); 
    298364    }}, 
    299365     
    300366    testToArray: function() {with(this) {