Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import core.thread;
- import std.stdio;
- import std.range;
- import std.algorithm;
- import std.array;
- class Gen(E) {
- private:
- Fiber fiber;
- E frontCopy;
- bool dataHeld = false;
- public:
- @trusted this(void delegate(void delegate(E)) run) {
- this.fiber = new Fiber(() {
- run((E value) {
- frontCopy = value;
- dataHeld = true;
- Fiber.yield();
- });
- });
- }
- @trusted bool empty() {
- if (dataHeld) {
- // We are holding data we haven't popped yet.
- return false;
- }
- if (fiber.state == Fiber.State.TERM) {
- // We hit the end of the fiber.
- return true;
- }
- // Call the fibre to ask for more data.
- fiber.call();
- // Check if this caused us to hit the end.
- return !dataHeld;
- }
- @trusted E front() {
- if (empty) {
- throw new Error("front called at end of iteration!");
- }
- return frontCopy;
- }
- @trusted void popFront() {
- if (empty) {
- throw new Error("popFront called at end of iteration!");
- }
- dataHeld = false;
- }
- }
- Gen!E generate(E)(void delegate(void delegate(E)) run) {
- return new Gen!E(run);
- }
- void main(string[] argv) {
- Gen!int generateInts() {
- return generate!int((yield) {
- yield(3);
- yield(4);
- yield(7);
- });
- }
- // Prints 3, 4, 7
- foreach(x; generateInts()) {
- writeln(x);
- }
- // true
- writeln(isInputRange!(typeof(generateInts())));
- auto arr = generateInts().map!(x => x * 2).array;
- // [6, 8, 14]
- writeln(arr);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement