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}
}