public static Task <TMessage> Expect <TMessage>(this MessagePipeline <TMessage> pipeline, Predicate <TMessage> filter, CancellationToken cancellationToken = default) { var tcs = new TaskCompletionSource <TMessage>(); pipeline.Subscribe(message => { if (filter(message)) { tcs.TrySetResult(message); return(new ValueTask <bool>(false)); } // stay subscribed until we receive the message return(new ValueTask <bool>(true)); }); // cancel the TCS if the cancellation token expires cancellationToken.Register(() => { tcs.TrySetCanceled(); }, false); return(tcs.Task); }
public static Task <TMessage> Expect <TMessage>(this MessagePipeline <TMessage> pipeline, Predicate <TMessage> filter, TimeSpan timeSpan) => Expect(pipeline, filter, new CancellationTokenSource(timeSpan).Token);