MonadCancel
概要
以下の効果を付与する型クラス
実行のキャンセルと
キャンセル不可能なアクション
リソース安全のために必要
モナド的なthrow,try-catch-finally
条件
uncancelable
def uncancelable[A](body: Poll[F] => F[A]): F[A]
pollで囲まれた部分のみがキャンセル可能になる
pollingしてキャンセルを観測する、みたいなイメージかな
code:scala
// fbアクションのみがキャンセル可能
F.uncancelable { poll =>
fa *> poll(fb) *> fc
}
forceR
def forceR[A, B](fa: F[A])(fb: F[B]): F[B]
キャンセルは受け付ける
強制的に値を入れ替えるという感じ
canceled
def canceled: F[Unit]
セルフキャンセルできる
code:scala
F.uncancelable { _ =>
F.canceled *> fa
} *> fb
faは実行されるが、fbは実行されない
onCancel
cancelationが観測された時に呼び出されるfinalizer
Finalizersの実行は必ず一回実行されて、uncancelableである
def onCancel[A](fa: F[A], fin: F[Unit]): F[A]