Here’s how `uarray` solves each of these issues:
- Backends… There is no default implementation.
- This is handled by (thread-safe) context managers, which make switching easy.
- There’s one coercion function per type of objec
- Libraries are only asked to dispatch over objects they know how to convert, so there’s no backwards-incompatible break when we add dtypes or ufuncs.
- Conversion can be as simple as lambda x: x.
- There’s a generic dispatcher and reverse dispatcher per function, with “marks” to indicate the type of object.
- Arrays are just one “type” of object you can dispatch over, so there’s no repition by definition.