// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. using System.Collections.Generic; namespace System.Reactive.Joins { /// /// Represents an execution plan for join patterns. /// /// The type of the results produced by the plan. public abstract class Plan { internal Plan() { } internal abstract ActivePlan Activate(Dictionary externalSubscriptions, IObserver observer, Action deactivate); internal static JoinObserver CreateObserver( Dictionary externalSubscriptions, IObservable observable, Action onError) { var observer = default(JoinObserver); var nonGeneric = default(IJoinObserver); if (!externalSubscriptions.TryGetValue(observable, out nonGeneric)) { observer = new JoinObserver(observable, onError); externalSubscriptions.Add(observable, observer); } else { observer = (JoinObserver) nonGeneric; } return observer; } } internal class Plan : Plan { internal Pattern Expression { get; private set; } internal Func Selector { get; private set; } internal Plan(Pattern expression, Func selector) { Expression = expression; Selector = selector; } internal override ActivePlan Activate(Dictionary externalSubscriptions, IObserver observer, Action deactivate) { var onError = new Action(observer.OnError); var firstJoinObserver = CreateObserver(externalSubscriptions, Expression.First, onError); var activePlan = default(ActivePlan); activePlan = new ActivePlan(firstJoinObserver, first => { var result = default(TResult); try { result = Selector(first); } catch (Exception exception) { observer.OnError(exception); return; } observer.OnNext(result); }, () => { firstJoinObserver.RemoveActivePlan(activePlan); deactivate(activePlan); }); firstJoinObserver.AddActivePlan(activePlan); return activePlan; } } internal class Plan : Plan { internal Pattern Expression { get; private set; } internal Func Selector { get; private set; } internal Plan(Pattern expression, Func selector) { Expression = expression; Selector = selector; } internal override ActivePlan Activate(Dictionary externalSubscriptions, IObserver observer, Action deactivate) { var onError = new Action(observer.OnError); var firstJoinObserver = CreateObserver(externalSubscriptions, Expression.First, onError); var secondJoinObserver = CreateObserver(externalSubscriptions, Expression.Second, onError); var activePlan = default(ActivePlan); activePlan = new ActivePlan(firstJoinObserver, secondJoinObserver, (first, second) => { var result = default(TResult); try { result = Selector(first, second); } catch (Exception exception) { observer.OnError(exception); return; } observer.OnNext(result); }, () => { firstJoinObserver.RemoveActivePlan(activePlan); secondJoinObserver.RemoveActivePlan(activePlan); deactivate(activePlan); }); firstJoinObserver.AddActivePlan(activePlan); secondJoinObserver.AddActivePlan(activePlan); return activePlan; } } internal class Plan : Plan { internal Pattern Expression { get; private set; } internal Func Selector { get; private set; } internal Plan(Pattern expression, Func selector) { Expression = expression; Selector = selector; } internal override ActivePlan Activate(Dictionary externalSubscriptions, IObserver observer, Action deactivate) { var onError = new Action(observer.OnError); var firstJoinObserver = CreateObserver(externalSubscriptions, Expression.First, onError); var secondJoinObserver = CreateObserver(externalSubscriptions, Expression.Second, onError); var thirdJoinObserver = CreateObserver(externalSubscriptions, Expression.Third, onError); var activePlan = default(ActivePlan); activePlan = new ActivePlan(firstJoinObserver, secondJoinObserver, thirdJoinObserver, (first, second, third) => { var result = default(TResult); try { result = Selector(first, second, third); } catch (Exception exception) { observer.OnError(exception); return; } observer.OnNext(result); }, () => { firstJoinObserver.RemoveActivePlan(activePlan); secondJoinObserver.RemoveActivePlan(activePlan); thirdJoinObserver.RemoveActivePlan(activePlan); deactivate(activePlan); }); firstJoinObserver.AddActivePlan(activePlan); secondJoinObserver.AddActivePlan(activePlan); thirdJoinObserver.AddActivePlan(activePlan); return activePlan; } } internal class Plan : Plan { internal Pattern Expression { get; private set; } internal Func Selector { get; private set; } internal Plan(Pattern expression, Func selector) { Expression = expression; Selector = selector; } internal override ActivePlan Activate(Dictionary externalSubscriptions, IObserver observer, Action deactivate) { var onError = new Action(observer.OnError); var firstJoinObserver = CreateObserver(externalSubscriptions, Expression.First, onError); var secondJoinObserver = CreateObserver(externalSubscriptions, Expression.Second, onError); var thirdJoinObserver = CreateObserver(externalSubscriptions, Expression.Third, onError); var fourthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fourth, onError); var activePlan = default(ActivePlan); activePlan = new ActivePlan(firstJoinObserver, secondJoinObserver, thirdJoinObserver, fourthJoinObserver, (first, second, third, fourth) => { var result = default(TResult); try { result = Selector(first, second, third, fourth); } catch (Exception exception) { observer.OnError(exception); return; } observer.OnNext(result); }, () => { firstJoinObserver.RemoveActivePlan(activePlan); secondJoinObserver.RemoveActivePlan(activePlan); thirdJoinObserver.RemoveActivePlan(activePlan); fourthJoinObserver.RemoveActivePlan(activePlan); deactivate(activePlan); }); firstJoinObserver.AddActivePlan(activePlan); secondJoinObserver.AddActivePlan(activePlan); thirdJoinObserver.AddActivePlan(activePlan); fourthJoinObserver.AddActivePlan(activePlan); return activePlan; } } #if !NO_LARGEARITY internal class Plan : Plan { internal Pattern Expression { get; private set; } internal Func Selector { get; private set; } internal Plan(Pattern expression, Func selector) { Expression = expression; Selector = selector; } internal override ActivePlan Activate(Dictionary externalSubscriptions, IObserver observer, Action deactivate) { var onError = new Action(observer.OnError); var firstJoinObserver = CreateObserver(externalSubscriptions, Expression.First, onError); var secondJoinObserver = CreateObserver(externalSubscriptions, Expression.Second, onError); var thirdJoinObserver = CreateObserver(externalSubscriptions, Expression.Third, onError); var fourthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fourth, onError); var fifthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fifth, onError); var activePlan = default(ActivePlan); activePlan = new ActivePlan(firstJoinObserver, secondJoinObserver, thirdJoinObserver, fourthJoinObserver, fifthJoinObserver, (first, second, third, fourth, fifth) => { var result = default(TResult); try { result = Selector(first, second, third, fourth, fifth); } catch (Exception exception) { observer.OnError(exception); return; } observer.OnNext(result); }, () => { firstJoinObserver.RemoveActivePlan(activePlan); secondJoinObserver.RemoveActivePlan(activePlan); thirdJoinObserver.RemoveActivePlan(activePlan); fourthJoinObserver.RemoveActivePlan(activePlan); fifthJoinObserver.RemoveActivePlan(activePlan); deactivate(activePlan); }); firstJoinObserver.AddActivePlan(activePlan); secondJoinObserver.AddActivePlan(activePlan); thirdJoinObserver.AddActivePlan(activePlan); fourthJoinObserver.AddActivePlan(activePlan); fifthJoinObserver.AddActivePlan(activePlan); return activePlan; } } internal class Plan : Plan { internal Pattern Expression { get; private set; } internal Func Selector { get; private set; } internal Plan(Pattern expression, Func selector) { Expression = expression; Selector = selector; } internal override ActivePlan Activate(Dictionary externalSubscriptions, IObserver observer, Action deactivate) { var onError = new Action(observer.OnError); var firstJoinObserver = CreateObserver(externalSubscriptions, Expression.First, onError); var secondJoinObserver = CreateObserver(externalSubscriptions, Expression.Second, onError); var thirdJoinObserver = CreateObserver(externalSubscriptions, Expression.Third, onError); var fourthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fourth, onError); var fifthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fifth, onError); var sixthJoinObserver = CreateObserver(externalSubscriptions, Expression.Sixth, onError); var activePlan = default(ActivePlan); activePlan = new ActivePlan(firstJoinObserver, secondJoinObserver, thirdJoinObserver, fourthJoinObserver, fifthJoinObserver, sixthJoinObserver, (first, second, third, fourth, fifth, sixth) => { var result = default(TResult); try { result = Selector(first, second, third, fourth, fifth, sixth); } catch (Exception exception) { observer.OnError(exception); return; } observer.OnNext(result); }, () => { firstJoinObserver.RemoveActivePlan(activePlan); secondJoinObserver.RemoveActivePlan(activePlan); thirdJoinObserver.RemoveActivePlan(activePlan); fourthJoinObserver.RemoveActivePlan(activePlan); fifthJoinObserver.RemoveActivePlan(activePlan); sixthJoinObserver.RemoveActivePlan(activePlan); deactivate(activePlan); }); firstJoinObserver.AddActivePlan(activePlan); secondJoinObserver.AddActivePlan(activePlan); thirdJoinObserver.AddActivePlan(activePlan); fourthJoinObserver.AddActivePlan(activePlan); fifthJoinObserver.AddActivePlan(activePlan); sixthJoinObserver.AddActivePlan(activePlan); return activePlan; } } internal class Plan : Plan { internal Pattern Expression { get; private set; } internal Func Selector { get; private set; } internal Plan(Pattern expression, Func selector) { Expression = expression; Selector = selector; } internal override ActivePlan Activate(Dictionary externalSubscriptions, IObserver observer, Action deactivate) { var onError = new Action(observer.OnError); var firstJoinObserver = CreateObserver(externalSubscriptions, Expression.First, onError); var secondJoinObserver = CreateObserver(externalSubscriptions, Expression.Second, onError); var thirdJoinObserver = CreateObserver(externalSubscriptions, Expression.Third, onError); var fourthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fourth, onError); var fifthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fifth, onError); var sixthJoinObserver = CreateObserver(externalSubscriptions, Expression.Sixth, onError); var seventhJoinObserver = CreateObserver(externalSubscriptions, Expression.Seventh, onError); var activePlan = default(ActivePlan); activePlan = new ActivePlan(firstJoinObserver, secondJoinObserver, thirdJoinObserver, fourthJoinObserver, fifthJoinObserver, sixthJoinObserver, seventhJoinObserver, (first, second, third, fourth, fifth, sixth, seventh) => { var result = default(TResult); try { result = Selector(first, second, third, fourth, fifth, sixth, seventh); } catch (Exception exception) { observer.OnError(exception); return; } observer.OnNext(result); }, () => { firstJoinObserver.RemoveActivePlan(activePlan); secondJoinObserver.RemoveActivePlan(activePlan); thirdJoinObserver.RemoveActivePlan(activePlan); fourthJoinObserver.RemoveActivePlan(activePlan); fifthJoinObserver.RemoveActivePlan(activePlan); sixthJoinObserver.RemoveActivePlan(activePlan); seventhJoinObserver.RemoveActivePlan(activePlan); deactivate(activePlan); }); firstJoinObserver.AddActivePlan(activePlan); secondJoinObserver.AddActivePlan(activePlan); thirdJoinObserver.AddActivePlan(activePlan); fourthJoinObserver.AddActivePlan(activePlan); fifthJoinObserver.AddActivePlan(activePlan); sixthJoinObserver.AddActivePlan(activePlan); seventhJoinObserver.AddActivePlan(activePlan); return activePlan; } } internal class Plan : Plan { internal Pattern Expression { get; private set; } internal Func Selector { get; private set; } internal Plan(Pattern expression, Func selector) { Expression = expression; Selector = selector; } internal override ActivePlan Activate(Dictionary externalSubscriptions, IObserver observer, Action deactivate) { var onError = new Action(observer.OnError); var firstJoinObserver = CreateObserver(externalSubscriptions, Expression.First, onError); var secondJoinObserver = CreateObserver(externalSubscriptions, Expression.Second, onError); var thirdJoinObserver = CreateObserver(externalSubscriptions, Expression.Third, onError); var fourthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fourth, onError); var fifthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fifth, onError); var sixthJoinObserver = CreateObserver(externalSubscriptions, Expression.Sixth, onError); var seventhJoinObserver = CreateObserver(externalSubscriptions, Expression.Seventh, onError); var eighthJoinObserver = CreateObserver(externalSubscriptions, Expression.Eighth, onError); var activePlan = default(ActivePlan); activePlan = new ActivePlan(firstJoinObserver, secondJoinObserver, thirdJoinObserver, fourthJoinObserver, fifthJoinObserver, sixthJoinObserver, seventhJoinObserver, eighthJoinObserver, (first, second, third, fourth, fifth, sixth, seventh, eighth) => { var result = default(TResult); try { result = Selector(first, second, third, fourth, fifth, sixth, seventh, eighth); } catch (Exception exception) { observer.OnError(exception); return; } observer.OnNext(result); }, () => { firstJoinObserver.RemoveActivePlan(activePlan); secondJoinObserver.RemoveActivePlan(activePlan); thirdJoinObserver.RemoveActivePlan(activePlan); fourthJoinObserver.RemoveActivePlan(activePlan); fifthJoinObserver.RemoveActivePlan(activePlan); sixthJoinObserver.RemoveActivePlan(activePlan); seventhJoinObserver.RemoveActivePlan(activePlan); eighthJoinObserver.RemoveActivePlan(activePlan); deactivate(activePlan); }); firstJoinObserver.AddActivePlan(activePlan); secondJoinObserver.AddActivePlan(activePlan); thirdJoinObserver.AddActivePlan(activePlan); fourthJoinObserver.AddActivePlan(activePlan); fifthJoinObserver.AddActivePlan(activePlan); sixthJoinObserver.AddActivePlan(activePlan); seventhJoinObserver.AddActivePlan(activePlan); eighthJoinObserver.AddActivePlan(activePlan); return activePlan; } } internal class Plan : Plan { internal Pattern Expression { get; private set; } internal Func Selector { get; private set; } internal Plan(Pattern expression, Func selector) { Expression = expression; Selector = selector; } internal override ActivePlan Activate(Dictionary externalSubscriptions, IObserver observer, Action deactivate) { var onError = new Action(observer.OnError); var firstJoinObserver = CreateObserver(externalSubscriptions, Expression.First, onError); var secondJoinObserver = CreateObserver(externalSubscriptions, Expression.Second, onError); var thirdJoinObserver = CreateObserver(externalSubscriptions, Expression.Third, onError); var fourthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fourth, onError); var fifthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fifth, onError); var sixthJoinObserver = CreateObserver(externalSubscriptions, Expression.Sixth, onError); var seventhJoinObserver = CreateObserver(externalSubscriptions, Expression.Seventh, onError); var eighthJoinObserver = CreateObserver(externalSubscriptions, Expression.Eighth, onError); var ninthJoinObserver = CreateObserver(externalSubscriptions, Expression.Ninth, onError); var activePlan = default(ActivePlan); activePlan = new ActivePlan(firstJoinObserver, secondJoinObserver, thirdJoinObserver, fourthJoinObserver, fifthJoinObserver, sixthJoinObserver, seventhJoinObserver, eighthJoinObserver, ninthJoinObserver, (first, second, third, fourth, fifth, sixth, seventh, eighth, ninth) => { var result = default(TResult); try { result = Selector(first, second, third, fourth, fifth, sixth, seventh, eighth, ninth); } catch (Exception exception) { observer.OnError(exception); return; } observer.OnNext(result); }, () => { firstJoinObserver.RemoveActivePlan(activePlan); secondJoinObserver.RemoveActivePlan(activePlan); thirdJoinObserver.RemoveActivePlan(activePlan); fourthJoinObserver.RemoveActivePlan(activePlan); fifthJoinObserver.RemoveActivePlan(activePlan); sixthJoinObserver.RemoveActivePlan(activePlan); seventhJoinObserver.RemoveActivePlan(activePlan); eighthJoinObserver.RemoveActivePlan(activePlan); ninthJoinObserver.RemoveActivePlan(activePlan); deactivate(activePlan); }); firstJoinObserver.AddActivePlan(activePlan); secondJoinObserver.AddActivePlan(activePlan); thirdJoinObserver.AddActivePlan(activePlan); fourthJoinObserver.AddActivePlan(activePlan); fifthJoinObserver.AddActivePlan(activePlan); sixthJoinObserver.AddActivePlan(activePlan); seventhJoinObserver.AddActivePlan(activePlan); eighthJoinObserver.AddActivePlan(activePlan); ninthJoinObserver.AddActivePlan(activePlan); return activePlan; } } internal class Plan : Plan { internal Pattern Expression { get; private set; } internal Func Selector { get; private set; } internal Plan(Pattern expression, Func selector) { Expression = expression; Selector = selector; } internal override ActivePlan Activate(Dictionary externalSubscriptions, IObserver observer, Action deactivate) { var onError = new Action(observer.OnError); var firstJoinObserver = CreateObserver(externalSubscriptions, Expression.First, onError); var secondJoinObserver = CreateObserver(externalSubscriptions, Expression.Second, onError); var thirdJoinObserver = CreateObserver(externalSubscriptions, Expression.Third, onError); var fourthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fourth, onError); var fifthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fifth, onError); var sixthJoinObserver = CreateObserver(externalSubscriptions, Expression.Sixth, onError); var seventhJoinObserver = CreateObserver(externalSubscriptions, Expression.Seventh, onError); var eighthJoinObserver = CreateObserver(externalSubscriptions, Expression.Eighth, onError); var ninthJoinObserver = CreateObserver(externalSubscriptions, Expression.Ninth, onError); var tenthJoinObserver = CreateObserver(externalSubscriptions, Expression.Tenth, onError); var activePlan = default(ActivePlan); activePlan = new ActivePlan(firstJoinObserver, secondJoinObserver, thirdJoinObserver, fourthJoinObserver, fifthJoinObserver, sixthJoinObserver, seventhJoinObserver, eighthJoinObserver, ninthJoinObserver, tenthJoinObserver, (first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth) => { var result = default(TResult); try { result = Selector(first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth); } catch (Exception exception) { observer.OnError(exception); return; } observer.OnNext(result); }, () => { firstJoinObserver.RemoveActivePlan(activePlan); secondJoinObserver.RemoveActivePlan(activePlan); thirdJoinObserver.RemoveActivePlan(activePlan); fourthJoinObserver.RemoveActivePlan(activePlan); fifthJoinObserver.RemoveActivePlan(activePlan); sixthJoinObserver.RemoveActivePlan(activePlan); seventhJoinObserver.RemoveActivePlan(activePlan); eighthJoinObserver.RemoveActivePlan(activePlan); ninthJoinObserver.RemoveActivePlan(activePlan); tenthJoinObserver.RemoveActivePlan(activePlan); deactivate(activePlan); }); firstJoinObserver.AddActivePlan(activePlan); secondJoinObserver.AddActivePlan(activePlan); thirdJoinObserver.AddActivePlan(activePlan); fourthJoinObserver.AddActivePlan(activePlan); fifthJoinObserver.AddActivePlan(activePlan); sixthJoinObserver.AddActivePlan(activePlan); seventhJoinObserver.AddActivePlan(activePlan); eighthJoinObserver.AddActivePlan(activePlan); ninthJoinObserver.AddActivePlan(activePlan); tenthJoinObserver.AddActivePlan(activePlan); return activePlan; } } internal class Plan : Plan { internal Pattern Expression { get; private set; } internal Func Selector { get; private set; } internal Plan(Pattern expression, Func selector) { Expression = expression; Selector = selector; } internal override ActivePlan Activate(Dictionary externalSubscriptions, IObserver observer, Action deactivate) { var onError = new Action(observer.OnError); var firstJoinObserver = CreateObserver(externalSubscriptions, Expression.First, onError); var secondJoinObserver = CreateObserver(externalSubscriptions, Expression.Second, onError); var thirdJoinObserver = CreateObserver(externalSubscriptions, Expression.Third, onError); var fourthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fourth, onError); var fifthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fifth, onError); var sixthJoinObserver = CreateObserver(externalSubscriptions, Expression.Sixth, onError); var seventhJoinObserver = CreateObserver(externalSubscriptions, Expression.Seventh, onError); var eighthJoinObserver = CreateObserver(externalSubscriptions, Expression.Eighth, onError); var ninthJoinObserver = CreateObserver(externalSubscriptions, Expression.Ninth, onError); var tenthJoinObserver = CreateObserver(externalSubscriptions, Expression.Tenth, onError); var eleventhJoinObserver = CreateObserver(externalSubscriptions, Expression.Eleventh, onError); var activePlan = default(ActivePlan); activePlan = new ActivePlan(firstJoinObserver, secondJoinObserver, thirdJoinObserver, fourthJoinObserver, fifthJoinObserver, sixthJoinObserver, seventhJoinObserver, eighthJoinObserver, ninthJoinObserver, tenthJoinObserver,eleventhJoinObserver, (first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh) => { var result = default(TResult); try { result = Selector(first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh); } catch (Exception exception) { observer.OnError(exception); return; } observer.OnNext(result); }, () => { firstJoinObserver.RemoveActivePlan(activePlan); secondJoinObserver.RemoveActivePlan(activePlan); thirdJoinObserver.RemoveActivePlan(activePlan); fourthJoinObserver.RemoveActivePlan(activePlan); fifthJoinObserver.RemoveActivePlan(activePlan); sixthJoinObserver.RemoveActivePlan(activePlan); seventhJoinObserver.RemoveActivePlan(activePlan); eighthJoinObserver.RemoveActivePlan(activePlan); ninthJoinObserver.RemoveActivePlan(activePlan); tenthJoinObserver.RemoveActivePlan(activePlan); eleventhJoinObserver.RemoveActivePlan(activePlan); deactivate(activePlan); }); firstJoinObserver.AddActivePlan(activePlan); secondJoinObserver.AddActivePlan(activePlan); thirdJoinObserver.AddActivePlan(activePlan); fourthJoinObserver.AddActivePlan(activePlan); fifthJoinObserver.AddActivePlan(activePlan); sixthJoinObserver.AddActivePlan(activePlan); seventhJoinObserver.AddActivePlan(activePlan); eighthJoinObserver.AddActivePlan(activePlan); ninthJoinObserver.AddActivePlan(activePlan); tenthJoinObserver.AddActivePlan(activePlan); eleventhJoinObserver.AddActivePlan(activePlan); return activePlan; } } internal class Plan : Plan { internal Pattern Expression { get; private set; } internal Func Selector { get; private set; } internal Plan(Pattern expression, Func selector) { Expression = expression; Selector = selector; } internal override ActivePlan Activate(Dictionary externalSubscriptions, IObserver observer, Action deactivate) { var onError = new Action(observer.OnError); var firstJoinObserver = CreateObserver(externalSubscriptions, Expression.First, onError); var secondJoinObserver = CreateObserver(externalSubscriptions, Expression.Second, onError); var thirdJoinObserver = CreateObserver(externalSubscriptions, Expression.Third, onError); var fourthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fourth, onError); var fifthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fifth, onError); var sixthJoinObserver = CreateObserver(externalSubscriptions, Expression.Sixth, onError); var seventhJoinObserver = CreateObserver(externalSubscriptions, Expression.Seventh, onError); var eighthJoinObserver = CreateObserver(externalSubscriptions, Expression.Eighth, onError); var ninthJoinObserver = CreateObserver(externalSubscriptions, Expression.Ninth, onError); var tenthJoinObserver = CreateObserver(externalSubscriptions, Expression.Tenth, onError); var eleventhJoinObserver = CreateObserver(externalSubscriptions, Expression.Eleventh, onError); var twelfthJoinObserver = CreateObserver(externalSubscriptions, Expression.Twelfth, onError); var activePlan = default(ActivePlan); activePlan = new ActivePlan(firstJoinObserver, secondJoinObserver, thirdJoinObserver, fourthJoinObserver, fifthJoinObserver, sixthJoinObserver, seventhJoinObserver, eighthJoinObserver, ninthJoinObserver, tenthJoinObserver, eleventhJoinObserver, twelfthJoinObserver, (first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth) => { var result = default(TResult); try { result = Selector(first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth); } catch (Exception exception) { observer.OnError(exception); return; } observer.OnNext(result); }, () => { firstJoinObserver.RemoveActivePlan(activePlan); secondJoinObserver.RemoveActivePlan(activePlan); thirdJoinObserver.RemoveActivePlan(activePlan); fourthJoinObserver.RemoveActivePlan(activePlan); fifthJoinObserver.RemoveActivePlan(activePlan); sixthJoinObserver.RemoveActivePlan(activePlan); seventhJoinObserver.RemoveActivePlan(activePlan); eighthJoinObserver.RemoveActivePlan(activePlan); ninthJoinObserver.RemoveActivePlan(activePlan); tenthJoinObserver.RemoveActivePlan(activePlan); eleventhJoinObserver.RemoveActivePlan(activePlan); twelfthJoinObserver.RemoveActivePlan(activePlan); deactivate(activePlan); }); firstJoinObserver.AddActivePlan(activePlan); secondJoinObserver.AddActivePlan(activePlan); thirdJoinObserver.AddActivePlan(activePlan); fourthJoinObserver.AddActivePlan(activePlan); fifthJoinObserver.AddActivePlan(activePlan); sixthJoinObserver.AddActivePlan(activePlan); seventhJoinObserver.AddActivePlan(activePlan); eighthJoinObserver.AddActivePlan(activePlan); ninthJoinObserver.AddActivePlan(activePlan); tenthJoinObserver.AddActivePlan(activePlan); eleventhJoinObserver.AddActivePlan(activePlan); twelfthJoinObserver.AddActivePlan(activePlan); return activePlan; } } internal class Plan : Plan { internal Pattern Expression { get; private set; } internal Func Selector { get; private set; } internal Plan(Pattern expression, Func selector) { Expression = expression; Selector = selector; } internal override ActivePlan Activate(Dictionary externalSubscriptions, IObserver observer, Action deactivate) { var onError = new Action(observer.OnError); var firstJoinObserver = CreateObserver(externalSubscriptions, Expression.First, onError); var secondJoinObserver = CreateObserver(externalSubscriptions, Expression.Second, onError); var thirdJoinObserver = CreateObserver(externalSubscriptions, Expression.Third, onError); var fourthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fourth, onError); var fifthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fifth, onError); var sixthJoinObserver = CreateObserver(externalSubscriptions, Expression.Sixth, onError); var seventhJoinObserver = CreateObserver(externalSubscriptions, Expression.Seventh, onError); var eighthJoinObserver = CreateObserver(externalSubscriptions, Expression.Eighth, onError); var ninthJoinObserver = CreateObserver(externalSubscriptions, Expression.Ninth, onError); var tenthJoinObserver = CreateObserver(externalSubscriptions, Expression.Tenth, onError); var eleventhJoinObserver = CreateObserver(externalSubscriptions, Expression.Eleventh, onError); var twelfthJoinObserver = CreateObserver(externalSubscriptions, Expression.Twelfth, onError); var thirteenthJoinObserver = CreateObserver(externalSubscriptions, Expression.Thirteenth, onError); var activePlan = default(ActivePlan); activePlan = new ActivePlan(firstJoinObserver, secondJoinObserver, thirdJoinObserver, fourthJoinObserver, fifthJoinObserver, sixthJoinObserver, seventhJoinObserver, eighthJoinObserver, ninthJoinObserver, tenthJoinObserver, eleventhJoinObserver, twelfthJoinObserver, thirteenthJoinObserver, (first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth, thirteenth) => { var result = default(TResult); try { result = Selector(first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth, thirteenth); } catch (Exception exception) { observer.OnError(exception); return; } observer.OnNext(result); }, () => { firstJoinObserver.RemoveActivePlan(activePlan); secondJoinObserver.RemoveActivePlan(activePlan); thirdJoinObserver.RemoveActivePlan(activePlan); fourthJoinObserver.RemoveActivePlan(activePlan); fifthJoinObserver.RemoveActivePlan(activePlan); sixthJoinObserver.RemoveActivePlan(activePlan); seventhJoinObserver.RemoveActivePlan(activePlan); eighthJoinObserver.RemoveActivePlan(activePlan); ninthJoinObserver.RemoveActivePlan(activePlan); tenthJoinObserver.RemoveActivePlan(activePlan); eleventhJoinObserver.RemoveActivePlan(activePlan); twelfthJoinObserver.RemoveActivePlan(activePlan); thirteenthJoinObserver.RemoveActivePlan(activePlan); deactivate(activePlan); }); firstJoinObserver.AddActivePlan(activePlan); secondJoinObserver.AddActivePlan(activePlan); thirdJoinObserver.AddActivePlan(activePlan); fourthJoinObserver.AddActivePlan(activePlan); fifthJoinObserver.AddActivePlan(activePlan); sixthJoinObserver.AddActivePlan(activePlan); seventhJoinObserver.AddActivePlan(activePlan); eighthJoinObserver.AddActivePlan(activePlan); ninthJoinObserver.AddActivePlan(activePlan); tenthJoinObserver.AddActivePlan(activePlan); eleventhJoinObserver.AddActivePlan(activePlan); twelfthJoinObserver.AddActivePlan(activePlan); thirteenthJoinObserver.AddActivePlan(activePlan); return activePlan; } } internal class Plan : Plan { internal Pattern Expression { get; private set; } internal Func Selector { get; private set; } internal Plan(Pattern expression, Func selector) { Expression = expression; Selector = selector; } internal override ActivePlan Activate(Dictionary externalSubscriptions, IObserver observer, Action deactivate) { var onError = new Action(observer.OnError); var firstJoinObserver = CreateObserver(externalSubscriptions, Expression.First, onError); var secondJoinObserver = CreateObserver(externalSubscriptions, Expression.Second, onError); var thirdJoinObserver = CreateObserver(externalSubscriptions, Expression.Third, onError); var fourthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fourth, onError); var fifthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fifth, onError); var sixthJoinObserver = CreateObserver(externalSubscriptions, Expression.Sixth, onError); var seventhJoinObserver = CreateObserver(externalSubscriptions, Expression.Seventh, onError); var eighthJoinObserver = CreateObserver(externalSubscriptions, Expression.Eighth, onError); var ninthJoinObserver = CreateObserver(externalSubscriptions, Expression.Ninth, onError); var tenthJoinObserver = CreateObserver(externalSubscriptions, Expression.Tenth, onError); var eleventhJoinObserver = CreateObserver(externalSubscriptions, Expression.Eleventh, onError); var twelfthJoinObserver = CreateObserver(externalSubscriptions, Expression.Twelfth, onError); var thirteenthJoinObserver = CreateObserver(externalSubscriptions, Expression.Thirteenth, onError); var fourteenthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fourteenth, onError); var activePlan = default(ActivePlan); activePlan = new ActivePlan( firstJoinObserver, secondJoinObserver, thirdJoinObserver, fourthJoinObserver, fifthJoinObserver, sixthJoinObserver, seventhJoinObserver, eighthJoinObserver, ninthJoinObserver, tenthJoinObserver, eleventhJoinObserver, twelfthJoinObserver, thirteenthJoinObserver, fourteenthJoinObserver, (first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth) => { var result = default(TResult); try { result = Selector(first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth); } catch (Exception exception) { observer.OnError(exception); return; } observer.OnNext(result); }, () => { firstJoinObserver.RemoveActivePlan(activePlan); secondJoinObserver.RemoveActivePlan(activePlan); thirdJoinObserver.RemoveActivePlan(activePlan); fourthJoinObserver.RemoveActivePlan(activePlan); fifthJoinObserver.RemoveActivePlan(activePlan); sixthJoinObserver.RemoveActivePlan(activePlan); seventhJoinObserver.RemoveActivePlan(activePlan); eighthJoinObserver.RemoveActivePlan(activePlan); ninthJoinObserver.RemoveActivePlan(activePlan); tenthJoinObserver.RemoveActivePlan(activePlan); eleventhJoinObserver.RemoveActivePlan(activePlan); twelfthJoinObserver.RemoveActivePlan(activePlan); thirteenthJoinObserver.RemoveActivePlan(activePlan); fourteenthJoinObserver.RemoveActivePlan(activePlan); deactivate(activePlan); }); firstJoinObserver.AddActivePlan(activePlan); secondJoinObserver.AddActivePlan(activePlan); thirdJoinObserver.AddActivePlan(activePlan); fourthJoinObserver.AddActivePlan(activePlan); fifthJoinObserver.AddActivePlan(activePlan); sixthJoinObserver.AddActivePlan(activePlan); seventhJoinObserver.AddActivePlan(activePlan); eighthJoinObserver.AddActivePlan(activePlan); ninthJoinObserver.AddActivePlan(activePlan); tenthJoinObserver.AddActivePlan(activePlan); eleventhJoinObserver.AddActivePlan(activePlan); twelfthJoinObserver.AddActivePlan(activePlan); thirteenthJoinObserver.AddActivePlan(activePlan); fourteenthJoinObserver.AddActivePlan(activePlan); return activePlan; } } internal class Plan : Plan { internal Pattern Expression { get; private set; } internal Func Selector { get; private set; } internal Plan(Pattern expression, Func selector) { Expression = expression; Selector = selector; } internal override ActivePlan Activate(Dictionary externalSubscriptions, IObserver observer, Action deactivate) { var onError = new Action(observer.OnError); var firstJoinObserver = CreateObserver(externalSubscriptions, Expression.First, onError); var secondJoinObserver = CreateObserver(externalSubscriptions, Expression.Second, onError); var thirdJoinObserver = CreateObserver(externalSubscriptions, Expression.Third, onError); var fourthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fourth, onError); var fifthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fifth, onError); var sixthJoinObserver = CreateObserver(externalSubscriptions, Expression.Sixth, onError); var seventhJoinObserver = CreateObserver(externalSubscriptions, Expression.Seventh, onError); var eighthJoinObserver = CreateObserver(externalSubscriptions, Expression.Eighth, onError); var ninthJoinObserver = CreateObserver(externalSubscriptions, Expression.Ninth, onError); var tenthJoinObserver = CreateObserver(externalSubscriptions, Expression.Tenth, onError); var eleventhJoinObserver = CreateObserver(externalSubscriptions, Expression.Eleventh, onError); var twelfthJoinObserver = CreateObserver(externalSubscriptions, Expression.Twelfth, onError); var thirteenthJoinObserver = CreateObserver(externalSubscriptions, Expression.Thirteenth, onError); var fourteenthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fourteenth, onError); var fifteenthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fifteenth, onError); var activePlan = default(ActivePlan); activePlan = new ActivePlan( firstJoinObserver, secondJoinObserver, thirdJoinObserver, fourthJoinObserver, fifthJoinObserver, sixthJoinObserver, seventhJoinObserver, eighthJoinObserver, ninthJoinObserver, tenthJoinObserver, eleventhJoinObserver, twelfthJoinObserver, thirteenthJoinObserver, fourteenthJoinObserver, fifteenthJoinObserver, (first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth, fifteenth) => { var result = default(TResult); try { result = Selector(first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth, fifteenth); } catch (Exception exception) { observer.OnError(exception); return; } observer.OnNext(result); }, () => { firstJoinObserver.RemoveActivePlan(activePlan); secondJoinObserver.RemoveActivePlan(activePlan); thirdJoinObserver.RemoveActivePlan(activePlan); fourthJoinObserver.RemoveActivePlan(activePlan); fifthJoinObserver.RemoveActivePlan(activePlan); sixthJoinObserver.RemoveActivePlan(activePlan); seventhJoinObserver.RemoveActivePlan(activePlan); eighthJoinObserver.RemoveActivePlan(activePlan); ninthJoinObserver.RemoveActivePlan(activePlan); tenthJoinObserver.RemoveActivePlan(activePlan); eleventhJoinObserver.RemoveActivePlan(activePlan); twelfthJoinObserver.RemoveActivePlan(activePlan); thirteenthJoinObserver.RemoveActivePlan(activePlan); fourteenthJoinObserver.RemoveActivePlan(activePlan); fifteenthJoinObserver.RemoveActivePlan(activePlan); deactivate(activePlan); }); firstJoinObserver.AddActivePlan(activePlan); secondJoinObserver.AddActivePlan(activePlan); thirdJoinObserver.AddActivePlan(activePlan); fourthJoinObserver.AddActivePlan(activePlan); fifthJoinObserver.AddActivePlan(activePlan); sixthJoinObserver.AddActivePlan(activePlan); seventhJoinObserver.AddActivePlan(activePlan); eighthJoinObserver.AddActivePlan(activePlan); ninthJoinObserver.AddActivePlan(activePlan); tenthJoinObserver.AddActivePlan(activePlan); eleventhJoinObserver.AddActivePlan(activePlan); twelfthJoinObserver.AddActivePlan(activePlan); thirteenthJoinObserver.AddActivePlan(activePlan); fourteenthJoinObserver.AddActivePlan(activePlan); fifteenthJoinObserver.AddActivePlan(activePlan); return activePlan; } } internal class Plan : Plan { internal Pattern Expression { get; private set; } internal Func Selector { get; private set; } internal Plan(Pattern expression, Func selector) { Expression = expression; Selector = selector; } internal override ActivePlan Activate(Dictionary externalSubscriptions, IObserver observer, Action deactivate) { var onError = new Action(observer.OnError); var firstJoinObserver = CreateObserver(externalSubscriptions, Expression.First, onError); var secondJoinObserver = CreateObserver(externalSubscriptions, Expression.Second, onError); var thirdJoinObserver = CreateObserver(externalSubscriptions, Expression.Third, onError); var fourthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fourth, onError); var fifthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fifth, onError); var sixthJoinObserver = CreateObserver(externalSubscriptions, Expression.Sixth, onError); var seventhJoinObserver = CreateObserver(externalSubscriptions, Expression.Seventh, onError); var eighthJoinObserver = CreateObserver(externalSubscriptions, Expression.Eighth, onError); var ninthJoinObserver = CreateObserver(externalSubscriptions, Expression.Ninth, onError); var tenthJoinObserver = CreateObserver(externalSubscriptions, Expression.Tenth, onError); var eleventhJoinObserver = CreateObserver(externalSubscriptions, Expression.Eleventh, onError); var twelfthJoinObserver = CreateObserver(externalSubscriptions, Expression.Twelfth, onError); var thirteenthJoinObserver = CreateObserver(externalSubscriptions, Expression.Thirteenth, onError); var fourteenthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fourteenth, onError); var fifteenthJoinObserver = CreateObserver(externalSubscriptions, Expression.Fifteenth, onError); var sixteenthJoinObserver = CreateObserver(externalSubscriptions, Expression.Sixteenth, onError); var activePlan = default(ActivePlan); activePlan = new ActivePlan( firstJoinObserver, secondJoinObserver, thirdJoinObserver, fourthJoinObserver, fifthJoinObserver, sixthJoinObserver, seventhJoinObserver, eighthJoinObserver, ninthJoinObserver, tenthJoinObserver, eleventhJoinObserver, twelfthJoinObserver, thirteenthJoinObserver, fourteenthJoinObserver, fifteenthJoinObserver, sixteenthJoinObserver, (first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth, fifteenth, sixteenth) => { var result = default(TResult); try { result = Selector(first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth, fifteenth, sixteenth); } catch (Exception exception) { observer.OnError(exception); return; } observer.OnNext(result); }, () => { firstJoinObserver.RemoveActivePlan(activePlan); secondJoinObserver.RemoveActivePlan(activePlan); thirdJoinObserver.RemoveActivePlan(activePlan); fourthJoinObserver.RemoveActivePlan(activePlan); fifthJoinObserver.RemoveActivePlan(activePlan); sixthJoinObserver.RemoveActivePlan(activePlan); seventhJoinObserver.RemoveActivePlan(activePlan); eighthJoinObserver.RemoveActivePlan(activePlan); ninthJoinObserver.RemoveActivePlan(activePlan); tenthJoinObserver.RemoveActivePlan(activePlan); eleventhJoinObserver.RemoveActivePlan(activePlan); twelfthJoinObserver.RemoveActivePlan(activePlan); thirteenthJoinObserver.RemoveActivePlan(activePlan); fourteenthJoinObserver.RemoveActivePlan(activePlan); fifteenthJoinObserver.RemoveActivePlan(activePlan); sixteenthJoinObserver.RemoveActivePlan(activePlan); deactivate(activePlan); }); firstJoinObserver.AddActivePlan(activePlan); secondJoinObserver.AddActivePlan(activePlan); thirdJoinObserver.AddActivePlan(activePlan); fourthJoinObserver.AddActivePlan(activePlan); fifthJoinObserver.AddActivePlan(activePlan); sixthJoinObserver.AddActivePlan(activePlan); seventhJoinObserver.AddActivePlan(activePlan); eighthJoinObserver.AddActivePlan(activePlan); ninthJoinObserver.AddActivePlan(activePlan); tenthJoinObserver.AddActivePlan(activePlan); eleventhJoinObserver.AddActivePlan(activePlan); twelfthJoinObserver.AddActivePlan(activePlan); thirteenthJoinObserver.AddActivePlan(activePlan); fourteenthJoinObserver.AddActivePlan(activePlan); fifteenthJoinObserver.AddActivePlan(activePlan); sixteenthJoinObserver.AddActivePlan(activePlan); return activePlan; } } #endif }