Seclude resolver utilities

This commit is contained in:
Mariusz Nowak
2014-09-22 12:25:03 +02:00
parent 9e574d8df5
commit d73ff62d04
3 changed files with 54 additions and 36 deletions

View File

@@ -1,53 +1,32 @@
'use strict';
var toArray = require('es5-ext/array/to-array')
, customError = require('es5-ext/error/custom')
, defineLength = require('es5-ext/function/_define-length')
, callable = require('es5-ext/object/valid-callable')
, d = require('d')
, ee = require('event-emitter').methods
var customError = require('es5-ext/error/custom')
, defineLength = require('es5-ext/function/_define-length')
, d = require('d')
, ee = require('event-emitter').methods
, resolveResolve = require('./resolve-resolve')
, resolveNormalize = require('./resolve-normalize')
, slice = Array.prototype.slice
, apply = Function.prototype.apply, call = Function.prototype.call
, create = Object.create, hasOwnProperty = Object.prototype.hasOwnProperty
, defineProperties = Object.defineProperties
, on = ee.on, emit = ee.emit, resolveArgs;
resolveArgs = function (args) {
return this.map(function (r, i) {
return r ? r(args[i]) : args[i];
}).concat(slice.call(args, this.length));
};
, on = ee.on, emit = ee.emit;
module.exports = function (original, length, options) {
var cache = create(null), conf, memLength, get, set, del, clear, extDel
, getListeners, setListeners, deleteListeners, memoized, resolve, resolvers;
var cache = create(null), conf, memLength, get, set, del, clear, extDel, normalizer
, getListeners, setListeners, deleteListeners, memoized, resolve;
if (length !== false) memLength = length;
else if (isNaN(original.length)) memLength = 1;
else memLength = original.length;
if (options.normalizer) {
if (typeof options.normalizer === 'function') {
set = get = options.normalizer;
} else {
get = callable(options.normalizer.get);
if (options.normalizer.set !== undefined) {
set = callable(options.normalizer.set);
del = callable(options.normalizer.delete);
clear = callable(options.normalizer.clear);
} else {
set = get;
}
}
}
if (options.resolvers != null) {
resolvers = toArray(options.resolvers);
resolvers.forEach(function (r) {
if (r != null) callable(r);
});
resolve = resolveArgs.bind(resolvers);
normalizer = resolveNormalize(options.normalizer);
get = normalizer.get;
set = normalizer.set;
del = normalizer.delete;
clear = normalizer.clear;
}
if (options.resolvers != null) resolve = resolveResolve(options.resolvers);
if (get) {
memoized = defineLength(function (arg) {

18
lib/resolve-normalize.js Normal file
View File

@@ -0,0 +1,18 @@
'use strict';
var callable = require('es5-ext/object/valid-callable')
module.exports = function (normalizer) {
if (typeof normalizer === 'function') {
return { set: normalizer, get: normalizer };
}
normalizer = { get: callable(normalizer.get) };
if (normalizer.set !== undefined) {
normalizer.set = callable(normalizer.set);
normalizer.delete = callable(normalizer.delete);
normalizer.clear = callable(normalizer.clear);
return normalizer;
}
normalizer.set = normalizer.get;
return normalizer;
};

21
lib/resolve-resolve.js Normal file
View File

@@ -0,0 +1,21 @@
'use strict';
var toArray = require('es5-ext/array/to-array')
, callable = require('es5-ext/object/valid-callable')
, slice = Array.prototype.slice
, resolveArgs;
resolveArgs = function (args) {
return this.map(function (r, i) {
return r ? r(args[i]) : args[i];
}).concat(slice.call(args, this.length));
};
module.exports = function (resolvers) {
resolvers = toArray(resolvers);
resolvers.forEach(function (r) {
if (r != null) callable(r);
});
return resolveArgs.bind(resolvers);
};