LoginSignup
0
0

More than 5 years have passed since last update.

ReactiveなLINQで点滅動作を表現したい

Last updated at Posted at 2019-03-08

ランプで状態表示などするときは点滅って言うパターンが用意されることが多いです。

これを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進数での負の数の表現を知らないと分からない話なんだと気付きました。
知らないといけないのは確かですが、人間はもっと上位層だけに意識を集中したいものです。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0