/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 */

package javax.json;

/**
 * A JSON MergePatch as defined in http://tools.ietf.org/html/rfc7396
 *
 * @see javax.json.spi.JsonProvider#createMergePatch(JsonValue)
 * @see javax.json.spi.JsonProvider#createMergeDiff(JsonValue, JsonValue)
 */
public interface JsonMergePatch  {

    /**
     * Applies the current JsonMergePatch to the given value
     * @param valueToApplyPatchOn the base value. Will not get changed itself.
     * @return the patched new JsonValue
     */
    JsonValue apply(JsonValue valueToApplyPatchOn);

    /**
     * @return the Patch as JsonValue
     */
    JsonValue toJsonValue();
}

