- なかやん・ゆーき / ぺんぎん / もみあげ
- @pocketberserker / id:pocketberserker
- 仕事でScalaを使うようになったという噂
https://github.com/scodec/scodec
バイナリデータを解析するためのコンビネータライブラリ。
下記のような制約の元、実装されている。
- プロトコル定義を書き写せる、かつ読みやすいように
- purely functionalなエンコーディング、デコーディング
- バイナリ構造から型へのマッピングは静的に検証されるべき
- コンパイラプラグインを使わない
- scodec-bits
- shapeless
- macro paradise(Scala 2.10の場合)
- 1.7.xからscalaz非依存になった
- 1.8.xからScala.jsサポート
- HList, Coproductをはじめとしたshapelessの知識
- なくても書けないことはないが、嵌ったときにつらい
- コンパイル時間
https://github.com/scodec/scodec#introduction
今回必要そうな部分のみ抜粋
import scodec._
import codecs._
case class Point(x: Int, y: Int, z: Int)
val pointCodec = (int8 :: int8 :: int8).as[Point]
https://github.com/scodec/scodec/blob/2736f9e7db81d94cb2b9256fd8958851a2266616/shared/src/main/scala/scodec/package.scala#L269 https://github.com/scodec/scodec/blob/2736f9e7db81d94cb2b9256fd8958851a2266616/shared/src/main/scala/scodec/package.scala#L130
https://github.com/pocketberserker/scodec-msgpack
- scodecを初めて触ったときに作った
- このときはshapelessの知識がほとんどなかった
- 現在の最新版ではCoproductで自動生成したりしている
- 効率とか考えていないので遅いはず(噂では100倍)