Skip to content

Commit

Permalink
add global.asap
Browse files Browse the repository at this point in the history
  • Loading branch information
zloirock committed Apr 10, 2016
1 parent e42201f commit add384d
Show file tree
Hide file tree
Showing 27 changed files with 292 additions and 105 deletions.
1 change: 1 addition & 0 deletions build/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ module.exports = {
'es7.reflect.has-metadata',
'es7.reflect.has-own-metadata',
'es7.reflect.metadata',
'es7.asap',
'web.immediate',
'web.dom.iterable',
'web.timers',
Expand Down
2 changes: 2 additions & 0 deletions es7/asap.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
require('../modules/es7.asap');
module.exports = require('../modules/_core').asap;
1 change: 1 addition & 0 deletions es7/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,5 @@ require('../modules/es7.reflect.get-own-metadata-keys');
require('../modules/es7.reflect.has-metadata');
require('../modules/es7.reflect.has-own-metadata');
require('../modules/es7.reflect.metadata');
require('../modules/es7.asap');
module.exports = require('../modules/_core');
2 changes: 2 additions & 0 deletions fn/asap.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
require('../modules/es7.asap');
module.exports = require('../modules/_core').asap;
2 changes: 2 additions & 0 deletions library/es7/asap.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
require('../modules/es7.asap');
module.exports = require('../modules/_core').asap;
1 change: 1 addition & 0 deletions library/es7/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,5 @@ require('../modules/es7.reflect.get-own-metadata-keys');
require('../modules/es7.reflect.has-metadata');
require('../modules/es7.reflect.has-own-metadata');
require('../modules/es7.reflect.metadata');
require('../modules/es7.asap');
module.exports = require('../modules/_core');
2 changes: 2 additions & 0 deletions library/fn/asap.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
require('../modules/es7.asap');
module.exports = require('../modules/_core').asap;
106 changes: 58 additions & 48 deletions library/modules/_microtask.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,56 +3,66 @@ var global = require('./_global')
, Observer = global.MutationObserver || global.WebKitMutationObserver
, process = global.process
, Promise = global.Promise
, isNode = require('./_cof')(process) == 'process'
, head, last, notify;
, isNode = require('./_cof')(process) == 'process';

var flush = function(){
var parent, fn;
if(isNode && (parent = process.domain))parent.exit();
while(head){
fn = head.fn;
fn(); // <- currently we use it only for Promise - try / catch not required
head = head.next;
} last = undefined;
if(parent)parent.enter();
};
module.exports = function(){
var head, last, notify;

// Node.js
if(isNode){
notify = function(){
process.nextTick(flush);
var flush = function(){
var parent, fn;
if(isNode && (parent = process.domain))parent.exit();
while(head){
fn = head.fn;
head = head.next;
try {
fn();
} catch(e){
if(head)notify();
else last = undefined;
throw e;
}
} last = undefined;
if(parent)parent.enter();
};
// browsers with MutationObserver
} else if(Observer){
var toggle = true
, node = document.createTextNode('');
new Observer(flush).observe(node, {characterData: true}); // eslint-disable-line no-new
notify = function(){
node.data = toggle = !toggle;
};
// environments with maybe non-completely correct, but existent Promise
} else if(Promise && Promise.resolve){
notify = function(){
Promise.resolve().then(flush);
};
// for other environments - macrotask based on:
// - setImmediate
// - MessageChannel
// - window.postMessag
// - onreadystatechange
// - setTimeout
} else {
notify = function(){
// strange IE + webpack dev server bug - use .call(global)
macrotask.call(global, flush);
};
}

module.exports = function(fn){
var task = {fn: fn, next: undefined};
if(last)last.next = task;
if(!head){
head = task;
notify();
} last = task;
// Node.js
if(isNode){
notify = function(){
process.nextTick(flush);
};
// browsers with MutationObserver
} else if(Observer){
var toggle = true
, node = document.createTextNode('');
new Observer(flush).observe(node, {characterData: true}); // eslint-disable-line no-new
notify = function(){
node.data = toggle = !toggle;
};
// environments with maybe non-completely correct, but existent Promise
} else if(Promise && Promise.resolve){
var promise = Promise.resolve();
notify = function(){
promise.then(flush);
};
// for other environments - macrotask based on:
// - setImmediate
// - MessageChannel
// - window.postMessag
// - onreadystatechange
// - setTimeout
} else {
notify = function(){
// strange IE + webpack dev server bug - use .call(global)
macrotask.call(global, flush);
};
}

return function asap(fn){
var task = {fn: fn, next: undefined};
if(last)last.next = task;
if(!head){
head = task;
notify();
} last = task;
};
};
2 changes: 1 addition & 1 deletion library/modules/es6.promise.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ var LIBRARY = require('./_library')
, setProto = require('./_set-proto').set
, speciesConstructor = require('./_species-constructor')
, task = require('./_task').set
, microtask = require('./_microtask')
, microtask = require('./_microtask')()
, PROMISE = 'Promise'
, TypeError = global.TypeError
, process = global.process
Expand Down
3 changes: 3 additions & 0 deletions library/modules/es7.asap.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// https://github.com/rwaldron/tc39-notes/blob/master/es6/2014-09/sept-25.md#510-globalasap-for-enqueuing-a-microtask
var $export = require('./_export');
$export($export.G, {asap: require('./_microtask')()});
1 change: 1 addition & 0 deletions library/shim.js
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,7 @@ require('./modules/es7.reflect.get-own-metadata-keys');
require('./modules/es7.reflect.has-metadata');
require('./modules/es7.reflect.has-own-metadata');
require('./modules/es7.reflect.metadata');
require('./modules/es7.asap');
require('./modules/web.timers');
require('./modules/web.immediate');
require('./modules/web.dom.iterable');
Expand Down
1 change: 1 addition & 0 deletions library/stage/0.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ require('../modules/es7.math.iaddh');
require('../modules/es7.math.isubh');
require('../modules/es7.math.imulh');
require('../modules/es7.math.umulh');
require('../modules/es7.asap');
module.exports = require('./1');
3 changes: 1 addition & 2 deletions library/stage/1.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
require('../modules/es7.string.trim-left');
require('../modules/es7.string.trim-right');
require('../modules/es7.string.match-all');
require('../modules/es7.system.global');
module.exports = require('./2');
module.exports = require('./2');
3 changes: 2 additions & 1 deletion library/stage/2.js
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
module.exports = require('./3');
require('../modules/es7.system.global');
module.exports = require('./3');
4 changes: 1 addition & 3 deletions library/stage/3.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
require('../modules/es7.object.get-own-property-descriptors');
require('../modules/es7.object.values');
require('../modules/es7.object.entries');
require('../modules/es7.string.pad-start');
require('../modules/es7.string.pad-end');
module.exports = require('./4');
module.exports = require('./4');
4 changes: 3 additions & 1 deletion library/stage/4.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,7 @@ require('../modules/es7.object.define-getter');
require('../modules/es7.object.define-setter');
require('../modules/es7.object.lookup-getter');
require('../modules/es7.object.lookup-setter');
require('../modules/es7.object.values');
require('../modules/es7.object.entries');
require('../modules/es7.array.includes');
module.exports = require('../modules/_core');
module.exports = require('../modules/_core');
106 changes: 58 additions & 48 deletions modules/_microtask.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,56 +3,66 @@ var global = require('./_global')
, Observer = global.MutationObserver || global.WebKitMutationObserver
, process = global.process
, Promise = global.Promise
, isNode = require('./_cof')(process) == 'process'
, head, last, notify;
, isNode = require('./_cof')(process) == 'process';

var flush = function(){
var parent, fn;
if(isNode && (parent = process.domain))parent.exit();
while(head){
fn = head.fn;
fn(); // <- currently we use it only for Promise - try / catch not required
head = head.next;
} last = undefined;
if(parent)parent.enter();
};
module.exports = function(){
var head, last, notify;

// Node.js
if(isNode){
notify = function(){
process.nextTick(flush);
var flush = function(){
var parent, fn;
if(isNode && (parent = process.domain))parent.exit();
while(head){
fn = head.fn;
head = head.next;
try {
fn();
} catch(e){
if(head)notify();
else last = undefined;
throw e;
}
} last = undefined;
if(parent)parent.enter();
};
// browsers with MutationObserver
} else if(Observer){
var toggle = true
, node = document.createTextNode('');
new Observer(flush).observe(node, {characterData: true}); // eslint-disable-line no-new
notify = function(){
node.data = toggle = !toggle;
};
// environments with maybe non-completely correct, but existent Promise
} else if(Promise && Promise.resolve){
notify = function(){
Promise.resolve().then(flush);
};
// for other environments - macrotask based on:
// - setImmediate
// - MessageChannel
// - window.postMessag
// - onreadystatechange
// - setTimeout
} else {
notify = function(){
// strange IE + webpack dev server bug - use .call(global)
macrotask.call(global, flush);
};
}

module.exports = function(fn){
var task = {fn: fn, next: undefined};
if(last)last.next = task;
if(!head){
head = task;
notify();
} last = task;
// Node.js
if(isNode){
notify = function(){
process.nextTick(flush);
};
// browsers with MutationObserver
} else if(Observer){
var toggle = true
, node = document.createTextNode('');
new Observer(flush).observe(node, {characterData: true}); // eslint-disable-line no-new
notify = function(){
node.data = toggle = !toggle;
};
// environments with maybe non-completely correct, but existent Promise
} else if(Promise && Promise.resolve){
var promise = Promise.resolve();
notify = function(){
promise.then(flush);
};
// for other environments - macrotask based on:
// - setImmediate
// - MessageChannel
// - window.postMessag
// - onreadystatechange
// - setTimeout
} else {
notify = function(){
// strange IE + webpack dev server bug - use .call(global)
macrotask.call(global, flush);
};
}

return function asap(fn){
var task = {fn: fn, next: undefined};
if(last)last.next = task;
if(!head){
head = task;
notify();
} last = task;
};
};
2 changes: 1 addition & 1 deletion modules/es6.promise.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ var LIBRARY = require('./_library')
, setProto = require('./_set-proto').set
, speciesConstructor = require('./_species-constructor')
, task = require('./_task').set
, microtask = require('./_microtask')
, microtask = require('./_microtask')()
, PROMISE = 'Promise'
, TypeError = global.TypeError
, process = global.process
Expand Down
3 changes: 3 additions & 0 deletions modules/es7.asap.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// https://github.com/rwaldron/tc39-notes/blob/master/es6/2014-09/sept-25.md#510-globalasap-for-enqueuing-a-microtask
var $export = require('./_export');
$export($export.G, {asap: require('./_microtask')()});
1 change: 1 addition & 0 deletions shim.js
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,7 @@ require('./modules/es7.reflect.get-own-metadata-keys');
require('./modules/es7.reflect.has-metadata');
require('./modules/es7.reflect.has-own-metadata');
require('./modules/es7.reflect.metadata');
require('./modules/es7.asap');
require('./modules/web.timers');
require('./modules/web.immediate');
require('./modules/web.dom.iterable');
Expand Down
1 change: 1 addition & 0 deletions stage/0.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ require('../modules/es7.math.iaddh');
require('../modules/es7.math.isubh');
require('../modules/es7.math.imulh');
require('../modules/es7.math.umulh');
require('../modules/es7.asap');
module.exports = require('./1');
2 changes: 2 additions & 0 deletions tests/commonjs.ls
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,7 @@ for P in <[.. ../library]>
ok typeof require("#P/fn/set-interval") is \function
ok typeof require("#P/fn/set-immediate") is \function
ok typeof require("#P/fn/clear-immediate") is \function
ok typeof require("#P/fn/asap") is \function
ok \mapPairs of require("#P/fn/dict")
ok \then of require("#P/fn/delay")(1)
ok require("#P/fn/is-iterable")([])
Expand Down Expand Up @@ -316,6 +317,7 @@ for P in <[.. ../library]>
ok require("#P/es7/error").isError new TypeError
ok typeof require("#P/es7/math").isubh is \function
ok \metadata of require("#P/es7/reflect")
ok typeof require("#P/es7/asap") is \function
ok \Array of require("#P/es7")
ok \setTimeout of require("#P/web/timers")
ok \setImmediate of require("#P/web/immediate")
Expand Down

0 comments on commit add384d

Please sign in to comment.