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
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 <toad3k@gmail.com> schrieb am Di., 20. Dez. 2016 um 16:59 Uhr:
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 <edwards.benj@gmail.com> 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 <jan.loewenstein@gmail.com> 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.