That being said, protothreads were implemented using wildly cursed C macros, and offered none of the safety guardrails that Rust has, nor the ergonomics, and had some insane constraints, like "you can't use local variables at all, only statics" because like rust, they were stackless coroutines that meant you would have no control of the stack across await points.
If you were VERY CAREFUL, you could get the same lightweight concurrency with almost the same fundamental model. Woe be on you if you ever had to debug though.
edit - here's a look at how protothreads were expanded: https://dunkels.com/adam/pt/expansion.html
More info: https://vala.dev/
Also, Vale is on the way: https://vale.dev/
And D is also working on it: https://dlang.org/blog/2019/07/15/ownership-and-borrowing-in...
So you do not know if there are and what kind and other important details.
>"I think Rust could learn from them."
Yet you think