まずgithubのURL
https://github.com/xuwei-k/iarray
setup方法はgithubのREADME参照
ちなみに、以前作ったものは以下を参照してください。
primitive型のArrayのwrapper
自作のnoboxというライブラリの現状報告
scala.collection.mutable.ArrayOpsの遅さ
noboxと似たようなImmutableなArrayのラッパーだけど、また別のもの作りました。
設計思想、狙いとしては
- Arrayは、通常生成にClassTag必要
- なので、普通の方法ではscalaz.Functorにできない
- boxingの回避を諦めて、内部的にArray[AnyRef]で保持すれば、ClassTag使わなくて済むのでは?
で、それをやってみたらできたので作りました。つまり、以前作ったnoboxは
「抽象化は犠牲にして、とにかくコード生成という力技により大量にメソッド作成し、極力Boxingを避ける手段を提供する」
のが狙いでしたが、今回作ったIArrayは
「プリミティブ型のBoxingは許容する代わりに、ClassTag不要 => scalazのtypeclassのインスタンスにできる、という利点を優先した」
というライブラリです。
ただ、できるだけ効率よくできるところは、ひたすらwhileループで頑張ってたり、java.lang.System.arraycopyを使ってたりするので、プリミティブ以外の場合は*1おそらく標準ライブラリのArrayOpsなどよりは基本速いはずです。
これ書いてる時点では、まだ最初のversionをリリースしたばかりで、メソッド名の規則が微妙なのでそのあたり変わるかもしれません。
noboxのときと同じように、作るのが楽しかっただけで、長期的にメンテするのかどうかは未定です。
あと、現在Scalaz7.1.xに直接依存してますが、そのあたりもどうしようかな・・・(直接依存やめるか、7.0.x系と互換性あるものも作るか、など)
*1:場合によってはプリミティブの場合も