Implementing tail with .NET & Rx

By default the tail command-line utility displays the last 10 lines of a file to standard output. To learn Rx, I endeavor to create a full .NET 4.0 version of tail. Here’s the initial version:

using (var stream = new FileStream (
    args[0],
   
FileMode
.Open,
   
FileAccess
.Read,
   
FileShare
.Read,
    2 << 15,
   
true
)) {
    stream.AsyncReadLines ().TakeLast (10).Run (
Console.WriteLine);
}

The majority of this code is the .NET call to open the file using async I/O. The 1st Rx method call is AsyncReadLines () which transforms the .NET stream into an IObservable<string>. TakeLast(10) ignores all strings observed except for the last 10 lines. Run() blocks the current thread until the IObservable<T> fires OnCompleted(), and I also pass in Console.WriteLine as the argument to use for the Action<string> delegate to write the last ten lines to the console. The output of this code is identical to running tail without any parameters.