code: function _Json_equality(x, y)
  {
  	if (x === y)
  	{
  		return true;
  	}
  
  	if (x.$ !== y.$)
  	{
  		return false;
  	}
  
  	switch (x.$)
  	{
  		case __1_SUCCEED:
  		case __1_FAIL:
  			return x.__msg === y.__msg;
  
  		case __1_PRIM:
  			return x.__decoder === y.__decoder;
  
  		case __1_NULL:
  			return x.__value === y.__value;
  
  		case __1_LIST:
  		case __1_ARRAY:
  		case __1_KEY_VALUE:
  			return _Json_equality(x.__decoder, y.__decoder);
  
  		case __1_FIELD:
  			return x.__field === y.__field && _Json_equality(x.__decoder, y.__decoder);
  
  		case __1_INDEX:
  			return x.__index === y.__index && _Json_equality(x.__decoder, y.__decoder);
  
  		case __1_MAP:
  			return x.__func === y.__func && _Json_listEquality(x.__decoders, y.__decoders);
  
  		case __1_AND_THEN:
  			return x.__callback === y.__callback && _Json_equality(x.__decoder, y.__decoder);
  
  		case __1_ONE_OF:
  			return _Json_listEquality(x.__decoders, y.__decoders);
  	}
  }
docs: EQUALITY