text: // Generated by IcedCoffeeScript 1.7.1-c
  (function() {
    var buildLocationData, extend, flatten, last, repeat, syntaxErrorToString, _ref;
  
    exports.starts = function(string, literal, start) {
      return literal === string.substr(start, literal.length);
    };
  
    exports.ends = function(string, literal, back) {
      var len;
      len = literal.length;
      return literal === string.substr(string.length - len - (back || 0), len);
    };
  
    exports.repeat = repeat = function(str, n) {
      var res;
      res = '';
      while (n > 0) {
        if (n & 1) {
          res += str;
        }
        n >>>= 1;
        str += str;
      }
      return res;
    };
  
    exports.compact = function(array) {
      var item, _i, _len, _results;
      _results = [];
      for (_i = 0, _len = array.length; _i < _len; _i++) {
        item = array[_i];
        if (item) {
          _results.push(item);
        }
      }
      return _results;
    };
  
    exports.count = function(string, substr) {
      var num, pos;
      num = pos = 0;
      if (!substr.length) {
        return 1 / 0;
      }
      while (pos = 1 + string.indexOf(substr, pos)) {
        num++;
      }
      return num;
    };
  
    exports.merge = function(options, overrides) {
      return extend(extend({}, options), overrides);
    };
  
    extend = exports.extend = function(object, properties) {
      var key, val;
      for (key in properties) {
        val = properties[key];
        object[key] = val;
      }
      return object;
    };
  
    exports.flatten = flatten = function(array) {
      var element, flattened, _i, _len;
      flattened = [];
      for (_i = 0, _len = array.length; _i < _len; _i++) {
        element = array[_i];
        if (element instanceof Array) {
          flattened = flattened.concat(flatten(element));
        } else {
          flattened.push(element);
        }
      }
      return flattened;
    };
  
    exports.del = function(obj, key) {
      var val;
      val = obj[key];
      delete obj[key];
      return val;
    };
  
    exports.last = last = function(array, back) {
      return array[array.length - (back || 0) - 1];
    };
  
    exports.some = (_ref = Array.prototype.some) != null ? _ref : function(fn) {
      var e, _i, _len;
      for (_i = 0, _len = this.length; _i < _len; _i++) {
        e = this[_i];
        if (fn(e)) {
          return true;
        }
      }
      return false;
    };
  
    exports.invertLiterate = function(code) {
      var line, lines, maybe_code;
      maybe_code = true;
      lines = (function() {
        var _i, _len, _ref1, _results;
        _ref1 = code.split('\n');
        _results = [];
        for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
          line = _ref1[_i];
          if (maybe_code && /^([ ]{4}|[ ]{0,3}\t)/.test(line)) {
            _results.push(line);
          } else if (maybe_code = /^\s*$/.test(line)) {
            _results.push(line);
          } else {
            _results.push('# ' + line);
          }
        }
        return _results;
      })();
      return lines.join('\n');
    };
  
    buildLocationData = function(first, last) {
      if (!last) {
        return first;
      } else {
        return {
          first_line: first.first_line,
          first_column: first.first_column,
          last_line: last.last_line,
          last_column: last.last_column
        };
      }
    };
  
    exports.addLocationDataFn = function(first, last) {
      return function(obj) {
        if (((typeof obj) === 'object') && (!!obj['updateLocationDataIfMissing'])) {
          obj.updateLocationDataIfMissing(buildLocationData(first, last));
        }
        return obj;
      };
    };
  
    exports.locationDataToString = function(obj) {
      var locationData;
      if (("2" in obj) && ("first_line" in obj[2])) {
        locationData = obj[2];
      } else if ("first_line" in obj) {
        locationData = obj;
      }
      if (locationData) {
        return ("" + (locationData.first_line + 1) + ":" + (locationData.first_column + 1) + "-") + ("" + (locationData.last_line + 1) + ":" + (locationData.last_column + 1));
      } else {
        return "No location data";
      }
    };
  
    exports.baseFileName = function(file, stripExt, useWinPathSep) {
      var parts, pathSep;
      if (stripExt == null) {
        stripExt = false;
      }
      if (useWinPathSep == null) {
        useWinPathSep = false;
      }
      pathSep = useWinPathSep ? /\\|\// : /\//;
      parts = file.split(pathSep);
      file = parts[parts.length - 1];
      if (!(stripExt && file.indexOf('.') >= 0)) {
        return file;
      }
      parts = file.split('.');
      parts.pop();
      if (parts[parts.length - 1] === 'coffee' && parts.length > 1) {
        parts.pop();
      }
      return parts.join('.');
    };
  
    exports.isCoffee = function(file) {
      return /\.((lit)?coffee|coffee\.md|iced)$/.test(file);
    };
  
    exports.isLiterate = function(file) {
      return /\.(litcoffee|coffee\.md)$/.test(file);
    };
  
    exports.throwSyntaxError = function(message, location) {
      var error;
      error = new SyntaxError(message);
      error.location = location;
      error.toString = syntaxErrorToString;
      error.stack = error.toString();
      throw error;
    };
  
    exports.updateSyntaxError = function(error, code, filename) {
      if (error.toString === syntaxErrorToString) {
        error.code || (error.code = code);
        error.filename || (error.filename = filename);
        error.stack = error.toString();
      }
      return error;
    };
  
    syntaxErrorToString = function() {
      var codeLine, colorize, colorsEnabled, end, filename, first_column, first_line, last_column, last_line, marker, start, _ref1, _ref2;
      if (!(this.code && this.location)) {
        return Error.prototype.toString.call(this);
      }
      _ref1 = this.location, first_line = _ref1.first_line, first_column = _ref1.first_column, last_line = _ref1.last_line, last_column = _ref1.last_column;
      if (last_line == null) {
        last_line = first_line;
      }
      if (last_column == null) {
        last_column = first_column;
      }
      filename = this.filename || '[stdin]';
      codeLine = this.code.split('\n')[first_line];
      start = first_column;
      end = first_line === last_line ? last_column + 1 : codeLine.length;
      marker = repeat(' ', start) + repeat('^', end - start);
      if ((typeof process !== "undefined" && process !== null ? process.stdout : void 0) != null) {
        colorsEnabled = process.stdout.isTTY && !process.env.NODE_DISABLE_COLORS;
      }
      if ((_ref2 = this.colorful) != null ? _ref2 : colorsEnabled) {
        colorize = function(str) {
          return "\x1B[1;31m" + str + "\x1B[0m";
        };
        codeLine = codeLine.slice(0, start) + colorize(codeLine.slice(start, end)) + codeLine.slice(end);
        marker = colorize(marker);
      }
      return "" + filename + ":" + (first_line + 1) + ":" + (first_column + 1) + ": error: " + this.message + "\n" + codeLine + "\n" + marker;
    };
  
    exports.nameWhitespaceCharacter = function(string) {
      switch (string) {
        case ' ':
          return 'space';
        case '\n':
          return 'newline';
        case '\r':
          return 'carriage return';
        case '\t':
          return 'tab';
        default:
          return string;
      }
    };
  
  }).call(this);
  