Feedback on Streams concept, similar to Ranges

Andrew andrewlalisofficial at gmail.com
Mon May 15 09:53:22 UTC 2023


So I've been working on a small side project for the last few 
days, and I think that it's gotten to the point where I think 
that it's ready to be reviewed/critiqued.

The project is available on GitHub here: 
https://github.com/andrewlalis/streams

It introduces the concept of **Streams**, which is anything with 
either of the following function signatures:
- `int read(T[] buffer)` - this is an **input stream**.
- `int write(T[] buffer)` - this is an **output stream**.

The README.md on the project's homepage describes the motivation 
in more detail, but in short, I'm not 100% satisfied with Phobos' 
ranges, and I think that streams could be introduced as a 
lower-level primitive that's also more familiar to programmers 
coming from a variety of other languages, while still trying to 
be as idiomatically D as possible.

Just for the sake of demonstration, here's an example of using 
streams to transfer the contents of a file to some arbitrary 
output stream. Of course pretty much anything done with streams 
can also be done with ranges, but I think that the simpler 
interface will make some things more ergonomic.

```d
import streams;

void readFileTo(S)(string filename, S stream) if 
(isOutputStream!(S, ubyte)) {
   import std.stdio;
   auto fIn = FileInputStream(filename);
   transferTo(fIn, stream);
}
```

So, I'd appreciate if anyone could take a look at my project, 
tell me if you think this is a good idea or not, if I should 
introduce a DIP for this change if added to Phobos (I know the 
DIP process is closed at the moment), or if you have any other 
feedback for this.


More information about the Digitalmars-d mailing list