microsoft/Terminal

`til::coalesce<T>` should be able to take a function that returns `T`

Open

#15.940 aberto em 7 de set. de 2023

Ver no GitHub
 (1 comment) (0 reactions) (0 assignees)C++ (3.212 forks)batch import
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

Guia do colaborador