F# と Sodium でリアクティブ・プログラミング(1)
F# 向けのリアクティブ・ブログラミングには SodiumFRP.FSharp パッケージが利用できます。
Sodium においては、GUI のボタンクリックイベントやキーボードによるキー入力など何であれ、そういったイベント群をストリーム(Stream<'a>
型)上に並べたデータ群として扱います。
SodiumFRP.FSharp では、イベント処理を、静的な F# のシーケンスやリストに対する処理と同等に扱うコードが書けます。F# のパイプライン演算子も利用できるので便利です。
イベント処理結果の I/O 出力は、 Sodium ではストリームへ登録したリスナーから行います。
簡単な例として、キーボードから入力したキーコードが数字かアルファベットかを判定して、判定結果を文字列としてコンソールに出力するコードを書いてみます。(数字とアルファベット以外のキー入力は無視します。 Esc キーを押せばアプリケーションを終了します。)
ソースコード
6行目:イベント送信可能なストリームとしてStreamSink<ConsoleKeyInfo>
を作成します。(StreamSink<'a>
はStream<'a>
の派生型です。)
7~16行目:ConsoleKeyInfo
型のデータのうち、数字とアルファベット入力だけを有効なイベントとして選抜し、イベントが運搬するデータ(ConsoleKeyInfo
型)を表示用文字列(string
型)に変換する新たなストリーム(Stream<'string>
型)を作成します。
Stream<string option>
に対する filterOptional
のフィルタ処理(16行目)ではNone
以外の値を選抜し、string option
からstring
へ型変換してイベントを通過させています。
18~20行目:sStrOutput
用のリスナー(IStrongListener
型)を作成します。listenS
で、イベントデータを受け取って処理する関数を登録します。(ここでは文字列をコンソール出力する関数を登録しています)
22~24行目:キー入力イベント群を表す無限長のシーケンス(ConsoleKeyInfo seq
型)を作成しています。Escキー入力が来るまで無限にキー入力を受け入れます。
24行目のsendS
関数によってイベントを発生させてConsoleKeyInfo
型のデータを送信しています。
26行目:20行目でsStrOutput
へ登録したリスナーを登録解除します。
※ソースコードはGitHubで公開しています
●概念図
《参考資料》