docs: function progress(title, options) {
        timeout('#fn_pg_Bar').stop();
        interval('#fn_pg_spi').stop();
        var progressBar, duration, pgType;
        if (isObj(title)) {
          options = title, title = UDF;
        }
        if (!options) options = {};
        title = typeVal(title, 'str') || get(options, '/title', 'str') || 'funclib ' + version;
        options.title = title;
        pgType = get(options, '/type', 'str');
        if (has(options, 'isSplit', 'bol') ? options.isSplit : true) console.log('');
        if (pgType === 'bar' || !contains(['bar', 'spi'], pgType)) {
          var Pgbar = eval('require("progress")');
          var prog = (options.title || '[fn.progress]') + ' [:bar] :percent';
          pgType = 'bar';
          duration = 250;
          progressBar = new Pgbar(prog, {
            complete: '=', incomplete: ' ',
            width: options['width'] || 40,
            total: options['total'] || 20
          });
          tick('+');
        }
        else {
          var stream = process.stderr;
          var flag = '/';
          interval('#fn_pg_spi', 180, function () {
            stream.clearLine();
            stream.cursorTo(0);
            stream.write(chalk(flag, 'cyan') + ' ' + title);
            flag = match(flag, { '/': '-', '-': '\\', '\\': '|', '|': '/', '@dft': '-' });
          });
        }
        /**
         * [fn.progress.stop] 结束进度条，结束后触发回调
         * @param onStopped : function [?]
         */
        progress.stop = function (onStopped) {
          if (pgType === 'bar') {
            duration = 600;
            tick('-', function () {
              pgType = null;
              if (isFun(onStopped)) onStopped();
            });
          }
          else {
            interval('#fn_pg_spi').stop();
            pgType = null;
            if (isFun(onStopped)) onStopped();
          }
        }
        /**
         * [fn.progress.clear] 立即结束进度条，并触发回调
         * @param onStopped : function [?]
         */
        progress.clear = function (onStopped) {
          if (pgType === 'bar') {
            pgType = null;
            progressBar.complete = true;
            timeout('#fn_pg_Bar').stop();
          }
          else {
            pgType = null;
            interval('#fn_pg_spi').stop();
          }
          if (isFun(onStopped)) onStopped();
        }
        function tick(tickType, onStopped) {
          timeout('#fn_pg_Bar', duration, function () {
            progressBar.tick();
            switch (tickType) {
              case '+': duration += 300; break;
              case '-': duration -= duration * 0.2; break;
            };
            if (!progressBar.complete) {
              tick(tickType, onStopped);
            }
            else if (onStopped) {
              onStopped();
            }
          });
        }
      }