function* RowReduce(m, n, zero) {
let i;
let j;
let ip;
let sm = {
init: function() {
i = 1;
j = 1;
ip = 1;
return 'visit';
},
visit: function() {
if (zero(i, j)) {
i = i + 1;
if (i > m) {
i = ip;
j = j + 1;
}
if (j > n) return 'stop';
return 'visit';
} else {
return 'pivot';
}
},
pivot: function() {
if (ip == m) return 'stop';
else return 'swap';
},
swap: function() {
i = ip + 1;
return 'eliminate';
},
eliminate: function() {
i = i + 1;
if (i > m) {
j = j + 1;
if (j > n) return 'stop';
ip = ip + 1;
i = ip;
return 'visit';
} else return 'eliminate';
}
};
let st = 'init';
do {
st = sm[st]();
yield { action: st, i, j, ip };
} while (st !== 'stop');
}