code: function eq(rootX, rootY)
  {
  	var stack = [{ x: rootX, y: rootY }];
  	while (stack.length > 0)
  	{
  		var front = stack.pop();
  		var x = front.x;
  		var y = front.y;
  		if (x === y)
  		{
  			continue;
  		}
  		if (typeof x === 'object')
  		{
  			var c = 0;
  			for (var key in x)
  			{
  				++c;
  				if (!(key in y))
  				{
  					return false;
  				}
  				if (key === 'ctor')
  				{
  					continue;
  				}
  				stack.push({ x: x[key], y: y[key] });
  			}
  			if ('ctor' in x)
  			{
  				stack.push({ x: x.ctor, y: y.ctor});
  			}
  			if (c !== Object.keys(y).length)
  			{
  				return false;
  			}
  		}
  		else if (typeof x === 'function')
  		{
  			throw new Error('Equality error: general function equality is ' +
  							'undecidable, and therefore, unsupported');
  		}
  		else
  		{
  			return false;
  		}
  	}
  	return true;
  }
docs: COMPARISONS