Hey all! Tiny tweak proposed for a simple feature:
Today we can use struct/0 in typespecs, which expands to
%{:__struct__ => atom(), optional(atom()) => any()}
I ran into a position today where it'd be handy to furnish the generic struct spec with fields, à la struct/1, so that you can write:
struct(foo: [atom])
which would expand into:
%{:__struct__ => atom(), :foo => [atom()], optional(atom()) => any()}
I can think of several times past when I would have used this feature; particularly within libraries that for whatever reason have macros that define new structs, all having standard fields. In those contexts it would be nice to instrument its own functions with typespecs that specify they accept *any* struct with the correct fields.
You can just write the manual %{:__struct__ => atom(), fields...} yourself today, but I assume the the point of the zero-arity built-in was to avoid the need to exposing the internal guts of a struct.
Currently none of the built-in typespec shortcuts accept arguments--they're all zero-arity. I assume historically this was to make them look more like syntax than function calls. However, now that appending parenthesis() is the norm, this effect is sort of ruined and we might as well put those parenthesis to work! I can think of other potentially useful parameterizations of the built-in typespec shortcuts but this one in particular is something I've frequently found myself wanting, rather than just inventing it for fun.
Cheers,
Chris K