public static IDisposable connect_item_hooks <T>(ObservableCollection <T> source, Func <T, IDisposable> get_item_hook, bool clear_source_on_dispose = false)
        {
            var item_hooks = source.Select(get_item_hook).ToList();

            return(new CompositeDisposable(
                       clear_source_on_dispose ? Disposable.Create(source.Clear) : Disposable.wrap_collection(item_hooks),
                       source.Subscribe((s, e) => CollectionHelper.reflect_change(item_hooks, source, get_item_hook, d => d.Dispose(), e))));
        }
        public static IDisposable connect_item_hooks <T>(IReadOnlyObservableCollection <T> source, Func <T, IDisposable> get_item_hook)
        {
            var item_hooks = source.Select(get_item_hook).ToList();

            return(new CompositeDisposable(
                       Disposable.wrap_collection(item_hooks),
                       source.Subscribe((s, e) => CollectionHelper.reflect_change(item_hooks, source, get_item_hook, d => d.Dispose(), e))));
        }