/* -*- Mode: js; js-indent-level: 2; -*- */ 
 | 
/* 
 | 
 * Copyright 2014 Mozilla Foundation and contributors 
 | 
 * Licensed under the New BSD license. See LICENSE or: 
 | 
 * http://opensource.org/licenses/BSD-3-Clause 
 | 
 */ 
 | 
  
 | 
const util = require("./util"); 
 | 
  
 | 
/** 
 | 
 * Determine whether mappingB is after mappingA with respect to generated 
 | 
 * position. 
 | 
 */ 
 | 
function generatedPositionAfter(mappingA, mappingB) { 
 | 
  // Optimized for most common case 
 | 
  const lineA = mappingA.generatedLine; 
 | 
  const lineB = mappingB.generatedLine; 
 | 
  const columnA = mappingA.generatedColumn; 
 | 
  const columnB = mappingB.generatedColumn; 
 | 
  return lineB > lineA || lineB == lineA && columnB >= columnA || 
 | 
         util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; 
 | 
} 
 | 
  
 | 
/** 
 | 
 * A data structure to provide a sorted view of accumulated mappings in a 
 | 
 * performance conscious manner. It trades a negligible overhead in general 
 | 
 * case for a large speedup in case of mappings being added in order. 
 | 
 */ 
 | 
class MappingList { 
 | 
  constructor() { 
 | 
    this._array = []; 
 | 
    this._sorted = true; 
 | 
    // Serves as infimum 
 | 
    this._last = {generatedLine: -1, generatedColumn: 0}; 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Iterate through internal items. This method takes the same arguments that 
 | 
   * `Array.prototype.forEach` takes. 
 | 
   * 
 | 
   * NOTE: The order of the mappings is NOT guaranteed. 
 | 
   */ 
 | 
  unsortedForEach(aCallback, aThisArg) { 
 | 
    this._array.forEach(aCallback, aThisArg); 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Add the given source mapping. 
 | 
   * 
 | 
   * @param Object aMapping 
 | 
   */ 
 | 
  add(aMapping) { 
 | 
    if (generatedPositionAfter(this._last, aMapping)) { 
 | 
      this._last = aMapping; 
 | 
      this._array.push(aMapping); 
 | 
    } else { 
 | 
      this._sorted = false; 
 | 
      this._array.push(aMapping); 
 | 
    } 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * Returns the flat, sorted array of mappings. The mappings are sorted by 
 | 
   * generated position. 
 | 
   * 
 | 
   * WARNING: This method returns internal data without copying, for 
 | 
   * performance. The return value must NOT be mutated, and should be treated as 
 | 
   * an immutable borrow. If you want to take ownership, you must make your own 
 | 
   * copy. 
 | 
   */ 
 | 
  toArray() { 
 | 
    if (!this._sorted) { 
 | 
      this._array.sort(util.compareByGeneratedPositionsInflated); 
 | 
      this._sorted = true; 
 | 
    } 
 | 
    return this._array; 
 | 
  } 
 | 
} 
 | 
  
 | 
exports.MappingList = MappingList; 
 |