using System;
using System.Threading.Tasks;
using ZeroLevel.Services.Serialization;

namespace ZeroLevel.Services.PartitionStorage.Interfaces
{
    public interface IStoreKVSerializer<TKey, TValue>
    {
        Func<MemoryStreamWriter, TKey, Task> KeySerializer { get; }

        Func<MemoryStreamWriter, TValue, Task> ValueSerializer { get; }

        Func<MemoryStreamReader, Task<DeserializeResult<TKey>>> KeyDeserializer { get; }

        Func<MemoryStreamReader, Task<DeserializeResult<TValue>>> ValueDeserializer { get; }
    }

    public interface IStoreSerializer<TKey, TInput, TValue>
        : IStoreKVSerializer<TKey, TValue>
    {
        Func<MemoryStreamWriter, TInput, Task> InputSerializer { get; }

        Func<MemoryStreamReader, Task<DeserializeResult<TInput>>> InputDeserializer { get; }
    }
}