'use strict'; 
 | 
var call = require('../internals/function-call'); 
 | 
var isCallable = require('../internals/is-callable'); 
 | 
var anObject = require('../internals/an-object'); 
 | 
var getIteratorDirect = require('../internals/get-iterator-direct'); 
 | 
var getIteratorMethod = require('../internals/get-iterator-method'); 
 | 
var getMethod = require('../internals/get-method'); 
 | 
var wellKnownSymbol = require('../internals/well-known-symbol'); 
 | 
var AsyncFromSyncIterator = require('../internals/async-from-sync-iterator'); 
 | 
  
 | 
var ASYNC_ITERATOR = wellKnownSymbol('asyncIterator'); 
 | 
  
 | 
module.exports = function (obj) { 
 | 
  var object = anObject(obj); 
 | 
  var alreadyAsync = true; 
 | 
  var method = getMethod(object, ASYNC_ITERATOR); 
 | 
  var iterator; 
 | 
  if (!isCallable(method)) { 
 | 
    method = getIteratorMethod(object); 
 | 
    alreadyAsync = false; 
 | 
  } 
 | 
  if (method !== undefined) { 
 | 
    iterator = call(method, object); 
 | 
  } else { 
 | 
    iterator = object; 
 | 
    alreadyAsync = true; 
 | 
  } 
 | 
  anObject(iterator); 
 | 
  return getIteratorDirect(alreadyAsync ? iterator : new AsyncFromSyncIterator(getIteratorDirect(iterator))); 
 | 
}; 
 |