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);
        }
Beispiel #2
0
 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);
        }
Beispiel #5
0
 protected O delayedImpl <O>(
     float seconds, ObserverBuilder <A, O> builder
     )
 {
     return(builder(obs =>
                    subscribe(v => ASync.WithDelay(seconds, () => obs.push(v)))
                    ));
 }
Beispiel #6
0
 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));
 }
Beispiel #7
0
 protected O filterImpl <O>
     (Fn <A, bool> predicate, ObserverBuilder <A, O> builder)
 {
     return(builder(obs => subscribe(val => {
         if (predicate(val))
         {
             obs.push(val);
         }
     })));
 }
Beispiel #8
0
 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);
         }
     })));
 }
Beispiel #9
0
 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);
         });
     }));
 }
Beispiel #10
0
 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));
 }
Beispiel #11
0
 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;
        }
Beispiel #15
0
 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;
        }
Beispiel #17
0
 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);
        }
Beispiel #19
0
        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)
                         );
Beispiel #20
0
        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)
                           ));
        }
Beispiel #21
0
 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);
     }));
 }
Beispiel #22
0
 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);
             }
         });
     }));
 }
Beispiel #23
0
 protected O mapImpl <B, O>(Fn <A, B> mapper, ObserverBuilder <B, O> builder)
 {
     return(builder(obs => subscribe(val => obs.push(mapper(val)))));
 }
Beispiel #24
0
 protected override void Context()
 {
     _builder = new ObserverBuilder();
     sut      = new ObserverBuilderToObjectBaseSummaryDTOMapper(new ObjectTypeResolver());
 }
Beispiel #25
0
 protected O collectImpl <O, B>
     (Fn <A, Option <B> > collector, ObserverBuilder <B, O> builder)
 {
     return(builder(obs => subscribe(val => collector(val).each(obs.push))));
 }