using System.Threading.Tasks;
private static async Task PerformWorkAsync(IProgress<Percentage> progress)
for (var i = 1; i <= 100; i++)
progress.Report(Percentage.FromValue(i));
public static async Task Main()
Console.WriteLine("Regular progress reporting with Percentage");
var progress = new Progress<Percentage>(p => Console.WriteLine(p));
await PerformWorkAsync(progress);
Console.WriteLine("--------------------------------------------------------------------");
Console.WriteLine("Handler composition");
var progress = new Progress<Percentage>(p => Console.WriteLine(p));
.WithTransform(p => Percentage.FromValue(Math.Round(p.Value / 10) * 10))
.WithFilter(p => p.Value >= 15)
Console.WriteLine("--------------------------------------------------------------------");
Console.WriteLine("Progress muxing");
var progress = new Progress<Percentage>(p => Console.WriteLine(p));
var muxer = progress.CreateMuxer();
var input1 = muxer.CreateInput(weight: 1);
var input2 = muxer.CreateInput(weight: 5);
var input3 = muxer.CreateInput(weight: 15);
PerformWorkAsync(input1),
PerformWorkAsync(input2),