進捗ストリームを受け取り、
完成したら煽ってくる進捗ストリームに変換して返す。
なるべく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文字で煽られました