Created
April 20, 2024 10:58
-
-
Save BYJRK/6912c2df1e6dd5b705400c006b6be627 to your computer and use it in GitHub Desktop.
Phobia Workshop Simulation With Rx.NET
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
using var bus = new MessageBus(); | |
bool isCompleted = false; | |
var reactionDelay = TimeSpan.FromSeconds(0.25); | |
var timReactionDelay = TimeSpan.FromSeconds(0.3); | |
var ronnieSilenceThreshold = TimeSpan.FromSeconds(3); | |
bus.Messages | |
.Subscribe( | |
m => $"[{DateTime.Now:mm:ss.fff}] {m.Sender}: {m.Content}".Dump(), | |
() => isCompleted = true | |
); | |
// 害怕别人说啊 | |
using var agent1 = bus.Messages | |
.Where(m => m.Content == "aagh" && m.Sender != "agent1") | |
.Delay(reactionDelay) | |
.Subscribe(_ => bus.SendMessage(new("agent1", "aagh"))); | |
// 害怕任何人道歉 | |
using var agent2 = bus.Messages | |
.Where(m => m.Content == "sorry") | |
.Delay(reactionDelay) | |
.Subscribe(_ => bus.SendMessage(new("agent2", "aagh"))); | |
// 害怕别人说重复的话 | |
using var agent3 = bus.Messages | |
.Buffer(2, 1) | |
.Where(ms => ms.Count == 2 | |
&& ms[0].Content == ms[1].Content | |
&& ms[0].Sender != "agent3" | |
&& ms[1].Sender != "agent3") | |
.Delay(reactionDelay) | |
.Subscribe(_ => bus.SendMessage(new("agent3", "aagh"))); | |
// 害怕冷场 | |
var agent4 = bus.Messages | |
.Throttle(ronnieSilenceThreshold) | |
.Subscribe(_ => bus.SendMessage(new("agent4", "aagh"))); | |
// 害怕别人害怕 | |
var agent5 = bus.Messages | |
.Where(m => m.Content == "aagh") | |
.Throttle(timReactionDelay) | |
.Subscribe(_ => bus.SendMessage(new("agent5", "woof"))); | |
while (!isCompleted) | |
{ | |
var input = Util.ReadLine(); | |
bus.SendMessage(new("user", input)); | |
} | |
class MessageBus : IDisposable | |
{ | |
private readonly Subject<Message> _messenger = new(); | |
public IObservable<Message> Messages => _messenger.AsObservable(); | |
public void SendMessage(Message message) | |
{ | |
if (message.Content == "exit") | |
_messenger.OnCompleted(); | |
else | |
_messenger.OnNext(message); | |
} | |
public void Dispose() | |
{ | |
_messenger.Dispose(); | |
} | |
} | |
record Message(string Sender, string Content); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment