/*
 * 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 org.apache.flink.statefun.sdk.state;

public class ApiExtension {
  public static <T> void setPersistedValueAccessor(
      PersistedValue<T> persistedValue, Accessor<T> accessor) {
    persistedValue.setAccessor(accessor);
  }

  public static <K, V> void setPersistedTableAccessor(
      PersistedTable<K, V> persistedTable, TableAccessor<K, V> accessor) {
    persistedTable.setAccessor(accessor);
  }

  public static <E> void setPersistedAppendingBufferAccessor(
      PersistedAppendingBuffer<E> persistedAppendingBuffer, AppendingBufferAccessor<E> accessor) {
    persistedAppendingBuffer.setAccessor(accessor);
  }

  public static void setRemotePersistedValueAccessor(
      RemotePersistedValue remotePersistedValue, Accessor<byte[]> accessor) {
    remotePersistedValue.setAccessor(accessor);
  }

  public static void bindPersistedStateRegistry(
      PersistedStateRegistry persistedStateRegistry, StateBinder stateBinder) {
    persistedStateRegistry.bind(stateBinder);
  }
}
