From 6e25ab5f5d0d14bb82517b1d5bd8215cacd018df Mon Sep 17 00:00:00 2001 From: Scott Christopher Date: Sat, 15 Oct 2016 10:33:09 +1100 Subject: [PATCH] Allow `set` to work with traversals --- src/lens.js | 27 +++++++++++++++++++++++---- src/over.js | 31 ------------------------------- src/view.js | 30 ------------------------------ test/test.js | 12 +++++++++--- 4 files changed, 32 insertions(+), 68 deletions(-) delete mode 100644 src/over.js delete mode 100644 src/view.js diff --git a/src/lens.js b/src/lens.js index f875f11..f7f02cf 100644 --- a/src/lens.js +++ b/src/lens.js @@ -1,10 +1,29 @@ -var set = require('ramda/src/set') -var lens = require('ramda/src/lens') +var ConstList = require('./internal/_const')([]) +var Identity = require('./internal/_identity') +var curry = require('ramda/src/curry') +var lens = require('ramda/src/lens') +var view = curry(function view(lens, x) { + return lens.call(ConstList, function(a) { + return ConstList([a]) + })(x).value[0] +}) + +var over = curry(function over(lens, f, x) { + return lens.call(Identity, function(y) { + return Identity(f(y)); + })(x).value; +}) + +var set = curry(function set(lens, v, x) { + return lens.call(Identity, function(_) { + return Identity(v); + })(x).value; +}) module.exports = { lens: lens, set: set, - view: require('./view'), - over: require('./over') + view: view, + over: over } diff --git a/src/over.js b/src/over.js deleted file mode 100644 index 705c485..0000000 --- a/src/over.js +++ /dev/null @@ -1,31 +0,0 @@ -var curry = require('ramda/src/curry') -var Identity = require('./internal/_identity') - - -/** - * Returns the result of "setting" the portion of the given data structure - * focused by the given lens to the result of applying the given function to - * the focused value. - * - * @func - * @memberOf R - * @since v0.16.0 - * @category Object - * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s - * @sig Lens s a -> (a -> a) -> s -> s - * @param {Lens} lens - * @param {*} v - * @param {*} x - * @return {*} - * @see R.prop, R.lensIndex, R.lensProp - * @example - * - * var headLens = R.lensIndex(0); - * - * R.over(headLens, R.toUpper, ['foo', 'bar', 'baz']); //=> ['FOO', 'bar', 'baz'] - */ -module.exports = curry(function over(lens, f, x) { - return lens.call(Identity, function(y) { - return Identity(f(y)); - })(x).value; -}); diff --git a/src/view.js b/src/view.js deleted file mode 100644 index 286ee4c..0000000 --- a/src/view.js +++ /dev/null @@ -1,30 +0,0 @@ -var curry = require('ramda/src/curry') -var Const = require('./internal/_const')([]) - - -/** - * Returns a "view" of the given data structure, determined by the given lens. - * The lens's focus determines which portion of the data structure is visible. - * - * @func - * @memberOf R - * @since v0.16.0 - * @category Object - * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s - * @sig Lens s a -> s -> a - * @param {Lens} lens - * @param {*} x - * @return {*} - * @see R.prop, R.lensIndex, R.lensProp - * @example - * - * var xLens = R.lensProp('x'); - * - * R.view(xLens, {x: 1, y: 2}); //=> 1 - * R.view(xLens, {x: 4, y: 2}); //=> 4 - */ -module.exports = curry(function view(lens, x) { - return lens.call(Const, function(a) { - return Const([a]) - })(x).value[0] -}); diff --git a/test/test.js b/test/test.js index cbb5a96..da56f85 100644 --- a/test/test.js +++ b/test/test.js @@ -80,9 +80,15 @@ describe("Lenses", function() { const trav_fn = function(x) { return x+1 } it('over a traversable', function() { - const result = over(traversed, trav_fn, Identity(2)) - const expected = Identity(3) - assert.deepEqual(result.value, expected.value) + const result = over(traversed, trav_fn, [1, 2, 3]) + const expected = [2, 3, 4] + assert.deepEqual(result, expected) + }) + + it('set a traversable', function() { + const result = set(traversed, 3, [1, 2, 3]) + const expected = [3, 3, 3] + assert.deepEqual(result, expected) }) it('with applicatives via traverseOf', function() {