On Monday, 11 July 2022 at 03:17:33 UTC, anonymouse wrote:
> On Sunday, 10 July 2022 at 18:31:46 UTC, drug007 wrote:
> I'd like to say that using of exception to break loop is really bad. Exception is exceptional thing but in the case above the exception is ordinary completion of the loop happens on regular basis. Don't do that.
Thanks for the advice. Lesson learned.
--anonymouse
Oh, sorry. I didn't defend the code in any way because I assumed that the exceptional design would be seen as obviously bad (and that someone else would dig harder in order to find a better solution).
The TypeInfo_Array fix breaks the last assertion of those unit tests, though. This works:
import std.variant : Variant;
size_t[] shape(Variant v) {
size_t[] s;
while (cast(TypeInfo_Array) v.type !is null && v.length > 0) {
Variant elem = v[0];
s ~= v.length;
v = elem;
}
return s;
}
Although, that last assertion really is debatable. Languages like APL would read it as having a shape of [2, 0]:
import std.variant : Variant;
size_t[] shape(Variant v) {
size_t[] s;
while (cast(TypeInfo_Array) v.type !is null) {
s ~= v.length;
if (!v.length) break;
v = v[0];
}
return s;
}
unittest {
assert([3, 1] == [[1], [2], [3]].Variant.shape);
assert([2, 1] == [[1], [2]].Variant.shape);
assert([2, 2] == [[1, 0], [2, 0]].Variant.shape);
assert([2] == [1, 2].Variant.shape);
assert([] == 2.Variant.shape);
assert([2, 0] == [[], []].Variant.shape);
// irregularity not checked
assert([2, 2] == [[1, 0], [2]].Variant.shape);
}