using System;
using System.Threading;
using System.Threading.Tasks;
namespace Timeline.Services.Data
{
///
/// A data manager controlling data.
///
///
/// Identical data will be saved as one copy and return the same tag.
/// Every data has a ref count. When data is retained, ref count increase.
/// When data is freed, ref count decease. If ref count is decreased
/// to 0, the data entry will be destroyed and no longer occupy space.
///
public interface IDataManager
{
///
/// Saves the data to a new entry if it does not exist,
/// increases its ref count and returns a tag to the entry.
///
/// The data. Can't be null.
/// Cancellation token.
/// The tag of the created entry.
/// Thrown when is null.
public Task RetainEntry(byte[] data, CancellationToken cancellationToken = default);
///
/// Decrease the the ref count of the entry.
/// Remove it if ref count is zero.
///
/// The tag of the entry.
/// Cancellation token.
/// Thrown when is null.
///
/// It's no-op if entry with tag does not exist.
///
public Task FreeEntry(string tag, CancellationToken cancellationToken = default);
///
/// Retrieve the entry with given tag. If not exist, returns null.
///
/// The tag of the entry.
/// Cancellation token.
/// The data of the entry. If not exist, returns null.
/// Thrown when is null.
public Task GetEntry(string tag, CancellationToken cancellationToken = default);
}
}