Onur Gumus
Onur Gumus

Reputation: 1439

How to deal with overlapping streams for reactive extensions?

Suppose I have a series of like this:

X - X - A - B - C - X - X

I am interested in two events:

1-) if A - B - C occurs sequentially.

2-) if B - C occurs sequentially AND if A - B - C does not occur.

Accordingly I will subscribe.

For example if A - B - C occurs I will print only ABC but not BC, whereas if X - B - C occurs then I will print BC. How can I do this ?

Upvotes: 0

Views: 57

Answers (1)

Enigmativity
Enigmativity

Reputation: 117027

If your source is IObservable<char> then try these:

IObservable<string> query1 =
    source
        .Publish(ss =>
            ss
                .Zip(ss.Skip(1), (s0, s1) => new { s0, s1 })
                .Zip(ss.Skip(2), (s01, s2) => new { s01.s0, s01.s1, s2 }))
        .Where(s => s.s0 == 'A' && s.s1 == 'B' & s.s2 == 'C')
        .Select(s => String.Join("", s.s0, s.s1, s.s2));

IObservable<string> query2 =
    source
        .Publish(ss =>
            ss
                .Zip(ss.Skip(1), (s0, s1) => new { s0, s1 })
                .Zip(ss.Skip(2), (s01, s2) => new { s01.s0, s01.s1, s2 }))
        .Where(s => s.s0 != 'A' && s.s1 == 'B' & s.s2 == 'C')
        .Select(s => String.Join("", s.s1, s.s2));  

Upvotes: 2

Related Questions