LoginSignup
3
2

More than 5 years have passed since last update.

リアクティブ進捗どうですか

Posted at

進捗ストリームを受け取り、
完成したら煽ってくる進捗ストリームに変換して返す。
なるべくIO<T>以外は使わない方針で作成。

static IObservable<string> HowIsTheProgress(IObservable<string> source, string[] words)
{
    var _source = Observable.Repeat("_", words.Length)
        .Concat(source)
        .Buffer(words.Length + 1, 1);

    var word = _source
        .TakeWhile(xs => !xs.Take(words.Length).SequenceEqual(words))
        .Select(xs => xs.Last());

    var count = word
        .Count()
        .SkipUntil(_source.SkipWhile(xs => xs.Take(words.Length).SequenceEqual(words)))
        .Select(x => $"???\n{x}文字で煽られました").Take(1);

    return word.Merge(count);
}
var words = new[] { "進捗", "どう", "です", "か" };
var random = new Random();
var dummy = new object();
var source =
    Observable.Repeat(dummy).Select(_ => words[random.Next(0, words.Length)])
    .Publish().RefCount();

//var source = new Subject<string>(); //デバッグ用

HowIsTheProgress(source, words).Subscribe(x => Console.Write(x));

//source.OnNext(words[0]);//1
//source.OnNext(words[0]);//2
//source.OnNext(words[0]);//3
//source.OnNext(words[1]);//4
//source.OnNext(words[2]);//5
//source.OnNext(words[3]);//6
//source.OnNext(words[0]);
//source.OnNext(words[1]);
//source.OnNext(words[2]);
//source.OnNext(words[3]);
どうですですですどうです進捗進捗かですかかどうどうですどうかどう進捗進捗どうですどうですどうどう進捗進捗進捗か進捗進捗進捗進捗ですかどうどう進捗ですかかか進捗進捗進捗ですか進捗かか進捗進捗どうどうかどう進捗どうかです進捗進捗進捗ですですです進捗ですか進捗どうどうです進捗どうか進捗ですどうですどうかどうか進捗進捗ですかかですどう進捗進捗進捗ですかかですどうどうです進捗どうですですですどうどうか進捗進捗どう進捗どう進捗どうか進捗どうですか???
122文字で煽られました
3
2
0

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
3
2