- Avoid overcategorization
That’s a good rule. It’s not tautological, any more than “avoid overeating” is. Categorization for the sake of categorization is not helpful, we don’t want std.data.dense.ArrayList, and that sort of ontological exuberance has been seen in the wild before.
Is categorization. The only thing linked_list is doing is putting two disparate data structures into the same category. Which is good! (LinkedList(Single|Double is not so completion-friendly, but the ‘most idiomatic’ ones are).
I think a std.map is worth considering on that basis. Probably not a std.list.array.ArrayList and a std.list.linked.Single though. My sense is that what you mean by “avoid categorization” is that doing taxonomy for its own sake ends up with a deep tree, and we should prefer shallow ones.
What I’m gesturing at with respect to std.Thread is that it conflates a category (things which pertain to threads) with the type-case of that category, Thread. I think the redundancy of having a std.thread.Thread is worth the clarity of not having a std.Thread.Mutex, when a Thread neither takes a Mutex as an argument, nor returns one.
It could also be std.Thread, and std.thread.Mutex. That might end up confusing, but then again maybe not.
I don’t think the recent trend of putting everything which makes use of an interface, within the type of that interface, is bad at all, organizationally speaking. It retains the problem that when looking at the home page of std, it’s not clear which capital letters have “goodies” in them, and which are just types you can do stuff with.
One way around that is to have fewer capital letters straight off of std.