Skip to content

Instantly share code, notes, and snippets.

@jordaaash
Last active August 31, 2017 18:57
Show Gist options
  • Save jordaaash/ead1091cb6c0b5a9d871b2a9b741eaf6 to your computer and use it in GitHub Desktop.
Save jordaaash/ead1091cb6c0b5a9d871b2a9b741eaf6 to your computer and use it in GitHub Desktop.

Revisions

  1. jordaaash revised this gist Aug 31, 2017. 1 changed file with 1 addition and 0 deletions.
    1 change: 1 addition & 0 deletions fiber.js
    Original file line number Diff line number Diff line change
    @@ -14,6 +14,7 @@ const fiber = function <T: any> (callback: () => T): Promise<T> {
    try {
    value = callback(function next (): void {
    if (yielded) {
    yielded = false;
    fiber.run();
    }
    else {
  2. jordaaash created this gist Aug 31, 2017.
    42 changes: 42 additions & 0 deletions fiber.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,42 @@
    /* @flow */
    'use strict';

    const Promise = require('bluebird');
    const Fiber = require('fibers');

    const fiber = function <T: any> (callback: () => T): Promise<T> {
    return new Promise(function (resolve: Function, reject: Function): void {
    Fiber(function (): void {
    let fiber: Fiber = Fiber.current;
    let yielded: boolean = false;

    let value: T;
    try {
    value = callback(function next (): void {
    if (yielded) {
    fiber.run();
    }
    else {
    yielded = true;
    Fiber.yield();
    }
    });

    if (yielded) {
    resolve(value);
    }
    else {
    throw new Error('fiber not yielded');
    }
    }
    catch (error) {
    reject(error);
    }
    finally {
    fiber = null;
    }
    }).run();
    });
    };

    module.exports = fiber;