//title: Single Jersey Tube (javascript with knitout module)

//include knitout module:
const knitout = require('knitout'); //include knitout module
const K = new knitout.Writer({ carriers:['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'] });
K.addHeader('Machine', 'SWGN2');

//Parameters:
let min = 1; //needle number of left edge
let max = 20; //needle number of right edge
let rows = 20; //number of rows to knit
let carrier = "3"; //carrier name

// ---- set up initial loops and yarn carrier ----
//Bring in carrier:
K.inhook(carrier);

//On SWGN2 machines, carriers start on the right,
//so will start tucking onto needles right-to-left:
for (let n = max; n >= min; n -= 1) {
	//tuck alternating needles starting at the right edge:
	if ((max - n) % 2 === 0) {
		K.tuck("-", 'f' + n, carrier);
	}
}

//...continue clockwise around the tube to the back bed:
for (let n = min; n <= max; n += 1) {
	//note that adding 1+max-min preserves the alternating-needles pattern:
	if ((1+max-min + n - min) % 2 === 0) {
		K.tuck("+", 'b' + n, carrier);
	}
}

//...continue clockwise around the tube to the front bed and fill in needles missed the first time:
for (let n = max; n >= min; n -= 1) {
	if ((max - n) % 2 !== 0) {
		K.tuck("-", 'f' + n, carrier);
	}
}

//...finally, fill in the rest of the back bed:
for (let n = min; n <= max; n += 1) {
	if ((1+max-min + n - min) % 2 !== 0) {
		K.tuck("+", 'b' + n, carrier);
	}
}

//now knit a row of plain knitting to let the cast-on stitches relax:
for (let n = max; n >= min; n -= 1) {
	K.knit("-", 'f' + n, carrier);
}
//send the yarn inserting hook out -- yarn should be well-enough held by the needles at this point.
K.releasehook(carrier);
//finish the back of the row of plain knitting:
for (let n = min; n <= max; n += 1) {
	K.knit("+", 'b' + n, carrier);
}

// ---- single jersey tube ----
//Create a single-jersey (all knits) tube:
for (let r = 0; r <= rows; r += 1) {
	//knit front of tube going left:
	for (let n = max; n >= min; n -= 1) {
		K.knit("-", 'f' + n, carrier);
	}
	//knit back of tube going right:
	for (let n = min; n <= max; n += 1) {
		K.knit("+", 'b' + n, carrier);
	}
}

// ---- take carrier out and drop remaining loops ----
//Take carrier out with yarn inserting hook:
K.outhook(carrier);

//drop loops:
for (let n = min; n <= max; n += 1) {
	K.drop('f' + n);
}
for (let n = min; n <= max; n += 1) {
	K.drop('b' + n);
}

K.write('single-jersey-tube.swgn2.k');
