simple-squiggle

A restricted subset of Squiggle
Log | Files | Refs | README

AsyncGenerator.js (2111B)


      1 var AwaitValue = require("./AwaitValue.js");
      2 
      3 function AsyncGenerator(gen) {
      4   var front, back;
      5 
      6   function send(key, arg) {
      7     return new Promise(function (resolve, reject) {
      8       var request = {
      9         key: key,
     10         arg: arg,
     11         resolve: resolve,
     12         reject: reject,
     13         next: null
     14       };
     15 
     16       if (back) {
     17         back = back.next = request;
     18       } else {
     19         front = back = request;
     20         resume(key, arg);
     21       }
     22     });
     23   }
     24 
     25   function resume(key, arg) {
     26     try {
     27       var result = gen[key](arg);
     28       var value = result.value;
     29       var wrappedAwait = value instanceof AwaitValue;
     30       Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {
     31         if (wrappedAwait) {
     32           resume(key === "return" ? "return" : "next", arg);
     33           return;
     34         }
     35 
     36         settle(result.done ? "return" : "normal", arg);
     37       }, function (err) {
     38         resume("throw", err);
     39       });
     40     } catch (err) {
     41       settle("throw", err);
     42     }
     43   }
     44 
     45   function settle(type, value) {
     46     switch (type) {
     47       case "return":
     48         front.resolve({
     49           value: value,
     50           done: true
     51         });
     52         break;
     53 
     54       case "throw":
     55         front.reject(value);
     56         break;
     57 
     58       default:
     59         front.resolve({
     60           value: value,
     61           done: false
     62         });
     63         break;
     64     }
     65 
     66     front = front.next;
     67 
     68     if (front) {
     69       resume(front.key, front.arg);
     70     } else {
     71       back = null;
     72     }
     73   }
     74 
     75   this._invoke = send;
     76 
     77   if (typeof gen["return"] !== "function") {
     78     this["return"] = undefined;
     79   }
     80 }
     81 
     82 AsyncGenerator.prototype[typeof Symbol === "function" && Symbol.asyncIterator || "@@asyncIterator"] = function () {
     83   return this;
     84 };
     85 
     86 AsyncGenerator.prototype.next = function (arg) {
     87   return this._invoke("next", arg);
     88 };
     89 
     90 AsyncGenerator.prototype["throw"] = function (arg) {
     91   return this._invoke("throw", arg);
     92 };
     93 
     94 AsyncGenerator.prototype["return"] = function (arg) {
     95   return this._invoke("return", arg);
     96 };
     97 
     98 module.exports = AsyncGenerator, module.exports.__esModule = true, module.exports["default"] = module.exports;