    "Abstract supertype of types that support scaling by a
     numeric factor. Examples of such types include vectors and
     matrices. The _scale_ operator `a ** x` accepts a scale
     factor as its first operand, and an instance of `Scalable`
     as its second operand.

         Vector scaled = 2.0 ** Vector(x,y,z);

     Concrete classes which implement this interface should
     satisfy:

     - `x == 1**x`
     - `a ** (b ** x) == a*b ** x`

     where `1` denotes the multiplicative identity of the
     numeric scaling type.

     Concrete classes which implement this interface are
     encouraged to also satisfy [[Invertible]], in which case,
     the following identity should be satisfied:

     - `-x == -1**x`

     Concrete classes which implement this interface and which
     also satisfy [[Summable]] should satisfy:

     - `x+x == 2**x`
     - `a ** (x+y) == a**x + a**y`

     The [[scaling type|Scale]] must be a [[numeric|Numeric]]
     type, but is not required to be [[Number]], since a complex
     number scaling type should be allowed."
    by ("Gavin")
    tagged("Numbers")
    shared interface Scalable<in Scale, out Value> of Value
            given Value satisfies Scalable<Scale,Value>
            given Scale satisfies Numeric<Scale> {

        "Scale this value by the given scale factor."
        shared formal Value scale(Scale scalar);

    }