using System;
using System.Reactive.Disposables;

namespace cannect.Core
{
	public class DisposableObject : ICancelable
	{
		public bool IsDisposed { get; private set; }

		public void Dispose()
		{
			DisposeCheck(true);
			GC.SuppressFinalize(this);
		}

		protected virtual void Dispose(bool disposing)
		{
			if (disposing)
			{
				TrashBin.Dispose();
			}
		}

		protected CompositeDisposable TrashBin { get; } = new();

		private void DisposeCheck(bool disposing)
		{
			if (IsDisposed)
			{
				return;
			}

			Dispose(disposing);

			IsDisposed = true;
		}
	}
}