1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
Array2D : Collection {
var <rows, <cols, <array;
*new { arg rows=1, cols=1;
^super.new.init(rows, cols);
}
init { arg argRows, argCols;
rows = argRows;
cols = argCols;
array = Array.newClear(rows * cols);
}
at { arg row, col;
^array.at(row*cols + col)
}
put { arg row, col, val;
array.put(row*cols + col, val)
}
asArray { ^array }
*fromArray { arg rows,cols, array;
^this.new(rows,cols).with(array);
}
with { arg aarray; array = aarray; }
do { arg func;
array.do(func)
}
colsDo { arg func;
cols.do({ arg ci;
func.value( Array.fill(rows,{ arg ri; this.at(ri,ci) }), ci )
})
}
rowsDo { arg func;
rows.do({ arg ri;
func.value( Array.fill(cols,{ arg ci; this.at(ri,ci) }), ri )
})
}
colAt { arg ci;
^Array.fill(rows,{ arg ri; this.at(ri,ci) })
}
rowAt { arg ri;
^array.copyRange(ri * cols, ri * cols + cols - 1)
}
// overide Array
// add { ^thisMethod.shouldNotImplement }
printOn { arg stream;
// not a compileable string
stream << this.class.name << "[ " ;
this.rowsDo({ arg r;
r.printOn(stream);
});
stream << " ]" ;
}
storeOn { arg stream;
var title;
stream << this.class.name << ".fromArray("
<<<* [rows,cols,this.asArray] << ")";
this.storeModifiersOn(stream);
}
}
|