User prompt can be changed. Await `ChangePrompt` to yield until the new prompt has been displayed.
``` c#
await Terminal.ChangePrompt("USER> ");
await Terminal.ChangePrompt(""); //No prompt!
```
### Other control
Multiple threads might often want to write multiple lines over a short period of time, and not have them messed up with another line(s) from other threads.
The programmer might encounter a situation like this:
} // The lock is released when `terminal`'s `Dispose()` method is called here.
```
These writes are now guaranteed to not be interrupted by other calls to `WriteLine` anywhere within `Terminal`.
The drawback is it is a global mutex that can be acquired for any amount of time, potentially blocking other tasks where it wouldn't be ideal. For these situations there is `Stage`.
#### Stage
`Stage` stores the writes in a buffer temporarily. The only mutex it acquires is internal to the stage handle, and doesn't hold the global write mutex until it wants to push everything it has stored.
``` c#
await using(var terminal = Terminal.Stage()) // Create a new `Stage` here.
{
await terminal.WriteLine("Line 4"); // These are stored in `Stage` until its `DisposeAsync()` method is called.
await terminal.WriteLine("Line 5");
await terminal.WriteLine("Line 6");
} // All buffered lines are written atomically here.
* The library respectfully asks the programmer to use the `Terminal` interface instead of the `Console` interface for all reads and writes in the program. I realise this is not ideal, or even possible in some cases.