<div dir="ltr">Thanks for looking into this. Apparently I did not yet express my question properly.<div><br></div><div>In short:</div><div>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.</div><div><br></div><div>More concrete, given the following Json fragment (out of a configuration file):</div><div><div>"disks": {</div><div>       "system": "/dev/xvda",</div><div>       "ephemeral": "/dev/sdb",</div><div>       "persistent": {</div><div>           "<disk identifier>" : { "path" : "/container/mounted/volume" }</div><div>       }</div><div>     },</div></div><div><br></div><div>I want to add a persistent disk `my-disk` with a given path `/yet/another/volume` and I don't want to handle</div><div><ul><li><font size="2">there is no node 'my-disk' </font></li><li><font size="2">there is<span class="inbox-inbox-Apple-converted-space"> </span>no node 'persistent'</font></li><li><font size="2">there is no node 'disks'</font></li></ul><div><font size="2">Given a function </font></div></div><div><font size="2"><div>  defaultsToEmpty :: Maybe (Value) -> Maybe (Value)</div><div>  defaultsToEmpty Nothing = Just $ Object HashMap.empty</div><div>  defaultsToEmpty m = m</div><div>I can do</div><div>  json & key "disks" %~ defaultsToEmpty</div><div>          &<span class="inbox-inbox-Apple-converted-space"> </span>key "disks".key "persistent" %~ defaultsToEmpty</div></font>          &<span class="inbox-inbox-inbox-inbox-Apple-converted-space" style="font-size:small"> </span><span style="font-size:small">key "disks".key "persistent".key diskId %~ defaultsToEmpty</span></div><div><font size="2">but this doesn't look nice and was wondering if lenses can do better.</font></div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">David McBride <<a href="mailto:toad3k@gmail.com">toad3k@gmail.com</a>> schrieb am Di., 20. Dez. 2016 um 16:59 Uhr:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">Sorry, replying to list:</div><div dir="ltr" class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg">Would that not just be<br class="gmail_msg"><br class="gmail_msg">json & key "outer" .~ object ["inner", "new-value"]</div><div class="gmail_extra gmail_msg"><br class="gmail_msg"><div class="gmail_quote gmail_msg">On Tue, Dec 20, 2016 at 8:26 AM, Jan von Löwenstein <span dir="ltr" class="gmail_msg"><<a href="mailto:jan.loewenstein@gmail.com" class="gmail_msg" target="_blank">jan.loewenstein@gmail.com</a>></span> wrote:<br class="gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">I guess I haven't explained well what I am looking for.<div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I want to set values deep inside a json structure, no matter if the full structure already exists.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Go into "outer", if it doesn't exist make it an empty object. </div><div class="gmail_msg">From there go into "inner" and set it to "new-value".</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">The first part should be arbitrarily deep.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Best</div><span class="m_-8181045627324967617HOEnZb gmail_msg"><font color="#888888" class="gmail_msg"><div class="gmail_msg">Jan</div></font></span></div><div class="m_-8181045627324967617HOEnZb gmail_msg"><div class="m_-8181045627324967617h5 gmail_msg"><br class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">Benjamin Edwards <<a href="mailto:edwards.benj@gmail.com" class="gmail_msg" target="_blank">edwards.benj@gmail.com</a>> schrieb am Di., 20. Dez. 2016 um 13:42 Uhr:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">If the desired function doesn't inspect the input then why not just use const <<thing you want>> ?<br class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"><br class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"></div>As to the lenses part: If you use a prism and it doesn't match, then it's a noop.<br class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"></div><br class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"><div class="gmail_quote m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"></div><div class="gmail_quote m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"><div dir="ltr" class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">On Tue, 20 Dec 2016 at 09:38 Jan von Löwenstein <<a href="mailto:jan.loewenstein@gmail.com" class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg" target="_blank">jan.loewenstein@gmail.com</a>> wrote:<br class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"></div></div><div class="gmail_quote m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"><blockquote class="gmail_quote m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">Hi,<div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"><br class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"></div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">I want to have code that produces the following result no matter if input A or B was given:</div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"><br class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"></div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">Result:</div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">{</div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">  "outer" : {</div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">                  "inner" : "new-value"</div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">                }</div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">}</div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"><br class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"></div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">A: </div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">{</div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">  "outer" : {</div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">                  "inner" : "old-value"</div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">                }</div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">}</div></div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"><br class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"></div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">B:</div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">{}</div></div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"><br class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"></div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">`json & key "outer"._Object.key "inner" .~ "new-value"` didn't work.</div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"><br class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"></div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">Is what I want even possible with lenses?</div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"><br class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"></div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">Best</div><div class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">Jan</div></div></blockquote></div><div class="gmail_quote m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg"><blockquote class="gmail_quote m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
_______________________________________________<br class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">
Haskell-Cafe mailing list<br class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">
To (un)subscribe, modify options or view archives go to:<br class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br class="m_-8181045627324967617m_-5353922401637114217gmail_msg gmail_msg">
Only members subscribed via the mailman list are allowed to post.</blockquote></div>
</blockquote></div>
</div></div><br class="gmail_msg">_______________________________________________<br class="gmail_msg">
Haskell-Cafe mailing list<br class="gmail_msg">
To (un)subscribe, modify options or view archives go to:<br class="gmail_msg">
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" class="gmail_msg" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br class="gmail_msg">
Only members subscribed via the mailman list are allowed to post.<br class="gmail_msg"></blockquote></div><br class="gmail_msg"></div>
_______________________________________________<br class="gmail_msg">
Haskell-Cafe mailing list<br class="gmail_msg">
To (un)subscribe, modify options or view archives go to:<br class="gmail_msg">
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" class="gmail_msg" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br class="gmail_msg">
Only members subscribed via the mailman list are allowed to post.</blockquote></div>