private ObservableList <IObjectDescriptorProvider> CreateObjectDescriptorProvider(ObservableList <IObjectDescriptorProvider> descriptorProviders) { var objectDescriptorProvider = new ObjectDescriptorProvider(AliasProviders); var objectDescriptorProviders = new ObservableList <IObjectDescriptorProvider> { objectDescriptorProvider, new DynamicObjectDescriptor(objectDescriptorProvider), new EnumerableObjectDescriptor(objectDescriptorProvider), new DictionaryObjectDescriptor(), new ReadOnlyGenericDictionaryObjectDescriptorProvider(), new GenericDictionaryObjectDescriptorProvider(), new ReadOnlyStringDictionaryObjectDescriptorProvider(), new StringDictionaryObjectDescriptorProvider(), } .AddMany(descriptorProviders); var observer = new ObserverBuilder <ObservableEvent <IObjectDescriptorProvider> >() .OnEvent < AddedObservableEvent <IObjectDescriptorProvider>, ObservableList <IObjectDescriptorProvider> >(objectDescriptorProviders, (@event, state) => { state.Add(@event.Value); }) .Build(); descriptorProviders.Subscribe(observer); return(objectDescriptorProviders); }
protected O joinImpl <B, O> (IObservable <B> other, ObserverBuilder <A, O> builder) where B : A { return(builder(obs => subscribe(obs.push).join(other.subscribe(v => obs.push(v))) )); }
private void CreateHelpersSubscription() { var existingHelpers = UnderlingConfiguration.Helpers.ToDictionary( o => _pathInfoStore.GetOrAdd($"[{o.Key}]"), o => new StrongBox <HelperDescriptorBase>(o.Value) ); Helpers = new ObservableDictionary <PathInfo, StrongBox <HelperDescriptorBase> >(existingHelpers, Compatibility.RelaxedHelperNaming ? PathInfo.PlainPathComparer : PathInfo.PlainPathWithPartsCountComparer); var helpersObserver = new ObserverBuilder <ObservableEvent <HelperDescriptorBase> >() .OnEvent <ObservableDictionary <string, HelperDescriptorBase> .ReplacedObservableEvent>( @event => Helpers[_pathInfoStore.GetOrAdd($"[{@event.Key}]")].Value = @event.Value ) .OnEvent <ObservableDictionary <string, HelperDescriptorBase> .AddedObservableEvent>( @event => { Helpers.AddOrUpdate(_pathInfoStore.GetOrAdd($"[{@event.Key}]"), h => new StrongBox <HelperDescriptorBase>(h), (h, o) => o.Value = h, @event.Value); }) .OnEvent <ObservableDictionary <string, HelperDescriptorBase> .RemovedObservableEvent>(@event => { if (Helpers.TryGetValue(_pathInfoStore.GetOrAdd($"[{@event.Key}]"), out var helperToRemove)) { helperToRemove.Value = new LateBindHelperDescriptor(@event.Key, this); } }) .Build(); UnderlingConfiguration.Helpers .As <ObservableDictionary <string, HelperDescriptorBase> >() .Subscribe(helpersObserver); }
private ObservableIndex <PathInfoLight, Ref <IHelperDescriptor <TOptions> >, IEqualityComparer <PathInfoLight> > CreateHelpersSubscription <TOptions>( IIndexed <string, IHelperDescriptor <TOptions> > source) where TOptions : struct, IHelperOptions { var equalityComparer = Compatibility.RelaxedHelperNaming ? PathInfoLight.PlainPathComparer : PathInfoLight.PlainPathWithPartsCountComparer; var existingHelpers = source.ToIndexed( o => (PathInfoLight)$"[{o.Key}]", o => new Ref <IHelperDescriptor <TOptions> >(o.Value), equalityComparer ); var target = new ObservableIndex <PathInfoLight, Ref <IHelperDescriptor <TOptions> >, IEqualityComparer <PathInfoLight> >(equalityComparer, existingHelpers); var helpersObserver = new ObserverBuilder <ObservableEvent <IHelperDescriptor <TOptions> > >() .OnEvent <DictionaryAddedObservableEvent <string, IHelperDescriptor <TOptions> > >( @event => { PathInfoLight key = $"[{@event.Key}]"; if (target.TryGetValue(key, out var @ref)) { @ref.Value = @event.Value; return; } target.AddOrReplace(key, new Ref <IHelperDescriptor <TOptions> >(@event.Value)); }) .Build(); source.As <ObservableIndex <string, IHelperDescriptor <TOptions>, StringEqualityComparer> >()?.Subscribe(helpersObserver); return(target); }
protected O delayedImpl <O>( float seconds, ObserverBuilder <A, O> builder ) { return(builder(obs => subscribe(v => ASync.WithDelay(seconds, () => obs.push(v))) )); }
protected O changesImpl <O>(ObserverBuilder <Tpl <A, A>, O> builder) { return(changesBase((obs, lastValue, val) => lastValue.each(lastVal => { if (!EqComparer <A> .Default.Equals(lastVal, val)) { obs.push(F.t(lastVal, val)); } }), builder)); }
protected O filterImpl <O> (Fn <A, bool> predicate, ObserverBuilder <A, O> builder) { return(builder(obs => subscribe(val => { if (predicate(val)) { obs.push(val); } }))); }
public O flatMapImpl <B, O> (Fn <A, IEnumerable <B> > mapper, ObserverBuilder <B, O> builder) { return(builder(obs => subscribe(val => { foreach (var b in mapper(val)) { obs.push(b); } }))); }
private O changesBase <Elem, O>( Act <IObserver <Elem>, Option <A>, A> action, ObserverBuilder <Elem, O> builder ) { return(builder(obs => { var lastValue = F.none <A>(); return subscribe(val => { action(obs, lastValue, val); lastValue = F.some(val); }); })); }
protected O changesOptImpl <O>(ObserverBuilder <Tpl <Option <A>, A>, O> builder) { return(changesBase((obs, lastValue, val) => { var valueChanged = lastValue.fold( () => true, lastVal => EqComparer <A> .Default.Equals(lastVal, val) ); if (valueChanged) { obs.push(F.t(lastValue, val)); } }, builder)); }
protected O changedValuesImpl <O>(ObserverBuilder <A, O> builder) { return(changesBase((obs, lastValue, val) => { if (lastValue.isEmpty) { obs.push(val); } else if (!EqComparer <A> .Default.Equals(lastValue.get, val)) { obs.push(val); } }, builder)); }
protected override void Context() { base.Context(); var t1 = new ObserverBuilder() .WithName("Passive") .WithDimension(DimensionFactoryForSpecs.ConcentrationDimension); var t2 = new ObserverBuilder() .WithName("Passive") .WithDimension(Constants.Dimension.NO_DIMENSION); _object1 = t1; _object2 = t2; }
protected override void Context() { base.Context(); var t1 = new ObserverBuilder().WithName("Passive"); t1.Formula = new ExplicitFormula("a+b"); var t2 = new ObserverBuilder().WithName("Passive"); t2.Formula = new ExplicitFormula("a-b"); _object1 = t1; _object2 = t2; }
protected override void Context() { base.Context(); var t1 = new ObserverBuilder().WithName("Passive"); t1.ContainerCriteria = Create.Criteria(x => x.With("Tada").And.With("Toto")); var t2 = new ObserverBuilder().WithName("Passive"); t2.ContainerCriteria = Create.Criteria(x => x.Not("Tada").And.With("Toto")); _object1 = t1; _object2 = t2; }
protected O onceEveryImpl <O> (float seconds, ObserverBuilder <A, O> builder) { return(builder(obs => { var lastEmit = float.NegativeInfinity; return subscribe(value => { if (lastEmit + seconds > Time.time) { return; } lastEmit = Time.time; obs.push(value); }); })); }
protected override void Context() { base.Context(); var t1 = new ObserverBuilder().WithName("Passive"); t1.ForAll = false; t1.AddMoleculeNameToExclude("Drug"); var t2 = new ObserverBuilder().WithName("Passive"); t2.ForAll = false; t2.AddMoleculeNameToExclude("Metab"); _object1 = t1; _object2 = t2; }
protected O bufferImpl <O> (int size, ObserverBuilder <ReadOnlyLinkedList <A>, O> builder) { return(builder(obs => { var buffer = new LinkedList <A>(); var roFacade = new ReadOnlyLinkedList <A>(buffer); return subscribe(val => { buffer.AddLast(val); if (buffer.Count > size) { buffer.RemoveFirst(); } obs.push(roFacade); }); })); }
public FormatterProvider(ObservableList <IFormatterProvider> providers = null) { _formatterProviders = new ObservableList <IFormatterProvider>(); if (providers != null) { Append(providers); } var observer = new ObserverBuilder <ObservableEvent <IFormatterProvider> >() .OnEvent <AddedObservableEvent <IFormatterProvider>, LookupSlim>( _formatters, (@event, state) => state.Clear() ) .Build(); _formatterProviders.Subscribe(observer); }
public static O withinTimeframe <A, O>( IObservable <A> o, int count, Duration timeframe, TimeScale timeScale, ObserverBuilder <ReadOnlyLinkedList <Tpl <A, float> >, O> builder ) => builder(obs => o.map(value => F.t(value, timeScale.now())) .buffer(count) .filter(events => { if (events.Count != count) { return(false); } var last = events.Last.Value._2; return(events.All(t => last - t._2 <= timeframe.seconds)); }) .subscribe(obs) );
protected O withinTimeframeImpl <O>( int count, float timeframe, ObserverBuilder <ReadOnlyLinkedList <Tpl <A, float> >, O> builder ) { return(builder(obs => map(value => F.t(value, Time.time)). buffer(count). filter(events => { if (events.Count != count) { return false; } var last = events.Last.Value._2; return events.All(t => last - t._2 <= timeframe); }).subscribe(obs.push) )); }
protected O zipImpl <B, O> (IObservable <B> other, ObserverBuilder <Tpl <A, B>, O> builder) { return(builder(obs => { var lastSelf = F.none <A>(); var lastOther = F.none <B>(); Action notify = () => lastSelf.each(aVal => lastOther.each(bVal => obs.push(F.t(aVal, bVal)) )); var s1 = subscribe(val => { lastSelf = F.some(val); notify(); }); var s2 = other.subscribe(val => { lastOther = F.some(val); notify(); }); return s1.join(s2); })); }
protected O timeBufferImpl <O> (float seconds, ObserverBuilder <ReadOnlyLinkedList <Tpl <A, float> >, O> builder) { return(builder(obs => { var buffer = new LinkedList <Tpl <A, float> >(); var roFacade = ReadOnlyLinkedList.a(buffer); return subscribe(val => { buffer.AddLast(F.t(val, Time.time)); var lastTime = buffer.Last.Value._2; if (buffer.First.Value._2 + seconds <= lastTime) { // Remove items which are too old. while (buffer.First.Value._2 + seconds < lastTime) { buffer.RemoveFirst(); } obs.push(roFacade); } }); })); }
protected O mapImpl <B, O>(Fn <A, B> mapper, ObserverBuilder <B, O> builder) { return(builder(obs => subscribe(val => obs.push(mapper(val))))); }
protected override void Context() { _builder = new ObserverBuilder(); sut = new ObserverBuilderToObjectBaseSummaryDTOMapper(new ObjectTypeResolver()); }
protected O collectImpl <O, B> (Fn <A, Option <B> > collector, ObserverBuilder <B, O> builder) { return(builder(obs => subscribe(val => collector(val).each(obs.push)))); }