I was looking at this in the Dotty 0.14.0-RC1 release notes. It’s very cool! I see some room for improvement there and this seemed like a good place to put my suggestion.
implied arrayOps {
inline def (arr: IArray[T]) apply[T] (n: Int): T = (arr: Array[T]).apply(n)
inline def (arr: IArray[T]) length[T] : Int = (arr: Array[T]).length
}
Having to repeat inline def (arr: IArray[T]) makes the above more cumbersome than AnyVal. I understand that IArray methods must be implemented as statics to avoid boxing, but defining them in the companion object doesn’t seem strictly necessary. There should be a way to add a bunch of methods at the same time. Also maybe take advantage of export ? I’m thinking that since an instance of IArray must be an Array, define IArray's methods in the type declaration, and use this for the instance.
opaque type IArray[T] = Array[T] {
def apply(n: Int): T = this.apply(n)
def length: Int = this.length
}
or
opaque type IArray[T] = Array[T] {
export this.{apply, length}
}