/*
 *  call-seq:
 *     struct.select(fixnum, ... )   => array
 *     struct.select {|i| block }    => array
 *  
 *  The first form returns an array containing the elements in
 *  <i>struct</i> corresponding to the given indices. The second
 *  form invokes the block passing in successive elements from
 *  <i>struct</i>, returning an array containing those elements
 *  for which the block returns a true value (equivalent to
 *  <code>Enumerable#select</code>).
 *     
 *     Lots = Struct.new(:a, :b, :c, :d, :e, :f)
 *     l = Lots.new(11, 22, 33, 44, 55, 66)
 *     l.select(1, 3, 5)               #=> [22, 44, 66]
 *     l.select(0, 2, 4)               #=> [11, 33, 55]
 *     l.select(-1, -3, -5)            #=> [66, 44, 22]
 *     l.select {|v| (v % 2).zero? }   #=> [22, 44, 66]
 */

static VALUE
rb_struct_select(argc, argv, s)
    int argc;
    VALUE *argv;
    VALUE s;
{
    VALUE result;
    long i;

    if (argc > 0) {
        rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc);
    }
    result = rb_ary_new();
    for (i = 0; i < RSTRUCT(s)->len; i++) {
        if (RTEST(rb_yield(RSTRUCT(s)->ptr[i]))) {
            rb_ary_push(result, RSTRUCT(s)->ptr[i]);
        }
    }

    return result;
}