public object Encode()
        {
            List <object> additionQueue = AdditionQueue.Select(id => PointerOrLocalIdEncoder.Instance.Encode(ParseObject.CreateWithoutData(TargetClassName, id))).ToList();
            List <object> removalQueue  = RemovalQueue.Select(id => PointerOrLocalIdEncoder.Instance.Encode(ParseObject.CreateWithoutData(TargetClassName, id))).ToList();

            Dictionary <string, object> additionOperation = additionQueue.Count == 0 ? null : new Dictionary <string, object>
            {
                ["__op"]    = "AddRelation",
                ["objects"] = additionQueue
            };
            Dictionary <string, object> removalOperation = removalQueue.Count == 0 ? null : new Dictionary <string, object>
            {
                ["__op"]    = "RemoveRelation",
                ["objects"] = removalQueue
            };

            return(additionOperation != null && removalOperation != null ? new Dictionary <string, object> {
                ["__op"] = "Batch", ["ops"] = new[] { additionOperation, removalOperation }
            } : additionOperation ?? removalOperation);
        }
        public IParseFieldOperation MergeWithPrevious(IParseFieldOperation previous)
        {
            switch (previous)
            {
            case null:
                return(this);

            case ParseDeleteOperation _:
                throw new InvalidOperationException("You can't modify a relation after deleting it.");

            case ParseRelationOperation other:
                if (other.TargetClassName != TargetClassName)
                {
                    throw new InvalidOperationException(String.Format("Related object must be of class {0}, but {1} was passed in.", other.TargetClassName, TargetClassName));
                }

                return(new ParseRelationOperation(AdditionQueue.Union(other.AdditionQueue.Except(RemovalQueue)).ToList(), RemovalQueue.Union(other.RemovalQueue.Except(AdditionQueue)).ToList(), TargetClassName));

            default:
                throw new InvalidOperationException("Operation is invalid after previous operation.");
            }
        }