using System;
using System.Collections.Generic;
using UnityEngine;
namespace BaseGames.Core.Events
{
///
/// 单条订阅的 Disposable 句柄。Dispose() 自动取消注册。
///
public readonly struct EventSubscription : IDisposable
{
private readonly Action _unsubscribe;
public EventSubscription(Action unsubscribe)
=> _unsubscribe = unsubscribe;
public void Dispose() => _unsubscribe?.Invoke();
}
///
/// 批量管理多条订阅,统一在 Dispose / Clear 时取消所有注册。
/// 用法:OnEnable 调用 Subscribe,OnDisable 调用 Clear。
///
public sealed class CompositeDisposable : IDisposable
{
private readonly List _items = new();
public void Add(IDisposable item) => _items.Add(item);
public void Clear()
{
foreach (var item in _items) item.Dispose();
_items.Clear();
}
public void Dispose() => Clear();
}
///
/// 扩展方法(架构 02 §8)。
///
public static class EventSubscriptionExtensions
{
///
/// 将订阅句柄添加到集合中,统一生命周期管理。
/// 用法:channel.Subscribe(Handler).AddTo(_subscriptions);
///
public static EventSubscription AddTo(this EventSubscription subscription,
ICollection collection)
{
collection.Add(subscription);
return subscription;
}
///
/// 将订阅句柄添加到 中。
///
public static EventSubscription AddTo(this EventSubscription subscription,
CompositeDisposable compositeDisposable)
{
compositeDisposable.Add(subscription);
return subscription;
}
}
}