private static IObservable <T> ObserveFullPropertyPathCore <TNotifier, TProperty, T>(this TNotifier source, NotifyingPath <TNotifier, TProperty> notifyingPath, Func <object, PropertyChangedEventArgs, T> create, bool signalInitial = true)
            where TNotifier : class, INotifyPropertyChanged
        {
            if (signalInitial)
            {
                return(Observable.Return(
                           create(
                               notifyingPath.SourceAndValue(source)
                               .Source,
                               CachedEventArgs.GetOrCreatePropertyChangedEventArgs(string.Empty)))
                       .Concat(source.ObserveFullPropertyPathCore(notifyingPath, create, signalInitial: false)));
            }

            return(Observable.Create <T>(
                       o =>
            {
#pragma warning disable IDISP001  // Dispose created.
                var tracker = notifyingPath.CreateTracker(source);
#pragma warning restore IDISP001  // Dispose created.
                void Handler(object sender, PropertyChangedEventArgs e) => o.OnNext(create(sender, e));
                foreach (var propertyTracker in tracker)
                {
                    propertyTracker.TrackedPropertyChanged += Handler;
                }

                return Disposable.Create(
                    () =>
                {
                    foreach (var propertyTracker in tracker)
                    {
                        propertyTracker.TrackedPropertyChanged -= Handler;
                    }

                    tracker.Dispose();
                });
            }));
        }