IEnumerable<int> IArrayIndexExpression.GetIndices(JsonElement array)
		{
			if (_expression.OutputType != QueryExpressionType.Number &&
			    _expression.OutputType != QueryExpressionType.InstanceDependent)
				return new int[] { };

			var result = _expression.Evaluate(array);
			if (result.ValueKind != JsonValueKind.Number) return new int[] { };

			var index = result.GetDecimal();
			if (Math.Truncate(index) != index) return new int[] { };
			return new[] {(int) index};
		}
        IEnumerable <int> IArrayIndexExpression.GetIndices(JsonElement array)
        {
            if (_expression.OutputType != QueryExpressionType.Number &&
                _expression.OutputType != QueryExpressionType.InstanceDependent)
            {
                return new int[] { }
            }
            ;

            var result = _expression.Evaluate(array);

            if (result.ValueKind != JsonValueKind.Number)
            {
                return new int[] { }
            }
            ;

            var index = result.GetDecimal();

            if (Math.Truncate(index) != index)
            {
                return new int[] { }
            }
            ;
            return(new[] { (int)index });
        }

        IEnumerable <string> IObjectIndexExpression.GetProperties(JsonElement obj)
        {
            if (_expression.OutputType != QueryExpressionType.String &&
                _expression.OutputType != QueryExpressionType.InstanceDependent)
            {
                return new string[] { }
            }
            ;

            var result = _expression.Evaluate(obj);

            if (result.ValueKind != JsonValueKind.String)
            {
                return new string[] { }
            }
            ;

            var index = result.GetString();

            return(new[] { index });
        }
        private bool Evaluate(JsonElement item)
        {
            if (_expression.OutputType != QueryExpressionType.Boolean &&
                _expression.OutputType != QueryExpressionType.InstanceDependent)
            {
                return(false);
            }

            var result = _expression.Evaluate(item);

            if (result.ValueKind != JsonValueKind.True &&
                result.ValueKind != JsonValueKind.False)
            {
                return(false);
            }

            return(result.GetBoolean());
        }