-
-
Notifications
You must be signed in to change notification settings - Fork 111
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
21 changed files
with
1,196 additions
and
792 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,103 +1,107 @@ | ||
namespace R3; | ||
|
||
public static partial class EventExtensions | ||
namespace R3 | ||
{ | ||
public static Event<TResult> CombineLatest<TLeft, TRight, TResult>(this Event<TLeft> left, Event<TRight> right, Func<TLeft, TRight, TResult> selector) | ||
public static partial class EventExtensions | ||
{ | ||
return new CombineLatest<TLeft, TRight, TResult>(left, right, selector); | ||
public static Event<TResult> CombineLatest<TLeft, TRight, TResult>(this Event<TLeft> left, Event<TRight> right, Func<TLeft, TRight, TResult> selector) | ||
{ | ||
return new CombineLatest<TLeft, TRight, TResult>(left, right, selector); | ||
} | ||
} | ||
} | ||
|
||
internal sealed class CombineLatest<TLeft, TRight, TResult>(Event<TLeft> left, Event<TRight> right, Func<TLeft, TRight, TResult> selector) : Event<TResult> | ||
namespace R3.Operators | ||
{ | ||
protected override IDisposable SubscribeCore(Subscriber<TResult> subscriber) | ||
internal sealed class CombineLatest<TLeft, TRight, TResult>(Event<TLeft> left, Event<TRight> right, Func<TLeft, TRight, TResult> selector) : Event<TResult> | ||
{ | ||
var method = new _CombineLatest(subscriber, selector); | ||
|
||
var d1 = left.Subscribe(new LeftSubscriber(method)); | ||
try | ||
protected override IDisposable SubscribeCore(Subscriber<TResult> subscriber) | ||
{ | ||
var d2 = right.Subscribe(new RightSubscriber(method)); | ||
return Disposable.Combine(d1, d2); | ||
} | ||
catch | ||
{ | ||
d1.Dispose(); | ||
throw; | ||
} | ||
} | ||
var method = new _CombineLatest(subscriber, selector); | ||
|
||
class _CombineLatest(Subscriber<TResult> subscriber, Func<TLeft, TRight, TResult> selector) | ||
{ | ||
TLeft? message1; | ||
bool hasMessage1; | ||
TRight? message2; | ||
bool hasMessage2; | ||
var d1 = left.Subscribe(new LeftSubscriber(method)); | ||
try | ||
{ | ||
var d2 = right.Subscribe(new RightSubscriber(method)); | ||
return Disposable.Combine(d1, d2); | ||
} | ||
catch | ||
{ | ||
d1.Dispose(); | ||
throw; | ||
} | ||
} | ||
|
||
public void OnNext(TLeft message) | ||
class _CombineLatest(Subscriber<TResult> subscriber, Func<TLeft, TRight, TResult> selector) | ||
{ | ||
var canPublish = false; | ||
TRight? msg2 = default; | ||
lock (this) | ||
TLeft? message1; | ||
bool hasMessage1; | ||
TRight? message2; | ||
bool hasMessage2; | ||
|
||
public void OnNext(TLeft message) | ||
{ | ||
hasMessage1 = true; | ||
message1 = message; | ||
var canPublish = false; | ||
TRight? msg2 = default; | ||
lock (this) | ||
{ | ||
hasMessage1 = true; | ||
message1 = message; | ||
|
||
if (hasMessage2) | ||
{ | ||
canPublish = true; | ||
msg2 = message2; | ||
} | ||
} | ||
|
||
if (hasMessage2) | ||
if (canPublish) | ||
{ | ||
canPublish = true; | ||
msg2 = message2; | ||
Publish(message, msg2!); | ||
} | ||
} | ||
|
||
if (canPublish) | ||
public void OnNext(TRight message) | ||
{ | ||
Publish(message, msg2!); | ||
} | ||
} | ||
var canPublish = false; | ||
TLeft? msg1 = default; | ||
lock (this) | ||
{ | ||
hasMessage2 = true; | ||
message2 = message; | ||
|
||
public void OnNext(TRight message) | ||
{ | ||
var canPublish = false; | ||
TLeft? msg1 = default; | ||
lock (this) | ||
{ | ||
hasMessage2 = true; | ||
message2 = message; | ||
if (hasMessage1) | ||
{ | ||
canPublish = true; | ||
msg1 = message1; | ||
} | ||
} | ||
|
||
if (hasMessage1) | ||
if (canPublish) | ||
{ | ||
canPublish = true; | ||
msg1 = message1; | ||
Publish(msg1!, message); | ||
} | ||
} | ||
|
||
if (canPublish) | ||
void Publish(TLeft m1, TRight m2) | ||
{ | ||
Publish(msg1!, message); | ||
var result = selector(m1, m2); | ||
subscriber.OnNext(result); | ||
} | ||
} | ||
|
||
void Publish(TLeft m1, TRight m2) | ||
sealed class LeftSubscriber(_CombineLatest parent) : Subscriber<TLeft> | ||
{ | ||
var result = selector(m1, m2); | ||
subscriber.OnNext(result); | ||
} | ||
} | ||
|
||
sealed class LeftSubscriber(_CombineLatest parent) : Subscriber<TLeft> | ||
{ | ||
public override void OnNext(TLeft message) | ||
{ | ||
parent.OnNext(message); | ||
public override void OnNext(TLeft message) | ||
{ | ||
parent.OnNext(message); | ||
} | ||
} | ||
} | ||
|
||
sealed class RightSubscriber(_CombineLatest parent) : Subscriber<TRight> | ||
{ | ||
public override void OnNext(TRight message) | ||
sealed class RightSubscriber(_CombineLatest parent) : Subscriber<TRight> | ||
{ | ||
parent.OnNext(message); | ||
public override void OnNext(TRight message) | ||
{ | ||
parent.OnNext(message); | ||
} | ||
} | ||
} | ||
} |
Oops, something went wrong.