lodash like utility/algorithms library for D

aliak something at something.com
Mon Oct 1 11:22:29 UTC 2018


On Monday, 1 October 2018 at 00:51:24 UTC, Paul Backus wrote:
> On Sunday, 30 September 2018 at 22:17:05 UTC, aliak wrote:
>> On Saturday, 29 September 2018 at 19:27:29 UTC, Paul Backus 
>> wrote:
>>> I agree that this is useful, but why not just return a naked 
>>> `SumType!(string, JSONError)` in that case? Is there some 
>>> additional value added by the `Expect` wrapper that I'm not 
>>> seeing?
>>
>> That's an option as well I guess. But then you'd need to rely 
>> on convention and you couldn't do SumType!(int, int) f(), and 
>> Expect also gives you some more purposeful APIs that makes the 
>> code's intent clear. Plus I'm considering range behavior as 
>> well.
>
> Is being able to write `Expect!(int, int)` actually desirable, 
> though? It seems to me like being forced to write something 
> like `SumType!(int, ErrorCode)` to distinguish the two cases 
> would be a good thing, even if ErrorCode itself is just a 
> renamed int (e.g., `struct ErrorCode { int code; alias code 
> this; }`).

Hard to say, I would try to avoid it if possible, but why should 
it not be allowed if someone wants it? For now it feels like an 
opinionated restriction that I think is better left out of 
generic code when possible - at least for now. If it turns out 
otherwise I'll change it - this is all still quite experimental 
in me head.

Using SumType to denote success and failure would be more of a 
convention though and would make for more "huh?" moments for 
readability/maintainability, IMO. I like typing intents.

And being able to add an "alias this" in Expect for e.g. might be 
nice. Or if I want to add a "make match has exactly two handlers" 
so that you have to handle both cases would also be a plus.


>
> I guess you could argue that `return 
> typeof(return).unexpected(...)` is better than `return 
> typeof(return)(ErrorCode(...))`, which is what you'd get with 
> SumType, but they look equally ugly to me. What's really needed 
> to make that look nice is implicit constructors.

*nods*

>
> Treating an Expect as a range basically turns it into an 
> Optional, in the sense that it collapses any error information 
> it contains down to the boolean of empty vs not-empty. In fact, 
> probably the easiest way to add range behavior to Expect would 
> be to add a method that returns an Optional containing the 
> expected value, since Optional already has range behavior.
>

Good point. Agreed!

>> Could you also return a union voldermort type then instead of 
>> a SumType?
>
> Raw unions in D are horrifically unsafe, so I wouldn't 
> recommend it. If you want a voldemort SumType, you can get one 
> like this:
>
> auto f()
> {
>     struct Result { SumType(T, U) data; alias data this; }
>     return Result(...);
> }



More information about the Digitalmars-d-announce mailing list