76 lines
1.8 KiB
C#
76 lines
1.8 KiB
C#
using System;
|
|
using System.Collections;
|
|
|
|
namespace UniRx
|
|
{
|
|
public static class Disposable
|
|
{
|
|
public static readonly IDisposable Empty = EmptyDisposable.Singleton;
|
|
|
|
public static IDisposable Create(Action disposeAction)
|
|
{
|
|
return new AnonymousDisposable(disposeAction);
|
|
}
|
|
|
|
public static IDisposable CreateWithState<TState>(TState state, Action<TState> disposeAction)
|
|
{
|
|
return new AnonymousDisposable<TState>(state, disposeAction);
|
|
}
|
|
|
|
class EmptyDisposable : IDisposable
|
|
{
|
|
public static EmptyDisposable Singleton = new EmptyDisposable();
|
|
|
|
private EmptyDisposable()
|
|
{
|
|
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
}
|
|
}
|
|
|
|
class AnonymousDisposable : IDisposable
|
|
{
|
|
bool isDisposed = false;
|
|
readonly Action dispose;
|
|
|
|
public AnonymousDisposable(Action dispose)
|
|
{
|
|
this.dispose = dispose;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
if (!isDisposed)
|
|
{
|
|
isDisposed = true;
|
|
dispose();
|
|
}
|
|
}
|
|
}
|
|
|
|
class AnonymousDisposable<T> : IDisposable
|
|
{
|
|
bool isDisposed = false;
|
|
readonly T state;
|
|
readonly Action<T> dispose;
|
|
|
|
public AnonymousDisposable(T state, Action<T> dispose)
|
|
{
|
|
this.state = state;
|
|
this.dispose = dispose;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
if (!isDisposed)
|
|
{
|
|
isDisposed = true;
|
|
dispose(state);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |