簡単なリアクティブシーケンス

そうだ、Reactive Programmingをやろう。

(Functional) Reactive Programmingの概要

Reactive Programmingは、変数を「時間とともに変化する値」、イベントを「時間と値の組からなる無限リスト」ととらえるプログラミング手法です。

この変数のとらえ方により、GUIのいろいろなテキストを、他の値に連動して変化させることができます。Excelの計算式みたいなものです。

このイベントのとらえ方により、GoFのObserverパターンのコールバック関数を、リスト処理へと変貌させられます。

簡単なリアクティブシーケンスクラスの実装

イベントのとらえ方は、その実装とは直結しなくていいと思うので、時間は無視して作ります。とりあえずforeachだけ作ると、こんな感じになります。

#include <iostream>
#include <functional>
#include <utility>

template <class T>
class reactive_sequence {
    std::function<void(T)> f_;
public:
    template <class F>
    void foreach(F f)
    {
        f_ = f;
    }

    void reaction(const T& arg)
    {
        f_(arg);
    }
};

using Point = std::pair<int, int>;
reactive_sequence<Point> seq;

void click_event(Point p)
{
    seq.reaction(p);
}

void print_ln(Point p)
{
    std::cout << p.first << ',' << p.second << std::endl;
}

int main()
{
    // イベントが発生したときのハンドラ
    seq.foreach([](Point p) { print_ln(p); });

    // イベント起動
    click_event({2, 3});
}

出力:

2,3 

次は、mapfilterあたりを作ろうと思います。それを作れば、これが有用だということがある程度わかると思います。

参照