Formerly, when a self-reference like `self(Tuple<number>)` was encountered,
but the `Tuple<number>` instance of a `Tuple<T>` implementation for this
operation had not yet been instantiated, the reference would be fulfilled
with a call to the catchall implementation for `Tuple`. Now the
necessary instance is instantiated on the spot and referred to instead.
This change is used to complete return-type specification for all of the
Tuple functions.
Typed-function's sort order/matching algorithm was interfering with
template resolution. This commit solves the difficulty by moving the
"catchall" implementations that implement generation of new template
instances into a separate "fallback" typed-function universe, so that
Pocomath can control exactly when that is searched.
Removes a couple of the matching anomalies already noted in the tests.
Also extends return types to somewhat more functions.
These changes greatly increased the need for precision in generating
implementations for signatures of operations whenever possible. So this
commit also includes a refactor that basically caches all of the
conversions of Pocomath implementations to typed-function implementatios so
that they are more often externally available (i.e., not disrupted so much
after invalidation).
Also changed the notation for an upper bound template to the more
readable 'T:number' (instead of 'T (= number', which was supposed to
look like the non-strict subset relation).
This feature helps specify the return type of implementations where
the return type depends on the exact subtype that the implementation
was called with, such as negate.
With this commit, there's a rudimentary function that attaches return-type
information, so it can be supplied, and PocomathInstance then proceeds
to check for it everywhere necessary (and supply it in all the internal
operations it builds). But so far in all of those place where it's checked
for, it's just ignored.
I think the next step will be just to put the return type info as a property
on the function itself. That should actually ease all of the code.