autoincrement
Version:
Clever auto-incrementing variable that works by magic.
47 lines (39 loc) • 1.56 kB
JavaScript
// Helper to create a date from an array of arguments to be passed to the Date constructor.
// This is not usually possible, see: http://stackoverflow.com/questions/181348
var offset = (new Date()).getTimezoneOffset() * 60000;
function dateConstructor(args) {
return new Date(Date.UTC.apply(null, arr) + offset);
}
// Constructor for Autoincrement instances.
function Autoincrement(number) {
// The valueOf implementation.
function valueOf() {
// Notify all observers.
for (var i = 0; i < observers.length; i++) observers[i](number);
return number++;
}
// Notify implementation. Kinda Object-Observer pattern. Kinda.
var observers = [];
function notify(callback) { observers.push(callback); }
// We'll use defineProperty if available.
if (Object.defineProperty) {
Object.defineProperty(this, 'valueOf', {value: valueOf});
Object.defineProperty(this, 'notify', {value: notify});
} else {
this.valueOf = valueOf;
this.notify = notify;
}
// Freeze, if possible.
if (Object.freeze) Object.freeze(this);
}
// Returns a new Autoincrement object from either a starting number or
// arguments to be passed to Date constructor.
Autoincrement.prototype.from = function(n) {
if (arguments.length === 1 && typeof n === 'number') {
return new Autoincrement(n);
}
var date = dateConstructor([].slice.call(arguments));
return new Autoincrement(+date);
};
// The export is an instance.
module.exports = new Autoincrement(+new Date);