これは何?
この記事は、FOLIO Advent calendar 2019 の15日目の記事です。
14日目は、yasuharu519さんの2019年発表された Datadog のプロダクトを勝手に紹介していくでした。
16日目は、ihcomegaさんの1on1は必ず議事録を残す(ときどき公開だってする)です。
併せて、Scala Advent Calendar 2019 の15日目の記事です。
14日目は、showmantさんのAkka HTTPでメンテナンス時のレスポンスを制御するでした。
16日目は、poad1010さんのScala で AWS CDK Javaを使ってみるです。
普段は、証券基盤チームの一員としてScalaを利用した基盤の開発をしています。
7月に参加してから約半年、新しい業務のドメインを学びつつ、より良いものを提供しようと日々開発に勤しんでます。
今回は、1.0.0-RC2がリリースされ、2020年の1月に正式リリースの兆しが見えてきたScala.jsと、社内でも使われている typelevel/cats が実はScala.jsでも利用できることについて紹介します。
Scala.jsについて
私がScala関西 Summit 2019にて「Scala.jsでGoogle Cloud Functionsを利用する前に知りたかったこと」というタイトルで発表した資料からいくつか抜粋しますが、以下の内容のプロダクトです。
- 普段利用しているScalaのコードが、ほぼJavaScriptへ変換出来る
- JavaScriptよりも強力に型の恩恵を受けられる
- Facadeを利用することで、npmのライブラリも導入することが出来る
いくつかsbtのプラグインをプロジェクトへ導入することで始められるのも、Scala.jsの良さだと思います。
決して万人にお勧めできるプロダクトではないですが、プロジェクトの内容によってはとても心強いプロダクトなので、試してみてはいかがでしょうか。
Scala.jsとcatsについて
catsは、typelevelの中で代表的なライブラリで、関数型プログラミングをしたい時に必要なデータ型等を提供してくれます。
実は、プロジェクトのplugins.sbtを見てみるとscala.jsのpluginが見えると思います。
Scala.jsのプロジェクトへの導入も簡単で、以下のように依存関係を記載することで利用できるようになります。
libraryDependencies ++= Seq(
"org.typelevel" %%% "cats-core" % "2.0.0"
)
catsとその仲間たち
以下に挙げるライブラリは、catsのエコシステムの中でもScala.jsに対応している数少ないライブラリの一例です。
まだ、自分が触っていないのを挙げるのは個人的によろしくないと思うので、ここに挙げた以外のも興味がありましたら、https://typelevel.org/cats/から探してみてはいかがでしょうか。
cats-effect
catsのエコシステムの中で特にIOモナドを扱っているのが、この cats effectです。
他のcatsのエコシステムのベースとなる事が多く、JavaScriptのpromiseよりも柔軟に非同期処理を扱う事が出来ます。
cats-retry
リトライ処理を組み込む際に自分で書くのは骨が折れます。その際に助けとなるのが、このcats-retryです。
リトライのPolicyを細かく設定することが出来ます。Scala.jsでも利用できるので、外部APIとの連携等でFaaSのリトライだけに頼る事なく実行できるので、呼び出し回数が多い場合は助かります。
circe
Scala.js でもJavaScriptのJSONを扱うことは出来ますが、parseしながらある一部の値を使いたい等の操作ができるので、とても重宝します。
もちろんcase classのdecode/encodeで使われることが多いので、JSONの緩い世界から強い型の世界の橋渡し役として活躍します。
refined
Scalaでもある程度強い型を定義することは出来ますが、よりDomesticな型を表現したい場合に使います。
ライブラリが標準で数字や文字列に関する定義を提供している為、組み合わせることで単なる文字列や数字以上の制約を型として表現できるようになります。circeとの組み合わせも出来るのでJSONをより安全に扱うことが出来るようになります
Monocle
単体で使うというよりもcirceと組み合わせて使うことが多いです。
特に、JSONのある項目の値を変えて扱いたいといった場合に、型の恩恵を受けたまま操作することが出来るようになります。
hammock
catsのエコシステムでもhttp clientはいくつかありますが、その中でもScala.jsで使えるのは限られています。その一つがこのhammockです。
特にcirceと組み合わせることで外部APIとの連携が型に守られたまま扱うことが出来ます。
fs2
Stream処理をしたい場合、catsのエコシステムでは、fs2を利用します。
cats effectのIOをベースにfan-in, fan-outといったStream処理特有の処理を書くことが出来ます。
Monix
fs2がStream処理で使うことが多いなら、Monixは非同期処理に使うことが多いです。
cats effectのIOベースになった上に、cats effectで非同期処理を扱うよりも簡単に、効率よく扱うことが出来ます。
特にリアクティブプログラミングに向いているため、フロントエンドでも使えるのではないかと思います。
まとめ
いかがだったでしょうか。
catsのエコシステムの広がりは、以前に比べると目を瞠るものがあります。
フロントエンドのJavaScriptもScalaのように型の恩恵を受けたまま扱いたいと思うことはあるのではないでしょうか。
その際には、Scala.jsという選択肢を考えてみるのもおもしろいかもしれません。