11.
IEnumerator
public interface IEnumerator<out T>
{
T Current { get; } //
bool MoveNext(); // Current
}
12.
public interface IEnumerator<out T>
{
T Current { get; }
bool MoveNext() throws Exception; // (C# throws )
}
public interface IEnumerator<out T>
{
T Current { get; }
true|false|Exception MoveNext();
}
MoveNext
true/false/Exception
13.
public interface IEnumerator<out T>
{
T Current { get; }
bool MoveNext() throws Exception; // (C# throws )
}
public interface IEnumerator<out T>
{
T Current { get; }
T|void|Exception GetNext();
}
true T false void
Current
14.
( )
public interface IEnumeratorDual<in T>
{
void GotNext(T|void|Exception);
}
public interface IEnumerator<out T>
{
T|void|Exception GetNext();
}
23.
Length or Time
IEnumerable<T> length
IObservable<T> time
event
async
IE<T>
24.
Same Atmosphere
var query = from person in sequence
where person.Age >= 20
select person.Name;
foreach (var item in query)
{
OnNext(item);
}
var query = from person in sequence
where person.Age >= 20
select person.Name;
query.Subscribe(item =>
{
OnNext(item);
});
IEnumerble<T> IObservable<T>
(filter/map)
Rx
26.
Synchronous Asynchronous
Single(1)Multiple(*)
var x = f(); var x = await f();
var query = from person in sequence
where person.Age >= 20
select person.Name;
foreach (var item in query)
{
OnNext(item);
}
var query = from person in sequence
where person.Age >= 20
select person.Name;
query.Subscribe(item =>
{
OnNext(item);
});
IEnumerble<T> IObservable<T>
Func<T> Task<T>
27.
Synchronous Asynchronous
Single(1)Multiple(*)
var x = f(); var x = await f();
var query = from person in sequence
where person.Age >= 20
select person.Name;
foreach (var item in query)
{
OnNext(item);
}
var query = from person in sequence
where person.Age >= 20
select person.Name;
query.Subscribe(item =>
{
OnNext(item);
});
IEnumerble<T> IObservable<T>
Func<T> Task<T>
Future Promise
C#
28.
C# 5.0
C# 5.0 Task<T>
async/await
Task<T> await T .NET Framework API
Task is Observable, Observable is Awaitable
(Task 1 IObservable IObservable Last Task
)
Before async/await
Task Rx
Rx
40.
GetStringAsync("http://hogemoge", nextUrl =>
{
GetStringsAsync(nextUrl, finalUrl =>
{
GetStringsAsync(finalUrl, result =>
{
/* result handling */
}, ex => { /* third error handling */ });
}, ex => { /* second error handling */ });
}, ex => { /* first error handling */ });
Callback Hell
(try-
catch )
ObservableWWW.Get("http://hogemoge")
.SelectMany(nextUrl => ObservableWWW.Get(nextUrl))
.SelectMany(finalUrl => ObservableWWW.Get(finalUrl))
.Subscribe(
result => { /*result handling */ },
ex => { /* error handling */ });
41.
Composability
var query = from nextUrl in ObservableWWW.Get("http://hogemoge")
from finalUrl in ObservableWWW.Get(nextUrl)
from result in ObservableWWW.Get(finalUrl)
select new { nextUrl, finalUrl, result };
var parallelQuery = Observable.WhenAll(
ObservableWWW.Get("http//hogehoge"),
ObservableWWW.Get("http//hugahuga"),
ObservableWWW.Get("http//takotako"));
var parallelQuery = Observable.WhenAll(
ObservableWWW.Get("http//hogehoge"),
ObservableWWW.Get("http//hugahuga"),
ObservableWWW.Get("http//takotako"))
.Timeout(TimeSpan.FromSeconds(15));
var incrementalSearch = userInput
.Throttle(TimeSpan.FromMilliseconds(250))
.Select(keyword => SearchAsync(keyword))
.Switch();
Timeout
IObservable
Pruning
56.
NotificationModel
Model
//
public class Enemy
{
// HP
public IReactiveProperty<long> CurrentHp { get; private set; }
//
public IReadOnlyReactiveProperty<bool> IsDead { get; private set; }
public Enemy(int initialHp)
{
// HP 0
CurrentHp = new ReactiveProperty<long>(initialHp);
IsDead = CurrentHp.Select(x => x <= 0).ToReadOnlyReactiveProperty();
}
}
57.
ReactiveProperty
public class ReactivePresenter : MonoBehaviour
{
// View UIEventAsObservable
Button button;
Text textView;
// Model ReactiveProperty Subscribe View Update
Enemy enemy;
// UI
void Start()
{
// HP
button.OnClickAsObservable().Subscribe(_ => enemy.CurrentHp.Value -= 99);
// UI
enemy.CurrentHp.SubscribeToText(textView); // HP Text
//
enemy.IsDead.Select(isDead => !isDead).SubscribeToInteractable(button);
}
}
ReactiveProperty
IObservable<T>
61.
Event processing at all scales with Reactive Extensions
http://channel9.msdn.com/events/TechDays/Techdays-2014-the-
Netherlands/Event-processing-at-all-scales-with-Reactive-Extensions
Rx Video
Bart Microsoft Principal Software Engineer
Cloud-Scale Event Processing Using Rx
http://buildstuff14.sched.org/event/174c265e4ec350bd2e005b59bce0275e
Advanced
IReactiveProcessingModel, Subject Duality, Rx(3.0)
62.
LINQ to Everywhere
Reactive Extensions is not only Asynchronous
Reactive Extensions is not only Data-Binding
Observable Everywhere
Rx
Be the first to comment