Comments (7)
Yes, the documentation could be clarified here. The template for L.pick
cannot directly be a nested object. However, you can do nested things by nesting optics. For example (see in playground):
let obj = {meta: {file: "./foo.txt", base: "foo", ext: "txt"}}
L.get(L.pick({meta: ["meta", L.props("file", "ext")]}), obj)
Don't have time to think this through right now, but there might be ways to allow for some form of nested version of L.props
to make this kind of usage nicer.
from partial.lenses.
Here is a kind of nested cross of L.pick
and L.props
(try in playground):
let obj = {meta: {file: "./foo.txt", base: "foo", ext: "txt"}}
const nested = t => (I.isObject(t)
? L.pick(L.modify(L.values, (v, k) => [k, nested(v)], t))
: t)
L.get(nested({meta: {file: [], ext: []}}), obj)
You can give it an arbitrary nested template of (plain) objects whose leaf props must be lenses.
Does this seem like what you'd want and what would be a good name for this? L.pickNested
? L.pickIn
?
from partial.lenses.
Wow, recursive lensing :)
I'm getting
Error: partial.lenses:
pick
expects a plain Object template.
with the last Partial.Lenses version available. Unpublished update to L.pick
?
from partial.lenses.
Hmm... Note that the isObject
predicate from the infestines
library basically tests that the constructor of the given value is Object
. IOW, it doesn't just test that the given value inherits from Object.
from partial.lenses.
BTW, thanks for opening this issue! I have to think about generalizing L.branch
and L.pick
(to accept nested templates) and possibly adding the new L.pickIn
(aka nested
above).
Here is a generalized (nested) branch
combinator (try in playground):
const branch = t => I.isObject(t) ? L.branch(L.modify(L.values, branch, t)) : t
L.modify(branch({x: {a: []}, y: {b: []}}),
R.negate,
{x: {a: 1, b: 2}, y: {a: 3, b: 4}})
Here is a generalized (nested) pick
combinator (try in playground):
const pick = t => I.isObject(t) ? L.pick(L.modify(L.values, pick, t)) : t
const data = {s: 1, t: 1}
const lens = pick({x: {a: "s"}, y: {b: "t"}})
R.identity({
get: L.get(lens, data),
set: L.set(lens, {x: {a: 1}, y: {b: 2}}, data)
})
Here is also the (newly proposed) generalized pickIn
combinator (try in playground):
let obj = {meta: {file: "./foo.txt", base: "foo", ext: "txt"}}
const pickIn = t => (I.isObject(t)
? L.pick(L.modify(L.values, (v, k) => [k, pickIn(v)], t))
: t)
L.get(pickIn({meta: {file: [], ext: []}}), obj)
BTW, I believe it is also time to seriously think about obsoleting L.augment
(this has been on my mind for some time already).
from partial.lenses.
Hi, Vesa. Sorry for not participating – mad months at work :(
pickIn
looks like a reasonable solution.
from partial.lenses.
No problem. I was also just on a tightly scheduled project and finally got some time & energy to finish the initial pickIn
implementation. Thanks for opening the issue!
from partial.lenses.
Related Issues (20)
- Error with react native HOT 3
- Add Node compatible `L.querystring` isomorphism
- Optic doesn't support Symbol. HOT 8
- Consider adding more parsing + stringifying combinators or a separate library
- Consider adding support for Maps and Sets
- Consider adding support for splitting an object into disjoint subsets of keys HOT 1
- Change `L.removable` Take a Predicate? HOT 3
- Consider adding `disperse` operation and `partsOf` lens constructor
- Isomorphism in L.array called with undefined HOT 2
- Index isomorphism HOT 5
- Great Work 👍 Thank you (No issue) HOT 5
- Dealing with exceptions?
- I'd like to L.traverse an object HOT 4
- Usage with JSON Patching? HOT 3
- Add example exercise answers to wiki? HOT 4
- Nested matches for L.satisfying HOT 2
- Branches Does not preserve order HOT 2
- Modifying a nested data structure? HOT 12
- `L.get` has unexpected behavior HOT 2
- Does not works with Modules object
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from partial.lenses.