From 23495e0302b39fe464d4bdd7de9794ef553d9ce0 Mon Sep 17 00:00:00 2001 From: Vladimir Gorej Date: Tue, 31 Jan 2017 20:32:07 +0100 Subject: [PATCH 1/3] feat(lens): add utils for further lens utilization - added lensEq - added lensSatisfies --- src/lens.js | 15 ++++++++++++++- test/test.js | 25 ++++++++++++++++++++++--- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/lens.js b/src/lens.js index f875f11..4a771cd 100644 --- a/src/lens.js +++ b/src/lens.js @@ -1,10 +1,23 @@ var set = require('ramda/src/set') var lens = require('ramda/src/lens') +var curry = require('ramda/src/curry') +var view = require('ramda/src/view') +var pipe = require('ramda/src/pipe') +var equals = require('ramda/src/equals') +var lensEq = curry(function(_lens, val, obj) { + return pipe(view(_lens), equals(val))(obj) +}); + +var lensSatisfies = curry(function(pred, _lens, obj) { + return pipe(view(_lens), pred, equals(true))(obj) +}); module.exports = { lens: lens, set: set, view: require('./view'), - over: require('./over') + over: require('./over'), + lensEq: lensEq, + lensSatisfies: lensSatisfies } diff --git a/test/test.js b/test/test.js index cbb5a96..81a0dce 100644 --- a/test/test.js +++ b/test/test.js @@ -1,12 +1,15 @@ -const assert = require("assert") +const assert = require('assert') const L = require('../index') -const R = require("ramda") +const R = require('ramda') const compose = R.compose const lensProp = R.lensProp const lensIndex = R.lensIndex +const equals = R.equals const set = L.set const view = L.view const over = L.over +const lensEq = L.lensEq +const lensSatisfies = L.lensSatisfies const mapped = L.mapped const traversed = L.traversed const traverseOf = L.traverseOf @@ -35,7 +38,7 @@ describe("Lenses", function() { const zip = lensProp('zip') - describe("Set/View/Over", function() { + describe("Set/View/Over/LensEq/LensSatisfies", function() { const firstStreet = compose(_0, addresses, _0, street) it('gets the value', function() { @@ -56,6 +59,22 @@ describe("Lenses", function() { assert.equal('393 Post Ave.', res[1].addresses[0].street) assert.equal('92 Oak St.', users[0].addresses[0].street) }) + + it('test if object has a specific value on provided lens', function() { + const res = lensEq(firstStreet, '92 Oak St.', users) + assert.ok(res) + + const resCurried = lensEq(firstStreet)('92 Oak St.')(users) + assert.ok(resCurried) + }) + + it('test if specified object property at lens satisfies the given predicate', function() { + const res = lensSatisfies(equals('92 Oak St.'), firstStreet, users) + assert.ok(res) + + const resCurried = lensSatisfies(equals('92 Oak St.'))(firstStreet)(users) + assert.ok(resCurried) + }) }) describe("Mapping", function() { From 4e764201f84198878b7454778d19b2b52c6974c8 Mon Sep 17 00:00:00 2001 From: Vladimir Gorej Date: Tue, 31 Jan 2017 20:51:21 +0100 Subject: [PATCH 2/3] feat(lens): add viewOr lens util --- src/lens.js | 6 ++++++ test/test.js | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/lens.js b/src/lens.js index 4a771cd..cc40807 100644 --- a/src/lens.js +++ b/src/lens.js @@ -4,6 +4,7 @@ var curry = require('ramda/src/curry') var view = require('ramda/src/view') var pipe = require('ramda/src/pipe') var equals = require('ramda/src/equals') +var defaultTo = require('ramda/src/defaultTo') var lensEq = curry(function(_lens, val, obj) { return pipe(view(_lens), equals(val))(obj) @@ -13,10 +14,15 @@ var lensSatisfies = curry(function(pred, _lens, obj) { return pipe(view(_lens), pred, equals(true))(obj) }); +var viewOr = curry(function (defaultValue, _lens, obj) { + return pipe(view(_lens), defaultTo(defaultValue))(obj) +}); + module.exports = { lens: lens, set: set, view: require('./view'), + viewOr: viewOr, over: require('./over'), lensEq: lensEq, lensSatisfies: lensSatisfies diff --git a/test/test.js b/test/test.js index 81a0dce..fec128b 100644 --- a/test/test.js +++ b/test/test.js @@ -7,6 +7,7 @@ const lensIndex = R.lensIndex const equals = R.equals const set = L.set const view = L.view +const viewOr = L.viewOr const over = L.over const lensEq = L.lensEq const lensSatisfies = L.lensSatisfies @@ -75,6 +76,17 @@ describe("Lenses", function() { const resCurried = lensSatisfies(equals('92 Oak St.'))(firstStreet)(users) assert.ok(resCurried) }) + + it('test "view" of the given data structure, determined by the given lens with default value', function() { + const res = viewOr('default street', firstStreet, users) + assert.equal('92 Oak St.', res) + + const resDefault = viewOr('default street', lensProp('non-existing-prop'), users) + assert.equal('default street', resDefault) + + const resCurried = viewOr('default street')(firstStreet)(users) + assert.equal('92 Oak St.', resCurried) + }) }) describe("Mapping", function() { From 7f57a055fe959fcce32e0d819c82327360cb9f06 Mon Sep 17 00:00:00 2001 From: Vladimir Gorej Date: Tue, 31 Jan 2017 20:53:01 +0100 Subject: [PATCH 3/3] test(lens): add viewOr into test case description --- test/test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test.js b/test/test.js index fec128b..446422f 100644 --- a/test/test.js +++ b/test/test.js @@ -39,7 +39,7 @@ describe("Lenses", function() { const zip = lensProp('zip') - describe("Set/View/Over/LensEq/LensSatisfies", function() { + describe("Set/View/ViewOr/Over/LensEq/LensSatisfies", function() { const firstStreet = compose(_0, addresses, _0, street) it('gets the value', function() {