ランプで状態表示などするときは点滅って言うパターンが用意されることが多いです。
これをReactiveなLINQで表現したい!!
点滅動作とは
一定期間ごとにON/OFFを繰り返す
と言うことでしょうか。
Observableで簡単に書けそうだなと思ったんですがちょっと失敗しましたのでメモ。
IntervalかTimerを使ってCountで発生回数を数えれば・・・。
と思ってましたがこれは間違い
Observable.Interval(TimeSpan.FromMilliseconds(1000))
.Count()
.Select(count => count % 2 == 0);
Countはシーケンスが終わるまで動きませんので、
IntervalではいつまでたってもCountから先に流れません(汗
これもメソッドの意味をちゃんと分かってなかったのですが、
TimerやIntervalは発生回数を引数に渡してくれるので↓で十分なのでした。
Observable.Interval(TimeSpan.FromMilliseconds(1000))
.Select(count => count % 2 == 0);//trueから開始
//Observable.Interval(TimeSpan.FromMilliseconds(1000))
// .Select(count => count % 2 == 1);//falseから開始
気になるのはこのCountがOverflowするとどうなるのか・・・?
ドキュメントが見つからず、ソースを確認
Intervalの中身はTimerでした。
ここが該当箇所でしょうか??
private void Tick()
{
var count = _index;
_index = unchecked(count + 1);
ForwardOnNext(count);
}
これだとオーバーフローして負の数になりそうな・・・・?
ただ指定できる最小単位が1msですので、オーバーフローするには最低でも292471208.67・・・年必要と言うことになります。
え?2.9億年て事?
確かにそこまでいけば気にしなくてもいいか(笑
追記
0bit目だけで判断できるのでこれでも可
Observable.Interval(TimeSpan.FromMilliseconds(1000))
.Select(count => (count & 1) == 0);//trueから開始
ところでこういうことは2進数での負の数の表現を知らないと分からない話なんだと気付きました。
知らないといけないのは確かですが、人間はもっと上位層だけに意識を集中したいものです。