microsoft/Terminal
Ver no GitHub`til::coalesce<T>` should be able to take a function that returns `T`
Open
#15.940 aberto em 7 de set. de 2023
Area-CodeHealthHelp WantedIssue-TaskProduct-Meta
Métricas do repositório
- Stars
- (35.764 stars)
- Métricas de merge de PR
- (Mesclagem média 27d 19h) (24 fundiu PRs em 30d)
Description
From a teams chat
example 1
int Foo() {...}
optional<int> whatever { /*...*/ };
...
int a = til::coalese(whatever, Foo)
Foo only gets called if whatever is empty.
example 2
class Foo{
optional<int> _cached;
int GetThing();
int _generate();
}
int Foo::GetThing()
{
_cached = coalesce(_cached, [&](){ return _generate(); });
return _cached;
}
int Foo::_generate() { /*...*/ }
Look ma, now it's easy to implement lazy properties. So easy in fact...
example 3 - til::lazy_property<T>
class Foo {
til::lazy_property<int> Thing { { this, &Foo::_generate } }; // same syntax as winrt event handlers
int _generate();
}
// ...
Foo foo{};
int x = foo.Thing(); // Calls _generate
int y = foo.Thing(); // Doesn't
foo.Thing.invalidate();
int z = foo.Thing(); // calls generate again
(maybe we don't do this one. Seems like it's potentially footgun-y)
This is a truly one of the ideas I had while working on Profile::EvaluatedIcon in #15843