using System;
using UnityEngine.Pool;
namespace RosettaUI.UndoSystem
{
///
/// UndoRecordをプーリングして管理するための構造体
///
///
/// using (UndoRecorder<TUndoRecord>.Get(out var record))
/// {
/// // recordの初期化処理
/// record.Initialize(...);
/// }
/// // Dispose時にUndoHistoryにrecordが追加される
///
public readonly struct UndoRecorder : IDisposable
where TUndoRecord : class, IUndoRecord, new()
{
private static readonly ObjectPool Pool = new(() => new TUndoRecord());
public static UndoRecorder Get(out TUndoRecord record)
{
record = Pool.Get();
return new UndoRecorder(record);
}
private static void OnDispose(IUndoRecord record)
{
if (record is TUndoRecord typedRecord)
{
Pool.Release(typedRecord);
}
}
private readonly TUndoRecord _record;
private UndoRecorder(TUndoRecord record)
{
_record = record;
}
public void Dispose()
{
UndoHistory.Add(_record, onDispose: OnDispose);
}
}
}