Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Possible optimisation for chain of mutations? #7

Open
SuddenGunter opened this issue Sep 17, 2018 · 10 comments
Open

Possible optimisation for chain of mutations? #7

SuddenGunter opened this issue Sep 17, 2018 · 10 comments

Comments

@SuddenGunter
Copy link

SuddenGunter commented Sep 17, 2018

If we need to apply several mutations one by one to an entity and we don't need any intermediate
results, it would be good if we can achieve it by creating only 1 new instance of entity:
Now:

            var tempDevice = _remute.With(deviceRecord, x => x.EndpointArn, endpointArn);
            var updatedDevice = _remute.With(tempDevice, x => x.DeviceName, deviceName);

Want to:

            var updatedDevice = _remute.With(deviceRecord, x => x.EndpointArn,   endpointArn)   
                                    .With(x => x.DeviceName, deviceName);
@ababik
Copy link
Owner

ababik commented Sep 18, 2018

@SuddenGunter thanks for posting this.
It's implemented as an extension method in 1.0.5.
You can do something like this

using Remutable.Extensions;
...

var employee = new Employee(Guid.NewGuid(), "Joe", "Doe");

var actual = employee
    .Remute(x => x.FirstName, "Foo")
    .Remute(x => x.LastName, "Bar");

Assert.AreEqual("Foo", actual.FirstName);
Assert.AreEqual("Bar", actual.LastName);

@ababik ababik closed this as completed Sep 18, 2018
@SuddenGunter
Copy link
Author

@ababik, thank you!

var actual = employee
    .Remute(x => x.FirstName, "Foo")
    .Remute(x => x.LastName, "Bar");

after calling this - how many employee were actually allocated in memory?
2 (employee and actual) or 3 (+intermediate Remute call)?

@ababik
Copy link
Owner

ababik commented Sep 18, 2018

@SuddenGunter
3 (+intermediate Remute call)
Extension method is just sugar syntax. Take a look at https://github.com/ababik/Remute/blob/master/Remute/Extensions/ExtensionMethods.cs for details.

@SuddenGunter
Copy link
Author

But is there some possible "magic" that we can use to make it 2? :)
even if we do .with().with().with() etc

@ababik
Copy link
Owner

ababik commented Sep 19, 2018

It's doable.
Can you explain me your use-case a little? Are your instances local variables? Do you modify them in a loop? Do you use Mono?
I don't experience any memory issues in my use-cases. Garbage collector does its job well.

@SuddenGunter
Copy link
Author

SuddenGunter commented Sep 20, 2018

Just local variables, small services on .Net Core in docker. It would be ok?

@ababik
Copy link
Owner

ababik commented Sep 20, 2018

Absolutely.

@mmalek06
Copy link

Hi @ababik ,
Any news on @SuddenGunter suggestions? Even though garbage collector does its job well, it could be beneficial not to create a whole bunch of intermediate objects in high-data-volume scenarios. I think Immutable.Net has this notion of builders to address this exact issue, though their code is much more cumbersome to use in other scenarios than yours.

@ababik
Copy link
Owner

ababik commented Jun 16, 2020

@mmalek06
Thanks for the inquiry. This feature is number one in the list. Hope to get it available asap.

@ababik
Copy link
Owner

ababik commented Jun 17, 2020

Just for the context: there is a bit of complexity for this feature because remute supports nested "mutations". E.g instance.Remute(x => x.Prop1.Prop2.Prop3, value)

@ababik ababik reopened this Jun 17, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants