Skip to content

Instantly share code, notes, and snippets.

@BYJRK
Created April 20, 2024 10:58
Show Gist options
  • Save BYJRK/6912c2df1e6dd5b705400c006b6be627 to your computer and use it in GitHub Desktop.
Save BYJRK/6912c2df1e6dd5b705400c006b6be627 to your computer and use it in GitHub Desktop.
Phobia Workshop Simulation With Rx.NET
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