From d73ff62d04835f6e00a092b0fe4f0cdc9055ea6e Mon Sep 17 00:00:00 2001 From: Mariusz Nowak Date: Mon, 22 Sep 2014 12:25:03 +0200 Subject: [PATCH] Seclude resolver utilities --- lib/configure-map.js | 51 ++++++++++++---------------------------- lib/resolve-normalize.js | 18 ++++++++++++++ lib/resolve-resolve.js | 21 +++++++++++++++++ 3 files changed, 54 insertions(+), 36 deletions(-) create mode 100644 lib/resolve-normalize.js create mode 100644 lib/resolve-resolve.js diff --git a/lib/configure-map.js b/lib/configure-map.js index f9899aa..522910a 100644 --- a/lib/configure-map.js +++ b/lib/configure-map.js @@ -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) { diff --git a/lib/resolve-normalize.js b/lib/resolve-normalize.js new file mode 100644 index 0000000..dbe8976 --- /dev/null +++ b/lib/resolve-normalize.js @@ -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; +}; diff --git a/lib/resolve-resolve.js b/lib/resolve-resolve.js new file mode 100644 index 0000000..c1d834d --- /dev/null +++ b/lib/resolve-resolve.js @@ -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); +};