File: /home/frenchy/www/extracts/var/www/french-american.org/current/node_modules/uglyfly-js/lib/MAP.js
/***********************************************************************
Copyright 2014 (c) Saair Quaderi <saair.quaderi@gmail.com>
Copyright 2012-2013 (c) Mihai Bazon <mihai.bazon@gmail.com>
UglyflyJS sourcecode can be found here:
https://github.com/quaderi/uglyflyjs
UglyflyJS (by Saair) is a fork of UglifyJS2 (by Mihai Bazon)
Both libraries are released under the BSD 2-Clause License.
***********************************************************************/
/*globals define, module, require */
((typeof define === "function") ? define :
function () { "use strict"; require('./nd').apply(module, arguments); })(
"MAP",
[
//no dependencies
],
function () {
"use strict";
/*jslint plusplus: true*/
var skip;
function AtTop(val) {
this.v = val;
}
function Splice(val) {
this.v = val;
}
function Last(val) {
this.v = val;
}
function MAP(a, f, backwards) {
var ret = [],
top = [],
i;
function doit() {
var val = f(a[i], i),
is_last = val instanceof Last;
if (is_last) {
val = val.v;
}
if (val instanceof AtTop) {
val = val.v;
if (val instanceof Splice) {
top.push.apply(top, backwards ? val.v.slice().reverse() : val.v);
} else {
top.push(val);
}
} else if (val !== skip) {
if (val instanceof Splice) {
ret.push.apply(ret, backwards ? val.v.slice().reverse() : val.v);
} else {
ret.push(val);
}
}
return is_last;
}
if (a instanceof Array) {
if (backwards) {
for (i = a.length - 1; i >= 0; --i) {
if (doit()) {
break;
}
}
ret.reverse();
top.reverse();
} else {
for (i = 0; i < a.length; ++i) {
if (doit()) {
break;
}
}
}
} else {
for (i in a) {
if (a.hasOwnProperty(i)) {
if (doit()) {
break;
}
}
}
}
return top.concat(ret);
}
skip = MAP.skip = {};
MAP.at_top = function (val) {
return new AtTop(val);
};
MAP.splice = function (val) {
return new Splice(val);
};
MAP.last = function (val) {
return new Last(val);
};
return MAP;
}
);