Skip to content

Instantly share code, notes, and snippets.

@olsonpm
Last active August 29, 2015 14:14
Show Gist options
  • Save olsonpm/df00ca2651c1dabd90a2 to your computer and use it in GitHub Desktop.
Save olsonpm/df00ca2651c1dabd90a2 to your computer and use it in GitHub Desktop.
Enabling iterators on ObjectLikeSequence.keys and *.values

##Code


//--------------------//
// ObjectLikeSequence //
//--------------------//

Lazy.ObjectLikeSequence.prototype.keys = function keys() {
    return new KeySequence(this);
};

Lazy.ObjectLikeSequence.prototype.values = function values() {
    return new ValueSequence(this);
};


//-------------//
// KeySequence //
//-------------//

function KeySequence(parent) {
    this.parent = parent;
}

KeySequence.prototype = new Lazy.ObjectLikeSequence();

KeySequence.prototype.each = function each(fn) {
    return this.parent.each(function(v, k) {
        return fn(k);
    });
};

KeySequence.prototype.toArray = function toArray() {
    return this.reduce(function(arr, element) {
        arr.push(element);
        return arr;
    }, []);
};

KeySequence.prototype.getIterator = function getIterator() {
    return new KeyIterator(this.parent);
};

function KeyIterator(sequence) {
    this.iterator = sequence.getIterator();
    this.index = -1;
}

KeyIterator.prototype.current = function current() {
    return this.iterator.current()[0];
};

KeyIterator.prototype.moveNext = function moveNext() {
    return this.iterator.moveNext();
};


//---------------//
// ValueSequence //
//---------------//

function ValueSequence(parent) {
    this.parent = parent;
}

ValueSequence.prototype = new Lazy.ObjectLikeSequence();

ValueSequence.prototype.getIterator = function getIterator() {
    return new ValueIterator(this.parent);
};

ValueSequence.prototype.each = function each(fn) {
    return this.parent.each(function(v, k) {
        return fn(v);
    });
};

ValueSequence.prototype.toArray = function toArray() {
    return this.reduce(function(arr, element) {
        arr.push(element);
        return arr;
    }, []);
};

function ValueIterator(sequence) {
    this.iterator = sequence.getIterator();
    this.index = -1;
}

ValueIterator.prototype.current = function current() {
    return this.iterator.current()[1];
};

ValueIterator.prototype.moveNext = function moveNext() {
    return this.iterator.moveNext();
};

##Mocha Tests


var chai = require('chai');

var assert = chai.assert;
chai.config.includeStack = true;

var objLit
	, objLitConst;

function getNewObjLit() {
	return {
		'akey': 'aval'
		, 'bkey': 'bval'
		, 'ckey': 'cval'
	};
}

setup(function() {
	objLit = Lazy(getNewObjLit());
	objLitConst = Lazy(getNewObjLit());
});

test("ObjectLikeSequence.keys", function ObjectLikeSequence_keys() {
	assert.isTrue(objLit.keys().equals(objLitConst.keys()));
	objLit = objLit.assign({
		'dkey': 'dval'
	});
	assert.isFalse(objLit.keys().equals(objLitConst.keys()));
});

test("ObjectLikeSequence.values", function ObjectLikeSequence_keys() {
	assert.isTrue(objLit.values().equals(objLitConst.values()));
	objLit = objLit.assign({
		'dkey': 'dval'
	});
	assert.isFalse(objLit.values().equals(objLitConst.values()));
});

test("KeySequence.toArray", function KeySequence_toArray() {
	var keyArray = objLitConst.keys().toArray();
	var expectedKeyArray = Object.keys(getNewObjLit());

	assert.strictEqual(keyArray[0], expectedKeyArray[0]);
	assert.strictEqual(keyArray[2], expectedKeyArray[2]);
});

test("KeySequence.each", function KeySequence_each() {
	var keyArray = objLitConst.keys().toArray();
	var i = 0;
	objLit.keys().each(function(k) {
		assert.strictEqual(k, keyArray[i]);
		i += 1;
	});
});

test("KeyIterator.current && moveNext", function KeyIterator_current_moveNext() {
	var keyArray = objLitConst.keys().toArray();
	var kit = objLit.keys().getIterator();
	var i = 0;
	while (kit.moveNext()) {
		assert.strictEqual(kit.current(), keyArray[i]);
		i += 1;
	}
});

test("ValueSequence.toArray", function ValueSequence_toArray() {
	var valArray = objLitConst.values().toArray();
	var tmpObj = getNewObjLit();
	var expectedValArray = Object.keys(tmpObj).reduce(function(aggr, k) {
		aggr.push(tmpObj[k])
		return aggr;
	}, []);

	assert.strictEqual(valArray[0], expectedValArray[0]);
	assert.strictEqual(valArray[2], expectedValArray[2]);
});

test("ValueSequence.each", function KeySequence_each() {
	var valArray = objLitConst.values().toArray();
	var i = 0;
	objLit.values().each(function(v) {
		assert.strictEqual(v, valArray[i]);
		i += 1;
	});
});

test("ValueIterator.current && moveNext", function KeyIterator_current_moveNext() {
	var valArray = objLitConst.values().toArray();
	var vit = objLit.values().getIterator();
	var i = 0;
	while (vit.moveNext()) {
		assert.strictEqual(vit.current(), valArray[i]);
		i += 1;
	}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment