Open dureuill opened 2 years ago
I can't say whether this is intentional, but I believe what's happening is that the initial state returned by gen!
is "unstarted".
i.e.
resume_with("0")
starts the generator, but then stops at the first yield!(())
resume_with("1")
resumes from the yield!(())
, receives the "1"
and prints itThis aligns with how rust async functions work in that no work is performed until an await occurs, so in that sense the behavior tracks. However, the genawaiter doc page contains:
let mut printer = gen!({
loop {
let string = yield_!(());
println!("{}", string);
}
});
printer.resume_with("hello");
printer.resume_with("world");
which confuses users as in reality this only prints "world".
I understand that there ought to be a method to move the generator from "unstarted" to the first value-accepting yield
, however as-is the API feels "wrong" to me:
Maybe we need to expose the two states of the generator:
start
method without argument.resume_with
method taking an argument.I agree that an API which doesn't discard arguments would be preferable. I will note, though, that the documentation does at least say that "the first resume argument will be lost."
I agree that an API which doesn't discard arguments would be preferable. I will note, though, that the documentation does at least say that "the first resume argument will be lost."
Thank you! I wasn't aware of this bit of documentation. This at least confirm that the behavior is intended.
It is unfortunate, however. As a user, it means my ResumeType
must provide a "dummy value" that can safely be built and lost on the first call. This means than the inside of the generators has to account for the possibility that a ResumeType
value has a "dummy value", even if it unreachable.
My concrete case here is an infinite looping generator that takes commands via resume, and returns results. The Command
type has to include a Dummy
or Start
command that is only used for the purpose of starting the generator.
Types containing "dummy values" strike me as unidiomatic Rust, and can lead to error (such as clients sending the Start
command on an already started generator).
I'm not sure what we could do here without breaking backcompatibility though.
Thank you for making
genawaiter
!Configuration
Code
Expected output:
or at least,
Observed output
It looks like the first value passed to the generator is never printed? I'm not sure why that is.
Is there something I'm misunderstanding?