Return explicitly "empty" MapResult (fail-fast)
kdevel
kdevel at vogtner.de
Wed Jan 28 08:37:52 UTC 2026
On Tuesday, 27 January 2026 at 02:05:45 UTC, Ali Çehreli wrote:
> On 1/1/26 9:01 AM, zhade wrote:
>> Hi, I am trying to fail-fast and need to return "something"
>> that works together with MapResult.
>
> A method I used in the past is to put the entire
> range-generating code inside a function that has a default
> argument (makeRange below):
Why put that code in a /nested/ function (template)?
> auto example_func(bool fail)
> {
> alias filterFunc = a => a != "expensive";
> alias mapFunc = a => tuple!("value", "numLetters")(a,
> a.length);
>
> auto makeRange(R)(R r =
> typeof(someExpensiveOperation()).init) {
> return r
> .filter!filterFunc
> .map!mapFunc;
> }
>
> if (fail)
> {
> return makeRange();
> }
>
> auto list = someExpensiveOperation();
>
> return makeRange(list);
> }
> makeRange need not be a template but the code is a little
> cleaner when it is.
Would it not be even cleaner with less indentation, less ifs and
less
functions?:
auto example_func (bool fail)
{
alias filterFunc = a => a != "expensive";
alias mapFunc = a => tuple!("value", "numLetters")(a,
a.length);
auto list = fail
? null // []
: someExpensiveOperation();
return list
.filter!filterFunc
.map!mapFunc;
}
BTW: The OP mentioned the notion of "fail fast". example_func is
not
fail fast. It fails fast if it immediately throws:
auto example_func (bool fail)
{
enforce (! fail, "oh no, failing...");
alias filterFunc = a => a != "expensive";
alias mapFunc = a => tuple!("value", "numLetters")(a,
a.length);
return someExpensiveOperation()
.filter!filterFunc
.map!mapFunc;
}
More information about the Digitalmars-d-learn
mailing list