+abstract class MicroIterator implements Iterator<Double> {
+ int i;
+ MicroData data;
+
+ public boolean hasNext() {
+ return i < data.pressures.length;
+ }
+
+ public MicroIterator (MicroData data) {
+ this.data = data;
+ i = 0;
+ }
+
+ public void remove() {
+ }
+}
+
+class MicroHeightIterator extends MicroIterator {
+ public Double next() {
+ return data.height(i++);
+ }
+
+ public MicroHeightIterator(MicroData data) {
+ super(data);
+ }
+}
+
+class MicroHeightIterable implements Iterable<Double> {
+ MicroData data;
+
+ public Iterator<Double> iterator() {
+ return new MicroHeightIterator(data);
+ }
+
+ public MicroHeightIterable(MicroData data) {
+ this.data = data;
+ }
+}
+
+class MicroSpeedIterator extends MicroIterator {
+ public Double next() {
+ return data.speed(i++);
+ }
+ public MicroSpeedIterator(MicroData data) {
+ super(data);
+ }
+}
+
+class MicroSpeedIterable implements Iterable<Double> {
+ MicroData data;
+
+ public Iterator<Double> iterator() {
+ return new MicroSpeedIterator(data);
+ }
+
+ public MicroSpeedIterable(MicroData data) {
+ this.data = data;
+ }
+}
+
+class MicroAccelIterator extends MicroIterator {
+ public Double next() {
+ return data.acceleration(i++);
+ }
+ public MicroAccelIterator(MicroData data) {
+ super(data);
+ }
+}
+
+class MicroAccelIterable implements Iterable<Double> {
+ MicroData data;
+
+ public Iterator<Double> iterator() {
+ return new MicroAccelIterator(data);
+ }
+
+ public MicroAccelIterable(MicroData data) {
+ this.data = data;
+ }
+}
+