6.17 Autounravel

The autounravel modifier can be used to automatically unravel a field. This is useful when building an associated library of functions that operate on a structure. For instance, consider a simple implementation of the rational structure defined in rational.asy:

struct rational {
  int p=0, q=1;
  void operator init(int p, int q) {
    this.p=p;
    this.q=q;
  }
}
rational operator +(rational a, rational b) {
  return rational(a.p*b.q+b.p*a.q, a.q*b.q);
}

To allow rational to be used as a type parameter for a templated import that adds instances of rational, we should move operator + into the body of the rational structure and add the autounravel modifier:

struct rational {
  int p=0, q=1;
  void operator init(int p, int q) {
    this.p=p;
    this.q=q;
  }
  autounravel rational operator +(rational a, rational b) {
    return rational(a.p*b.q+b.p*a.q, a.q*b.q);
  }
}

This is almost equivalent to the previous code, but now the + operator will be accessible wherever the rational structure is.

Currently, types cannot be autounraveled. Users who encounter a case where this might be useful can submit a feature request at https://github.com/vectorgraphics/asymptote/issues.