State rename to AsyncReadOnlyReactiveProperty and removed setter and implicit conversion.

master
neuecc 2020-05-22 10:44:41 +09:00
parent 0e25122ee2
commit c3d22968e1
3 changed files with 48 additions and 96 deletions

View File

@ -52,44 +52,44 @@ namespace NetCoreTests
ar.Should().BeEquivalentTo(new[] { 100, 100, 100, 131, 191 }); ar.Should().BeEquivalentTo(new[] { 100, 100, 100, 131, 191 });
} }
[Fact] //[Fact]
public async Task StateIteration() //public async Task StateIteration()
{ //{
var rp = new State<int>(99); // var rp = new ReadOnlyAsyncReactiveProperty<int>(99);
var setter = rp.GetSetter(); // var setter = rp.GetSetter();
var f = await rp.FirstAsync(); // var f = await rp.FirstAsync();
f.Should().Be(99); // f.Should().Be(99);
var array = rp.Take(5).ToArrayAsync(); // var array = rp.Take(5).ToArrayAsync();
setter(100); // setter(100);
setter(100); // setter(100);
setter(100); // setter(100);
setter(131); // setter(131);
var ar = await array; // var ar = await array;
ar.Should().BeEquivalentTo(new[] { 99, 100, 100, 100, 131 }); // ar.Should().BeEquivalentTo(new[] { 99, 100, 100, 100, 131 });
} //}
[Fact] //[Fact]
public async Task StateWithoutCurrent() //public async Task StateWithoutCurrent()
{ //{
var rp = new State<int>(99); // var rp = new ReadOnlyAsyncReactiveProperty<int>(99);
var setter = rp.GetSetter(); // var setter = rp.GetSetter();
var array = rp.WithoutCurrent().Take(5).ToArrayAsync(); // var array = rp.WithoutCurrent().Take(5).ToArrayAsync();
setter(100); // setter(100);
setter(100); // setter(100);
setter(100); // setter(100);
setter(131); // setter(131);
setter(191); // setter(191);
var ar = await array; // var ar = await array;
ar.Should().BeEquivalentTo(new[] { 100, 100, 100, 131, 191 }); // ar.Should().BeEquivalentTo(new[] { 100, 100, 100, 131, 191 });
} //}
@ -98,7 +98,7 @@ namespace NetCoreTests
{ {
var rp = new AsyncReactiveProperty<int>(10); var rp = new AsyncReactiveProperty<int>(10);
var state = rp.ToState(CancellationToken.None); var state = rp.ToReadOnlyAsyncReactiveProperty(CancellationToken.None);
rp.Value = 10; rp.Value = 10;
state.Value.Should().Be(10); state.Value.Should().Be(10);

View File

@ -175,13 +175,11 @@ namespace Cysharp.Threading.Tasks
} }
} }
public class State<T> : IReadOnlyAsyncReactiveProperty<T>, IDisposable public class ReadOnlyAsyncReactiveProperty<T> : IReadOnlyAsyncReactiveProperty<T>, IDisposable
{ {
TriggerEvent<T> triggerEvent; TriggerEvent<T> triggerEvent;
T latestValue; T latestValue;
Action<T> setter;
IUniTaskAsyncEnumerator<T> enumerator; IUniTaskAsyncEnumerator<T> enumerator;
public T Value public T Value
@ -192,19 +190,13 @@ namespace Cysharp.Threading.Tasks
} }
} }
public State(T value) public ReadOnlyAsyncReactiveProperty(T initialValue, IUniTaskAsyncEnumerable<T> source, CancellationToken cancellationToken)
{
this.latestValue = value;
this.triggerEvent = default;
}
public State(T initialValue, IUniTaskAsyncEnumerable<T> source, CancellationToken cancellationToken)
{ {
latestValue = initialValue; latestValue = initialValue;
ConsumeEnumerator(source, cancellationToken).Forget(); ConsumeEnumerator(source, cancellationToken).Forget();
} }
public State(IUniTaskAsyncEnumerable<T> source, CancellationToken cancellationToken) public ReadOnlyAsyncReactiveProperty(IUniTaskAsyncEnumerable<T> source, CancellationToken cancellationToken)
{ {
ConsumeEnumerator(source, cancellationToken).Forget(); ConsumeEnumerator(source, cancellationToken).Forget();
} }
@ -216,7 +208,9 @@ namespace Cysharp.Threading.Tasks
{ {
while (await enumerator.MoveNextAsync()) while (await enumerator.MoveNextAsync())
{ {
SetValue(enumerator.Current); var value = enumerator.Current;
this.latestValue = value;
triggerEvent.SetResult(value);
} }
} }
finally finally
@ -226,28 +220,6 @@ namespace Cysharp.Threading.Tasks
} }
} }
public Action<T> GetSetter()
{
if (enumerator != null)
{
throw new InvalidOperationException("Can not get setter when create from IUniTaskAsyncEnumerable source.");
}
if (setter != null)
{
throw new InvalidOperationException("GetSetter can only call once.");
}
setter = SetValue;
return setter;
}
void SetValue(T value)
{
this.latestValue = value;
triggerEvent.SetResult(value);
}
public IUniTaskAsyncEnumerable<T> WithoutCurrent() public IUniTaskAsyncEnumerable<T> WithoutCurrent()
{ {
return new WithoutCurrentEnumerable(this); return new WithoutCurrentEnumerable(this);
@ -268,12 +240,7 @@ namespace Cysharp.Threading.Tasks
triggerEvent.SetCompleted(); triggerEvent.SetCompleted();
} }
public static implicit operator State<T>(T value) public static implicit operator T(ReadOnlyAsyncReactiveProperty<T> value)
{
return new State<T>(value);
}
public static implicit operator T(State<T> value)
{ {
return value.Value; return value.Value;
} }
@ -286,16 +253,16 @@ namespace Cysharp.Threading.Tasks
static bool isValueType; static bool isValueType;
static State() static ReadOnlyAsyncReactiveProperty()
{ {
isValueType = typeof(T).IsValueType; isValueType = typeof(T).IsValueType;
} }
class WithoutCurrentEnumerable : IUniTaskAsyncEnumerable<T> class WithoutCurrentEnumerable : IUniTaskAsyncEnumerable<T>
{ {
readonly State<T> parent; readonly ReadOnlyAsyncReactiveProperty<T> parent;
public WithoutCurrentEnumerable(State<T> parent) public WithoutCurrentEnumerable(ReadOnlyAsyncReactiveProperty<T> parent)
{ {
this.parent = parent; this.parent = parent;
} }
@ -310,14 +277,14 @@ namespace Cysharp.Threading.Tasks
{ {
static Action<object> cancellationCallback = CancellationCallback; static Action<object> cancellationCallback = CancellationCallback;
readonly State<T> parent; readonly ReadOnlyAsyncReactiveProperty<T> parent;
readonly CancellationToken cancellationToken; readonly CancellationToken cancellationToken;
readonly CancellationTokenRegistration cancellationTokenRegistration; readonly CancellationTokenRegistration cancellationTokenRegistration;
T value; T value;
bool isDisposed; bool isDisposed;
bool firstCall; bool firstCall;
public Enumerator(State<T> parent, CancellationToken cancellationToken, bool publishCurrentValue) public Enumerator(ReadOnlyAsyncReactiveProperty<T> parent, CancellationToken cancellationToken, bool publishCurrentValue)
{ {
this.parent = parent; this.parent = parent;
this.cancellationToken = cancellationToken; this.cancellationToken = cancellationToken;
@ -391,14 +358,14 @@ namespace Cysharp.Threading.Tasks
public static class StateExtensions public static class StateExtensions
{ {
public static State<T> ToState<T>(this IUniTaskAsyncEnumerable<T> source, CancellationToken cancellationToken) public static ReadOnlyAsyncReactiveProperty<T> ToReadOnlyAsyncReactiveProperty<T>(this IUniTaskAsyncEnumerable<T> source, CancellationToken cancellationToken)
{ {
return new State<T>(source, cancellationToken); return new ReadOnlyAsyncReactiveProperty<T>(source, cancellationToken);
} }
public static State<T> ToState<T>(this IUniTaskAsyncEnumerable<T> source, T initialValue, CancellationToken cancellationToken) public static ReadOnlyAsyncReactiveProperty<T> ToReadOnlyAsyncReactiveProperty<T>(this IUniTaskAsyncEnumerable<T> source, T initialValue, CancellationToken cancellationToken)
{ {
return new State<T>(initialValue, source, cancellationToken); return new ReadOnlyAsyncReactiveProperty<T>(initialValue, source, cancellationToken);
} }
} }
} }

View File

@ -142,9 +142,7 @@ public class SandboxMain : MonoBehaviour
{ {
// State<int> Hp { get; } // State<int> Hp { get; }
AsyncReactiveProperty<int> hp;
IReadOnlyAsyncReactiveProperty<int> Hp => hp;
public Model() public Model()
@ -172,23 +170,10 @@ public class SandboxMain : MonoBehaviour
public Text text; public Text text;
public Button button; public Button button;
[SerializeField]
State<int> count;
void Start2() void Start2()
{ {
count = 10;
var countS = count.GetSetter();
count.BindTo(text);
button.OnClickAsAsyncEnumerable().ForEachAsync(_ =>
{
// int foo = countS;
//countS.Set(countS += 10);
// setter.SetValue(count.Value + 10);
});
} }