{"action":"created","issue":{"url":"https://api.github.com/repos/AArnott/ImmutableObjectGraph/issues/111","repository_url":"https://api.github.com/repos/AArnott/ImmutableObjectGraph","labels_url":"https://api.github.com/repos/AArnott/ImmutableObjectGraph/issues/111/labels{/name}","comments_url":"https://api.github.com/repos/AArnott/ImmutableObjectGraph/issues/111/comments","events_url":"https://api.github.com/repos/AArnott/ImmutableObjectGraph/issues/111/events","html_url":"https://github.com/AArnott/ImmutableObjectGraph/issues/111","id":371139679,"node_id":"MDU6SXNzdWUzNzExMzk2Nzk=","number":111,"title":"Bi-direction relationships a'la Roslyn Red/Green trees","user":{"login":"nathanwinder","id":3843271,"node_id":"MDQ6VXNlcjM4NDMyNzE=","avatar_url":"https://avatars0.githubusercontent.com/u/3843271?v=4","gravatar_id":"","url":"https://api.github.com/users/nathanwinder","html_url":"https://github.com/nathanwinder","followers_url":"https://api.github.com/users/nathanwinder/followers","following_url":"https://api.github.com/users/nathanwinder/following{/other_user}","gists_url":"https://api.github.com/users/nathanwinder/gists{/gist_id}","starred_url":"https://api.github.com/users/nathanwinder/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nathanwinder/subscriptions","organizations_url":"https://api.github.com/users/nathanwinder/orgs","repos_url":"https://api.github.com/users/nathanwinder/repos","events_url":"https://api.github.com/users/nathanwinder/events{/privacy}","received_events_url":"https://api.github.com/users/nathanwinder/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2018-10-17T15:34:22Z","updated_at":"2018-11-17T04:45:58Z","closed_at":null,"author_association":"NONE","body":"This is a pretty big feature. Is this something you would consider? I've spent a fair amount of time studying the implementation and reproducing more generic versions of it and would be willing to make some contributions if this is a direction the project is heading."},"comment":{"url":"https://api.github.com/repos/AArnott/ImmutableObjectGraph/issues/comments/439587918","html_url":"https://github.com/AArnott/ImmutableObjectGraph/issues/111#issuecomment-439587918","issue_url":"https://api.github.com/repos/AArnott/ImmutableObjectGraph/issues/111","id":439587918,"node_id":"MDEyOklzc3VlQ29tbWVudDQzOTU4NzkxOA==","user":{"login":"nathanwinder","id":3843271,"node_id":"MDQ6VXNlcjM4NDMyNzE=","avatar_url":"https://avatars0.githubusercontent.com/u/3843271?v=4","gravatar_id":"","url":"https://api.github.com/users/nathanwinder","html_url":"https://github.com/nathanwinder","followers_url":"https://api.github.com/users/nathanwinder/followers","following_url":"https://api.github.com/users/nathanwinder/following{/other_user}","gists_url":"https://api.github.com/users/nathanwinder/gists{/gist_id}","starred_url":"https://api.github.com/users/nathanwinder/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nathanwinder/subscriptions","organizations_url":"https://api.github.com/users/nathanwinder/orgs","repos_url":"https://api.github.com/users/nathanwinder/repos","events_url":"https://api.github.com/users/nathanwinder/events{/privacy}","received_events_url":"https://api.github.com/users/nathanwinder/received_events","type":"User","site_admin":false},"created_at":"2018-11-17T04:45:58Z","updated_at":"2018-11-17T04:45:58Z","author_association":"NONE","body":"Ok, so if I'm following this correctly all ancestor access is relative a common ancestor or \"root\". Rooting a node makes that node the common ancestor \"embedding\" it so that you can traverse down and back up without having to maintain a reference to the root. But traversing the ancestors is computationally \"heavy\" as it either descends the tree from the root or uses the roots look-up table. To reduce the computational load you probably want to scope operations by Rooting at an appropriate level in the tree to avoid scanning a huge tree if you only need to manage a small scope. You use WithRoot to move the scope back to a broader or original root scope. Any time a rooted node is mutated the \"Red\" spine is rebuilt for you so you don't have to manage the unzip/rezip of the ancestors. You can then use the Root property to get to the new root. You have to ability to move back and forth between rooted and un-rooted depending on the operations you are performing and how you want them to affect the tree. This requires that the developer have a pretty solid grasp on the impact of operations in these two modes to get the best performance and use out of the pattern. Probably a bit too much power for the average .NET developer. Is my assessment of this implementation correct?"}}
{"actor":{"display_login":"nathanwinder"}}