
Thanks for looking into this. Apparently I did not yet express my question
properly.
In short:
Given a deeply nested data structure (e.g. Json with nested objects) I want
to set a leaf value without considering which parent and or sibling nodes
already exist.
More concrete, given the following Json fragment (out of a configuration
file):
"disks": {
"system": "/dev/xvda",
"ephemeral": "/dev/sdb",
"persistent": {
"<disk identifier>" : { "path" : "/container/mounted/volume" }
}
},
I want to add a persistent disk `my-disk` with a given path
`/yet/another/volume` and I don't want to handle
- there is no node 'my-disk'
- there is no node 'persistent'
- there is no node 'disks'
Given a function
defaultsToEmpty :: Maybe (Value) -> Maybe (Value)
defaultsToEmpty Nothing = Just $ Object HashMap.empty
defaultsToEmpty m = m
I can do
json & key "disks" %~ defaultsToEmpty
& key "disks".key "persistent" %~ defaultsToEmpty
& key "disks".key "persistent".key diskId %~ defaultsToEmpty
but this doesn't look nice and was wondering if lenses can do better.
David McBride
Sorry, replying to list:
Would that not just be
json & key "outer" .~ object ["inner", "new-value"]
On Tue, Dec 20, 2016 at 8:26 AM, Jan von Löwenstein < jan.loewenstein@gmail.com> wrote:
I guess I haven't explained well what I am looking for.
I want to set values deep inside a json structure, no matter if the full structure already exists.
Go into "outer", if it doesn't exist make it an empty object. From there go into "inner" and set it to "new-value".
The first part should be arbitrarily deep.
Best Jan
Benjamin Edwards
schrieb am Di., 20. Dez. 2016 um 13:42 Uhr: If the desired function doesn't inspect the input then why not just use const <<thing you want>> ?
As to the lenses part: If you use a prism and it doesn't match, then it's a noop.
On Tue, 20 Dec 2016 at 09:38 Jan von Löwenstein
wrote: Hi,
I want to have code that produces the following result no matter if input A or B was given:
Result: { "outer" : { "inner" : "new-value" } }
A: { "outer" : { "inner" : "old-value" } }
B: {}
`json & key "outer"._Object.key "inner" .~ "new-value"` didn't work.
Is what I want even possible with lenses?
Best Jan
_______________________________________________ Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe Only members subscribed via the mailman list are allowed to post.
_______________________________________________ Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe Only members subscribed via the mailman list are allowed to post.
_______________________________________________ Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe Only members subscribed via the mailman list are allowed to post.