IArrayという名前で、またScalaのImmutableなArrayのライブラリを作った

まず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:場合によってはプリミティブの場合も